From a915547f8af4bb39e9633a8c5e7e6156888a3088 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 16 Nov 2015 09:54:05 +0100 Subject: [PATCH] OO-1770, OO-1769: allow pseudonym and guest posts, refactor the message model to hold only threads or messages of a unique thread in memory, minimize the number of joins on query, minimize the number of queries on peekview, remove buggy docking feature... --- .../collaboration/CollaborationTools.java | 10 +- .../CollaborationToolsSettingsController.java | 2 - .../commons/services/image/ImageUtils.java | 48 +- .../services/mark/impl/MarkManagerImpl.java | 16 +- .../notifications/NotificationsManager.java | 2 +- .../flexible/elements/FlexiTableElement.java | 5 + .../table/FlexiTableClassicRenderer.java | 10 +- .../elements/table/FlexiTableElementImpl.java | 9 + .../table/FlexiTableRowCssDelegate.java} | 29 +- .../SortableFlexiTableModelDelegate.java | 22 + .../generic/docking/DockController.java | 217 -- .../control/generic/docking/DockModule.java | 47 - .../generic/docking/_content/docked.html | 19 - .../docking/_i18n/LocalStrings_ar.properties | 2 - .../docking/_i18n/LocalStrings_bg.properties | 2 - .../docking/_i18n/LocalStrings_cs.properties | 2 - .../docking/_i18n/LocalStrings_da.properties | 2 - .../docking/_i18n/LocalStrings_de.properties | 2 - .../docking/_i18n/LocalStrings_el.properties | 2 - .../docking/_i18n/LocalStrings_en.properties | 2 - .../docking/_i18n/LocalStrings_es.properties | 2 - .../docking/_i18n/LocalStrings_fa.properties | 2 - .../docking/_i18n/LocalStrings_fr.properties | 2 - .../docking/_i18n/LocalStrings_it.properties | 2 - .../docking/_i18n/LocalStrings_jp.properties | 2 - .../docking/_i18n/LocalStrings_lt.properties | 2 - .../_i18n/LocalStrings_nl_NL.properties | 2 - .../docking/_i18n/LocalStrings_pl.properties | 2 - .../_i18n/LocalStrings_pt_BR.properties | 2 - .../_i18n/LocalStrings_pt_PT.properties | 2 - .../docking/_i18n/LocalStrings_ru.properties | 2 - .../docking/_i18n/LocalStrings_sq.properties | 2 - .../_i18n/LocalStrings_zh_CN.properties | 2 - .../_i18n/LocalStrings_zh_TW.properties | 2 - .../java/org/olat/core/util/FileUtils.java | 2 +- .../util/openxml/HTMLToOpenXMLHandler.java | 55 +- .../core/util/openxml/OpenXMLDocument.java | 131 +- .../core/util/openxml/_resources/styles.xml | 74 +- .../olat/course/nodes/DialogCourseNode.java | 12 +- .../org/olat/course/nodes/FOCourseNode.java | 155 +- .../DialogCourseNodeEditController.java | 2 +- .../nodes/dialog/DialogNodeForumCallback.java | 12 + .../nodes/fo/FOCourseNodeEditController.java | 46 +- .../nodes/fo/FOCourseNodeRunController.java | 74 +- .../course/nodes/fo/FOPeekviewController.java | 49 +- .../course/nodes/fo/FOPreviewController.java | 2 + .../course/nodes/fo/SettingsController.java | 112 + .../course/nodes/fo/_content/peekview.html | 13 +- .../nodes/fo/_i18n/LocalStrings_de.properties | 8 +- .../nodes/fo/_i18n/LocalStrings_en.properties | 8 +- .../olat/modules/_spring/modulesContext.xml | 22 + .../dialog/DialogElementsController.java | 4 +- .../olat/modules/fo/DemoForumCallback.java | 70 - .../modules/fo/FilterForUserController.java | 777 ------- .../org/olat/modules/fo/ForumCallback.java | 19 +- .../olat/modules/fo/ForumChangedEvent.java | 27 +- .../org/olat/modules/fo/ForumController.java | 1797 ----------------- .../java/org/olat/modules/fo/ForumHelper.java | 124 +- .../org/olat/modules/fo/ForumImpl.hbm.xml | 18 - .../java/org/olat/modules/fo/ForumImpl.java | 54 - .../olat/modules/fo/ForumLoggingAction.java | 2 +- .../org/olat/modules/fo/ForumManager.java | 728 ------- .../fo/ForumMessagesTableDataModel.java | 78 - .../java/org/olat/modules/fo/ForumModule.java | 97 + .../modules/fo/ForumNotificationsHandler.java | 1 + .../fo/ForumThreadViewModeController.java | 151 -- .../org/olat/modules/fo/ForumUIFactory.java | 1 + .../java/org/olat/modules/fo/Message.java | 61 +- .../org/olat/modules/fo/MessageImpl.hbm.xml | 49 - .../java/org/olat/modules/fo/MessageImpl.java | 205 -- .../org/olat/modules/fo/MessageLight.java | 57 + .../java/org/olat/modules/fo/MessageRef.java | 34 + .../olat/modules/fo/QuoteAndTagFilter.java | 11 +- .../org/olat/modules/fo/ReadMessage.hbm.xml | 26 - .../java/org/olat/modules/fo/ReadMessage.java | 46 - .../org/olat/modules/fo/ReadMessageImpl.java | 66 - .../modules/fo/ThreadColumnDescriptor.java | 387 ---- .../fo/_content/attachments-editview.html | 14 - .../modules/fo/_content/filter_for_user.html | 8 - .../olat/modules/fo/_content/filter_view.html | 4 - .../olat/modules/fo/_content/msg-preview.html | 21 - .../olat/modules/fo/_content/threadview.html | 179 -- .../fo/_i18n/LocalStrings_de.properties | 15 + .../fo/_i18n/LocalStrings_en.properties | 14 +- .../fo/_i18n/LocalStrings_fr.properties | 2 + .../fo/archiver/ForumArchiveManager.java | 4 +- .../fo/{ => archiver}/MessageNode.java | 86 +- .../formatters/ForumDownloadResource.java | 177 ++ .../archiver/formatters/ForumFormatter.java | 14 +- .../formatters/ForumOpenXMLFormatter.java | 214 ++ .../formatters/ForumRTFFormatter.java | 32 +- .../formatters/ForumStreamedRTFFormatter.java | 44 +- .../olat/modules/fo/manager/ForumManager.java | 974 +++++++++ .../org/olat/modules/fo/model/ForumImpl.java | 126 ++ .../olat/modules/fo/model/ForumThread.java | 111 + .../org/olat/modules/fo/model/ForumUser.java | 84 + .../modules/fo/model/ForumUserStatistics.java | 106 + .../olat/modules/fo/model/MessageImpl.java | 311 +++ .../modules/fo/model/MessageLightImpl.java | 184 ++ .../modules/fo/model/MessagePeekviewImpl.java | 121 ++ .../olat/modules/fo/model/MessageRefImpl.java | 77 + .../modules/fo/model/MessageStatistics.java | 152 ++ .../modules/fo/model/ReadMessageImpl.java | 143 ++ .../fo/portfolio/ForumArtefactHandler.java | 2 +- .../fo/restapi/ForumCourseNodeWebService.java | 11 +- .../fo/restapi/ForumImportWebService.java | 2 +- .../modules/fo/restapi/ForumWebService.java | 11 +- .../fo/restapi/MyForumsWebService.java | 4 +- .../modules/fo/ui/ForumAdminController.java | 126 ++ .../olat/modules/fo/ui/ForumController.java | 369 ++++ .../modules/fo/ui/ForumMessageDataModel.java | 112 + .../fo/ui/ForumMessageListController.java | 232 +++ .../modules/fo/ui/ForumUserDataModel.java | 116 ++ .../fo/ui/ForumUserListController.java | 177 ++ .../modules/fo/ui/IndentCellRenderer.java | 59 + .../fo/{ => ui}/MessageEditController.java | 369 ++-- .../olat/modules/fo/ui/MessageLightView.java | 123 ++ .../modules/fo/ui/MessageListController.java | 1173 +++++++++++ .../olat/modules/fo/ui/MessagePeekview.java | 40 + .../org/olat/modules/fo/ui/MessageView.java | 221 ++ .../modules/fo/ui/StatusTypeCellRenderer.java | 63 + .../modules/fo/ui/StickyCellRenderer.java | 61 + .../modules/fo/ui/ThreadListController.java | 260 +++ .../modules/fo/ui/ThreadListDataModel.java | 155 ++ .../fo/ui/_content/attachments-editview.html | 14 + .../olat/modules/fo/ui/_content/forum.html | 4 + .../modules/fo/ui/_content/msg-preview.html | 17 + .../_content/threads.html} | 17 +- .../modules/fo/ui/_content/threadview.html | 198 ++ .../modules/fo/ui/_content/user_list.html | 4 + .../fo/ui/events/SelectMessageEvent.java | 58 + .../modules/fo/ui/events/SelectUserEvent.java | 69 + .../events/SelectUserListEvent.java} | 30 +- .../olat/modules/wiki/WikiForumCallback.java | 5 + .../olat/modules/wiki/WikiMainController.java | 4 +- ...PageChangeOrCreateNotificationHandler.java | 2 +- .../java/org/olat/portfolio/EPUIFactory.java | 13 +- .../portfolio/manager/EPArtefactManager.java | 28 + .../portfolio/manager/EPFrontendManager.java | 4 + .../ArtefactWizzardStepsController.java | 49 +- .../search/service/indexer/ForumIndexer.java | 2 +- .../indexer/group/GroupForumIndexer.java | 2 +- .../course/DialogCourseNodeIndexer.java | 2 +- .../course/FOCourseNodeIndexer.java | 2 +- .../java/org/olat/user/UserPropertiesRow.java | 20 +- .../_spring/userPropertiesContext.xml | 20 + .../logging/activity/LoggingResourceable.java | 11 +- src/main/resources/META-INF/persistence.xml | 10 +- .../database/mysql/alter_10_3_4_to_10_4_0.sql | 6 + .../database/mysql/setupDatabase.sql | 7 +- .../oracle/alter_10_3_4_to_10_4_0.sql | 6 + .../database/oracle/setupDatabase.sql | 4 +- .../postgresql/alter_10_3_4_to_10_4_0.sql | 7 + .../database/postgresql/setupDatabase.sql | 4 +- .../static/themes/light/modules/_forum.scss | 4 + .../static/themes/light/modules/_icons.scss | 6 + src/main/webapp/static/themes/light/theme.css | 2 +- .../webapp/static/themes/light/theme.css.map | 2 +- .../themes/light/theme_ie_completions.css | 2 +- .../org/olat/modules/fo/ForumManagerTest.java | 296 +-- src/test/java/org/olat/restapi/ForumTest.java | 22 +- .../java/org/olat/restapi/GroupMgmtTest.java | 22 +- .../org/olat/restapi/NotificationsTest.java | 6 +- .../java/org/olat/restapi/UserMgmtTest.java | 10 +- 164 files changed, 8187 insertions(+), 5852 deletions(-) rename src/main/java/org/olat/core/gui/{control/generic/docking/DockLayoutControllerCreatorCallback.java => components/form/flexible/impl/elements/table/FlexiTableRowCssDelegate.java} (52%) delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/DockController.java delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/DockModule.java delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_content/docked.html delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ar.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_bg.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_cs.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_da.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_de.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_el.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_en.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_es.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fa.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fr.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_it.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_jp.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_lt.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_nl_NL.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pl.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_BR.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_PT.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ru.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_sq.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_CN.properties delete mode 100644 src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_TW.properties create mode 100644 src/main/java/org/olat/course/nodes/fo/SettingsController.java delete mode 100644 src/main/java/org/olat/modules/fo/DemoForumCallback.java delete mode 100644 src/main/java/org/olat/modules/fo/FilterForUserController.java delete mode 100644 src/main/java/org/olat/modules/fo/ForumController.java delete mode 100644 src/main/java/org/olat/modules/fo/ForumImpl.hbm.xml delete mode 100644 src/main/java/org/olat/modules/fo/ForumImpl.java delete mode 100644 src/main/java/org/olat/modules/fo/ForumManager.java delete mode 100644 src/main/java/org/olat/modules/fo/ForumMessagesTableDataModel.java create mode 100644 src/main/java/org/olat/modules/fo/ForumModule.java delete mode 100644 src/main/java/org/olat/modules/fo/ForumThreadViewModeController.java delete mode 100644 src/main/java/org/olat/modules/fo/MessageImpl.hbm.xml delete mode 100644 src/main/java/org/olat/modules/fo/MessageImpl.java create mode 100644 src/main/java/org/olat/modules/fo/MessageLight.java create mode 100644 src/main/java/org/olat/modules/fo/MessageRef.java delete mode 100644 src/main/java/org/olat/modules/fo/ReadMessage.hbm.xml delete mode 100644 src/main/java/org/olat/modules/fo/ReadMessage.java delete mode 100644 src/main/java/org/olat/modules/fo/ReadMessageImpl.java delete mode 100644 src/main/java/org/olat/modules/fo/ThreadColumnDescriptor.java delete mode 100644 src/main/java/org/olat/modules/fo/_content/attachments-editview.html delete mode 100644 src/main/java/org/olat/modules/fo/_content/filter_for_user.html delete mode 100644 src/main/java/org/olat/modules/fo/_content/filter_view.html delete mode 100644 src/main/java/org/olat/modules/fo/_content/msg-preview.html delete mode 100644 src/main/java/org/olat/modules/fo/_content/threadview.html rename src/main/java/org/olat/modules/fo/{ => archiver}/MessageNode.java (71%) create mode 100644 src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java create mode 100644 src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java create mode 100644 src/main/java/org/olat/modules/fo/manager/ForumManager.java create mode 100644 src/main/java/org/olat/modules/fo/model/ForumImpl.java create mode 100644 src/main/java/org/olat/modules/fo/model/ForumThread.java create mode 100644 src/main/java/org/olat/modules/fo/model/ForumUser.java create mode 100644 src/main/java/org/olat/modules/fo/model/ForumUserStatistics.java create mode 100644 src/main/java/org/olat/modules/fo/model/MessageImpl.java create mode 100644 src/main/java/org/olat/modules/fo/model/MessageLightImpl.java create mode 100644 src/main/java/org/olat/modules/fo/model/MessagePeekviewImpl.java create mode 100644 src/main/java/org/olat/modules/fo/model/MessageRefImpl.java create mode 100644 src/main/java/org/olat/modules/fo/model/MessageStatistics.java create mode 100644 src/main/java/org/olat/modules/fo/model/ReadMessageImpl.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumAdminController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumUserDataModel.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ForumUserListController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java rename src/main/java/org/olat/modules/fo/{ => ui}/MessageEditController.java (57%) create mode 100644 src/main/java/org/olat/modules/fo/ui/MessageLightView.java create mode 100644 src/main/java/org/olat/modules/fo/ui/MessageListController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/MessagePeekview.java create mode 100644 src/main/java/org/olat/modules/fo/ui/MessageView.java create mode 100644 src/main/java/org/olat/modules/fo/ui/StatusTypeCellRenderer.java create mode 100644 src/main/java/org/olat/modules/fo/ui/StickyCellRenderer.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ThreadListController.java create mode 100644 src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java create mode 100644 src/main/java/org/olat/modules/fo/ui/_content/attachments-editview.html create mode 100644 src/main/java/org/olat/modules/fo/ui/_content/forum.html create mode 100644 src/main/java/org/olat/modules/fo/ui/_content/msg-preview.html rename src/main/java/org/olat/modules/fo/{_content/list_titles.html => ui/_content/threads.html} (51%) create mode 100644 src/main/java/org/olat/modules/fo/ui/_content/threadview.html create mode 100644 src/main/java/org/olat/modules/fo/ui/_content/user_list.html create mode 100644 src/main/java/org/olat/modules/fo/ui/events/SelectMessageEvent.java create mode 100644 src/main/java/org/olat/modules/fo/ui/events/SelectUserEvent.java rename src/main/java/org/olat/modules/fo/{OpenMessageInThreadEvent.java => ui/events/SelectUserListEvent.java} (60%) diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java index 0b72306f9f3..14b9d596574 100644 --- a/src/main/java/org/olat/collaboration/CollaborationTools.java +++ b/src/main/java/org/olat/collaboration/CollaborationTools.java @@ -65,6 +65,7 @@ import org.olat.core.util.ZipUtil; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.coordinate.SyncerExecutor; +import org.olat.core.util.i18n.I18nModule; import org.olat.core.util.mail.ContactMessage; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.Quota; @@ -83,11 +84,11 @@ import org.olat.instantMessaging.ui.ChatToolController; import org.olat.modules.co.ContactFormController; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.ForumUIFactory; import org.olat.modules.fo.archiver.ForumArchiveManager; import org.olat.modules.fo.archiver.formatters.ForumFormatter; import org.olat.modules.fo.archiver.formatters.ForumRTFFormatter; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.openmeetings.OpenMeetingsModule; import org.olat.modules.openmeetings.manager.OpenMeetingsException; import org.olat.modules.openmeetings.manager.OpenMeetingsManager; @@ -260,6 +261,11 @@ public class CollaborationTools implements Serializable { titleInfo.setSeparatorEnabled(true); Controller forumController = ForumUIFactory.getTitledForumController(ureq, wControl, forum, new ForumCallback() { + @Override + public boolean mayUsePseudonym() { + return false; + } + public boolean mayOpenNewThread() { return true; } @@ -878,7 +884,7 @@ public class CollaborationTools implements Serializable { VFSContainer archiveContainer = new LocalFolderImpl(new File(archivFilePath)); String archiveForumName = "del_forum_" + forumKeyProperty.getLongValue(); VFSContainer archiveForumContainer = archiveContainer.createChildContainer(archiveForumName); - ForumFormatter ff = new ForumRTFFormatter(archiveForumContainer, false); + ForumFormatter ff = new ForumRTFFormatter(archiveForumContainer, false, I18nModule.getDefaultLocale()); ForumArchiveManager.getInstance().applyFormatter(ff, forumKeyProperty.getLongValue(), null); } } diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java index 08f16299538..06c177f9956 100644 --- a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java +++ b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java @@ -229,7 +229,6 @@ public class CollaborationToolsSettingsController extends BasicController { // update quota form: only show when enabled if (collabTools.isToolEnabled(CollaborationTools.TOOL_FOLDER)) { vc_collabtools.contextPut("folderToolEnabled", Boolean.TRUE); - //fxdiff VCRP-8: collaboration tools folder access control if(folderForm != null) { removeAsListenerAndDispose(folderForm); } @@ -245,7 +244,6 @@ public class CollaborationToolsSettingsController extends BasicController { } else { vc_collabtools.contextPut("folderToolEnabled", Boolean.FALSE); } - } else if (source == newsController) { if (event.equals(Event.DONE_EVENT)) { String news = newsController.getNewsValue(); diff --git a/src/main/java/org/olat/core/commons/services/image/ImageUtils.java b/src/main/java/org/olat/core/commons/services/image/ImageUtils.java index 2fc5055c247..f712d576518 100644 --- a/src/main/java/org/olat/core/commons/services/image/ImageUtils.java +++ b/src/main/java/org/olat/core/commons/services/image/ImageUtils.java @@ -68,8 +68,10 @@ public class ImageUtils { try { ImageInputStream stream = new MemoryCacheImageInputStream(in); reader.setInput(stream); - int width = reader.getWidth(reader.getMinIndex()); - int height = reader.getHeight(reader.getMinIndex()); + + int imageIndex = reader.getMinIndex(); + int width = reader.getWidth(imageIndex); + int height = reader.getHeight(imageIndex); result = new Size(width, height, 0, 0, false); } catch (IOException e) { log.error(e.getMessage()); @@ -82,4 +84,46 @@ public class ImageUtils { } return result; } + /* + public int getPngResolution() throws IOException { + ImageInputStream imageInput = ImageIO.createImageInputStream(f); + Iterator it = ImageIO.getImageReaders(imageInput); + ImageReader reader = (ImageReader) it.next(); + + reader.setInput(imageInput); + IIOMetadata meta = reader.getImageMetadata(0); + org.w3c.dom.Node n = meta.getAsTree("javax_imageio_1.0"); + n = n.getFirstChild(); + + while (n != null) { + if (n.getNodeName().equals("Dimension")) { + org.w3c.dom.Node n2 = n.getFirstChild(); + + while (n2 != null) { + if (n2.getNodeName().equals("HorizontalPixelSize")) { + org.w3c.dom.NamedNodeMap nnm = n2.getAttributes(); + org.w3c.dom.Node n3 = nnm.item(0); + float hps = Float.parseFloat(n3.getNodeValue()); + xDPI = Math.round(25.4f / hps); + } + if (n2.getNodeName().equals("VerticalPixelSize")) { + org.w3c.dom.NamedNodeMap nnm = n2.getAttributes(); + org.w3c.dom.Node n3 = nnm.item(0); + float vps = Float.parseFloat(n3.getNodeValue()); + yDPI = Math.round(25.4f / vps); + } + n2 = n2.getNextSibling(); + } + } + n = n.getNextSibling(); + } + + if (xDPI == yDPI) { + resolution = xDPI; + } else { + resolution = 0; + } + return resolution; + } + */ } diff --git a/src/main/java/org/olat/core/commons/services/mark/impl/MarkManagerImpl.java b/src/main/java/org/olat/core/commons/services/mark/impl/MarkManagerImpl.java index 19c12415af4..9c2c34997ef 100644 --- a/src/main/java/org/olat/core/commons/services/mark/impl/MarkManagerImpl.java +++ b/src/main/java/org/olat/core/commons/services/mark/impl/MarkManagerImpl.java @@ -58,20 +58,18 @@ public class MarkManagerImpl implements MarkManager { StringBuilder sb = new StringBuilder(); sb.append("select mark from ").append(MarkImpl.class.getName()).append(" mark where ") .append("mark.resId=:resId and mark.resName=:resName and mark.creator=:creator"); - if(!subPath.isEmpty()) { + if(subPath != null && !subPath.isEmpty()) { sb.append(" and mark.resSubPath in (:resSubPaths)"); } - TypedQuery<Mark> query = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Mark.class); - query.setParameter("resName", ores.getResourceableTypeName()); - query.setParameter("resId", ores.getResourceableId()); - query.setParameter("creator", identity); - if(!subPath.isEmpty()) { + TypedQuery<Mark> query = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Mark.class) + .setParameter("resName", ores.getResourceableTypeName()) + .setParameter("resId", ores.getResourceableId()) + .setParameter("creator", identity); + if(subPath != null && !subPath.isEmpty()) { query.setParameter("resSubPaths", subPath); } - - List<Mark> results = query.getResultList(); - return results; + return query.getResultList(); } @Override diff --git a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java index 4c38b37448c..f6e92aa362d 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java +++ b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java @@ -55,7 +55,7 @@ public abstract class NotificationsManager extends BasicManager { * * @see org.olat.core.commons.services.notifications.NotificationsHandler and the corresponding code * in such as - * @see org.olat.modules.fo.ForumController where you add the subscription stuff + * @see org.olat.modules.fo.ui.ForumController where you add the subscription stuff * to the constructor and for the action that creates a new entry you have * to inform the * @see org.olat.core.commons.services.notifications.manager.NotificationsManagerImpl#markPublisherNews(SubscriptionContext, diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java index ea6974d4d8d..910a4210ac8 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java @@ -35,6 +35,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColum import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponentDelegate; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRowCssDelegate; import org.olat.core.gui.components.velocity.VelocityContainer; /** @@ -126,6 +127,10 @@ public interface FlexiTableElement extends FormItem { */ public void setWrapperSelector(String wrapperSelector); + public FlexiTableRowCssDelegate getRowCssDelegate(); + + public void setRowCssDelegate(FlexiTableRowCssDelegate rowCssDelegate); + /** * * @return diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java index 94014c0c885..e98e0100b14 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableClassicRenderer.java @@ -141,8 +141,14 @@ class FlexiTableClassicRenderer extends AbstractFlexiTableRenderer implements Co // use alternating css class int numOfColumns = 0; - target.append("<tr id='").append(rowIdPrefix).append(row) - .append("'>"); + target.append("<tr id='").append(rowIdPrefix).append(row).append("'"); + if(ftE.getRowCssDelegate() != null) { + String cssClass = ftE.getRowCssDelegate().getRowCssClass(row); + if(StringHelper.containsNonWhitespace(cssClass)) { + target.append(" class='").append(cssClass).append("'"); + } + } + target.append(">"); if(ftE.isMultiSelect()) { target.append("<td>") diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index dc8186eac41..9f040928bab 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -120,6 +120,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private final WindowControl wControl; private String wrapperSelector; + private FlexiTableRowCssDelegate rowCssDelegate; private SortKey[] orderBy; private FlexiTableSortOptions sortOptions; @@ -294,6 +295,14 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle this.wrapperSelector = wrapperSelector; } + public FlexiTableRowCssDelegate getRowCssDelegate() { + return rowCssDelegate; + } + + public void setRowCssDelegate(FlexiTableRowCssDelegate rowCssDelegate) { + this.rowCssDelegate = rowCssDelegate; + } + @Override public FlexiTableComponent getComponent() { return component; diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/DockLayoutControllerCreatorCallback.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableRowCssDelegate.java similarity index 52% rename from src/main/java/org/olat/core/gui/control/generic/docking/DockLayoutControllerCreatorCallback.java rename to src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableRowCssDelegate.java index 9be1dd337f2..1f5e255ecf4 100644 --- a/src/main/java/org/olat/core/gui/control/generic/docking/DockLayoutControllerCreatorCallback.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableRowCssDelegate.java @@ -17,31 +17,16 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.core.gui.control.generic.docking; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.control.creator.ControllerCreator; +package org.olat.core.gui.components.form.flexible.impl.elements.table; /** - * Description:<br> - * This callback provides methods to create the layout controller and a - * possibility to execute code after the cloning took place and the cloned - * content opened in a new window. - * - * <P> - * Initial Date: 24.03.2009 <br> * - * @author gnaegi + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * */ -public interface DockLayoutControllerCreatorCallback { +public interface FlexiTableRowCssDelegate { - /** - * This method is called when the content should be docked to create a - * controller creator - * - * @param ureq - * @param contentControllerCreator - * @return - */ - public ControllerCreator createLayoutControllerCreator(UserRequest ureq, ControllerCreator contentControllerCreator); + public String getRowCssClass(int pos); + } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java index d71ecedffd5..cb1f1815aab 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java @@ -68,10 +68,18 @@ public class SortableFlexiTableModelDelegate<T> { return columnIndex; } + public boolean isAsc() { + return asc; + } + public Collator getCollator() { return collator; } + public SortableFlexiTableDataModel<T> getTableModel() { + return tableModel; + } + public List<T> sort() { int rowCount = tableModel.getRowCount(); List<T> rows = new ArrayList<>(rowCount); @@ -149,6 +157,20 @@ public class SortableFlexiTableModelDelegate<T> { return ba? (bb? 0: -1):(bb? 1: 0); } + public class ReverseComparator implements Comparator<T> { + + private final Comparator<T> delegate; + + public ReverseComparator(Comparator<T> delegate) { + this.delegate = delegate; + } + + @Override + public int compare(T o1, T o2) { + return -1 * delegate.compare(o1, o2); + } + } + public class DefaultComparator implements Comparator<T> { @Override diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java b/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java deleted file mode 100644 index bd293563e24..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java +++ /dev/null @@ -1,217 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -* <p> -*/ - -package org.olat.core.gui.control.generic.docking; - -import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.panel.StackedPanel; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowBackOffice; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.control.creator.ControllerCreator; -import org.olat.core.gui.control.info.WindowControlInfo; -import org.olat.core.id.context.BusinessControl; - -/** - * Initial Date: 05.01.2006 - * Allows to undock/dock a controller out of its original screen part into a new browser window. - * @author Felix Jost - */ -public class DockController extends BasicController { - private static final String CMD_UNDOCK = "ud"; - - private VelocityContainer mainVC; - private StackedPanel panel; - private DockLayoutControllerCreatorCallback layoutCreator; - - Controller controller; - DelegatingWControl delegWControl; - private final boolean disposeWhenFloating; - - /** - * - * @param ureq - * @param wControl - * @param disposeWhenFloating if true, the floating window will be disposed when the controller where it was originally created is disposed. if false, the undocked window will live independently. - * @param controllerCreator the creator of the controller to be made undockable - * @param afterDockingCallback the callback to be called when docking process is finished or NULL - * @param the layout creator used to wrap the content controller - */ - public DockController(UserRequest ureq, WindowControl wControl, boolean disposeWhenFloating, ControllerCreator controllerCreator, DockLayoutControllerCreatorCallback layoutCreator) { - super(ureq, wControl); - this.disposeWhenFloating = disposeWhenFloating; - this.layoutCreator = layoutCreator; - mainVC = createVelocityContainer("docked"); - /* - * delegate window control to new basis window (clientside new browserwindow) - * -> take controller out of main window and set the controller into the new window - * -> info / warn / error message, push, pop is then relative to the new window - */ - delegWControl = new DelegatingWControl(); - delegWControl.setDelegate(getWindowControl()); - - Controller c = controllerCreator.createController(ureq, delegWControl); - // don't use auto dispose feature from basic controller, this is a special case - this.controller = c; - mainVC.put("controllerComp", c.getInitialComponent()); - mainVC.contextPut("winid", "w" + mainVC.getDispatchID()); - - panel = putInitialPanel(mainVC); - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - public void event(UserRequest ureq, Component source, Event event) { - if (source == mainVC) { - if (event.getCommand().equals(CMD_UNDOCK)) { - panel.setContent(null); - // pop up in new browser window - ControllerCreator undockControllerCreator = new ControllerCreator() { - public Controller createController(UserRequest lureq,WindowControl lwControl) { - delegWControl.setDelegate(lwControl); - return new LayoutMain3ColsController(lureq, delegWControl, controller); - } - }; - - ControllerCreator newWindowContent; - if(layoutCreator != null){ - //wrap with layout - newWindowContent = layoutCreator.createLayoutControllerCreator(ureq, undockControllerCreator); - }else{ - //use default layout - newWindowContent = undockControllerCreator; - } - openInNewBrowserWindow(ureq, newWindowContent); - } - } - } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ - protected void doDispose() { - if (disposeWhenFloating) { - if (controller != null) controller.dispose(); - } // else nothing to do - } - //fxdiff BAKS-7 Resume function - public Controller getController() { - return controller; - } - -} - -class DelegatingWControl implements WindowControl { - private WindowControl origWCon; - - void setDelegate(WindowControl delegWCon) { - origWCon = delegWCon; - } - - /** - * @see org.olat.core.gui.control.WindowControl#getWindowControlInfo() - */ - public WindowControlInfo getWindowControlInfo() { - return origWCon.getWindowControlInfo(); - } - - /** - * @see org.olat.core.gui.control.WindowControl#makeFlat() - */ - public void makeFlat() { - origWCon.makeFlat(); - } - - /** - * @see org.olat.core.gui.control.WindowControl#pop() - */ - public void pop() { - origWCon.pop(); - } - - /** - * @see org.olat.core.gui.control.WindowControl#pushAsModalDialog(java.lang.String, - * org.olat.core.gui.components.Component) - */ - public void pushAsModalDialog(Component comp) { - origWCon.pushAsModalDialog(comp); - } - - @Override - public void pushAsCallout(Component comp, String targetId) { - origWCon.pushAsCallout(comp, targetId); - } - - /** - * @see org.olat.core.gui.control.WindowControl#pushToMainArea(org.olat.core.gui.components.Component) - */ - public void pushToMainArea(Component comp) { - origWCon.pushToMainArea(comp); - } - - /** - * @see org.olat.core.gui.control.WindowControl#setError(java.lang.String) - */ - public void setError(String string) { - origWCon.setError(string); - } - - /** - * @see org.olat.core.gui.control.WindowControl#setInfo(java.lang.String) - */ - public void setInfo(String string) { - origWCon.setInfo(string); - } - - /** - * @see org.olat.core.gui.control.WindowControl#setWarning(java.lang.String) - */ - public void setWarning(String string) { - origWCon.setWarning(string); - } - - /* (non-Javadoc) - * @see org.olat.core.gui.control.WindowControl#getBusinessControl() - */ - public BusinessControl getBusinessControl() { - return origWCon.getBusinessControl(); - } - - /* (non-Javadoc) - * @see org.olat.core.gui.control.WindowControl#getWindowBackOffice() - */ - public WindowBackOffice getWindowBackOffice() { - return origWCon.getWindowBackOffice(); - } - -} \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/DockModule.java b/src/main/java/org/olat/core/gui/control/generic/docking/DockModule.java deleted file mode 100644 index 917e21e5e0e..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/DockModule.java +++ /dev/null @@ -1,47 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -* <p> -*/ -package org.olat.core.gui.control.generic.docking; - - -/** - * Description:<br> - * TODO: Felix Jost Class Description for Trans - * - * <P> - * Initial Date: 24.01.2007 <br> - * @author Felix Jost, http://www.goodsolutions.ch - */ -public class DockModule { - - /** - * - */ - public DockModule() { - // - } - - -} diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_content/docked.html b/src/main/java/org/olat/core/gui/control/generic/docking/_content/docked.html deleted file mode 100644 index cdc14448561..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_content/docked.html +++ /dev/null @@ -1,19 +0,0 @@ -<script type="text/javascript"> -function $r.getId("undf")() { - try { - jQuery('#$r.getId("undck")').each(function(index, el){ - el.style.display = 'none'; - ## for IE specialwurscht... - jQuery(el).attr("style","display:none"); - }); - var ww = window.open("$r.commandURI("ud")", "$winid", "height=400, width=800, left=0, top=0, location=no, menubar=no, resizable=yes, scrollbars=yes, toolbar=no"); - ww.focus(); - } catch(e) { - if(jQuery(document).ooLog().isDebugEnabled()) jQuery(document).ooLog('debug','Error when trying to dock div id::$r.getId("undck")' , "org.olat.core.gui.control.generic.docking._content.docked.html"); - } -} -</script> -<div id="$r.getId("undck")"> - <a class="o_content_popup" href="javascript:$r.getId("undf")()" title="$r.translateInAttribute("command.undock")"><i class="o_icon o_icon_content_popup o_icon-lg"></i></a> - $r.render("controllerComp") -</div> \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ar.properties deleted file mode 100644 index 4397b69fda4..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ar.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sun Feb 14 22:21:39 CET 2010 -command.undock=\u0641\u062A\u062D \u0641\u0649 \u0646\u0627\u0641\u0630\u0629 \u062C\u062F\u064A\u062F\u0629 diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_bg.properties deleted file mode 100644 index 434e8040e9c..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_bg.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu May 21 20:39:46 CEST 2009 -command.undock=\u041E\u0442\u0432\u043E\u0440\u0435\u0442\u0435 \u0432 \u043D\u043E\u0432 \u043F\u0440\u043E\u0437\u043E\u0440\u0435\u0446 diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_cs.properties deleted file mode 100644 index c99665f46fa..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_cs.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:13 CET 2009 -command.undock=Otev\u0159\u00EDt v nov\u00E9m okn\u011B diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_da.properties deleted file mode 100644 index e2cfd947c53..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_da.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:08 CET 2009 -command.undock=Undock diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_de.properties deleted file mode 100644 index 54e971d2106..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_de.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:04 CET 2009 -command.undock=In neuem Fenster \u00F6ffnen diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_el.properties deleted file mode 100644 index 57ed48a1396..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_el.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:15 CET 2009 -command.undock=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE \u03C3\u03B5 \u03BD\u03AD\u03BF \u03C0\u03B1\u03C1\u03AC\u03B8\u03C5\u03C1\u03BF diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_en.properties deleted file mode 100644 index 177e871fe14..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_en.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Jan 22 19:24:37 CET 2010 -command.undock=Open in new window diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_es.properties deleted file mode 100644 index 1d113a77438..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_es.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:20 CET 2009 -command.undock=Quitar de la plataforma diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fa.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fa.properties deleted file mode 100644 index 1243be6669c..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fa.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:12 CET 2009 -command.undock=Undock diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fr.properties deleted file mode 100644 index 5b0e5e6af2b..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_fr.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sun Sep 05 16:10:32 CEST 2010 -command.undock=Ouvrir dans une nouvelle fen\u00EAtre diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_it.properties deleted file mode 100644 index 9be32a90ac1..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_it.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Sep 03 14:45:54 CEST 2010 -command.undock=Aprire in nuova finestra diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_jp.properties deleted file mode 100644 index a96a80d0564..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_jp.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:01 CET 2009 -command.undock=\u65B0\u3057\u3044\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u8868\u793A\u3059\u308B diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_lt.properties deleted file mode 100644 index b6fae984a1b..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_lt.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:02 CET 2009 -command.undock=Atsijungti diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_nl_NL.properties deleted file mode 100644 index 19288049136..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_nl_NL.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:21 CET 2009 -command.undock=Open in nieuw venster diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pl.properties deleted file mode 100644 index 3f37e5993fb..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pl.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:16 CET 2009 -command.undock=Otw\u00F3rz w nowym oknie diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_BR.properties deleted file mode 100644 index ee7b2a44fce..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_BR.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:53:59 CET 2009 -command.undock=Abrir em uma nova janela diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_PT.properties deleted file mode 100644 index 402931f52f5..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_pt_PT.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:04 CET 2009 -command.undock=Abrir em uma nova janela diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ru.properties deleted file mode 100644 index 4b331a31fb4..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_ru.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:18 CET 2009 -command.undock=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435 diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_sq.properties deleted file mode 100644 index 772fb559109..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_sq.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:11 CET 2009 -command.undock=Hape n\u00EB nj\u00EB dritare t\u00EB re diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_CN.properties deleted file mode 100644 index c253a37064a..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_CN.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:03 CET 2009 -command.undock=\u5728\u65B0\u7A97\u53E3\u4E2D\u6253\u5F00 diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_TW.properties deleted file mode 100644 index 39e0944dd0e..00000000000 --- a/src/main/java/org/olat/core/gui/control/generic/docking/_i18n/LocalStrings_zh_TW.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Mar 02 09:54:06 CET 2009 -command.undock=\u5728\u65B0\u8996\u7A97\u958B\u555F diff --git a/src/main/java/org/olat/core/util/FileUtils.java b/src/main/java/org/olat/core/util/FileUtils.java index ddb64864964..1d38010a2ab 100644 --- a/src/main/java/org/olat/core/util/FileUtils.java +++ b/src/main/java/org/olat/core/util/FileUtils.java @@ -1021,7 +1021,7 @@ public class FileUtils { public static String appendNumberAtTheEndOfFilename(String name, int number) { // Try to match the file to the pattern "[name].[extension]" Matcher m = fileNamePattern.matcher(name); - StringBuffer newName = new StringBuffer(); + StringBuilder newName = new StringBuilder(); if (m.matches()) { newName.append(m.group(1)).append(number); if (m.group(2) != null) { diff --git a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java index 1f6b681af7e..8b43222e01a 100644 --- a/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java +++ b/src/main/java/org/olat/core/util/openxml/HTMLToOpenXMLHandler.java @@ -25,7 +25,9 @@ import java.util.Collections; import java.util.Deque; import java.util.List; +import org.olat.core.util.StringHelper; import org.olat.core.util.openxml.OpenXMLDocument.ListParagraph; +import org.olat.core.util.openxml.OpenXMLDocument.Spacing; import org.olat.core.util.openxml.OpenXMLDocument.Style; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -45,6 +47,7 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { private boolean latex = false; private StringBuilder textBuffer; + private Spacing startSpacing; private final OpenXMLDocument factory; @@ -60,6 +63,11 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { this.currentParagraph = paragraph; } + public HTMLToOpenXMLHandler(OpenXMLDocument document, Spacing spacing) { + this.factory = document; + this.startSpacing = spacing; + } + /** * Flush the text if a new paragraph is created. Trailing text is flushed * in the previous paragraph. @@ -73,8 +81,24 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { flushText(); addContent(currentParagraph); } - currentParagraph = factory.createParagraphEl(); + if(startSpacing == null) { + currentParagraph = factory.createParagraphEl(); + } else { + currentParagraph = factory.createParagraphEl(startSpacing); + startSpacing = null;//consumed + } + } + return currentParagraph; + } + + private Element appendParagraph(Spacing spacing) { + //flush the text + if(textBuffer != null) { + flushText(); + addContent(currentParagraph); } + + currentParagraph = factory.createParagraphEl(spacing); return currentParagraph; } @@ -122,12 +146,12 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { } } else { Element currentRun = getCurrentRun(); - String content = textBuffer.toString(); - if(content.length() > 0 && Character.isSpaceChar(content.charAt(0))) { + String text = textBuffer.toString(); + if(text.length() > 0 && Character.isSpaceChar(text.charAt(0))) { currentRun.appendChild(factory.createPreserveSpaceEl()); } - currentRun.appendChild(factory.createTextEl(content)); - if(content.length() > 1 && Character.isSpaceChar(content.charAt(content.length() - 1))) { + currentRun.appendChild(factory.createTextEl(text)); + if(text.length() > 1 && Character.isSpaceChar(text.charAt(text.length() - 1))) { currentRun.appendChild(factory.createPreserveSpaceEl()); } } @@ -269,6 +293,25 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { currentListParagraph = factory.createListParagraph(); } else if("li".equals(tag)) { getCurrentListParagraph(true); + } else if("div".equals(tag)) { + String cl = attributes.getValue("class"); + if(StringHelper.containsNonWhitespace(cl)) { + if(cl.contains("o_quote_author")) { + appendParagraph(new Spacing(180, 0)); + Style[] styles = setTextPreferences(Style.italic); + styleStack.add(new StyleStatus(tag, styles)); + } else if(cl.contains("o_quote_wrapper")) { + // + } else if(cl.contains("o_quote")) { + appendParagraph(new Spacing(120, 0)); + Style[] styles = setTextPreferences(Style.italic); + styleStack.add(new StyleStatus(tag, styles)); + } else { + styleStack.add(new StyleStatus(tag, new Style[0])); + } + } else { + styleStack.add(new StyleStatus(tag, new Style[0])); + } } } @@ -319,6 +362,8 @@ public class HTMLToOpenXMLHandler extends DefaultHandler { currentListParagraph = null; } else if("li".equals(tag)) { //do nothing + } else if("div".equals(tag)) { + popStyle(tag); } } diff --git a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java index b241cbe3591..a9e5c04e49a 100644 --- a/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java +++ b/src/main/java/org/olat/core/util/openxml/OpenXMLDocument.java @@ -182,7 +182,7 @@ public class OpenXMLDocument { List<Element> runsEl = new ArrayList<Element>(2); Element runEl = createRunEl(Collections.singletonList(textEl)); runsEl.add(runEl); - Element styleEl = createParagraphStyle(style.styleId()); + Element styleEl = createParagraphStyle(style.styleId(), style.runStyleId()); if(StringHelper.containsNonWhitespace(additionalText)) { //add an "insecable" blank between the title and the additional text Element blankRunEl = document.createElement("w:r"); @@ -208,6 +208,16 @@ public class OpenXMLDocument { Element paragraphEl = createParagraphEl(styleEl, runsEl); getCursor().appendChild(paragraphEl); } + + public void appendSubtitle(String text) { + Element textEl = createTextEl(text); + List<Element> runsEl = new ArrayList<Element>(2); + Element runEl = createRunEl(Collections.singletonList(textEl), Heading.subSubtleEmphasis.runStyleId()); + runsEl.add(runEl); + Element styleEl = createParagraphStyle(Heading.subSubtleEmphasis.styleId(), Heading.subSubtleEmphasis.runStyleId()); + Element paragraphEl = createParagraphEl(styleEl, runsEl); + getCursor().appendChild(paragraphEl); + } /* <w:sectPr w:rsidR="00F528BA" w:rsidRPr="00DF16C8" w:rsidSect="007347AA"> <w:pgSz w:w="11900" w:h="16840" /> @@ -295,7 +305,7 @@ public class OpenXMLDocument { } } - public void appendText(String text, boolean newParagraph, Style... styles) { + public void appendText(String text, boolean newParagraph, Style... textStyles) { if(!StringHelper.containsNonWhitespace(text)) return; List<Element> textEls = new ArrayList<Element>(); @@ -311,8 +321,8 @@ public class OpenXMLDocument { if(textEls.size() > 0) { Element paragraphEl = getParagraphToAppendTo(newParagraph); Element runEl = document.createElement("w:r"); - if(styles != null && styles.length > 0) { - runEl.appendChild(createRunPrefsEl(styles)); + if(textStyles != null && textStyles.length > 0) { + runEl.appendChild(createRunPrefsEl(textStyles)); } for(Element textEl:textEls) { runEl.appendChild(textEl); @@ -372,6 +382,19 @@ public class OpenXMLDocument { getCursor().appendChild(paragraphEl); } + public void appendHtmlText(String html, Spacing spacing) { + if(!StringHelper.containsNonWhitespace(html)) return; + try { + SAXParser parser = new SAXParser(); + parser.setContentHandler(new HTMLToOpenXMLHandler(this, spacing)); + parser.parse(new InputSource(new StringReader(html))); + } catch (SAXException e) { + log.error("", e); + } catch (IOException e) { + log.error("", e); + } + } + public void appendHtmlText(String html, boolean newParagraph) { if(!StringHelper.containsNonWhitespace(html)) return; try { @@ -394,12 +417,20 @@ public class OpenXMLDocument { /* <w:pPr> <w:pStyle w:val="berschrift1" /> + <w:rPr> + <w:rStyle w:val="SchwacheHervorhebung" /> + </w:rPr> </w:pPr> */ - public Element createParagraphStyle(String styleId) { + public Element createParagraphStyle(String styleId, String runStyleId) { Element paragraphEl = document.createElement("w:pPr"); Element styleEl = (Element)paragraphEl.appendChild(document.createElement("w:pStyle")); styleEl.setAttribute("w:val", styleId); + if(StringHelper.containsNonWhitespace(runStyleId)) { + Element runPrefsEl = (Element)paragraphEl.appendChild(document.createElement("w:rPr")); + Element rStyleEl = (Element)runPrefsEl.appendChild(document.createElement("w:rStyle")); + rStyleEl.setAttribute("w:val", runStyleId); + } return paragraphEl; } @@ -426,8 +457,33 @@ public class OpenXMLDocument { return paragraphEl; } + /* +<w:pPr> + <w:spacing w:before="120" w:after="120" w:beforeAutospacing="0" w:afterAutospacing="0"/> +</w:pPr> +*/ + public Element createParagraphEl(Spacing spacing) { + Element paragraphEl = document.createElement("w:p"); + Element paragraphPrefsEl = (Element)paragraphEl.appendChild(document.createElement("w:pPr")); + Element spacingEl = (Element)paragraphPrefsEl.appendChild(document.createElement("w:spacing")); + spacingEl.setAttribute("w:before", Integer.toString(spacing.getBefore())); + spacingEl.setAttribute("w:after", Integer.toString(spacing.getAfter())); + spacingEl.setAttribute("w:beforeAutospacing", "0"); + spacingEl.setAttribute("w:afterAutospacing", "0"); + return paragraphEl; + } + public Element createRunEl(Collection<? extends Node> textEls) { + return createRunEl(textEls, null); + } + + public Element createRunEl(Collection<? extends Node> textEls, String runStyleId) { Element runEl = document.createElement("w:r"); + if(StringHelper.containsNonWhitespace(runStyleId)) { + Element runPrefsEl = (Element)runEl.appendChild(document.createElement("w:rPr")); + Element rStyleEl = (Element)runPrefsEl.appendChild(document.createElement("w:rStyle")); + rStyleEl.setAttribute("w:val", runStyleId); + } if(textEls != null && textEls.size() > 0) { for(Node textEl:textEls) { runEl.appendChild(textEl); @@ -436,14 +492,14 @@ public class OpenXMLDocument { return runEl; } - public Node createRunPrefsEl(Style... styles) { + public Node createRunPrefsEl(Style... runStyles) { Element runPrefsEl = document.createElement("w:rPr"); - return createRunPrefsEl(runPrefsEl, styles); + return createRunPrefsEl(runPrefsEl, runStyles); } - public Node createRunPrefsEl(Node runPrefsEl, Style... styles) { - if(styles != null && styles.length > 0) { - for(Style style:styles) { + public Node createRunPrefsEl(Node runPrefsEl, Style... prefsStyles) { + if(prefsStyles != null && prefsStyles.length > 0) { + for(Style style:prefsStyles) { if(style != null) { switch(style) { case underline: { @@ -461,9 +517,9 @@ public class OpenXMLDocument { return runPrefsEl; } - public Node createRunReversePrefsEl(Node runPrefsEl, Style... styles) { - if(styles != null && styles.length > 0) { - for(Style style:styles) { + public Node createRunReversePrefsEl(Node runPrefsEl, Style... runStyles) { + if(runStyles != null && runStyles.length > 0) { + for(Style style:runStyles) { if(style != null) { switch(style) { case underline: @@ -837,6 +893,16 @@ public class OpenXMLDocument { } return mathEls; } + + public void appendImage(File file) { + Element imgEl = createImageEl(file); + if(imgEl != null) { + Element runEl = createRunEl(Collections.singletonList(imgEl)); + Element paragraphEl = getParagraphToAppendTo(true); + paragraphEl.appendChild(runEl); + getCursor().appendChild(paragraphEl); + } + } public Element createImageEl(String path) { if(mediaContainer == null) return null; @@ -1061,9 +1127,8 @@ public class OpenXMLDocument { return docEl; } - private final Element createBodyElement(Element rootElement, Document doc) { - Element bodyEl = (Element)rootElement.appendChild(doc.createElement("w:body")); - return bodyEl; + private final Element createBodyElement(Element rootEl, Document doc) { + return (Element)rootEl.appendChild(doc.createElement("w:body")); } public enum Style { @@ -1090,19 +1155,27 @@ public class OpenXMLDocument { } public enum Heading { - title("ooTitle"), - heading1("ooHeading1"), - heading2("ooHeading2"); + title("ooTitle", null), + heading1("ooHeading1", null), + heading2("ooHeading2", null), + subTitle("ooUntertitel", "ooUntertitelZeichen"), + subSubtleEmphasis("ooSubtleEmphasis", "ooSubtleEmphasisZeichen"); private final String styleId; + private final String runStyleId; - private Heading(String styleId) { + private Heading(String styleId, String runStyleId) { this.styleId = styleId; + this.runStyleId = runStyleId; } public String styleId() { return styleId; } + + public String runStyleId() { + return runStyleId; + } } public static class HeaderReference { @@ -1128,6 +1201,24 @@ public class OpenXMLDocument { } } + public static class Spacing { + private final int before; + private final int after; + + public Spacing(int before, int after) { + this.before = before; + this.after = after; + } + + public int getBefore() { + return before; + } + + public int getAfter() { + return after; + } + } + public static class ListParagraph { private final int abstractNumId; diff --git a/src/main/java/org/olat/core/util/openxml/_resources/styles.xml b/src/main/java/org/olat/core/util/openxml/_resources/styles.xml index 0fd8bf0801e..9b35421624b 100644 --- a/src/main/java/org/olat/core/util/openxml/_resources/styles.xml +++ b/src/main/java/org/olat/core/util/openxml/_resources/styles.xml @@ -415,8 +415,7 @@ <w:rsid w:val="000300CE" /> <w:pPr> <w:pBdr> - <w:bottom w:val="single" w:sz="8" w:space="4" w:color="4F81BD" - w:themeColor="accent1" /> + <w:bottom w:val="single" w:sz="8" w:space="4" w:color="4F81BD" w:themeColor="accent1" /> </w:pBdr> <w:spacing w:after="300" /> <w:contextualSpacing /> @@ -447,4 +446,75 @@ <w:szCs w:val="52" /> </w:rPr> </w:style> + <w:style w:type="paragraph" w:styleId="ooUntertitel"> + <w:name w:val="OO Subtitle" /> + <w:basedOn w:val="Standard" /> + <w:next w:val="Standard" /> + <w:link w:val="ooUntertitelZeichen" /> + <w:uiPriority w:val="11" /> + <w:qFormat /> + <w:rsid w:val="00384D08" /> + <w:pPr> + <w:numPr> + <w:ilvl w:val="1" /> + </w:numPr> + </w:pPr> + <w:rPr> + <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi" /> + <w:i /> + <w:iCs /> + <w:color w:val="4F81BD" w:themeColor="accent1" /> + <w:spacing w:val="15" /> + </w:rPr> + </w:style> + <w:style w:type="character" w:customStyle="1" w:styleId="ooUntertitelZeichen"> + <w:name w:val="OO Untertitel Zeichen" /> + <w:basedOn w:val="Absatzstandardschriftart" /> + <w:link w:val="Untertitel" /> + <w:uiPriority w:val="11" /> + <w:rsid w:val="00384D08" /> + <w:rPr> + <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi" /> + <w:i /> + <w:iCs /> + <w:color w:val="4F81BD" w:themeColor="accent1" /> + <w:spacing w:val="15" /> + </w:rPr> + </w:style> + <w:style w:type="paragraph" w:styleId="ooSubtleEmphasis"> + <w:name w:val="OO Subtle Emphasis" /> + <w:basedOn w:val="Standard" /> + <w:next w:val="Standard" /> + <w:link w:val="ooSubtleEmphasisZeichen" /> + <w:uiPriority w:val="11" /> + <w:qFormat /> + <w:rsid w:val="00384E11" /> + <w:pPr> + <w:numPr> + <w:ilvl w:val="1" /> + </w:numPr> + </w:pPr> + <w:rPr> + <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi" /> + <w:i /> + <w:iCs /> + <w:color w:val="8A6D3B" w:themeColor="subtle1" /> + <w:sz w:val="20" /> + <w:szCs w:val="20" /> + </w:rPr> + </w:style> + <w:style w:type="character" w:styleId="ooSubtleEmphasisZeichen"> + <w:name w:val="OO Subtle Emphasis" /> + <w:basedOn w:val="Absatzstandardschriftart" /> + <w:uiPriority w:val="19" /> + <w:qFormat /> + <w:rsid w:val="00384E12" /> + <w:rPr> + <w:i /> + <w:iCs /> + <w:color w:val="8A6D3B" w:themeColor="subtle1" /> + <w:sz w:val="20" /> + <w:szCs w:val="20" /> + </w:rPr> + </w:style> </w:styles> \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java index ea5b8594b33..e354d3ec41c 100644 --- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java +++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java @@ -65,11 +65,11 @@ import org.olat.modules.ModuleConfiguration; import org.olat.modules.dialog.DialogElement; import org.olat.modules.dialog.DialogElementsPropertyManager; import org.olat.modules.dialog.DialogPropertyElements; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.archiver.ForumArchiveManager; import org.olat.modules.fo.archiver.formatters.ForumFormatter; import org.olat.modules.fo.archiver.formatters.ForumRTFFormatter; import org.olat.modules.fo.archiver.formatters.ForumStreamedRTFFormatter; +import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; /** @@ -224,7 +224,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { * @param element * @param exportDirectory */ - public void doArchiveElement(DialogElement element, File exportDirectory) { + public void doArchiveElement(DialogElement element, File exportDirectory, Locale locale) { VFSContainer forumContainer = getForumContainer(element.getForumKey()); //there is only one file (leave) in the top forum container VFSItem dialogFile = forumContainer.getItems(new VFSLeafFilter()).get(0); @@ -238,7 +238,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { diaNodeElemExportContainer.copyFrom(dialogFile); ForumArchiveManager fam = ForumArchiveManager.getInstance(); - ForumFormatter ff = new ForumRTFFormatter(diaNodeElemExportContainer, false); + ForumFormatter ff = new ForumRTFFormatter(diaNodeElemExportContainer, false, locale); fam.applyFormatter(ff, element.getForumKey(), null); } @@ -250,7 +250,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { .getDialogPropertyElements(); if(list.size() > 0) { for (DialogElement element:list) { - doArchiveElement(element, exportStream); + doArchiveElement(element, exportStream, locale); dataFound = true; } } @@ -262,7 +262,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { * @param element * @param exportDirectory */ - public void doArchiveElement(DialogElement element, ZipOutputStream exportStream) { + public void doArchiveElement(DialogElement element, ZipOutputStream exportStream, Locale locale) { // append export timestamp to avoid overwriting previous export String exportDirName = Formatter.makeStringFilesystemSave(getShortTitle()) + "_" + element.getForumKey() @@ -274,7 +274,7 @@ public class DialogCourseNode extends AbstractAccessableCourseNode { } ForumArchiveManager fam = ForumArchiveManager.getInstance(); - ForumFormatter ff = new ForumStreamedRTFFormatter(exportStream, exportDirName, false); + ForumFormatter ff = new ForumStreamedRTFFormatter(exportStream, exportDirName, false, locale); fam.applyFormatter(ff, element.getForumKey(), null); } diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java index dc5a3cda97d..8f6df7f35a6 100644 --- a/src/main/java/org/olat/course/nodes/FOCourseNode.java +++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Locale; import java.util.zip.ZipOutputStream; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.gui.UserRequest; @@ -43,6 +44,7 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControl; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.logging.OLATRuntimeException; +import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.Formatter; import org.olat.core.util.Util; @@ -71,9 +73,10 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.ModuleConfiguration; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; -import org.olat.modules.fo.ForumManager; +import org.olat.modules.fo.ForumModule; import org.olat.modules.fo.archiver.ForumArchiveManager; import org.olat.modules.fo.archiver.formatters.ForumStreamedRTFFormatter; +import org.olat.modules.fo.manager.ForumManager; import org.olat.properties.Property; import org.olat.repository.RepositoryEntry; @@ -84,6 +87,8 @@ import org.olat.repository.RepositoryEntry; * @author BPS (<a href="http://www.bps-system.de/">BPS Bildungsportal Sachsen GmbH</a>) */ public class FOCourseNode extends AbstractAccessableCourseNode { + + private static final OLog log = Tracing.createLoggerFor(FOCourseNode.class); private static final long serialVersionUID = 2281715263255594865L; private static final String PACKAGE_FO = Util.getPackageName(FOCourseNodeRunController.class); @@ -123,8 +128,10 @@ public class FOCourseNode extends AbstractAccessableCourseNode { * org.olat.course.run.userview.UserCourseEnvironment, * org.olat.course.run.userview.NodeEvaluation) */ + @Override public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl, final UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) { + updateModuleConfigDefaults(false); Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment()); boolean isOlatAdmin = ureq.getUserSession().getRoles().isOLATAdmin(); @@ -138,13 +145,27 @@ public class FOCourseNode extends AbstractAccessableCourseNode { wControl = bcf.createBusinessWindowControl(businessControl, wControl); } catch (NumberFormatException e) { // ups, nodecmd is not a message, what the heck is it then? - Tracing.createLoggerFor(this.getClass()).warn("Could not create message ID from given nodemcd::" + nodecmd, e); + log.warn("Could not create message ID from given nodemcd::" + nodecmd, e); } } + + //for guests, check if posting is allowed + boolean pseudonymPostAllowed = false; + boolean guestPostAllowed = false; + if(ureq.getUserSession().getRoles().isGuestOnly()) { + String config = getModuleConfiguration().getStringValue(FOCourseNodeEditController.GUEST_POST_ALLOWED); + guestPostAllowed = CoreSpringFactory.getImpl(ForumModule.class).isAnonymousPostingWithPseudonymEnabled() + && "true".equals(config); + } else { + String config = getModuleConfiguration().getStringValue(FOCourseNodeEditController.PSEUDONYM_POST_ALLOWED); + pseudonymPostAllowed = CoreSpringFactory.getImpl(ForumModule.class).isAnonymousPostingWithPseudonymEnabled() + && "true".equals(config); + } // Create subscription context and run controller SubscriptionContext forumSubContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(), this); - FOCourseNodeRunController forumC = new FOCourseNodeRunController(ureq, userCourseEnv, wControl, theForum, - new ForumNodeForumCallback(ne, isOlatAdmin, isGuestOnly, forumSubContext), this); + ForumNodeForumCallback foCallback = new ForumNodeForumCallback(ne, isOlatAdmin, isGuestOnly, + guestPostAllowed, pseudonymPostAllowed, forumSubContext); + FOCourseNodeRunController forumC = new FOCourseNodeRunController(ureq, wControl, theForum, foCallback, this); return new NodeRunConstructionResult(forumC); } @@ -165,43 +186,43 @@ public class FOCourseNode extends AbstractAccessableCourseNode { Property forumKeyProp = cpm.findCourseNodeProperty(thisCourseNode, null, null, FORUM_KEY); //System.out.println("System.out.println - findCourseNodeProperty"); if(forumKeyProp!=null) { - // Forum does already exist, load forum with key from properties - Long forumKey = forumKeyProp.getLongValue(); - theForum = fom.loadForum(forumKey); - if (theForum == null) { throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " + // Forum does already exist, load forum with key from properties + Long forumKey = forumKeyProp.getLongValue(); + theForum = fom.loadForum(forumKey); + if (theForum == null) { throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " + courseEnv.getCourseResourceableId() + " for node " + thisCourseNode.getIdent() + " as defined in course node property but forum manager could not load forum.", null); } } else { - //creates resourceable from FOCourseNode.class and the current node id as key + //creates resourceable from FOCourseNode.class and the current node id as key OLATResourceable courseNodeResourceable = OresHelper.createOLATResourceableInstance(FOCourseNode.class, new Long(this.getIdent())); - //o_clusterOK by:ld - theForum = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerCallback<Forum>(){ - public Forum execute() { - Forum forum = null; - Long forumKey; - Property forumKeyProperty = cpm.findCourseNodeProperty(thisCourseNode, null, null, FORUM_KEY); - if (forumKeyProperty == null) { - // First call of forum, create new forum and save forum key as property - forum = fom.addAForum(); - forumKey = forum.getKey(); - forumKeyProperty = cpm.createCourseNodePropertyInstance(thisCourseNode, null, null, FORUM_KEY, null, forumKey, null, null); - cpm.saveProperty(forumKeyProperty); - //System.out.println("Forum added"); - } else { - // Forum does already exist, load forum with key from properties - forumKey = forumKeyProperty.getLongValue(); - forum = fom.loadForum(forumKey); - if (forum == null) { throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " + //o_clusterOK by:ld + theForum = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(courseNodeResourceable, new SyncerCallback<Forum>(){ + @Override + public Forum execute() { + Forum forum = null; + Long forumKey; + Property forumKeyProperty = cpm.findCourseNodeProperty(thisCourseNode, null, null, FORUM_KEY); + if (forumKeyProperty == null) { + // First call of forum, create new forum and save forum key as property + forum = fom.addAForum(); + forumKey = forum.getKey(); + forumKeyProperty = cpm.createCourseNodePropertyInstance(thisCourseNode, null, null, FORUM_KEY, null, forumKey, null, null); + cpm.saveProperty(forumKeyProperty); + } else { + // Forum does already exist, load forum with key from properties + forumKey = forumKeyProperty.getLongValue(); + forum = fom.loadForum(forumKey); + if (forum == null) { throw new OLATRuntimeException(FOCourseNode.class, "Tried to load forum with key " + forumKey.longValue() + " in course " + courseEnv.getCourseResourceableId() + " for node " + thisCourseNode.getIdent() + " as defined in course node property but forum manager could not load forum.", null); } - } - //System.out.println("Forum already exists"); - return forum; + } + return forum; }}); } return theForum; } + @Override protected void calcAccessAndVisibility(ConditionInterpreter ci, NodeEvaluation nodeEval) { // evaluate the preconditions boolean reader = (getPreConditionReader().getConditionExpression() == null ? true : ci.evaluateCondition(getPreConditionReader())); @@ -225,6 +246,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { * org.olat.course.run.userview.UserCourseEnvironment, * org.olat.course.run.userview.NodeEvaluation) */ + @Override public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne) { return new FOPreviewController(ureq, wControl, ne); } @@ -241,7 +263,8 @@ public class FOCourseNode extends AbstractAccessableCourseNode { if (ne.isAtLeastOneAccessible()) { // Create a forum peekview controller that shows the latest two messages Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment()); - Controller peekViewController = new FOPeekviewController(ureq, wControl, theForum, getIdent(), 3); + RepositoryEntry courseEntry = userCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + Controller peekViewController = new FOPeekviewController(ureq, wControl, courseEntry, theForum, getIdent(), 3); return peekViewController; } else { // use standard peekview @@ -318,6 +341,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { /** * @see org.olat.course.nodes.CourseNode#isConfigValid() */ + @Override public StatusDescription isConfigValid() { /* * first check the one click cache @@ -329,10 +353,10 @@ public class FOCourseNode extends AbstractAccessableCourseNode { return StatusDescription.NOERROR; } - /** * @see org.olat.course.nodes.CourseNode#isConfigValid(org.olat.course.run.userview.UserCourseEnvironment) */ + @Override public StatusDescription[] isConfigValid(CourseEditorEnv cev) { oneClickStatusCache = null; //only here we know which translator to take for translating condition error messages @@ -344,6 +368,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { /** * @see org.olat.course.nodes.CourseNode#getReferencedRepositoryEntry() */ + @Override public RepositoryEntry getReferencedRepositoryEntry() { return null; } @@ -351,6 +376,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { /** * @see org.olat.course.nodes.CourseNode#needsReferenceToARepositoryEntry() */ + @Override public boolean needsReferenceToARepositoryEntry() { return false; } @@ -369,7 +395,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { String forumName = "forum_" + Formatter.makeStringFilesystemSave(getShortTitle()) + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())); - ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false); + ForumStreamedRTFFormatter rtff = new ForumStreamedRTFFormatter(exportStream, forumName, false, locale); ForumArchiveManager.getInstance().applyFormatter(rtff, forumKey, null); return true; } @@ -378,6 +404,7 @@ public class FOCourseNode extends AbstractAccessableCourseNode { * @see org.olat.course.nodes.CourseNode#informOnDelete(org.olat.core.gui.UserRequest, * org.olat.course.ICourse) */ + @Override public String informOnDelete(Locale locale, ICourse course) { CoursePropertyManager cpm = PersistingCoursePropertyManager.getInstance(course); Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, FORUM_KEY); @@ -396,10 +423,11 @@ public class FOCourseNode extends AbstractAccessableCourseNode { // delete the forum, if there is one (is created on demand only) CoursePropertyManager cpm = PersistingCoursePropertyManager.getInstance(course); Property forumKeyProperty = cpm.findCourseNodeProperty(this, null, null, FORUM_KEY); - if (forumKeyProperty == null) return; // no forum created yet - Long forumKey = forumKeyProperty.getLongValue(); - ForumManager.getInstance().deleteForum(forumKey); // delete the forum - cpm.deleteProperty(forumKeyProperty); // delete the property + if (forumKeyProperty != null) { + Long forumKey = forumKeyProperty.getLongValue(); + ForumManager.getInstance().deleteForum(forumKey); // delete the forum + cpm.deleteProperty(forumKeyProperty); // delete the property + } } /** @@ -413,11 +441,27 @@ public class FOCourseNode extends AbstractAccessableCourseNode { @Override public void updateModuleConfigDefaults(boolean isNewNode) { ModuleConfiguration config = getModuleConfiguration(); + if(isNewNode) { + ForumModule forumModule = CoreSpringFactory.getImpl(ForumModule.class); + boolean pseudonymAllowed = forumModule.isAnonymousPostingWithPseudonymEnabled() + && forumModule.isPseudonymForCourseEnabledByDefault(); + config.setStringValue(FOCourseNodeEditController.PSEUDONYM_POST_ALLOWED, pseudonymAllowed ? "true" : "false"); + config.setStringValue(FOCourseNodeEditController.GUEST_POST_ALLOWED, "false"); + } if (isNewNode || config.getConfigurationVersion() < 2) { // use defaults for new course building blocks config.setBooleanEntry(NodeEditController.CONFIG_STARTPAGE, Boolean.FALSE.booleanValue()); config.setConfigurationVersion(2); } + if (config.getConfigurationVersion() < 3) { + if(config.getStringValue(FOCourseNodeEditController.PSEUDONYM_POST_ALLOWED) == null) { + config.setStringValue(FOCourseNodeEditController.PSEUDONYM_POST_ALLOWED, "false"); + } + if(config.getStringValue(FOCourseNodeEditController.GUEST_POST_ALLOWED) == null) { + config.setStringValue(FOCourseNodeEditController.GUEST_POST_ALLOWED, "false"); + } + config.setConfigurationVersion(3); + } // else node is up-to-date - nothing to do config.remove(NodeEditController.CONFIG_INTEGRATION); } @@ -483,9 +527,11 @@ public class FOCourseNode extends AbstractAccessableCourseNode { */ class ForumNodeForumCallback implements ForumCallback { - private NodeEvaluation ne; - private boolean isOlatAdmin; - private boolean isGuestOnly; + private final NodeEvaluation ne; + private final boolean isOlatAdmin; + private final boolean isGuestOnly; + private final boolean guestPostAllowed; + private final boolean anonymousPostAllowed; private final SubscriptionContext subscriptionContext; /** @@ -494,32 +540,45 @@ class ForumNodeForumCallback implements ForumCallback { * @param isGuestOnly true if the user is olat-guest * @param subscriptionContext */ - public ForumNodeForumCallback(NodeEvaluation ne, boolean isOlatAdmin, boolean isGuestOnly, SubscriptionContext subscriptionContext) { + public ForumNodeForumCallback(NodeEvaluation ne, boolean isOlatAdmin, boolean isGuestOnly, + boolean guestPostAllowed, boolean anonymousPostAllowed, + SubscriptionContext subscriptionContext) { this.ne = ne; this.isOlatAdmin = isOlatAdmin; this.isGuestOnly = isGuestOnly; + this.guestPostAllowed = guestPostAllowed; + this.anonymousPostAllowed = anonymousPostAllowed; this.subscriptionContext = subscriptionContext; } + @Override + public boolean mayUsePseudonym() { + if (isGuestOnly) return false; + return anonymousPostAllowed; + } + /** * @see org.olat.modules.fo.ForumCallback#mayOpenNewThread() */ + @Override public boolean mayOpenNewThread() { - if (isGuestOnly) return false; + if (isGuestOnly && !guestPostAllowed) return false; return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; } /** * @see org.olat.modules.fo.ForumCallback#mayReplyMessage() */ + @Override public boolean mayReplyMessage() { - if (isGuestOnly) return false; + if (isGuestOnly && !guestPostAllowed) return false; return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; } /** * @see org.olat.modules.fo.ForumCallback#mayEditMessageAsModerator() */ + @Override public boolean mayEditMessageAsModerator() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -528,6 +587,7 @@ class ForumNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#mayDeleteMessageAsModerator() */ + @Override public boolean mayDeleteMessageAsModerator() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -537,14 +597,15 @@ class ForumNodeForumCallback implements ForumCallback { * * @see org.olat.modules.fo.ForumCallback#mayArchiveForum() */ + @Override public boolean mayArchiveForum() { - if (isGuestOnly) return false; - else return true; + return !isGuestOnly; } /** * @see org.olat.modules.fo.ForumCallback#mayFilterForUser() */ + @Override public boolean mayFilterForUser() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -553,11 +614,11 @@ class ForumNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#getSubscriptionContext() */ + @Override public SubscriptionContext getSubscriptionContext() { // SubscriptionContext sc = new SubscriptionContext("coourseli", new // Long(123), "subident", "Einfuehrung in die Blabla", "Knoten gugus"); // do not offer subscription to forums for guests return (isGuestOnly ? null : subscriptionContext); } - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java index cf5198bd376..23c38dfe559 100644 --- a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java +++ b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeEditController.java @@ -66,7 +66,7 @@ import org.olat.modules.dialog.DialogElementsPropertyManager; import org.olat.modules.dialog.DialogElementsTableModel; import org.olat.modules.dialog.DialogPropertyElements; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; +import org.olat.modules.fo.manager.ForumManager; import org.olat.util.logging.activity.LoggingResourceable; /** diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java b/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java index 7d3d57f9c9a..dcb60f36c96 100644 --- a/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java +++ b/src/main/java/org/olat/course/nodes/dialog/DialogNodeForumCallback.java @@ -57,9 +57,15 @@ public class DialogNodeForumCallback implements ForumCallback { this.subscriptionContext = subscriptionContext; } + @Override + public boolean mayUsePseudonym() { + return false; + } + /** * @see org.olat.modules.fo.ForumCallback#mayOpenNewThread() */ + @Override public boolean mayOpenNewThread() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -68,6 +74,7 @@ public class DialogNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#mayReplyMessage() */ + @Override public boolean mayReplyMessage() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("poster") || ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -76,6 +83,7 @@ public class DialogNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#mayEditMessageAsModerator() */ + @Override public boolean mayEditMessageAsModerator() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -84,6 +92,7 @@ public class DialogNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#mayDeleteMessageAsModerator() */ + @Override public boolean mayDeleteMessageAsModerator() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -93,6 +102,7 @@ public class DialogNodeForumCallback implements ForumCallback { * * @see org.olat.modules.fo.ForumCallback#mayArchiveForum() */ + @Override public boolean mayArchiveForum() { if (isGuestOnly) return false; else return true; @@ -101,6 +111,7 @@ public class DialogNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#mayFilterForUser() */ + @Override public boolean mayFilterForUser() { if (isGuestOnly) return false; return ne.isCapabilityAccessible("moderator") || isOlatAdmin; @@ -109,6 +120,7 @@ public class DialogNodeForumCallback implements ForumCallback { /** * @see org.olat.modules.fo.ForumCallback#getSubscriptionContext() */ + @Override public SubscriptionContext getSubscriptionContext() { return (isGuestOnly ? null : subscriptionContext); } diff --git a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java index 14d400265bb..4164198a69e 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeEditController.java @@ -51,13 +51,18 @@ import org.olat.course.tree.CourseEditorTreeModel; */ public class FOCourseNodeEditController extends ActivateableTabbableDefaultController implements ControllerEventListener { - private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; - static final String[] paneKeys = { PANE_TAB_ACCESSIBILITY }; + private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; + private static final String PANE_TAB_SETTINGS = "pane.tab.settings"; + private static final String[] paneKeys = { PANE_TAB_ACCESSIBILITY, PANE_TAB_SETTINGS }; - private FOCourseNode foNode; - private VelocityContainer myContent; + public static final String PSEUDONYM_POST_ALLOWED = "pseudonym.post.allowed"; + public static final String GUEST_POST_ALLOWED = "guest.post.allowed"; + + private final FOCourseNode foNode; + private final VelocityContainer myContent; - private ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; + private SettingsController settingsCtrl; + private final ConditionEditController readerCondContr, posterCondContr, moderatorCondContr; private TabbedPane myTabbedPane; /** @@ -72,35 +77,40 @@ public class FOCourseNodeEditController extends ActivateableTabbableDefaultContr super(ureq, wControl); this.foNode = forumNode; - myContent = this.createVelocityContainer("edit"); + myContent = createVelocityContainer("edit"); CourseEditorTreeModel editorModel = course.getEditorTreeModel(); // Reader precondition Condition readerCondition = foNode.getPreConditionReader(); readerCondContr = new ConditionEditController(ureq, getWindowControl(), readerCondition, AssessmentHelper.getAssessableNodes(editorModel, forumNode), euce); - this.listenTo(readerCondContr); + listenTo(readerCondContr); myContent.put("readerCondition", readerCondContr.getInitialComponent()); // Poster precondition Condition posterCondition = foNode.getPreConditionPoster(); posterCondContr = new ConditionEditController(ureq, getWindowControl(), posterCondition, AssessmentHelper.getAssessableNodes(editorModel, forumNode), euce); - this.listenTo(posterCondContr); + listenTo(posterCondContr); myContent.put("posterCondition", posterCondContr.getInitialComponent()); // Moderator precondition Condition moderatorCondition = foNode.getPreConditionModerator(); moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), moderatorCondition, AssessmentHelper.getAssessableNodes(editorModel, forumNode), euce); - this.listenTo(moderatorCondContr); + listenTo(moderatorCondContr); myContent.put("moderatorCondition", moderatorCondContr.getInitialComponent()); + + //Settings + settingsCtrl = new SettingsController(ureq, getWindowControl(), forumNode); + listenTo(settingsCtrl); } /** * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Component source, Event event) { // } @@ -109,6 +119,7 @@ public class FOCourseNodeEditController extends ActivateableTabbableDefaultContr * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest urequest, Controller source, Event event) { if (source == readerCondContr) { if (event == Event.CHANGED_EVENT) { @@ -128,28 +139,43 @@ public class FOCourseNodeEditController extends ActivateableTabbableDefaultContr foNode.setPreConditionModerator(cond); fireEvent(urequest, NodeEditController.NODECONFIG_CHANGED_EVENT); } + } else if (source == settingsCtrl) { + if (event == Event.CHANGED_EVENT) { + String pseudoAllowed = settingsCtrl.isPseudonymPostAllowed() ? "true" : "false"; + foNode.getModuleConfiguration().setStringValue(PSEUDONYM_POST_ALLOWED, pseudoAllowed); + String guestAllowed = settingsCtrl.isGuestPostAllowed() ? "true" : "false"; + foNode.getModuleConfiguration().setStringValue(GUEST_POST_ALLOWED, guestAllowed); + fireEvent(urequest, NodeEditController.NODECONFIG_CHANGED_EVENT); + } } } /** * @see org.olat.core.gui.control.generic.tabbable.TabbableDefaultController#addTabs(org.olat.core.gui.components.TabbedPane) */ + @Override public void addTabs(TabbedPane tabbedPane) { myTabbedPane = tabbedPane; tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), myContent); + if(settingsCtrl != null) { + tabbedPane.addTab(translate(PANE_TAB_SETTINGS), settingsCtrl.getInitialComponent()); + } } /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ + @Override protected void doDispose() { - //child controllers registered with listenTo() get disposed in BasicController + //child controllers registered with listenTo() get disposed in BasicController } + @Override public String[] getPaneKeys() { return paneKeys; } + @Override public TabbedPane getTabbedPane() { return myTabbedPane; } diff --git a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeRunController.java index d36783c7b82..6fa9d7ff22b 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeRunController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeRunController.java @@ -27,29 +27,20 @@ package org.olat.course.nodes.fo; import java.util.List; -import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; -import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.control.creator.ControllerCreator; -import org.olat.core.gui.control.generic.docking.DockController; -import org.olat.core.gui.control.generic.docking.DockLayoutControllerCreatorCallback; import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.gui.control.generic.title.TitledWrapperController; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; -import org.olat.course.CourseFactory; import org.olat.course.nodes.FOCourseNode; import org.olat.course.nodes.TitledWrapperHelper; -import org.olat.course.run.environment.CourseEnvironment; -import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; -import org.olat.modules.fo.ForumUIFactory; +import org.olat.modules.fo.ui.ForumController; import org.olat.util.logging.activity.LoggingResourceable; /** @@ -60,11 +51,7 @@ import org.olat.util.logging.activity.LoggingResourceable; */ public class FOCourseNodeRunController extends BasicController implements Activateable2 { - private DockController dockC; - private FOCourseNode courseNode; - private CourseEnvironment courseEnv; - private Forum forum; - private ForumCallback foCallback; + private final ForumController forumCtrl; /** * Constructor for a forum course building block runtime controller @@ -76,17 +63,18 @@ public class FOCourseNodeRunController extends BasicController implements Activa * @param foCallback The forum security callback * @param foCourseNode The current course node */ - public FOCourseNodeRunController(UserRequest ureq, UserCourseEnvironment userCourseEnv, WindowControl wControl, Forum forum, - ForumCallback foCallback, FOCourseNode foCourseNode) { + public FOCourseNodeRunController(UserRequest ureq, WindowControl wControl, Forum forum, + ForumCallback foCallback, FOCourseNode courseNode) { super(ureq, wControl); - this.courseNode = foCourseNode; - this.courseEnv = userCourseEnv.getCourseEnvironment(); - this.forum = forum; - this.foCallback = foCallback; - // set logger on this run controller - addLoggingResourceable(LoggingResourceable.wrap(foCourseNode)); - doLaunch(ureq); + // set logger on this run controller + addLoggingResourceable(LoggingResourceable.wrap(courseNode)); + + forumCtrl = new ForumController(ureq, getWindowControl(), forum, foCallback, true); + listenTo(forumCtrl); + Controller titledCtrl = TitledWrapperHelper.getWrapper(ureq, getWindowControl(), forumCtrl, courseNode, "o_fo_icon"); + listenTo(titledCtrl); + putInitialPanel(titledCtrl.getInitialComponent()); } @Override @@ -94,34 +82,6 @@ public class FOCourseNodeRunController extends BasicController implements Activa // nothing to do } - private void doLaunch(UserRequest ureq) { - dockC = new DockController(ureq, getWindowControl(), false, new ControllerCreator(){ - public Controller createController(UserRequest lureq, WindowControl lwControl) { - Controller foCtr = ForumUIFactory.getStandardForumController(lureq, lwControl, forum, foCallback); - listenTo(foCtr); - Controller titledCtrl = TitledWrapperHelper.getWrapper(lureq, lwControl, foCtr, courseNode, "o_fo_icon"); - listenTo(titledCtrl); - return titledCtrl; - }}, - new DockLayoutControllerCreatorCallback() { - public ControllerCreator createLayoutControllerCreator(UserRequest ureq, final ControllerCreator contentControllerCreator) { - return BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, new ControllerCreator() { - @SuppressWarnings("synthetic-access") - public Controller createController(UserRequest lureq, WindowControl lwControl) { - // Wrap in column layout, popup window needs a layout controller - Controller ctr = contentControllerCreator.createController(lureq, lwControl); - LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(lureq, lwControl, ctr); - layoutCtr.setCustomCSS(CourseFactory.getCustomCourseCss(lureq.getUserSession(), courseEnv)); - layoutCtr.addDisposableChildController(ctr); - return layoutCtr; - } - }); - } - }); - listenTo(dockC); - putInitialPanel(dockC.getInitialComponent()); - } - @Override protected void doDispose() { // @@ -129,12 +89,6 @@ public class FOCourseNodeRunController extends BasicController implements Activa @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - if(dockC != null && dockC.getController() instanceof TitledWrapperController) { - TitledWrapperController wrapper2 = (TitledWrapperController)dockC.getController(); - if(wrapper2.getContentController() instanceof Activateable2) { - ((Activateable2)wrapper2.getContentController()).activate(ureq, entries, state); - } - } + forumCtrl.activate(ureq, entries, state); } - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java b/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java index 8048ec8b2b3..bc7b8157050 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOPeekviewController.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.List; import org.apache.commons.lang.StringEscapeUtils; +import org.olat.NewControllerFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.htmlsite.OlatCmdEvent; @@ -39,9 +40,9 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.filter.FilterFactory; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; -import org.olat.modules.fo.Message; -import org.olat.user.UserManager; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.ui.MessagePeekview; +import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; /** @@ -60,9 +61,9 @@ import org.springframework.beans.factory.annotation.Autowired; public class FOPeekviewController extends BasicController implements Controller { // the current course node id private final String nodeId; - - @Autowired - private UserManager userManager; + private final Link allItemsLink; + private final RepositoryEntry courseEntry; + @Autowired private ForumManager forumManager; @@ -74,26 +75,26 @@ public class FOPeekviewController extends BasicController implements Controller * @param nodeId The course node ID * @param itemsToDisplay number of items to be displayed, must be > 0 */ - public FOPeekviewController(UserRequest ureq, WindowControl wControl, Forum forum, String nodeId, int itemsToDisplay) { + public FOPeekviewController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry, Forum forum, String nodeId, int itemsToDisplay) { // Use fallback translator from forum super(ureq, wControl, Util.createPackageTranslator(Forum.class, ureq.getLocale())); this.nodeId = nodeId; + this.courseEntry = courseEntry; VelocityContainer peekviewVC = createVelocityContainer("peekview"); // add items, only as many as configured - List<Message> messages = forumManager.getMessagesByForumID(forum.getKey(), 0, itemsToDisplay, Message.OrderBy.creationDate, false); + List<MessagePeekview> messages = forumManager.getPeekviewMessages(forum, itemsToDisplay); // only take the configured amount of messages List<MessageView> views = new ArrayList<MessageView>(itemsToDisplay); - for (Message message :messages) { + for (MessagePeekview message :messages) { // add link to item // Add link to jump to course node Link nodeLink = LinkFactory.createLink("nodeLink_" + message.getKey(), peekviewVC, this); nodeLink.setCustomDisplayText(StringHelper.escapeHtml(message.getTitle())); nodeLink.setIconLeftCSS("o_icon o_icon_post"); nodeLink.setCustomEnabledLinkCSS("o_gotoNode"); - nodeLink.setUserObject(message.getKey()); + nodeLink.setUserObject(message); - String creator = userManager.getUserDisplayName(message.getCreator()); String body = message.getBody(); if(body.length() > 256) { String truncateBody = FilterFactory.getHtmlTagsFilter().filter(body); @@ -107,11 +108,11 @@ public class FOPeekviewController extends BasicController implements Controller } else { body = StringHelper.xssScan(body); } - views.add(new MessageView(message.getKey(), message.getCreationDate(), creator, body)); + views.add(new MessageView(message.getKey(), message.getCreationDate(), body)); } peekviewVC.contextPut("messages", views); // Add link to show all items (go to node) - Link allItemsLink = LinkFactory.createLink("peekview.allItemsLink", peekviewVC, this); + allItemsLink = LinkFactory.createLink("peekview.allItemsLink", peekviewVC, this); allItemsLink.setIconRightCSS("o_icon o_icon_start"); allItemsLink.setCustomEnabledLinkCSS("pull-right"); // Add Formatter for proper date formatting @@ -124,13 +125,15 @@ public class FOPeekviewController extends BasicController implements Controller */ @Override protected void event(UserRequest ureq, Component source, Event event) { - if (source instanceof Link) { + if(allItemsLink == source) { + fireEvent(ureq, new OlatCmdEvent(OlatCmdEvent.GOTONODE_CMD, nodeId)); + } else if (source instanceof Link) { Link nodeLink = (Link) source; - Object messageId = nodeLink.getUserObject(); - if (messageId == null) { - fireEvent(ureq, new OlatCmdEvent(OlatCmdEvent.GOTONODE_CMD, nodeId)); - } else { - fireEvent(ureq, new OlatCmdEvent(OlatCmdEvent.GOTONODE_CMD, nodeId + "/" + messageId)); + Object uobject = nodeLink.getUserObject(); + if (uobject instanceof MessagePeekview) { + MessagePeekview message = (MessagePeekview)uobject; + String businessPath = "[RepositoryEntry:" + courseEntry.getKey() + "][CourseNode:" + nodeId + "][Message:" + message.getKey() + "]"; + NewControllerFactory.getInstance().launch(businessPath, ureq, getWindowControl()); } } } @@ -148,13 +151,11 @@ public class FOPeekviewController extends BasicController implements Controller private final Long key; private final String body; private final Date creationDate; - private final String creatorFullname; - public MessageView(Long key, Date creationDate, String creatorFullname, String body) { + public MessageView(Long key, Date creationDate, String body) { this.key = key; this.body = body; this.creationDate = creationDate; - this.creatorFullname = creatorFullname; } public Long getKey() { @@ -165,10 +166,6 @@ public class FOPeekviewController extends BasicController implements Controller return creationDate; } - public String getCreatorFullname() { - return creatorFullname; - } - public String getBody() { return body; } diff --git a/src/main/java/org/olat/course/nodes/fo/FOPreviewController.java b/src/main/java/org/olat/course/nodes/fo/FOPreviewController.java index d757d65692b..b0703baa258 100644 --- a/src/main/java/org/olat/course/nodes/fo/FOPreviewController.java +++ b/src/main/java/org/olat/course/nodes/fo/FOPreviewController.java @@ -66,6 +66,7 @@ public class FOPreviewController extends DefaultController { * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Component source, Event event) { // } @@ -73,6 +74,7 @@ public class FOPreviewController extends DefaultController { /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ + @Override protected void doDispose() { // } diff --git a/src/main/java/org/olat/course/nodes/fo/SettingsController.java b/src/main/java/org/olat/course/nodes/fo/SettingsController.java new file mode 100644 index 00000000000..b152722c6ad --- /dev/null +++ b/src/main/java/org/olat/course/nodes/fo/SettingsController.java @@ -0,0 +1,112 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.nodes.fo; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.course.nodes.FOCourseNode; +import org.olat.modules.fo.ForumModule; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class SettingsController extends FormBasicController { + + private static final String[] allowKeys = new String[] { "on" }; + + private MultipleSelectionElement allowPseudonymEl, allowGuestEl; + + private final FOCourseNode foNode; + + @Autowired + private ForumModule forumModule; + + public SettingsController(UserRequest ureq, WindowControl wControl, FOCourseNode foNode) { + super(ureq, wControl, LAYOUT_VERTICAL); + this.foNode = foNode; + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + setFormTitle("settings.title"); + + if(forumModule.isAnonymousPostingWithPseudonymEnabled()) { + String[] allowPseudonymValues = new String[] { translate("allow.pseudonym.post") }; + allowPseudonymEl = uifactory.addCheckboxesHorizontal("allow.pseudonym", formLayout, + allowKeys, allowPseudonymValues); + allowPseudonymEl.setLabel(null, null); + allowPseudonymEl.addActionListener(FormEvent.ONCHANGE); + + if("true".equals(foNode.getModuleConfiguration().getStringValue(FOCourseNodeEditController.PSEUDONYM_POST_ALLOWED))) { + allowPseudonymEl.select(allowKeys[0], true); + } + } + + String[] allowGuestValues = new String[] { translate("allow.guest.post") }; + allowGuestEl = uifactory.addCheckboxesHorizontal("allow.guest", formLayout, + allowKeys, allowGuestValues); + allowGuestEl.setLabel(null, null); + allowGuestEl.addActionListener(FormEvent.ONCHANGE); + if("true".equals(foNode.getModuleConfiguration().getStringValue(FOCourseNodeEditController.GUEST_POST_ALLOWED))) { + allowGuestEl.select(allowKeys[0], true); + } + } + + @Override + protected void doDispose() { + // + } + + public boolean isPseudonymPostAllowed() { + return allowPseudonymEl.isAtLeastSelected(1); + } + + public boolean isGuestPostAllowed() { + return allowGuestEl.isAtLeastSelected(1); + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(allowPseudonymEl == source) { + fireEvent(ureq, Event.CHANGED_EVENT); + } else if(allowGuestEl == source) { + fireEvent(ureq, Event.CHANGED_EVENT); + } + super.formInnerEvent(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + +} diff --git a/src/main/java/org/olat/course/nodes/fo/_content/peekview.html b/src/main/java/org/olat/course/nodes/fo/_content/peekview.html index d38605e0acf..90f637c559d 100644 --- a/src/main/java/org/olat/course/nodes/fo/_content/peekview.html +++ b/src/main/java/org/olat/course/nodes/fo/_content/peekview.html @@ -1,16 +1,9 @@ <div class="o_forum_peekview clearfix"> #foreach( $message in $messages ) <div class="o_forum_peekview_message"> - <h5> - $r.render("nodeLink_${message.getKey()}") - <small class="o_nowrap"> - $r.escapeHtml($message.creator) - $formatter.formatDateAndTime($message.getCreationDate()) - </small> - </h5> - <div> - $r.formatLatexFormulas($message.getBody()) - </div> + <h5>$r.render("nodeLink_${message.getKey()}") + <small class="o_nowrap">$formatter.formatDateAndTime($message.getCreationDate())</small></h5> + <div>$r.formatLatexFormulas($message.getBody())</div> </div> #end $r.render("peekview.allItemsLink") diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties index eae5bc1ff22..882939ada20 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties @@ -1,4 +1,6 @@ #Mon Mar 02 09:54:04 CET 2009 +allow.guest.post=Erstellen von Beitr\u00E4ge mit Guastzugang zulassen +allow.pseudonym.post=Anonyme Beitr\u00E4ge mit Pseudonym zulassen command.closefo=Ansicht schliessen command.show=Forum anzeigen command.showpopup=Forum in neuem Fenster anzeigen @@ -9,12 +11,10 @@ display.config.fieldsettitle=Konfiguration display.config.startPage=Mit Startseite? display.config.startPage.false=Nein, Inhalt direkt starten display.config.startPage.true=Ja, anzeigen - - - - pane.tab.accessibility=Zugang pane.tab.foconfig=Darstellung +pane.tab.settings=Konfiguration +settings.title=Konfiguration preview.canModerate=Forumsbeitr\u00E4ge moderieren m\u00F6glich preview.canPost=Forumsbeitr\u00E4ge schreiben m\u00F6glich preview.canRead=Forumsbeitr\u00E4ge lesen m\u00F6glich diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties index e958f5f58b4..b30675d654f 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_en.properties @@ -1,4 +1,6 @@ #Wed Jan 26 19:01:16 CET 2011 +allow.guest.post=Erstellen von Beitr\u00E4ge mit Guastzugang zulassen +allow.pseudonym.post=Anonyme Beitr\u00E4ge mit Pseudonym zulassen command.closefo=Close view command.show=Display forum command.showpopup=Display forum in a new window @@ -9,12 +11,10 @@ display.config.fieldsettitle=Configuration display.config.startPage=With welcome page? display.config.startPage.false=No, show content immediately. display.config.startPage.true=Yes, display welcome page. - - - - pane.tab.accessibility=Access pane.tab.foconfig=Display +pane.tab.settings=Settings +settings.title=Settings peekview.allItemsLink=All contributions preview.canModerate=Moderating forum contributions enabled preview.canPost=Writing forum contributions enabled diff --git a/src/main/java/org/olat/modules/_spring/modulesContext.xml b/src/main/java/org/olat/modules/_spring/modulesContext.xml index abe45deda06..ae070c234f3 100644 --- a/src/main/java/org/olat/modules/_spring/modulesContext.xml +++ b/src/main/java/org/olat/modules/_spring/modulesContext.xml @@ -18,5 +18,27 @@ <import resource="classpath:/org/olat/modules/webFeed/_spring/webFeedContext.xml"/> <import resource="classpath:/org/olat/modules/wiki/_spring/wikiContext.xml"/> <import resource="classpath:/org/olat/modules/reminder/_spring/reminderContext.xml"/> + + + + <!-- Forum admin. panel --> + <bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints"> + <property name="order" value="8208" /> + <property name="actionController"> + <bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype"> + <property name="className" value="org.olat.modules.fo.ui.ForumAdminController"/> + </bean> + </property> + <property name="navigationKey" value="forum" /> + <property name="i18nActionKey" value="admin.menu.title"/> + <property name="i18nDescriptionKey" value="admin.menu.title.alt"/> + <property name="translationPackage" value="org.olat.modules.fo"/> + <property name="parentTreeNodeIdentifier" value="modulesParent" /> + <property name="extensionPoints"> + <list> + <value>org.olat.admin.SystemAdminMainController</value> + </list> + </property> + </bean> </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsController.java b/src/main/java/org/olat/modules/dialog/DialogElementsController.java index 19a6f0e8642..370fc8eb013 100644 --- a/src/main/java/org/olat/modules/dialog/DialogElementsController.java +++ b/src/main/java/org/olat/modules/dialog/DialogElementsController.java @@ -85,8 +85,8 @@ import org.olat.course.properties.CoursePropertyManager; import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.ForumUIFactory; +import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.util.logging.activity.LoggingResourceable; @@ -365,7 +365,7 @@ public class DialogElementsController extends BasicController { if (DialogBoxUIFactory.isYesEvent(event)) { DialogCourseNode node = (DialogCourseNode) courseNode; // archive data to personal folder - node.doArchiveElement(selectedElement, CourseFactory.getOrCreateDataExportDirectory(ureq.getIdentity(), node.getShortTitle())); + node.doArchiveElement(selectedElement, CourseFactory.getOrCreateDataExportDirectory(getIdentity(), node.getShortTitle()), getLocale()); // delete element dialogElmsMgr.deleteDialogElement(coursePropMgr, courseNode, selectedElement.getForumKey()); forumMgr.deleteForum(selectedElement.getForumKey()); diff --git a/src/main/java/org/olat/modules/fo/DemoForumCallback.java b/src/main/java/org/olat/modules/fo/DemoForumCallback.java deleted file mode 100644 index 588b7af6684..00000000000 --- a/src/main/java/org/olat/modules/fo/DemoForumCallback.java +++ /dev/null @@ -1,70 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.fo; - -import org.olat.core.commons.services.notifications.SubscriptionContext; -/** - * @author schneider - */ -public class DemoForumCallback implements ForumCallback { - - /* (non-Javadoc) - * @see org.olat.modules.fo.ForumCallback#mayOpenNewThread() - */ - public boolean mayOpenNewThread() { - return true; - } - - public boolean mayReplyMessage() { - return true; - } - - public boolean mayEditMessageAsModerator() { - - return true; - } - - public boolean mayDeleteMessageAsModerator() { - - return false; - } - - public boolean mayArchiveForum() { - - return true; - } - - public boolean mayFilterForUser() { - return true; - } - - /** - * @see org.olat.modules.fo.ForumCallback#getSubscriptionContext() - */ - public SubscriptionContext getSubscriptionContext() { - return null; - } -} diff --git a/src/main/java/org/olat/modules/fo/FilterForUserController.java b/src/main/java/org/olat/modules/fo/FilterForUserController.java deleted file mode 100644 index d7aa7f65b38..00000000000 --- a/src/main/java/org/olat/modules/fo/FilterForUserController.java +++ /dev/null @@ -1,777 +0,0 @@ -/** - * <a href="http://www.openolat.org"> - * OpenOLAT - Online Learning and Training</a><br> - * <p> - * Licensed under the Apache License, Version 2.0 (the "License"); <br> - * you may not use this file except in compliance with the License.<br> - * You may obtain a copy of the License at the - * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> - * <p> - * Unless required by applicable law or agreed to in writing,<br> - * software distributed under the License is distributed on an "AS IS" BASIS, <br> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> - * See the License for the specific language governing permissions and <br> - * limitations under the License. - * <p> - * Initial code contributed and copyrighted by<br> - * frentix GmbH, http://www.frentix.com - * <p> - */ -package org.olat.modules.fo; - -import java.text.DateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - -import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory; -import org.olat.core.commons.modules.bc.meta.MetaInfo; -import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; -import org.olat.core.commons.services.mark.Mark; -import org.olat.core.commons.services.mark.MarkResourceStat; -import org.olat.core.commons.services.mark.MarkingService; -import org.olat.core.commons.services.notifications.SubscriptionContext; -import org.olat.core.dispatcher.mapper.Mapper; -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.link.LinkFactory; -import org.olat.core.gui.components.link.LinkPopupSettings; -import org.olat.core.gui.components.panel.StackedPanel; -import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter; -import org.olat.core.gui.components.table.DefaultColumnDescriptor; -import org.olat.core.gui.components.table.StaticColumnDescriptor; -import org.olat.core.gui.components.table.Table; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableDataModel; -import org.olat.core.gui.components.table.TableEvent; -import org.olat.core.gui.components.table.TableGuiConfiguration; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.control.creator.ControllerCreator; -import org.olat.core.gui.control.generic.ajax.autocompletion.AutoCompleterController; -import org.olat.core.gui.control.generic.ajax.autocompletion.EntriesChosenEvent; -import org.olat.core.gui.control.generic.ajax.autocompletion.ListProvider; -import org.olat.core.gui.control.generic.ajax.autocompletion.ListReceiver; -import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; -import org.olat.core.gui.media.MediaResource; -import org.olat.core.gui.media.NotFoundMediaResource; -import org.olat.core.gui.util.CSSHelper; -import org.olat.core.id.Identity; -import org.olat.core.id.OLATResourceable; -import org.olat.core.id.UserConstants; -import org.olat.core.logging.AssertException; -import org.olat.core.util.Formatter; -import org.olat.core.util.StringHelper; -import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.vfs.VFSContainer; -import org.olat.core.util.vfs.VFSItem; -import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.VFSMediaResource; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; -import org.olat.user.DisplayPortraitController; -import org.olat.user.UserInfoMainController; -import org.olat.user.UserManager; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * - * Description:<br> - * This controller is implementing a search by user. There is two ways to search: - * a text field with autocomplete to select directly the user and the list of - * users which have posted some messages in the forum. - * <BR> - * Events: - * <ul> - * <li>OpenMessageInThreadEvent</li> - * <ul> - * <P> - * Initial Date: 18 sept. 2009 <br> - * @author srosse - */ -public class FilterForUserController extends BasicController { - - private static final String CMD_SHOW = "show"; - private static final String CMD_HOMEPAGE = "homepage"; - - private final Forum forum; - private List<Message> msgs; - private List<Message> threadMsgs; - private List<Map<String, Object>> currentMessagesMap; - private UsersTableModel usersTableModel; - private UserListProvider userListProvider; - private boolean forumChangedEventReceived = false; - - private final VelocityContainer mainVC; - private VelocityContainer vcThreadView; - private final TableController userListCtr; - private final AutoCompleterController userAutoCompleterCtr; - private final DateFormat dateFormat; - private final StackedPanel searchPanel; - - private final OLATResourceable forumOres; - private final String thumbMapper; - - @Autowired - private ForumManager forumManager; - - public FilterForUserController(UserRequest ureq, WindowControl wControl, Forum forum) { - super(ureq, wControl); - this.forum = forum; - - msgs = forumManager.getMessagesByForum(forum); - forumOres = OresHelper.createOLATResourceableInstance(Forum.class,forum.getKey()); - - mainVC = createVelocityContainer("filter_for_user"); - - List<UserInfo> userInfoList = getUserInfoList(); - userListProvider = new UserListProvider(userInfoList); - - boolean ajax = wControl.getWindowBackOffice().getWindowManager().getGlobalSettings().getAjaxFlags().isIframePostEnabled(); - mainVC.contextPut("ajax", new Boolean(ajax)); - - // show key in result list, users that can see this filter have administrative rights - userAutoCompleterCtr = new AutoCompleterController(ureq, wControl, userListProvider, null, true, 60, 3, null); - listenTo(userAutoCompleterCtr); - - dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, ureq.getLocale()); - - TableGuiConfiguration tableConfig = new TableGuiConfiguration(); - tableConfig.setSortingEnabled(true); - - userListCtr = new TableController(tableConfig, ureq, wControl, getTranslator()); - DefaultColumnDescriptor lastNameDesc = new DefaultColumnDescriptor("table.user.lastname", 0, CMD_HOMEPAGE, ureq.getLocale()); - lastNameDesc.setIsPopUpWindowAction(true, "height=600, width=900, location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, toolbar=no"); - userListCtr.addColumnDescriptor(lastNameDesc); - DefaultColumnDescriptor firstNameDesc = new DefaultColumnDescriptor("table.user.firstname", 1, CMD_HOMEPAGE, ureq.getLocale()); - firstNameDesc.setIsPopUpWindowAction(true, "height=600, width=900, location=no, menubar=no, resizable=yes, status=no, scrollbars=yes, toolbar=no"); - userListCtr.addColumnDescriptor(firstNameDesc); - userListCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.user.replies", 2, null, ureq.getLocale())); - userListCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.user.threads", 3, null, ureq.getLocale())); - userListCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.lastModified", 4, null, ureq.getLocale())); - userListCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.numOfCharacters", 5, null, ureq.getLocale())); - userListCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.numOfWords", 6, null, ureq.getLocale())); - userListCtr.addColumnDescriptor(new StaticColumnDescriptor(CMD_SHOW, "viewswitch.title", getTranslator().translate("viewswitch.title"))); - - usersTableModel = new UsersTableModel(userInfoList); - userListCtr.setTableDataModel(usersTableModel); - listenTo(userListCtr); - - mainVC.put("userAutoCompleter", userAutoCompleterCtr.getInitialComponent()); - mainVC.put("userList", userListCtr.getInitialComponent()); - - //results - vcThreadView = createVelocityContainer("threadview"); - - // Mapper to display thumbnail images of file attachments - thumbMapper = registerCacheableMapper(ureq, "fo_att_" + forum.getKey(), new Mapper() { - @Override - public MediaResource handle(String relPath, HttpServletRequest request) { - String[] query = relPath.split("/"); // exptected path looks like this /messageId/attachmentUUID/filename - if (query.length == 4) { - try { - Long mId = Long.valueOf(Long.parseLong(query[1])); - Map<String, Object> map = null; - for (Map<String, Object> m : currentMessagesMap) { - // search for message in current message map - if (m.get("id").equals(mId)) { - map = m; - break; - } - } - if (map != null) { - ArrayList<VFSItem> attachments = (ArrayList<VFSItem>) map.get("attachments"); - for (VFSItem vfsItem : attachments) { - MetaInfo meta = ((MetaTagged)vfsItem).getMetaInfo(); - if (meta.getUUID().equals(query[2])) { - if (meta.isThumbnailAvailable()) { - VFSLeaf thumb = meta.getThumbnail(200, 200, false); - if(thumb != null) { - // Positive lookup, send as response - return new VFSMediaResource(thumb); - } - } - break; - } - } - } - } catch (NumberFormatException e) { - logDebug("Could not parse attachment path::" + relPath, null); - } - } - // In any error case, send not found - return new NotFoundMediaResource(request.getRequestURI()); - } - }); - - searchPanel = putInitialPanel(mainVC); - } - - /** - * Is the controller displaying the results - * @return - */ - public boolean isShowResults() { - return searchPanel.getContent() == vcThreadView; - } - - /** - * set the controller to its initial status, the search form - */ - public void setShowSearch() { - searchPanel.setContent(mainVC); - } - - public void forumChanged() { - forumChangedEventReceived = true; - } - - private boolean checkForumChangedEventReceived() { - if(forumChangedEventReceived) { - loadMessages(); - forumChangedEventReceived = false; - return true; - } - return false; - } - - private void loadMessages() { - - msgs = ForumManager.getInstance().getMessagesByForum(forum); - - List<UserInfo> userInfoList = getUserInfoList(); - userListProvider.setUserInfos(userInfoList); - usersTableModel = new UsersTableModel(userInfoList); - userListCtr.setTableDataModel(usersTableModel); - } - - protected List<UserInfo> getUserInfoList() { - Map<Identity,UserInfo> infoMap = new HashMap<Identity,UserInfo>(); - - for(Message msg:msgs) { - Identity creator = msg.getCreator(); - if(creator == null) continue; - UserInfo stats = infoMap.get(creator); - if(stats == null) { - stats = new UserInfo(creator); - stats.setLastModified(msg.getLastModified()); - infoMap.put(creator, stats); - } else { - - Date lastModified = msg.getLastModified(); - if(stats.getLastModified().compareTo(lastModified) > 0) { - stats.setLastModified(lastModified); - } - } - - if(msg.getParent() == null) { - stats.incThreads(); - } else { - stats.incReplies(); - } - stats.addNumOfCharacters(msg.getNumOfCharacters()); - stats.addNumOfWords(msg.getNumOfWords()); - } - - List<UserInfo> infoList = new ArrayList<UserInfo>(infoMap.values()); - Collections.sort(infoList); - return infoList; - } - - @Override - protected void doDispose() { - // - } - - @Override - protected void event(UserRequest ureq, Component source, Event event) { - checkForumChangedEventReceived(); - - if (source instanceof Link) { - // all other commands have the message value map id coded into the - // the command name. get message from this id - Link link = (Link) source; - String command = link.getCommand(); - Map<String, Object> messageMap = getMessageMapFromCommand(ureq.getIdentity(), command); - Long messageId = (Long) messageMap.get("id"); - - Message selectedMessage = forumManager.loadMessage(messageId); - if (selectedMessage != null) { - if (command.startsWith("open_in_thread_")) { - fireEvent(ureq, new OpenMessageInThreadEvent(selectedMessage)); - } - } - } - } - - /** - * Get the message value map from a velocity command. The command must have - * the signature commandname_messagemapid - * - * @param identity - * @param command - * @return Map the value map for the current message - */ - private Map<String, Object> getMessageMapFromCommand(Identity identity, String command) { - String cmdId = command.substring(command.lastIndexOf("_") + 1); - try { - Integer id = Integer.valueOf(cmdId); - return currentMessagesMap.get(id.intValue()); - } catch (NumberFormatException e) { - throw new AssertException("Tried to parse forum message id from command::" + command - + " but message id was not a long. Could be a user who tries to hack the system. User::" + identity.getName(), e); - } - } - - @Override - protected void event(UserRequest ureq, Controller source, Event event) { - checkForumChangedEventReceived(); - - if(source == userListCtr) { - if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { - TableEvent te = (TableEvent) event; - - int rowid = te.getRowId(); - final UserInfo selectedInfo = usersTableModel.getUserInfo(rowid); - if (te.getActionId().equals(CMD_SHOW)) { - showMessages(ureq, selectedInfo); - } else if (te.getActionId().equals(CMD_HOMEPAGE)) { - ControllerCreator ctrlCreator = new ControllerCreator() { - @Override - public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, selectedInfo.getIdentity(), true, false); - } - }; - // wrap the content controller into a full header layout - ControllerCreator layoutCtrlr = BaseFullWebappPopupLayoutFactory.createAuthMinimalPopupLayout(ureq, ctrlCreator); - // open in new browser window - PopupBrowserWindow pbw = getWindowControl().getWindowBackOffice().getWindowManager().createNewPopupBrowserWindowFor(ureq, - layoutCtrlr); - pbw.open(ureq); - } - } - } else if (source == userAutoCompleterCtr) { - if(event instanceof EntriesChosenEvent) { - List<String> selectedUsernames = ((EntriesChosenEvent)event).getEntries(); - if(selectedUsernames.size() == 1) { - String username = selectedUsernames.get(0); - UserInfo selectedInfo = usersTableModel.getUserInfo(username); - if(selectedInfo != null) { - showMessages(ureq, selectedInfo); - } - } - } - } - } - - protected void showMessages(UserRequest ureq, UserInfo selectedInfo) { - // for simplicity no reuse of container, always create new one - vcThreadView = createVelocityContainer("threadview"); - vcThreadView.contextPut("filteredForFirstName", selectedInfo.getFirstName()); - vcThreadView.contextPut("filteredForLastName", selectedInfo.getLastName()); - - vcThreadView.contextPut("isClosed", Boolean.FALSE); - vcThreadView.contextPut("isHidden",Boolean.FALSE); - - vcThreadView.contextPut("showThreadTable", Boolean.FALSE); - vcThreadView.contextPut("threadMode", Boolean.FALSE); - vcThreadView.contextPut("msgDeepMap", null); - - threadMsgs = getMessages(selectedInfo.getIdentity()); - - // add all messages that are needed - currentMessagesMap = new ArrayList<Map<String, Object>>(threadMsgs.size()); - - // load marks - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - List<String> markResSubPath = new ArrayList<String>(); - for(Message threadMsg:threadMsgs) { - markResSubPath.add(threadMsg.getKey().toString()); - } - List<Mark> markList = markingService.getMarkManager().getMarks(forumOres, ureq.getIdentity(), markResSubPath); - Map<String,Mark> marks = new HashMap<String,Mark>(markList.size() * 2 + 1); - for(Mark mark:markList) { - marks.put(mark.getResSubPath(), mark); - } - List<MarkResourceStat> statList = markingService.getMarkManager().getStats(forumOres, markResSubPath, null); - Map<String,MarkResourceStat> stats = new HashMap<String,MarkResourceStat>(statList.size() * 2 + 1); - for(MarkResourceStat stat:statList) { - stats.put(stat.getSubPath(), stat); - } - - // all messages in flat view - List<Message> orderedMessages = new ArrayList<Message>(); - - orderedMessages.addAll(threadMsgs); - orderedMessages = threadMsgs; - Collections.sort(orderedMessages, new MessageComparatorByDate()); - - int msgNum = 0; - for(Message msg:orderedMessages) { - addMessageToCurrentMessagesAndVC(ureq, msg, vcThreadView, currentMessagesMap, msgNum++, marks, stats); - } - - vcThreadView.contextPut("messages", currentMessagesMap); - - // Mapper to display thumbnail images of file attachments - vcThreadView.contextPut("thumbMapper", thumbMapper); - // add security callback - vcThreadView.contextPut("security", new SearchForumCallback()); - searchPanel.setContent(vcThreadView); - } - - //TODO this method is very similar to the same in ForumController - private void addMessageToCurrentMessagesAndVC(UserRequest ureq, Message m, VelocityContainer vcContainer, List<Map<String, Object>> allList, int msgCount, Map<String,Mark> marks, Map<String,MarkResourceStat> stats) { - // all values belonging to a message are stored in this map - // these values can be accessed in velocity. make sure you clean up - // everything - // you create here in disposeCurrentMessages()! - Map<String, Object> map = new HashMap<String, Object>(); - map.put("id", m.getKey()); - - map.put("newMessage", Boolean.FALSE); - - // add some data now - Date creationDate = m.getCreationDate(); - Identity modifier = m.getModifier(); - if (modifier != null) { - map.put("isModified", Boolean.TRUE); - map.put("modfname",StringHelper.escapeHtml( modifier.getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale()))); - map.put("modlname", StringHelper.escapeHtml(modifier.getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale()))); - } else { - map.put("isModified", Boolean.FALSE); - } - map.put("title", m.getTitle()); - map.put("body", m.getBody()); - map.put("date", dateFormat.format(creationDate)); - Identity creator = m.getCreator(); - - - map.put("firstname", StringHelper.escapeHtml(Formatter.truncate(creator.getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale()), 18))); //keeps the first 15 chars - map.put("lastname", StringHelper.escapeHtml(Formatter.truncate(creator.getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale()), 18))); - - String subPath = m.getKey().toString(); - Mark currentMark = marks.get(subPath); - MarkResourceStat stat = stats.get(subPath); - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - - if(!ureq.getUserSession().getRoles().isGuestOnly()) { - String businessPath = currentMark == null ? - getWindowControl().getBusinessControl().getAsString() + "[Message:" + m.getKey() + "]" - : currentMark.getBusinessPath(); - Controller markCtrl = markingService.getMarkController(ureq, getWindowControl(), currentMark, stat, forumOres, subPath, businessPath); - vcThreadView.put("mark_"+msgCount, markCtrl.getInitialComponent()); - } - - map.put("modified", dateFormat.format(m.getLastModified())); - // message attachments - ForumManager fm = ForumManager.getInstance(); - VFSContainer msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey()); - map.put("messageContainer", msgContainer); - List<VFSItem> attachments = new ArrayList<VFSItem>(msgContainer.getItems(new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES))); -// List attachments = msgContainer.getItems(); - map.put("attachments", attachments); - if (attachments == null || attachments.size() == 0) map.put("hasAttachments", Boolean.FALSE); - else map.put("hasAttachments", Boolean.TRUE); - // number of children and modify/delete permissions - map.put("nOfCh", new Integer(1)); - boolean userIsMsgCreator = ureq.getIdentity().getKey().equals(creator.getKey()); - Boolean uIsMsgC = new Boolean(userIsMsgCreator); - map.put("uIsMsgC", uIsMsgC); - boolean isThreadtop = m.getThreadtop()==null; - map.put("isThreadtop", Boolean.valueOf(isThreadtop)); - boolean isThreadClosed = Status.getStatus(m.getStatusCode()).isClosed(); - if(!isThreadtop) { - isThreadClosed = Status.getStatus(m.getThreadtop().getStatusCode()).isClosed(); - } - map.put("isThreadClosed", isThreadClosed); - // add portrait to map for later disposal and key for rendering in velocity - DisplayPortraitController portrait = new DisplayPortraitController(ureq, getWindowControl(), m.getCreator(), true, true); - // add also to velocity - map.put("portrait", portrait); - String portraitComponentVCName = m.getKey().toString(); - map.put("portraitComponentVCName", portraitComponentVCName); - vcContainer.put(portraitComponentVCName, portrait.getInitialComponent()); - // Add link with username that is clickable - String creatorFullName = StringHelper.escapeHtml(UserManager.getInstance().getUserDisplayName(creator)); - Link vcLink = LinkFactory.createCustomLink("vc_"+msgCount, "vc_"+msgCount, creatorFullName, Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, vcThreadView, this); - vcLink.setUserObject(msgCount); - LinkPopupSettings settings = new LinkPopupSettings(800, 600, "_blank"); - vcLink.setPopup(settings); - allList.add(map); - - Link link = LinkFactory.createCustomLink("open_in_thread_"+msgCount, "open_in_thread_"+msgCount, "msg.open_in_thread", Link.BUTTON_SMALL, vcThreadView, this); - link.setIconRightCSS("o_icon o_icon_start"); - } - - private List<Message> getMessages(Identity identity) { - List<Message> usersMessages = new ArrayList<Message>(); - for(Message msg:msgs) { - if(identity.equals(msg.getCreator())) { - usersMessages.add(msg); - } - } - return usersMessages; - } - - /** - * Provider for the autocomplete - */ - public class UserListProvider implements ListProvider { - private List<UserInfo> stats; - - public UserListProvider(List<UserInfo> stats) { - this.stats = stats; - } - - public List<UserInfo> getUserInfos() { - return stats; - } - - public void setUserInfos(List<UserInfo> stats) { - this.stats = stats; - } - - public void getResult(String searchValue, ListReceiver receiver) { - searchValue = searchValue == null ? null : searchValue.toLowerCase(); - for(UserInfo info:stats) { - Identity identity = info.getIdentity(); - String name = identity.getName(); - - if(identity.getName().startsWith(searchValue)) { - receiver.addEntry(name, name, info.getLastName() + " " + info.getFirstName(), CSSHelper.CSS_CLASS_USER); - } else if(info.getFirstNameLowerCase().startsWith(searchValue)) { - receiver.addEntry(name, name, info.getLastName() + " " + info.getFirstName(), CSSHelper.CSS_CLASS_USER); - } else if(info.getLastNameLowerCase().startsWith(searchValue)) { - receiver.addEntry(name, name, info.getLastName() + " " + info.getFirstName(), CSSHelper.CSS_CLASS_USER); - } - } - } - } - - /** - * Read-only security callback - */ - public class SearchForumCallback implements ForumCallback { - - public SubscriptionContext getSubscriptionContext() { - return null; - } - - public boolean mayArchiveForum() { - return false; - } - - public boolean mayDeleteMessageAsModerator() { - return false; - } - - public boolean mayEditMessageAsModerator() { - return false; - } - - public boolean mayFilterForUser() { - return true; - } - - public boolean mayOpenNewThread() { - return false; - } - - public boolean mayReplyMessage() { - return false; - } - } - - /** - * TableDataModel for the overview of all users in the forum - */ - public class UsersTableModel extends BaseTableDataModelWithoutFilter<UserInfo> implements TableDataModel<UserInfo> { - private final List<UserInfo> infos; - - public UsersTableModel(List<UserInfo> infos) { - this.infos = infos; - } - - public UserInfo getUserInfo(String username) { - for(UserInfo info:infos) { - Identity id = info.getIdentity(); - if(username.equals(id.getName())) { - return info; - } - } - return null; - } - - public UserInfo getUserInfoByKey(Long key) { - for (UserInfo info : infos) { - Identity id = info.getIdentity(); - if (key.equals(id.getKey())) { return info; } - } - return null; - } - - public UserInfo getUserInfo(int rowid) { - if(rowid >= 0 && rowid < infos.size()) { - return infos.get(rowid); - } - return null; - } - - public int getColumnCount() { - return 5; - } - - public int getRowCount() { - return infos.size(); - } - - public Object getValueAt(int row, int col) { - UserInfo userStats = infos.get(row); - switch(col) { - case 0: return userStats.getLastName(); - case 1: return userStats.getFirstName(); - case 2: return Integer.toString(userStats.getReplies()); - case 3: return Integer.toString(userStats.getThreads()); - case 4: { - if(userStats.getLastModified() == null) - return ""; - return dateFormat.format(userStats.getLastModified()); - } - case 5: return userStats.getNumOfCharacters(); - case 6: return userStats.getNumOfWords(); - case 7: return userStats; - default: return ""; - } - } - - } - - /** - * Wrapper for all the statistics needed by the overview of all users - * and the autocomplete - */ - public class UserInfo implements Comparable<UserInfo> { - private int replies = 0; - private int threads = 0; - private int numOfCharacters = 0; - private int numOfWords = 0; - private Date lastModified; - private final Identity identity; - - private String firstName; - private String lastName; - private String firstNameLowerCase; - private String lastNameLowerCase; - - public UserInfo(Identity identity) { - this.identity = identity; - - firstName = identity.getUser().getProperty(UserConstants.FIRSTNAME, getLocale()); - lastName = identity.getUser().getProperty(UserConstants.LASTNAME, getLocale()); - firstNameLowerCase = firstName.toLowerCase(); - lastNameLowerCase = lastName.toLowerCase(); - } - - public Identity getIdentity() { - return identity; - } - - public int getReplies() { - return replies; - } - - public int getThreads() { - return threads; - } - - public int getNumOfCharacters() { - return numOfCharacters; - } - - public int getNumOfWords() { - return numOfWords; - } - - public Date getLastModified() { - return lastModified; - } - - public void setLastModified(Date lastModified) { - this.lastModified = lastModified; - } - - public String getFirstName() { - return firstName; - } - - public String getLastName() { - return lastName; - } - - public String getFirstNameLowerCase() { - return firstNameLowerCase; - } - - public String getLastNameLowerCase() { - return lastNameLowerCase; - } - - public void incReplies() { - replies++; - } - - public void incThreads() { - threads++; - } - - public void addNumOfCharacters(Integer characters) { - if(characters != null) { - numOfCharacters += characters.intValue(); - } - } - - public void addNumOfWords(Integer words) { - if(words != null) { - numOfWords += words.intValue(); - } - } - - public int compareTo(UserInfo o) { - if(o == null) return -1; - String l1 = getLastNameLowerCase(); - String l2 = o.getLastNameLowerCase(); - if(l1 == null) - return -1; - if(l2 == null) - return 1; - return l1.compareTo(l2); - } - } - - /** - * Sort the message by date, ascending - */ - private class MessageComparatorByDate implements Comparator<Message> { - public int compare(Message o1, Message o2) { - Date d1 = o1.getLastModified(); - Date d2 = o2.getLastModified(); - - if(d1 == null) - return -1; - else if(d2 == null) - return 1; - return d1.compareTo(d2); - } - } -} diff --git a/src/main/java/org/olat/modules/fo/ForumCallback.java b/src/main/java/org/olat/modules/fo/ForumCallback.java index d29a61e2aa3..3c6b12d44b1 100644 --- a/src/main/java/org/olat/modules/fo/ForumCallback.java +++ b/src/main/java/org/olat/modules/fo/ForumCallback.java @@ -31,40 +31,45 @@ import org.olat.core.commons.services.notifications.SubscriptionContext; * @author schneider */ public interface ForumCallback { + + /** + * @return if allowed to post in forum with a pseudonym + */ + public boolean mayUsePseudonym(); /** * @return if allowed to open a new forum thread */ - boolean mayOpenNewThread(); + public boolean mayOpenNewThread(); /** * @return if the current user may reply to messages */ - boolean mayReplyMessage(); + public boolean mayReplyMessage(); /** * @return if allowed to moderate */ - boolean mayEditMessageAsModerator(); + public boolean mayEditMessageAsModerator(); /** * @return if allowed to delete non-owned messages */ - boolean mayDeleteMessageAsModerator(); + public boolean mayDeleteMessageAsModerator(); /** * @return true if allowed to archive the whole forum or threads of it */ - boolean mayArchiveForum(); + public boolean mayArchiveForum(); /** * @return true if allowed to filter the whole forum */ - boolean mayFilterForUser(); + public boolean mayFilterForUser(); /** * @return the subscriptionContext. if null, then no subscription must be offered */ - SubscriptionContext getSubscriptionContext(); + public SubscriptionContext getSubscriptionContext(); } diff --git a/src/main/java/org/olat/modules/fo/ForumChangedEvent.java b/src/main/java/org/olat/modules/fo/ForumChangedEvent.java index 554729273f2..de6a5e7bbc9 100644 --- a/src/main/java/org/olat/modules/fo/ForumChangedEvent.java +++ b/src/main/java/org/olat/modules/fo/ForumChangedEvent.java @@ -39,8 +39,29 @@ import org.olat.core.util.event.MultiUserEvent; public class ForumChangedEvent extends MultiUserEvent { private static final long serialVersionUID = -6798225990538608024L; + + public static final String SPLIT = "split"; + public static final String CLOSE = "close"; + public static final String OPEN = "open"; + public static final String HIDE = "hide"; + public static final String SHOW = "show"; + public static final String NEW = "new"; + public static final String STICKY = "sticky"; + + private Long threadtopKey; + private Long messageKey; - public ForumChangedEvent(String command) { - super(command); - } + public ForumChangedEvent(String command, Long threadtopKey, Long messageKey) { + super(command); + this.threadtopKey = threadtopKey; + this.messageKey = messageKey; + } + + public Long getThreadtopKey() { + return threadtopKey; + } + + public Long getMessageKey() { + return messageKey; + } } diff --git a/src/main/java/org/olat/modules/fo/ForumController.java b/src/main/java/org/olat/modules/fo/ForumController.java deleted file mode 100644 index 3967c45039d..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumController.java +++ /dev/null @@ -1,1797 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.orgrmform -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <p> -*/ - -package org.olat.modules.fo; - -import java.io.File; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.lang.StringEscapeUtils; -import org.olat.NewControllerFactory; -import org.olat.basesecurity.BaseSecurityModule; -import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.modules.bc.FolderConfig; -import org.olat.core.commons.modules.bc.meta.MetaInfo; -import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; -import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.commons.persistence.PersistenceHelper; -import org.olat.core.commons.services.mark.Mark; -import org.olat.core.commons.services.mark.MarkResourceStat; -import org.olat.core.commons.services.mark.MarkingService; -import org.olat.core.commons.services.notifications.NotificationsManager; -import org.olat.core.commons.services.notifications.PublisherData; -import org.olat.core.commons.services.notifications.SubscriptionContext; -import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; -import org.olat.core.dispatcher.mapper.Mapper; -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.link.LinkFactory; -import org.olat.core.gui.components.link.LinkPopupSettings; -import org.olat.core.gui.components.panel.SimpleStackedPanel; -import org.olat.core.gui.components.panel.StackedPanel; -import org.olat.core.gui.components.table.BooleanColumnDescriptor; -import org.olat.core.gui.components.table.ColumnDescriptor; -import org.olat.core.gui.components.table.CustomCellRenderer; -import org.olat.core.gui.components.table.CustomCssCellRenderer; -import org.olat.core.gui.components.table.CustomRenderColumnDescriptor; -import org.olat.core.gui.components.table.DefaultColumnDescriptor; -import org.olat.core.gui.components.table.DefaultTableDataModel; -import org.olat.core.gui.components.table.GenericObjectArrayTableDataModel; -import org.olat.core.gui.components.table.Table; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableEvent; -import org.olat.core.gui.components.table.TableGuiConfiguration; -import org.olat.core.gui.components.velocity.VelocityContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; -import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.gui.control.generic.modal.DialogBoxController; -import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; -import org.olat.core.gui.media.MediaResource; -import org.olat.core.gui.media.NotFoundMediaResource; -import org.olat.core.gui.render.Renderer; -import org.olat.core.gui.render.StringOutput; -import org.olat.core.id.Identity; -import org.olat.core.id.OLATResourceable; -import org.olat.core.id.User; -import org.olat.core.id.UserConstants; -import org.olat.core.id.context.BusinessControl; -import org.olat.core.id.context.BusinessControlFactory; -import org.olat.core.id.context.ContextEntry; -import org.olat.core.id.context.StateEntry; -import org.olat.core.logging.AssertException; -import org.olat.core.logging.OLATSecurityException; -import org.olat.core.logging.activity.ILoggingAction; -import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; -import org.olat.core.util.ConsumableBoolean; -import org.olat.core.util.Formatter; -import org.olat.core.util.StringHelper; -import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.event.GenericEventListener; -import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.vfs.VFSContainer; -import org.olat.core.util.vfs.VFSItem; -import org.olat.core.util.vfs.VFSLeaf; -import org.olat.core.util.vfs.VFSMediaResource; -import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; -import org.olat.modules.fo.archiver.ForumArchiveManager; -import org.olat.modules.fo.archiver.formatters.ForumRTFFormatter; -import org.olat.portfolio.EPUIFactory; -import org.olat.search.SearchServiceUIFactory; -import org.olat.search.SearchServiceUIFactory.DisplayOption; -import org.olat.user.DisplayPortraitController; -import org.olat.user.UserManager; -import org.olat.util.logging.activity.LoggingResourceable; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * Description: <br> - * CREATE: - new thread (topmessage) -> ask ForumCallback 'mayOpenNewThread' - - * new message -> ask ForumCallback 'mayReplyMessage' <br> - * READ: - everybody may read every message <br> - * UPDATE: - who wrote a message may edit and save his message as long as it has - * no children. - if somebody want to edit a message of somebodyelse -> ask - * ForumCallback 'mayEditMessageAsModerator' <br> - * DELETE: - who wrote a message may delete his message as long as it has no - * children. - if somebody want to delete a message of somebodyelse -> ask - * ForumCallback 'mayDeleteMessageAsModerator' <br> - * <br> - * Notifications: notified when: <br> - * a new thread is opened <br> - * a new reply is given <br> - * a message has been edited <br> - * but not when a message has been deleted <br> - * - * @author Felix Jost - * @author Refactorings: Roman Haag, roman.haag@frentix.com, frentix GmbH - */ -public class ForumController extends BasicController implements GenericEventListener, Activateable2 { - - protected static final String TINYMCE_EMPTYLINE_CODE = "<p> </p>"; //is pre/appended to quote message to allow writing inside. - - private static final String CMD_SHOWDETAIL = "showdetail"; - private static final String CMD_SHOWMARKED = "showmarked"; - private static final String CMD_SHOWNEW = "shownew"; - - protected static final String GUI_PREFS_THREADVIEW_KEY = "forum.threadview.enabled"; - - private ForumCallback focallback; - - Message currentMsg; // current Msg (in detailview), so we know after - private Formatter f; - - private Collator collator; - - private StackedPanel forumPanel; - - private VelocityContainer vcListTitles; - private VelocityContainer vcEditMessage; - private VelocityContainer vcThreadView; - private VelocityContainer vcFilterView; - private Link msgCreateButton; - private Link archiveForumButton; - private Link archiveThreadButton; - private Link backLinkListTitles; - private Link backLinkSearchListTitles; - private List<Map<String, Object>> currentMessagesMap; - private Link closeThreadButton; - private Link openThreadButton; - private Link hideThreadButton; - private Link showThreadButton; - private Link filterForUserButton; - - private TableController allThreadTableCtr; - private TableController singleThreadTableCtr; - - private GenericObjectArrayTableDataModel attdmodel; - private ForumMessagesTableDataModel sttdmodel; - private ForumManager fm; - private Forum forum; - private List<Message> msgs; - private List<Message> threadMsgs; - private Set<Long> rms; // all keys from messages that the user already read - private boolean forumChangedEventReceived = false; - - private DialogBoxController yesno, yesNoSplit, archiveFoDiaCtr, archiveThDiaCtr; - private TableController moveMessageTableCtr; - List<Message> threadList; - private CloseableModalController cmcMoveMsg; - - private SubscriptionContext subsContext; - private ContextualSubscriptionController csc; - - private MessageEditController msgEditCtr; - private CloseableModalController msgEditCmc; - private ForumThreadViewModeController viewSwitchCtr; - private Map<Long, Integer> msgDeepMap; - - private boolean searchMode = false; - private FilterForUserController filterForUserCtr; - - private Controller searchController; - - private final OLATResourceable forumOres; - - private final String thumbMapper; - - @Autowired - private BaseSecurityModule securityModule; - @Autowired - private UserManager userManager; - - /** - * @param forum - * @param focallback - * @param ureq - * @param wControl - */ - public ForumController(UserRequest ureq, WindowControl wControl, - Forum forum, ForumCallback focallback, boolean showSubscriptionButton) { - super(ureq, wControl); - this.forum = forum; - this.focallback = focallback; - addLoggingResourceable(LoggingResourceable.wrap(forum)); - - forumOres = OresHelper.createOLATResourceableInstance(Forum.class,forum.getKey()); - f = Formatter.getInstance(ureq.getLocale()); - fm = ForumManager.getInstance(); - - msgs = fm.getMessagesByForum(forum); - - collator = Collator.getInstance(ureq.getLocale()); - collator.setStrength(Collator.PRIMARY); - - forumPanel = new SimpleStackedPanel("forumPanel"); - forumPanel.addListener(this); - - //create page - vcListTitles = createVelocityContainer("list_titles"); - - msgCreateButton = LinkFactory.createButtonSmall("msg.create", vcListTitles, this); - msgCreateButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_thread_icon"); - msgCreateButton.setElementCssClass("o_sel_forum_thread_new"); - archiveForumButton = LinkFactory.createButtonSmall("archive.forum", vcListTitles, this); - archiveForumButton.setIconLeftCSS("o_icon o_icon-fw o_icon_archive_tool"); - archiveForumButton.setElementCssClass("o_sel_forum_archive"); - - if(securityModule.isUserAllowedAutoComplete(ureq.getUserSession().getRoles())) { - filterForUserButton = LinkFactory.createButtonSmall("filter", vcListTitles, this); - filterForUserButton.setIconLeftCSS("o_icon o_icon-fw o_icon_user"); - filterForUserButton.setElementCssClass("o_sel_forum_filter"); - } - - if(!this.isGuestOnly(ureq)) { - SearchServiceUIFactory searchServiceUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class); - searchController = searchServiceUIFactory.createInputController(ureq, wControl, DisplayOption.STANDARD, null); - listenTo(searchController); - vcListTitles.put("search_input", searchController.getInitialComponent()); - } - - // a list of titles of all messages in all threads - vcListTitles.contextPut("security", focallback); - - // --- subscription --- - subsContext = focallback.getSubscriptionContext(); - // if sc is null, then no subscription is desired - if (subsContext != null && showSubscriptionButton) { - String businessPath = wControl.getBusinessControl().getAsString(); - String data = String.valueOf(forum.getKey()); - PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(Forum.class), data, businessPath); - - csc = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext, pdata); - listenTo(csc); - - vcListTitles.put("subscription", csc.getInitialComponent()); - } - - TableGuiConfiguration tableConfig = new TableGuiConfiguration(); - tableConfig.setCustomCssClass("o_forum"); - tableConfig.setSelectedRowUnselectable(true); - tableConfig.setDownloadOffered(false); - tableConfig.setTableEmptyMessage(translate("forum.emtpy")); - - allThreadTableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); - listenTo(allThreadTableCtr); - allThreadTableCtr.addColumnDescriptor(new CustomRenderColumnDescriptor("table.header.typeimg", 0, null, - ureq.getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, new MessageIconRenderer())); - allThreadTableCtr.addColumnDescriptor(new StickyRenderColumnDescriptor("table.thread", 1, CMD_SHOWDETAIL, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_LEFT, new StickyThreadCellRenderer())); - allThreadTableCtr.addColumnDescriptor(new StickyColumnDescriptor("table.userfriendlyname", 2, null, ureq.getLocale())); - allThreadTableCtr.addColumnDescriptor(new StickyColumnDescriptor("table.lastModified", 3, null, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_CENTER)); - allThreadTableCtr.addColumnDescriptor(new StickyColumnDescriptor("table.marked", 4, CMD_SHOWMARKED, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_RIGHT)); - allThreadTableCtr.addColumnDescriptor(new StickyColumnDescriptor("table.unread", 5, CMD_SHOWNEW, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_RIGHT)); - allThreadTableCtr.addColumnDescriptor(new StickyColumnDescriptor("table.total", 6, null, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_RIGHT)); - - singleThreadTableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); - listenTo(singleThreadTableCtr); - singleThreadTableCtr.addColumnDescriptor(new ThreadColumnDescriptor("table.title", 0, CMD_SHOWDETAIL)); - singleThreadTableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.userfriendlyname", 1, null, ureq.getLocale())); - singleThreadTableCtr.addColumnDescriptor(new DefaultColumnDescriptor("table.modified", 2, null, ureq.getLocale(), - ColumnDescriptor.ALIGNMENT_CENTER)); - singleThreadTableCtr - .addColumnDescriptor(new BooleanColumnDescriptor("table.header.state", 3, "", translate("table.row.new"))); - - rms = getReadSet(ureq.getIdentity()); // here we fetch which messages had - - // been read by the user - threadList = prepareListTitles(msgs); - - //precalulate message deepness - precalcMessageDeepness(msgs); - - // Default view - forumPanel = putInitialPanel(vcListTitles); - // jump to either the forum or the folder if the business-launch-path says so. - BusinessControl bc = getWindowControl().getBusinessControl(); - ContextEntry ce = bc.popLauncherContextEntry(); - if ( ce != null) { // a context path is left for me - if (isLogDebugEnabled()) logDebug("businesscontrol (for further jumps) would be: ", bc.toString()); - OLATResourceable ores = ce.getOLATResourceable(); - if (isLogDebugEnabled()) logDebug("OLATResourceable= " , ores.toString()); - Long resId = ores.getResourceableId(); - if (resId.longValue() != 0) { - if (isLogDebugEnabled()) logDebug("messageId=" , ores.getResourceableId().toString()); - currentMsg = fm.loadMessage(ores.getResourceableId()); - if (currentMsg != null) { - showThreadView(ureq, currentMsg, null); - scrollToCurrentMessage(); - } else { - // message not found, do nothing. Load normal start screen - showError("deleteok"); - logDebug("Invalid messageId=", ores.getResourceableId().toString()); - } - } else { - //FIXME:chg: Should not happen, occurs when course-node are called - if (isLogDebugEnabled()) logDebug("Invalid messageId=" , ores.getResourceableId().toString()); - } - } - - // Mapper to display thumbnail images of file attachments - thumbMapper = registerCacheableMapper(ureq, "fo_att_" + forum.getKey(), new Mapper() { - @Override - public MediaResource handle(String relPath, HttpServletRequest request) { - String[] query = relPath.split("/"); // exptected path looks like this /messageId/attachmentUUID/filename - if (query.length == 4) { - try { - Long mId = Long.valueOf(Long.parseLong(query[1])); - Map<String, Object> map = null; - for (Map<String, Object> m : currentMessagesMap) { - // search for message in current message map - if (m.get("id").equals(mId)) { - map = m; - break; - } - } - if (map != null) { - ArrayList<VFSItem> attachments = (ArrayList<VFSItem>) map.get("attachments"); - for (VFSItem vfsItem : attachments) { - MetaInfo meta = ((MetaTagged)vfsItem).getMetaInfo(); - if (meta.getUUID().equals(query[2])) { - if (meta.isThumbnailAvailable()) { - VFSLeaf thumb = meta.getThumbnail(200, 200, false); - if(thumb != null) { - // Positive lookup, send as response - return new VFSMediaResource(thumb); - } - } - break; - } - } - } - } catch (NumberFormatException e) { - logDebug("Could not parse attachment path::" + relPath, null); - } - } - // In any error case, send not found - return new NotFoundMediaResource(request.getRequestURI()); - } - }); - - // Register for forum events - CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), forum); - - //filter for user - vcFilterView = createVelocityContainer("filter_view"); - } - - @Override - public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - if(entries == null || entries.isEmpty()) return; - - Long resId = entries.get(0).getOLATResourceable().getResourceableId(); - if (resId.longValue() != 0) { - currentMsg = fm.loadMessage(resId); - if (currentMsg != null) { - showThreadView(ureq, currentMsg, null); - scrollToCurrentMessage(); - } - } - } - - /** - * If event received, must update thread overview. - */ - private boolean checkForumChangedEventReceived() { - if(forumChangedEventReceived) { - this.showThreadOverviewView(); - forumChangedEventReceived = false; - return true; - } - return false; - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ - public void event(UserRequest ureq, Component source, Event event) { - if(checkForumChangedEventReceived()) { - return; - } - String cmd = event.getCommand(); - if (source == msgCreateButton){ - showNewThreadView(ureq); - } else if (source == archiveForumButton){ - archiveFoDiaCtr = activateYesNoDialog(ureq, null, translate("archive.forum.dialog"), archiveFoDiaCtr); - } else if (source == filterForUserButton) { - showFilterForUserView(ureq); - } else if (source == backLinkListTitles){ // back link list titles - if(searchMode && filterForUserCtr != null && filterForUserCtr.isShowResults()) { - forumPanel.setContent(vcFilterView); - } else { - searchMode = false; - showThreadOverviewView(); - } - } else if (source == backLinkSearchListTitles) { - if(filterForUserCtr != null && filterForUserCtr.isShowResults()) { - filterForUserCtr.setShowSearch(); - } else { - showThreadOverviewView(); - } - } else if (source == archiveThreadButton){ - archiveThDiaCtr = activateYesNoDialog(ureq, null, translate("archive.thread.dialog"), archiveThDiaCtr); - } else if (source == closeThreadButton) { - closeThread(currentMsg, true); - } else if (source == openThreadButton) { - closeThread(currentMsg, false); - } else if (source == hideThreadButton) { - hideThread(currentMsg, true); - } else if (source == showThreadButton) { - hideThread(currentMsg, false); - } else if (source == vcThreadView) { - if (cmd.startsWith("attachment_")) { - Map<String, Object> messageMap = getMessageMapFromCommand(ureq.getIdentity(), cmd); - Long messageId = (Long) messageMap.get("id"); - currentMsg = fm.loadMessage(messageId); - doAttachmentDelivery(ureq, cmd, messageMap); - } - } else if (source instanceof Link) { - // all other commands have the message value map id coded into the - // the command name. get message from this id - Link link = (Link) source; - String command = link.getCommand(); - Map<String, Object> messageMap = getMessageMapFromCommand(ureq.getIdentity(), command); - Long messageId = (Long) messageMap.get("id"); - - Message updatedMessage = fm.loadMessage(messageId); - if (updatedMessage!=null) { - currentMsg = updatedMessage; - // now dispatch the commands - if (command.startsWith("qt_")) { - showReplyView(ureq, true, currentMsg); - } else if (command.startsWith("rp_")) { - showReplyView(ureq, false, currentMsg); - } else if (command.startsWith("dl_")) { - showDeleteMessageView(ureq); - } else if (command.startsWith("ed_")) { - showEditMessageView(ureq); - } else if (command.startsWith("split_")) { - showSplitThreadView(ureq); - } else if (command.startsWith("move_")) { - showMoveMessageView(ureq); - } else if (command.startsWith("vc_")) { - Map<String, Object> map = currentMessagesMap.get((Integer)link.getUserObject()); - DisplayPortraitController dpC = (DisplayPortraitController) map.get("portrait"); - if (dpC != null) { - dpC.showUserInfo(ureq); - } - } - } else if (currentMsg != null) { - showInfo("header.cannoteditmessage"); - showThreadOverviewView(); - } - } - } - - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) - */ - public void event(UserRequest ureq, Controller source, Event event) { - if(checkForumChangedEventReceived()) { - return; - } - if (source == yesno) { - if (DialogBoxUIFactory.isYesEvent(event)) { // yes - doDeleteMessage(ureq); - if (currentMsg.getThreadtop() == null) { - showThreadOverviewView(); // was last message in thread - } else { - showThreadView(ureq, currentMsg.getThreadtop(), null); - } - } - } else if (source == archiveFoDiaCtr) { - if (DialogBoxUIFactory.isYesEvent(event)) { // ok - doArchiveForum(ureq); - showInfo("archive.forum.successfully"); - } - } else if (source == archiveThDiaCtr) { - if (DialogBoxUIFactory.isYesEvent(event)) { // ok - doArchiveThread(ureq, currentMsg); - showInfo("archive.thread.successfully"); - } - } else if (source == singleThreadTableCtr) { - if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { - // user has selected a message title from singleThreadTable - // -> display message details and below all messages with the same - // topthread_id as the selected one - TableEvent te = (TableEvent) event; - String actionid = te.getActionId(); - if (actionid.equals(CMD_SHOWDETAIL)) { - int rowid = te.getRowId(); - Message m = sttdmodel.getObjects().get(rowid); - showThreadView(ureq, m, null); - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_READ, getClass(), LoggingResourceable.wrap(currentMsg)); - } - } - } else if (source == allThreadTableCtr) { - if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { - TableEvent te = (TableEvent) event; - String actionid = te.getActionId(); - int rowid = te.getRowId(); - Object[] msgWrapper = attdmodel.getObjects().get(rowid); - int size = msgWrapper.length; - Message m = (Message) msgWrapper[size-1]; - if (actionid.equals(CMD_SHOWDETAIL)) { - showThreadView(ureq, m, null); - } else if (CMD_SHOWMARKED.equals(actionid)) { - showThreadView(ureq, m, ForumThreadViewModeController.VIEWMODE_MARKED); - } else if (CMD_SHOWNEW.equals(actionid)) { - showThreadView(ureq, m, ForumThreadViewModeController.VIEWMODE_NEW); - } - } - } else if (source == yesNoSplit) { - // the dialogbox is already removed from the gui stack - do not use getWindowControl().pop(); to remove dialogbox - if (DialogBoxUIFactory.isYesEvent(event)){ - splitThread(ureq); - } - } else if (source == moveMessageTableCtr) { - TableEvent te = (TableEvent)event; - Message topMsg = threadList.get(te.getRowId()); - moveMessage(ureq, topMsg); - } else if(source == msgEditCmc) { - removeAsListenerAndDispose(msgEditCmc); - removeAsListenerAndDispose(msgEditCtr); - msgEditCtr = null; - msgEditCmc = null; - } - // events from messageEditor - else if (source == msgEditCtr){ - //persist changed or new message - if (event == Event.DONE_EVENT){ - if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_NEWTHREAD)){ - // creation done -> save - doNewThread(ureq); - msgEditCtr.persistTempUploadedFiles(currentMsg); - } else if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_EDITMSG)){ - // edit done -> save - Message updatedMessage = fm.loadMessage(currentMsg.getKey()); - if(updatedMessage!=null) { - doEditMessage(ureq); - //file persisting is done already, as a msg-key was known during edit. - } else { - showInfo("header.cannoteditmessage"); - } - } else if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_REPLYMSG)){ - // reply done -> save - Message updatedMessage = fm.loadMessage(currentMsg.getKey()); - if(updatedMessage!=null) { - doReplyMessage(ureq); - msgEditCtr.persistTempUploadedFiles(currentMsg); - } else { - showInfo("header.cannotsavemessage"); - } - } - //show thread view after all kind of operations - showThreadView(ureq, currentMsg, null); - - //editor was canceled - } else if (event == Event.CANCELLED_EVENT) { - // back to 'list all titles' if canceled on new thread - if (msgEditCtr.getLastEditModus().equals(MessageEditController.EDITMODE_NEWTHREAD)){ - forumPanel.setContent(vcListTitles); - } else { - showThreadView(ureq, currentMsg, null); - } - } - if(msgEditCmc != null) { - msgEditCmc.deactivate(); - } - cleanUp(); - } else if (source == viewSwitchCtr){ - if (event == Event.CHANGED_EVENT){ - //viewmode has been switched, so change view: - String mode = viewSwitchCtr.getSelectedViewMode(); - showThreadView(ureq, currentMsg, mode); - } - } else if (source == filterForUserCtr) { - if(event instanceof OpenMessageInThreadEvent) { - OpenMessageInThreadEvent openEvent = (OpenMessageInThreadEvent)event; - Message selectedMsg = openEvent.getMessage(); - showThreadView(ureq,selectedMsg, null); - scrollToCurrentMessage(); - } - } - } - - private void cleanUp() { - removeAsListenerAndDispose(msgEditCtr); - removeAsListenerAndDispose(msgEditCmc); - msgEditCmc = null; - msgEditCtr = null; - } - - /** - * - * @see org.olat.core.util.event.GenericEventListener#event(org.olat.core.gui.control.Event) - */ - public void event(Event event) { - if(event instanceof ForumChangedEvent) { - forumChangedEventReceived = true; - } - } - - - //////////////////////////////////////// - // Application logic, do sth... - //////////////////////////////////////// - - - - private void doEditMessage(UserRequest ureq) { - //after editing message - boolean userIsMsgCreator = ureq.getIdentity().getKey().equals(currentMsg.getCreator().getKey()); - boolean children = fm.hasChildren(currentMsg); - - if (focallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (children == false))) { - - currentMsg = msgEditCtr.getMessageBackAfterEdit(); - currentMsg.setModifier(ureq.getIdentity()); - - final boolean changeLastModifiedDate = true; // OLAT-6295 - fm.updateMessage(currentMsg, changeLastModifiedDate, null); - // if notification is enabled -> notify the publisher about news - if (subsContext != null) { - NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); - } - - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_EDIT, getClass(), - LoggingResourceable.wrap(currentMsg)); - - } else { - showWarning("may.not.save.msg.as.author"); - forumPanel.setContent(vcEditMessage); - } - } - - private void doReplyMessage(UserRequest ureq) { - //after replying to a message - Message m = fm.createMessage(); - m = msgEditCtr.getMessageBackAfterEdit(); - - fm.replyToMessage(m, ureq.getIdentity(), currentMsg); - DBFactory.getInstance().intermediateCommit(); - // if notification is enabled -> notify the publisher about news - if (subsContext != null) { - NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); - } - currentMsg = m; - markRead(m, ureq.getIdentity()); - - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_REPLY_MESSAGE_CREATE, getClass(), - LoggingResourceable.wrap(currentMsg)); - } - - private void doNewThread(UserRequest ureq) { - //after creating a thread - Message m = fm.createMessage(); - m = msgEditCtr.getMessageBackAfterEdit(); - - if (!focallback.mayOpenNewThread()) throw new OLATSecurityException("not allowed to open new thread in forum " + forum.getKey()); - // open a new thread - fm.addTopMessage(ureq.getIdentity(), forum, m); - // if notification is enabled -> notify the publisher about news - if (subsContext != null) { - NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); - } - currentMsg = m; - markRead(m, ureq.getIdentity()); - - // do logging - addLoggingResourceable(LoggingResourceable.wrap(m)); - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_CREATE, getClass()); - } - - private void doAttachmentDelivery(UserRequest ureq, String cmd, Map<String, Object> messageMap) { - // user selected one attachment from the attachment list - int pos = Integer.parseInt(cmd.substring(cmd.indexOf("_") + 1, cmd.lastIndexOf("_"))); - // velocity counter starts at 1 - List<VFSItem> attachments = new ArrayList<VFSItem>(); - attachments.addAll((Collection<VFSItem>) messageMap.get("attachments")); - VFSItem vI = attachments.get(pos - 1); - VFSLeaf vl = (VFSLeaf) vI; - VFSMediaResource res = new VFSMediaResource(vl); - res.setDownloadable(true); // prevent XSS attack - ureq.getDispatchResult().setResultingMediaResource(res); - } - - private void doDeleteMessage(UserRequest ureq) { - boolean children = fm.hasChildren(currentMsg); - boolean hasParent = currentMsg.getParent() != null; - boolean userIsMsgCreator = ureq.getIdentity().getKey().equals(currentMsg.getCreator().getKey()); - if (focallback.mayDeleteMessageAsModerator() || (userIsMsgCreator && children == false)) { - fm.deleteMessageTree(forum.getKey(), currentMsg); - showInfo("deleteok"); - // do logging - if(hasParent) { - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_DELETE, getClass(), - LoggingResourceable.wrap(currentMsg)); - } else { - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_DELETE, getClass(), - LoggingResourceable.wrap(currentMsg)); - } - } else { - showWarning("may.not.delete.msg.as.author"); - } - } - - private void doArchiveForum(UserRequest ureq) { - ForumRTFFormatter rtff = new ForumRTFFormatter(getArchiveContainer(ureq), false); - ForumArchiveManager fam = ForumArchiveManager.getInstance(); - fam.applyFormatter(rtff, forum.getKey(), focallback); - } - - private void doArchiveThread(UserRequest ureq, Message currMsg) { - Message m = currMsg.getThreadtop(); - Long topMessageId = (m == null) ? currMsg.getKey() : m.getKey(); - - ForumRTFFormatter rtff = new ForumRTFFormatter(getArchiveContainer(ureq), true); - ForumArchiveManager fam = ForumArchiveManager.getInstance(); - fam.applyFormatterForOneThread(rtff, forum.getKey(), topMessageId); - } - - - - //////////////////////////////////////// - // Presentation - //////////////////////////////////////// - - private void showFilterForUserView(UserRequest ureq) { - if(securityModule.isUserAllowedAutoComplete(ureq.getUserSession().getRoles())) { - searchMode = true; - backLinkSearchListTitles = LinkFactory.createCustomLink("backLinkLT", "back", "listalltitles", Link.LINK_BACK, vcFilterView, this); - - removeAsListenerAndDispose(filterForUserCtr); - filterForUserCtr = new FilterForUserController(ureq, getWindowControl(), forum); - listenTo(filterForUserCtr); - - vcFilterView.put("filterForUser", filterForUserCtr.getInitialComponent()); - forumPanel.setContent(vcFilterView); - } - } - - private void showThreadOverviewView() { - // user has clicked on button 'list all message titles' - // -> display allThreadTable - msgs = fm.getMessagesByForum(forum); - prepareListTitles(msgs); - forumPanel.setContent(vcListTitles); - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_LIST, getClass()); - } - - private void showNewThreadView(UserRequest ureq) { - cleanUp(); - // user has clicked on button 'open new thread'. - Message m = fm.createMessage(); - msgEditCtr = new MessageEditController(ureq, getWindowControl(), focallback, m, null); - listenTo(msgEditCtr); - - String title = translate("msg.create"); - msgEditCmc = new CloseableModalController(getWindowControl(), "close", - msgEditCtr.getInitialComponent(), true, title); - listenTo(msgEditCmc); - msgEditCmc.activate(); - } - - private void showEditMessageView(UserRequest ureq) { - // user has clicked on button 'edit' - boolean userIsMsgCreator = ureq.getIdentity().getKey().equals(currentMsg.getCreator().getKey()); - boolean children = fm.hasChildren(currentMsg); - if (focallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (children == false))) { - // user is forum-moderator -> may edit every message on every level - // or user is author of the current message and it has still no - // children - cleanUp(); - - msgEditCtr = new MessageEditController(ureq, getWindowControl(), focallback, currentMsg, null); - listenTo(msgEditCtr); - - String title = translate("msg.update"); - msgEditCmc = new CloseableModalController(getWindowControl(), "close", - msgEditCtr.getInitialComponent(), true, title); - listenTo(msgEditCmc); - msgEditCmc.activate(); - } else if ((userIsMsgCreator) && (children == true)) { - // user is author of the current message but it has already at least - // one child - showWarning("may.not.save.msg.as.author"); - } else { - // user isn't author of the current message - showInfo("may.not.edit.msg"); - } - } - - private void showDeleteMessageView(UserRequest ureq) { - // user has clicked on button 'delete' - // -> display modal dialog 'Do you really want to delete this message?' - // 'yes': back to allThreadTable, 'no' back to messageDetails - int numOfChildren = countNumOfChildren(currentMsg, threadMsgs); - boolean children = fm.hasChildren(currentMsg); - boolean userIsMsgCreator = ureq.getIdentity().getKey().equals(currentMsg.getCreator().getKey()); - String currentMsgTitle = StringHelper.escapeHtml(currentMsg.getTitle()); - - if (focallback.mayDeleteMessageAsModerator()) { - // user is forum-moderator -> may delete every message on every level - if (numOfChildren == 0) { - yesno = activateYesNoDialog(ureq, null, translate("reallydeleteleaf", currentMsgTitle), yesno); - } else if (numOfChildren == 1) { - yesno = activateYesNoDialog(ureq, null, translate("reallydeletenode1", currentMsgTitle), yesno); - } else { - yesno = activateYesNoDialog(ureq, null, getTranslator().translate("reallydeletenodeN", new String[] { currentMsgTitle, Integer.toString(numOfChildren) }), yesno); - } - } else if ((userIsMsgCreator) && (children == false)) { - // user may delete his own message if it has no children - yesno = activateYesNoDialog(ureq, null, translate("reallydeleteleaf", currentMsgTitle), yesno); - } else if ((userIsMsgCreator) && (children == true)) { - // user may not delete his own message because it has at least one child - showWarning("may.not.delete.msg.as.author"); - } else { - // user isn't author of the current message - showInfo("may.not.delete.msg"); - } - } - - private void showReplyView(UserRequest ureq, boolean quote, Message parent) { - // user has clicked on button 'reply' - if (focallback.mayReplyMessage()) { - - Message quotedMessage = fm.createMessage(); - String reString = ""; - if(parent!=null && parent.getThreadtop()==null) { - //add reString only for the first answer - reString = translate("msg.title.re"); - } - quotedMessage.setTitle(reString + currentMsg.getTitle()); - if (quote) { - // load message to form as quotation - StringBuilder quoteSB = new StringBuilder(); - quoteSB.append(TINYMCE_EMPTYLINE_CODE); - quoteSB.append("<div class=\"o_quote_wrapper\"><div class=\"o_quote_author mceNonEditable\">"); - String date = f.formatDateAndTime(currentMsg.getCreationDate()); - User creator = currentMsg.getCreator().getUser(); - String creatorName = creator.getProperty(UserConstants.FIRSTNAME, ureq.getLocale()) + " " + creator.getProperty(UserConstants.LASTNAME, ureq.getLocale()); - quoteSB.append(getTranslator().translate("msg.quote.intro", new String[]{date, creatorName})); - quoteSB.append("</div><blockquote class=\"o_quote\">"); - quoteSB.append(currentMsg.getBody()); - quoteSB.append("</blockquote></div>"); - quoteSB.append(TINYMCE_EMPTYLINE_CODE); - quotedMessage.setBody(quoteSB.toString()); - } - - cleanUp(); - - msgEditCtr = new MessageEditController(ureq, getWindowControl(), focallback, currentMsg, quotedMessage); - listenTo(msgEditCtr); - - String title = quote ? translate("msg.quote") : translate("msg.reply"); - msgEditCmc = new CloseableModalController(getWindowControl(), "close", - msgEditCtr.getInitialComponent(), true, title); - listenTo(msgEditCmc); - msgEditCmc.activate(); - } else { - showInfo("may.not.reply.msg"); - } - } - - private void showSplitThreadView(UserRequest ureq) { - if (focallback.mayEditMessageAsModerator()) { - // user is forum-moderator -> may delete every message on every level - int numOfChildren = countNumOfChildren(currentMsg, threadMsgs); - - // provide yesNoSplit as argument, this ensures that dc is disposed before newly created - yesNoSplit = activateYesNoDialog(ureq, null, getTranslator().translate("reallysplitthread", new String[] { currentMsg.getTitle(), Integer.toString(numOfChildren) }), yesNoSplit); - - //activateYesNoDialog means that this controller listens to it, and dialog is shown on screen. - //nothing further to do here! - return; - } - } - - private void showMoveMessageView(UserRequest ureq) { - if (focallback.mayEditMessageAsModerator()) { - //prepare the table data - msgs = fm.getMessagesByForum(forum); - threadList = prepareListTitles(msgs); - DefaultTableDataModel<Message> tdm = new DefaultTableDataModel<Message>(threadList) { - - @Override - public Object getValueAt(int row, int col) { - Message m = threadList.get(row); - boolean isSource = m.equalsByPersistableKey(currentMsg.getThreadtop()); - switch (col) { - case 0: - String title = StringEscapeUtils.escapeHtml(m.getTitle()).toString(); - return title; - case 1: - if (m.getCreator().getStatus().equals(Identity.STATUS_DELETED)) { - return m.getCreator().getName(); - } else { - return userManager.getUserDisplayName(m.getCreator()); - } - case 2 : - Date mod = m.getLastModified(); - return mod; - case 3: - return !isSource; - - default: return "error"; - } - } - - @Override - public int getColumnCount() { - return 4; - } - }; - - //prepare the table config - TableGuiConfiguration tableConfig = new TableGuiConfiguration(); - tableConfig.setCustomCssClass("o_forum"); - tableConfig.setSelectedRowUnselectable(true); - tableConfig.setDownloadOffered(false); - tableConfig.setTableEmptyMessage(translate("forum.emtpy")); - - //prepare the table controller - removeAsListenerAndDispose(moveMessageTableCtr); - moveMessageTableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); - listenTo(moveMessageTableCtr); - - moveMessageTableCtr.addColumnDescriptor(true, new DefaultColumnDescriptor("table.thread", 0, null, ureq.getLocale())); - moveMessageTableCtr.addColumnDescriptor(true, new DefaultColumnDescriptor("table.userfriendlyname", 1, null, ureq.getLocale())); - moveMessageTableCtr.addColumnDescriptor(true, new DefaultColumnDescriptor("table.lastModified", 2, null, ureq.getLocale())); - moveMessageTableCtr.addColumnDescriptor(true, new BooleanColumnDescriptor("table.choose", 3, "move", translate("table.choose"), translate("table.source"))); - moveMessageTableCtr.setTableDataModel(tdm); - - //push the modal dialog with the table as content - removeAsListenerAndDispose(cmcMoveMsg); - cmcMoveMsg = new CloseableModalController(getWindowControl(), "close", moveMessageTableCtr.getInitialComponent()); - listenTo(cmcMoveMsg); - - cmcMoveMsg.activate(); - } - } - - private void showThreadView(UserRequest ureq, Message m, String viewMode) { - - adjustBusinessControlPath(ureq, m); - - // remove old messages from velocity and dispose controllers - disposeCurrentMessages(); - // now fetch current thread - Message threadTopM = m.getThreadtop(); - currentMsg = m; // in some cases already set, but set current message anyway - threadMsgs = fm.getThread(threadTopM == null ? m.getKey() : threadTopM.getKey()); - precalcMessageDeepness(threadMsgs); - // for simplicity no reuse of container, always create new one - vcThreadView = createVelocityContainer("threadview"); - - backLinkListTitles = LinkFactory.createCustomLink("backLinkLT", "back", "listalltitles", Link.LINK_BACK, vcThreadView, this); - archiveThreadButton = LinkFactory.createButtonSmall("archive.thread", vcThreadView, this); - archiveThreadButton.setIconLeftCSS("o_icon o_icon-fw o_icon_archive_tool"); - - - boolean isClosed = Status.getStatus(m.getStatusCode()).isClosed(); - vcThreadView.contextPut("isClosed",isClosed); - if(!isClosed) { - closeThreadButton = LinkFactory.createButtonSmall("close.thread", vcThreadView, this); - closeThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_closed_icon"); - } else { - openThreadButton = LinkFactory.createButtonSmall("open.thread", vcThreadView, this); - openThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_opened_icon"); - } - boolean isHidden = Status.getStatus(m.getStatusCode()).isHidden(); - vcThreadView.contextPut("isHidden",isHidden); - if(!isHidden) { - hideThreadButton = LinkFactory.createButtonSmall("hide.thread", vcThreadView, this); - hideThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_hidden_icon"); - } else { - showThreadButton = LinkFactory.createButtonSmall("show.thread", vcThreadView, this); - showThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_visible_icon"); - } - - //allow to set thread-viewmode prefs and get actual ones - viewSwitchCtr = new ForumThreadViewModeController(ureq,getWindowControl(), viewMode); - listenTo(viewSwitchCtr); - vcThreadView.put("threadViewSwitch", viewSwitchCtr.getInitialComponent()); - - vcThreadView.contextPut("showThreadTable", Boolean.FALSE); - vcThreadView.contextPut("threadMode", Boolean.FALSE); - vcThreadView.contextPut("msgDeepMap", msgDeepMap); - - // add all messages that are needed - currentMessagesMap = new ArrayList<Map<String, Object>>(threadMsgs.size()); - - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - List<String> markResSubPath = new ArrayList<String>(); - for(Message threadMsg:threadMsgs) { - markResSubPath.add(threadMsg.getKey().toString()); - } - List<Mark> markList = markingService.getMarkManager().getMarks(forumOres, ureq.getIdentity(), markResSubPath); - Map<String,Mark> marks = new HashMap<String,Mark>(markList.size() * 2 + 1); - for(Mark mark:markList) { - marks.put(mark.getResSubPath(), mark); - } - List<MarkResourceStat> statList = markingService.getMarkManager().getStats(forumOres, markResSubPath, null); - Map<String,MarkResourceStat> stats = new HashMap<String,MarkResourceStat>(statList.size() * 2 + 1); - for(MarkResourceStat stat:statList) { - stats.put(stat.getSubPath(), stat); - } - - if(viewMode == null) { - viewMode = viewSwitchCtr.getThreadViewMode(ureq); - } - - if (ForumThreadViewModeController.VIEWMODE_FLAT.equals(viewMode)) { - // all messages in flat view - List<Message> orderedMessages = new ArrayList<Message>(); - - orderedMessages.addAll(threadMsgs); - orderedMessages = threadMsgs; - Collections.sort(orderedMessages); - - int msgNum = 0; - Iterator<Message> iter = orderedMessages.iterator(); - while (iter.hasNext()) { - Message msg = iter.next(); - // add message and mark as read - addMessageToCurrentMessagesAndVC(ureq, msg, vcThreadView, currentMessagesMap, msgNum, marks, stats); - msgNum++; - } - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_READ, getClass(), LoggingResourceable.wrap(currentMsg)); - } else if (ForumThreadViewModeController.VIEWMODE_MESSAGE.equals(viewMode)){ - // single message in thread view, add message and mark as read - addMessageToCurrentMessagesAndVC(ureq, m, vcThreadView, currentMessagesMap, 0, marks, stats); - // init single thread list and append - sttdmodel = new ForumMessagesTableDataModel(userManager, threadMsgs, rms); - sttdmodel.setLocale(ureq.getLocale()); - singleThreadTableCtr.setTableDataModel(sttdmodel); - int position = PersistenceHelper.indexOf(threadMsgs, currentMsg); - singleThreadTableCtr.setSelectedRowId(position); - vcThreadView.contextPut("showThreadTable", Boolean.TRUE); - vcThreadView.put("singleThreadTable", singleThreadTableCtr.getInitialComponent()); - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_READ, getClass(), LoggingResourceable.wrap(currentMsg)); - - } else if (ForumThreadViewModeController.VIEWMODE_MARKED.equals(viewMode)) { - // marked messages in flat view - List<Message> orderedMessages = new ArrayList<Message>(); - - orderedMessages.addAll(threadMsgs); - orderedMessages = threadMsgs; - Collections.sort(orderedMessages); - - int msgNum = 0; - for (Message msg:orderedMessages) { - // add marked message - if(marks.containsKey(msg.getKey().toString())) { - addMessageToCurrentMessagesAndVC(ureq, msg, vcThreadView, currentMessagesMap, msgNum, marks, stats); - msgNum++; - } - } - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_READ, getClass(), LoggingResourceable.wrap(currentMsg)); - } else if (ForumThreadViewModeController.VIEWMODE_NEW.equals(viewMode)) { - // new messages in flat view - List<Message> orderedMessages = new ArrayList<Message>(); - - orderedMessages.addAll(threadMsgs); - orderedMessages = threadMsgs; - Collections.sort(orderedMessages); - - int msgNum = 0; - for (Message msg:orderedMessages) { - // add new message - if(!rms.contains(msg.getKey())) { - addMessageToCurrentMessagesAndVC(ureq, msg, vcThreadView, currentMessagesMap, msgNum, marks, stats); - msgNum++; - } - } - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_READ, getClass(), LoggingResourceable.wrap(currentMsg)); - } else { - //real threaded view with indent - vcThreadView.contextPut("threadMode", Boolean.TRUE); - List<Message> orderedMessages = new ArrayList<Message>(); - orderMessagesThreaded(threadMsgs, orderedMessages, (threadTopM == null ? m : threadTopM)); - // all messages in thread view - //Iterator iter = threadMsgs.iterator(); - Iterator<Message> iter = orderedMessages.iterator(); - - int msgNum = 0; - while (iter.hasNext()) { - Message msg = iter.next(); - // add message and mark as read - addMessageToCurrentMessagesAndVC(ureq, msg, vcThreadView, currentMessagesMap, msgNum, marks, stats); - msgNum++; - } - // do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_READ, getClass(), LoggingResourceable.wrap(m)); - } - vcThreadView.contextPut("messages", currentMessagesMap); - - // Mapper to display thumbnail images of file attachments - vcThreadView.contextPut("thumbMapper", thumbMapper); - // add security callback - vcThreadView.contextPut("security", focallback); - vcThreadView.contextPut("mode", viewMode); - forumPanel.setContent(vcThreadView); - } - - private void scrollToCurrentMessage() { - // Scroll to message, but only the first time the view is rendered - if (currentMsg.getThreadtop() == null || currentMessagesMap.size() == 1) { - vcThreadView.contextPut("goToMessage", Boolean.FALSE); - } else { - vcThreadView.contextPut("goToMessage", new ConsumableBoolean(true)); - vcThreadView.contextPut("goToMessageId", currentMsg.getKey()); - } - } - - - //////////////////////////////////////// - // Helper Methods / Classes - //////////////////////////////////////// - - - private void precalcMessageDeepness(List<Message> msgList){ - msgDeepMap = new HashMap<Long, Integer>(); - for (Message message : msgList) { - int deepness = messageDeepness(message, 0); - msgDeepMap.put(message.getKey(), deepness); - } - } - - private int messageDeepness(Message msg, int deep){ - if (deep > 20) return 20; - if (msg.getParent()==null) return deep; - else { - int newDeep = deep + 1; - return messageDeepness(msg.getParent(), newDeep); - } - } - - - private void addMessageToCurrentMessagesAndVC(UserRequest ureq, Message m, VelocityContainer vcContainer, List<Map<String, Object>> allList, int msgCount, Map<String,Mark> marks, Map<String,MarkResourceStat> stats) { - // all values belonging to a message are stored in this map - // these values can be accessed in velocity. make sure you clean up - // everything - // you create here in disposeCurrentMessages()! - Map<String, Object> map = new HashMap<String, Object>(); - map.put("id", m.getKey()); - - if (rms.contains(m.getKey())) { - // already read - map.put("newMessage", Boolean.FALSE); - } else { - // mark now as read - markRead(m, ureq.getIdentity()); - map.put("newMessage", Boolean.TRUE); - } - // add some data now - Date creationDate = m.getCreationDate(); - Identity modifier = m.getModifier(); - if (modifier != null) { - map.put("isModified", Boolean.TRUE); - map.put("modfname", modifier.getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale())); - map.put("modlname", modifier.getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale())); - } else { - map.put("isModified", Boolean.FALSE); - } - map.put("title", m.getTitle()); - map.put("body", m.getBody()); - map.put("date", f.formatDateAndTime(creationDate)); - Identity creator = m.getCreator(); - map.put("creator", creator.getKey()); - map.put("firstname", Formatter.truncate(creator.getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale()),18)); //keeps the first 15 chars - map.put("lastname", Formatter.truncate(creator.getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale()),18)); - map.put("modified", f.formatDateAndTime(m.getLastModified())); - // message attachments - VFSContainer msgContainer = fm.getMessageContainer(forum.getKey(), m.getKey()); - map.put("messageContainer", msgContainer); - final List<VFSItem> attachments = new ArrayList<VFSItem>(msgContainer.getItems(new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES))); - map.put("attachments", attachments); - if (attachments == null || attachments.size() == 0) map.put("hasAttachments", Boolean.FALSE); - else map.put("hasAttachments", Boolean.TRUE); - // number of children and modify/delete permissions - int numOfChildren; - numOfChildren = countNumOfChildren(m, threadMsgs); - Integer nOfCh = new Integer(numOfChildren); - map.put("nOfCh", nOfCh); - boolean userIsMsgCreator = getIdentity().getKey().equals(creator.getKey()); - Boolean uIsMsgC = new Boolean(userIsMsgCreator); - map.put("uIsMsgC", uIsMsgC); - boolean isThreadtop = m.getThreadtop()==null; - map.put("isThreadtop", Boolean.valueOf(isThreadtop)); - boolean isThreadClosed = Status.getStatus(m.getStatusCode()).isClosed(); - if(!isThreadtop) { - isThreadClosed = Status.getStatus(m.getThreadtop().getStatusCode()).isClosed(); - } - map.put("isThreadClosed", isThreadClosed); - if(!isGuestOnly(ureq)) { - // add portrait to map for later disposal and key for rendering in velocity - DisplayPortraitController portrait = new DisplayPortraitController(ureq, getWindowControl(), m.getCreator(), true, true, false, true); - // add also to velocity - map.put("portrait", portrait); - String portraitComponentVCName = m.getKey().toString(); - map.put("portraitComponentVCName", portraitComponentVCName); - vcContainer.put(portraitComponentVCName, portrait.getInitialComponent()); - // Add link with username that is clickable - String creatorFullName = StringHelper.escapeHtml(UserManager.getInstance().getUserDisplayName(creator)); - Link vcLink = LinkFactory.createCustomLink("vc_"+msgCount, "vc_"+msgCount, creatorFullName, Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, vcThreadView, this); - vcLink.setUserObject(msgCount); - LinkPopupSettings settings = new LinkPopupSettings(800, 600, "_blank"); - vcLink.setPopup(settings); - } - allList.add(map); - /* - * those Link objects are used! see event method and the instanceof Link part! - * but reference won't be used! - */ - Link dlLink = LinkFactory.createCustomLink("dl_"+msgCount, "dl_"+msgCount, "msg.delete", Link.BUTTON_SMALL, vcThreadView, this); - dlLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item"); - Link edLink = LinkFactory.createCustomLink("ed_"+msgCount, "ed_"+msgCount, "msg.update", Link.BUTTON_SMALL, vcThreadView, this); - edLink.setIconLeftCSS("o_icon o_icon-fw o_icon_edit"); - - Link qtLink = LinkFactory.createCustomLink("qt_"+msgCount, "qt_"+msgCount, "msg.quote", Link.BUTTON_SMALL, vcThreadView, this); - qtLink.setElementCssClass("o_sel_forum_reply_quoted"); - qtLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply_with_quote"); - Link rpLink = LinkFactory.createCustomLink("rp_"+msgCount, "rp_"+msgCount, "msg.reply", Link.BUTTON_SMALL, vcThreadView, this); - rpLink.setElementCssClass("o_sel_forum_reply"); - rpLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply"); - - Link splitLink = LinkFactory.createCustomLink("split_"+msgCount, "split_"+msgCount, "msg.split", Link.LINK, vcThreadView, this); - splitLink.setIconLeftCSS("o_icon o_icon-fw o_icon_split"); - Link moveLink = LinkFactory.createCustomLink("move_"+msgCount, "move_"+msgCount, "msg.move", Link.LINK, vcThreadView, this); - moveLink.setIconLeftCSS("o_icon o_icon-fw o_icon_move"); - - String subPath = m.getKey().toString(); - Mark currentMark = marks.get(subPath); - MarkResourceStat stat = stats.get(subPath); - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - - if(!ureq.getUserSession().getRoles().isGuestOnly()) { - String businessPath = currentMark == null ? - getWindowControl().getBusinessControl().getAsString() + "[Message:" + m.getKey() + "]" - : currentMark.getBusinessPath(); - Controller markCtrl = markingService.getMarkController(ureq, getWindowControl(), currentMark, stat, forumOres, subPath, businessPath); - vcThreadView.put("mark_"+msgCount, markCtrl.getInitialComponent()); - } - - if (uIsMsgC) { - OLATResourceable messageOres = OresHelper.createOLATResourceableInstance("Forum", m.getKey()); - String businessPath = BusinessControlFactory.getInstance().getAsString(getWindowControl().getBusinessControl()) + "[Message:" + m.getKey() + "]"; - Controller ePFCollCtrl = EPUIFactory.createArtefactCollectWizzardController(ureq, getWindowControl(), messageOres, - businessPath); - if (ePFCollCtrl != null) { - String ePFAddComponentName = "eportfolio_" + msgCount; - map.put("ePFCollCtrl", ePFCollCtrl); - map.put("ePFAddComponentName", ePFAddComponentName); - vcThreadView.put(ePFAddComponentName, ePFCollCtrl.getInitialComponent()); - } - } - } - - private boolean isGuestOnly(UserRequest ureq) { - return ureq.getUserSession().getRoles().isGuestOnly(); - } - - private void disposeCurrentMessages() { - if (currentMessagesMap != null) { - Iterator<Map<String, Object>> iter = currentMessagesMap.iterator(); - while (iter.hasNext()) { - Map<String, Object> messageMap = iter.next(); - // cleanup portrait controllers - Controller ctr = (Controller) messageMap.get("portrait"); - if(ctr!=null) { //ctr could be null for a guest user - ctr.dispose(); - vcThreadView.remove(ctr.getInitialComponent()); - } - // cleanup mark controllers - - // cleanup ePortfolio controllers - Controller ePCtr = (Controller) messageMap.get("ePFCollCtrl"); - if (ePCtr != null) ePCtr.dispose(); - } - } - } - - private List<Message> prepareListTitles(List<Message> messages) { - List<Message> tmpThreadList = new ArrayList<Message>(); - // extract threads from all messages - List<Object[]> threads = new ArrayList<Object[]>(); - int numTableCols = 8; - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - List<MarkResourceStat> stats = markingService.getMarkManager().getStats(forumOres, null, getIdentity()); - - boolean isModerator = focallback.mayEditMessageAsModerator(); - for (Iterator<Message> iter = messages.iterator(); iter.hasNext();) { - Message thread = iter.next(); - if (thread.getParent() == null) { - // put all data in a generic object array - Object[] mesgWrapper = new Object[numTableCols]; - String title = StringEscapeUtils.escapeHtml(thread.getTitle()).toString(); - title = Formatter.truncate(title, 50); - Status messageStatus = Status.getStatus(thread.getStatusCode()); - boolean isSticky = messageStatus.isSticky(); - boolean isClosed = messageStatus.isClosed(); - boolean isHidden = messageStatus.isHidden(); - if(isHidden && !isModerator) { - continue; - } - - mesgWrapper[0] = "status_thread"; - if(isSticky && isClosed) { - mesgWrapper[0] = "status_sticky_closed"; - } else if (isSticky) { - mesgWrapper[0] = "status_sticky"; - } else if (isClosed) { - mesgWrapper[0] = "status_closed"; - } - if(isHidden) { - title = translate("msg.hidden") + " " + title; - } - mesgWrapper[1] = new ForumHelper.MessageWrapper(title,isSticky,collator, f); - User creator = thread.getCreator().getUser(); - mesgWrapper[2] = new ForumHelper.MessageWrapper(userManager.getUserDisplayName(creator),isSticky, collator, f); - // find latest date, and number of read messages for all children - // init with thread values - Date lastModified = thread.getLastModified(); - int readCounter = (rms.contains(thread.getKey()) ? 1 : 0); - int childCounter = 1; - int statCounter = 0; - String threadSubPath = thread.getKey().toString(); - for(MarkResourceStat stat:stats) { - if(threadSubPath.equals(stat.getSubPath())) { - statCounter += stat.getCount(); - } - } - - for (Iterator<Message> iter2 = messages.iterator(); iter2.hasNext();) { - Message msg = iter2.next(); - if (msg.getThreadtop() != null && msg.getThreadtop().getKey().equals(thread.getKey())) { - // a child is found, update values - childCounter++; - if (rms.contains(msg.getKey())) readCounter++; - if (msg.getLastModified().after(lastModified)) lastModified = msg.getLastModified(); - - String subPath = msg.getKey().toString(); - for(MarkResourceStat stat:stats) { - if(subPath.equals(stat.getSubPath())) { - statCounter += stat.getCount(); - } - } - } - } - mesgWrapper[3] = new ForumHelper.MessageWrapper(lastModified,isSticky,collator, f); - //lastModified - mesgWrapper[4] = new ForumHelper.MessageWrapper(new Integer(statCounter),isSticky,collator, f); - //marked - mesgWrapper[5] = new ForumHelper.MessageWrapper(new Integer((childCounter - readCounter)),isSticky,collator, f); - // unread - mesgWrapper[6] = new ForumHelper.MessageWrapper(new Integer(childCounter),isSticky,collator, f); - // add message itself for later usage - mesgWrapper[7] = thread; - tmpThreadList.add(thread); - threads.add(mesgWrapper); - } - } - // build table model - attdmodel = new GenericObjectArrayTableDataModel(threads, numTableCols); - allThreadTableCtr.setTableDataModel(attdmodel); - allThreadTableCtr.setSortColumn(3, false); - - vcListTitles.put("allThreadTable", allThreadTableCtr.getInitialComponent()); - vcListTitles.contextPut("hasThreads", (attdmodel.getRowCount() == 0) ? Boolean.FALSE : Boolean.TRUE); - - return tmpThreadList; - } - - /** - * @param m - * @param messages - * @return number of all children, grandchildren, grand-grandchildren etc. of - * a certain message - */ - private int countNumOfChildren(Message m, List<Message> messages) { - int counter = 0; - counter = countChildrenRecursion(m, messages, counter); - return counter; - } - - private int countChildrenRecursion(Message m, List<Message> messages, int counter) { - for (Iterator<Message> iter = messages.iterator(); iter.hasNext();) { - Message element = iter.next(); - if (element.getParent() != null) { - if (m.getKey().equals(element.getParent().getKey())) { - counter = countChildrenRecursion(element, messages, counter); - counter++; - } - } - } - return counter; - } - - private VFSContainer getArchiveContainer(UserRequest ureq) { - VFSContainer container = new OlatRootFolderImpl(FolderConfig.getUserHomes() + File.separator + ureq.getIdentity().getName() + "/private/archive", null); - // append export timestamp to avoid overwriting previous export - Date tmp = new Date(System.currentTimeMillis()); - java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH_mm_ss"); - String folder = "forum_" + forum.getKey().toString()+"_"+formatter.format(tmp); - VFSItem vfsItem = container.resolve(folder); - if (vfsItem == null || !(vfsItem instanceof VFSContainer)) { - vfsItem = container.createChildContainer(folder); - } - container = (VFSContainer) vfsItem; - return container; - } - - private void adjustBusinessControlPath(UserRequest ureq, Message m) { - ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrap(m)); - OLATResourceable ores = OresHelper.createOLATResourceableInstance(Message.class,m.getKey()); - //fxdiff BAKS-7 Resume function - WindowControl bwControl = addToHistory(ureq, ores, null); - - //Simple way to "register" the new ContextEntry although only a VelocityPage was flipped. - Controller dummy = new BasicController(ureq, bwControl) { - - @Override - protected void event(UserRequest ureq, Component source, Event event) { - // TODO Auto-generated method stub - - } - - @Override - protected void doDispose() { - // TODO Auto-generated method stub - - } - - }; - dummy.dispose(); - dummy = null; - } - - private Set<Long> getReadSet(Identity s) { - // FIXME:fj:c put the whole readset of 1 user / 1 forum in one property - // only: 234,45646,2343,23432 etc. - // Problem now is that a lot of rows are generated: number of users x - // visited messages of all forums = e.g. 5000 x 300 = 1.5 million etc. - - return ForumManager.getInstance().getReadSet(s, forum); - } - - private void markRead(Message m, Identity s) { - if (!rms.contains(m.getKey())) { - rms.add(m.getKey()); - ForumManager.getInstance().markAsRead(s, m); - } - } - - protected void doDispose() { - disposeCurrentMessages(); - CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, forum); - } - - /** - * Get the message value map from a velocity command. The command must have - * the signature commandname_messagemapid - * - * @param identity - * @param command - * @return Map the value map for the current message - */ - private Map<String, Object> getMessageMapFromCommand(Identity identity, String command) { - String cmdId = command.substring(command.lastIndexOf("_") + 1); - try { - Integer id = Integer.valueOf(cmdId); - return currentMessagesMap.get(id.intValue()); - } catch (NumberFormatException e) { - throw new AssertException("Tried to parse forum message id from command::" + command - + " but message id was not a long. Could be a user who tries to hack the system. User::" + identity.getName(), e); - } - } - - /** - * Orders the messages in the logical instead of chronological order. - * @param messages - * @param orderedList - * @param startMessage - */ - private void orderMessagesThreaded(List<Message> messages, List<Message> orderedList, Message startMessage) { - if(messages==null || orderedList==null || startMessage==null) return; - Iterator<Message> iterMsg = messages.iterator(); - while(iterMsg.hasNext()) - { - Message msg = iterMsg.next(); - if (msg.getParent() == null) - { - orderedList.add(msg); - ArrayList<Message> copiedMessages = new ArrayList<Message>(); - copiedMessages.addAll(messages); - copiedMessages.remove(msg); - messages = copiedMessages; - - continue; - } - if ((msg.getParent() != null) && (msg.getParent().getKey().equals(startMessage.getKey()))) - { - orderedList.add(msg); - orderMessagesThreaded(messages, orderedList, msg); - } - } - } - - - /** - * Calls splitThread on ForumManager and shows the new thread view. - * @param ureq - */ - private void splitThread(UserRequest ureq) { - if (focallback.mayEditMessageAsModerator()) { - Message newTopMessage = fm.splitThread(currentMsg); - showThreadView(ureq,newTopMessage, null); - //do logging - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_SPLIT, getClass(), LoggingResourceable.wrap(currentMsg)); - - } else { - showWarning("may.not.split.thread"); - } - } - - /** - * Calls moveMessage on ForumManager - * @param ureq - * @param topMessage - */ - private void moveMessage(UserRequest ureq, Message topMsg) { - if (focallback.mayEditMessageAsModerator()) { - currentMsg = fm.moveMessage(currentMsg, topMsg); - cmcMoveMsg.deactivate(); - showThreadView(ureq, topMsg, null); - ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_MOVE, getClass(), LoggingResourceable.wrap(currentMsg)); - } else { - showWarning("may.not.move.message"); - } - } - - /** - * Sets the closed status to the threadtop message. - * @param ureq - * @param msg - * @param closed - */ - private void closeThread(Message msg, boolean closed) { - //if the input message is not the Threadtop get the Threadtop message - if(msg != null && msg.getThreadtop()!=null) { - msg = msg.getThreadtop(); - } - if (msg != null && msg.getThreadtop()==null) { - currentMsg = fm.loadMessage(msg.getKey()); - Status status = Status.getStatus(currentMsg.getStatusCode()); - status.setClosed(closed); - if (currentMsg.getParent() == null) { - currentMsg.setStatusCode(Status.getStatusCode(status)); - final boolean changeLastModifiedDate = !closed; //OLAT-6295 - fm.updateMessage(currentMsg, changeLastModifiedDate, new ForumChangedEvent("close")); - } - // do logging - ILoggingAction loggingAction; - if (closed) { - loggingAction = ForumLoggingAction.FORUM_THREAD_CLOSE; - } else { - loggingAction = ForumLoggingAction.FORUM_THREAD_REOPEN; - } - - ThreadLocalUserActivityLogger.log(loggingAction, getClass(), LoggingResourceable.wrap(currentMsg)); - showThreadOverviewView(); - } - } - - /** - * Sets the hidden status to the threadtop message. - * @param ureq - * @param msg - * @param hidden - */ - private void hideThread(Message msg, boolean hidden) { - //if the input message is not the Threadtop get the Threadtop message - if(msg != null && msg.getThreadtop()!=null) { - msg = msg.getThreadtop(); - } - if (msg != null && msg.getThreadtop()==null) { - currentMsg = fm.loadMessage(msg.getKey()); - Status status = Status.getStatus(currentMsg.getStatusCode()); - status.setHidden(hidden); - if(currentMsg.getParent()==null) { - currentMsg.setStatusCode(Status.getStatusCode(status)); - final boolean changeLastModifiedDate = !hidden; //OLAT-6295 - fm.updateMessage(currentMsg, changeLastModifiedDate, new ForumChangedEvent("hide")); - } - // do logging - ILoggingAction loggingAction; - if (hidden) { - loggingAction = ForumLoggingAction.FORUM_THREAD_HIDE; - } else { - loggingAction = ForumLoggingAction.FORUM_THREAD_SHOW; - } - - ThreadLocalUserActivityLogger.log(loggingAction, getClass(), LoggingResourceable.wrap(currentMsg)); - showThreadOverviewView(); - } - } - - - //////////////////////////////////////// - // Sticky things - //////////////////////////////////////// - - /** - * - * Description:<br> - * Tree cell renderer for the sticky thread titles. - * - * <P> - * Initial Date: 09.07.2007 <br> - * @author Lavinia Dumitrescu - */ - private static class StickyThreadCellRenderer implements CustomCellRenderer { - @Override - public void render(final StringOutput sb, final Renderer renderer, final Object val, final Locale locale, final int alignment, final String action) { - if(val instanceof ForumHelper.MessageWrapper) { - ForumHelper.MessageWrapper messageWrapper = (ForumHelper.MessageWrapper)val; - String content = messageWrapper.toString(); - if (renderer == null) { - sb.append(content); - } else { - sb.append("<span class='"); - if (messageWrapper.isSticky()) { - sb.append("o_forum_thread_sticky"); - } - sb.append("'>").append(content).append("</span>"); - } - } - } - } - - /** - * - * Description:<br> - * <code>ColumnDescriptor</code> with special <code>compareTo</code> method implementation. - * Allows a special column sorting for MessageWrappers considering the sticky attribute. - * - * <P> - * Initial Date: 11.07.2007 <br> - * @author Lavinia Dumitrescu - */ - private class StickyColumnDescriptor extends DefaultColumnDescriptor{ - public StickyColumnDescriptor(String headerKey, int dataColumn, String action, Locale locale) { - super(headerKey, dataColumn, action, locale, ColumnDescriptor.ALIGNMENT_LEFT); - } - /** - * Sole constructor. - * @param headerKey - * @param dataColumn - * @param action - * @param locale used ONLY for method getRenderValue in case the Object is of type Date to provide locale-sensitive Date formatting - * @param alignment left, middle or right; constants in ColumnDescriptor - */ - public StickyColumnDescriptor(String headerKey, int dataColumn, String action, Locale locale, int alignment) { - super(headerKey, dataColumn, action, locale, alignment); - } - - /** - * Delegates comparison to the <code>ForumHelper.compare</code>. In case the <code>ForumHelper.compare</code> - * returns <code>ForumHelper.NOT_MY_JOB</code>, the comparison is executed by the superclass. - * @see org.olat.core.gui.components.table.ColumnDescriptor#compareTo(int, int) - */ - @Override - public int compareTo(int rowa, int rowb) { - ForumHelper.MessageWrapper a = (ForumHelper.MessageWrapper)getTable().getTableDataModel().getValueAt(rowa,getDataColumn()); - ForumHelper.MessageWrapper b = (ForumHelper.MessageWrapper)getTable().getTableDataModel().getValueAt(rowb,getDataColumn()); - boolean sortAscending = getTable().isSortAscending(); - - int comparisonOutcome = ForumHelper.compare(a,b,sortAscending); - if(comparisonOutcome == ForumHelper.NOT_MY_JOB) { - comparisonOutcome = super.compareTo(rowa, rowb); - } - return comparisonOutcome; - } - } - - /** - * - * Description:<br> - * <code>ColumnDescriptor</code> with special <code>compareTo</code> method implementation for a <code>CustomCellRenderer</code>. - * Allows a special column sorting for MessageWrappers considering the sticky attribute. - * - * <P> - * Initial Date: 11.07.2007 <br> - * @author Lavinia Dumitrescu - */ - private static class StickyRenderColumnDescriptor extends CustomRenderColumnDescriptor { - - public StickyRenderColumnDescriptor(String headerKey, int dataColumn, String action, Locale locale, int alignment, - CustomCellRenderer customCellRenderer) { - super(headerKey, dataColumn, action, locale, alignment,customCellRenderer); - } - - /** - * Delegates comparison to the <code>ForumHelper.compare</code>. In case the <code>ForumHelper.compare</code> - * returns <code>ForumHelper.NOT_MY_JOB</code>, the comparison is executed by the superclass. - * @see org.olat.core.gui.components.table.ColumnDescriptor#compareTo(int, int) - */ - @Override - public int compareTo(int rowa, int rowb) { - ForumHelper.MessageWrapper a = (ForumHelper.MessageWrapper)getTable().getTableDataModel().getValueAt(rowa,getDataColumn()); - ForumHelper.MessageWrapper b = (ForumHelper.MessageWrapper)getTable().getTableDataModel().getValueAt(rowb,getDataColumn()); - boolean sortAscending = getTable().isSortAscending(); - - int comparisonOutcome = ForumHelper.compare(a,b,sortAscending); - if(comparisonOutcome == ForumHelper.NOT_MY_JOB) { - comparisonOutcome = super.compareTo(rowa, rowb); - } - return comparisonOutcome; - } - } - - public class MessageIconRenderer extends CustomCssCellRenderer { - @Override - protected String getHoverText(Object val) { - return NewControllerFactory.translateResourceableTypeName((String)val, getLocale()); - } - - @Override - protected String getCellValue(Object val) { - return ""; - } - - @Override - protected String getCssClass(Object val) { - // use small icon and create icon class for resource: o_FileResource-SHAREDFOLDER_icon - return "o_icon o_forum_" + ((String)val) + "_icon"; - } - } -} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ForumHelper.java b/src/main/java/org/olat/modules/fo/ForumHelper.java index 3690843e478..31e7e62bf9f 100644 --- a/src/main/java/org/olat/modules/fo/ForumHelper.java +++ b/src/main/java/org/olat/modules/fo/ForumHelper.java @@ -25,12 +25,18 @@ package org.olat.modules.fo; -import java.text.Collator; +import java.io.File; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Comparator; import java.util.Date; -import java.util.Locale; -import org.olat.core.util.Formatter; +import org.olat.core.commons.modules.bc.FolderConfig; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.gui.UserRequest; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.modules.fo.archiver.MessageNode; /** * @@ -46,6 +52,20 @@ public class ForumHelper { public static final String CSS_ICON_CLASS_MESSAGE = "o_forum_message_icon"; public static int NOT_MY_JOB = 0; + + public static final VFSContainer getArchiveContainer(UserRequest ureq, Forum forum) { + VFSContainer container = new OlatRootFolderImpl(FolderConfig.getUserHomes() + File.separator + ureq.getIdentity().getName() + "/private/archive", null); + // append export timestamp to avoid overwriting previous export + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH_mm_ss"); + String folder = "forum_" + forum.getKey().toString()+"_"+formatter.format(new Date()); + VFSItem vfsItem = container.resolve(folder); + if (vfsItem == null || !(vfsItem instanceof VFSContainer)) { + vfsItem = container.createChildContainer(folder); + } + container = (VFSContainer) vfsItem; + return container; + } + /** * Comparators can be passed to a sort method (such as Collections.sort) @@ -60,104 +80,8 @@ public class ForumHelper { return new MessageNodeComparator(); } - /** - * Compares two MessageWrappers. <br> - * If a and b both sticky or if none sticky, let the caller do the sorting (return NOT_MY_JOB),<br> - * else if a is sticky and sortAscending is true then a less then b (return -1) <br> - * else if b is sticky and sortAscending is true then a greater then b (return 1)<p> - * @param a - * @param b - * @param sortAscending - * @return -1, 1, or NOT_MY_JOB which means the caller has to do the comparison. - */ - public static int compare(MessageWrapper a, MessageWrapper b, boolean sortAscending) { - if (a.isSticky() && b.isSticky()) { - return NOT_MY_JOB; - } else if (a.isSticky()) { - if (sortAscending) return -1; - else return 1; - } else if (b.isSticky()) { - if (sortAscending) return 1; - else return -1; - } else { - return NOT_MY_JOB; - } - } - - /** - * Description:<br> - * Wrapper for the table cell values for providing the sticky info - * about a message. - * <P> - * Initial Date: 11.07.2007 <br> - * - * @author Lavinia Dumitrescu - */ - protected static class MessageWrapper implements Comparable { - - private Comparable value; - private boolean sticky; - private Collator collator = Collator.getInstance(); - private Formatter formatter = Formatter.getInstance(Locale.getDefault()); - - public MessageWrapper(Comparable value_, boolean sticky_, Collator collator, Formatter formatter) { - value = value_; - sticky = sticky_; - if (collator != null) { - this.collator = collator; - } - if (formatter != null) { - this.formatter = formatter; - } - } - - /** - * - * @see java.lang.Object#toString() - */ - public String toString() { - if (value instanceof Date) { - return formatter.formatDateAndTime((Date)value); - } - else return value.toString(); - } - - public boolean isSticky() { - return sticky; - } - - public Comparable getValue() { - return value; - } - - /** - * - * @see java.lang.Comparable#compareTo(java.lang.Object) - */ - public int compareTo(Object o) { - MessageWrapper theOtherMessage = ((MessageWrapper)o); - if(getValue() instanceof String) { - return collator.compare(getValue().toString(), theOtherMessage.getValue().toString()); - } - return getValue().compareTo(theOtherMessage.getValue()); - } - - /** - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - try { - MessageWrapper theOther = (MessageWrapper)obj; - return getValue().equals(theOther.getValue()); - } catch(Exception ex) { - //nothing to do - } - return false; - } - } - private static class MessageNodeComparator implements Comparator<MessageNode> { + @Override public int compare(final MessageNode m1, final MessageNode m2) { if(m1.isSticky() && m2.isSticky()) { return m2.getModifiedDate().compareTo(m1.getModifiedDate()); //last first diff --git a/src/main/java/org/olat/modules/fo/ForumImpl.hbm.xml b/src/main/java/org/olat/modules/fo/ForumImpl.hbm.xml deleted file mode 100644 index 5e0b21f1ce0..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumImpl.hbm.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD//EN" - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> - -<hibernate-mapping default-lazy="false"> - <class name="org.olat.modules.fo.ForumImpl" table="o_forum"> - - <id name="key" column="forum_id" type="long" unsaved-value="null"> - <generator class="hilo"/> - </id> - - <version name="version" access="field" column="version" type="int"/> - <property name="creationDate" column="creationdate" type="timestamp" /> - - </class> -</hibernate-mapping> - diff --git a/src/main/java/org/olat/modules/fo/ForumImpl.java b/src/main/java/org/olat/modules/fo/ForumImpl.java deleted file mode 100644 index 1176054bff3..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.modules.fo; - -import org.olat.core.commons.persistence.PersistentObject; -import org.olat.core.logging.AssertException; -import org.olat.core.util.resource.OresHelper; -/** - * Implementation of the Forum Interface - * - * @author Felix Jost - */ -public class ForumImpl extends PersistentObject implements Forum { - - /* (non-Javadoc) - * @see org.olat.core.id.OLATResourceablegetTypeName() - */ - public String getResourceableTypeName() { - //TODO:fj:b: make constant later - return OresHelper.calculateTypeName(Forum.class); - } - - /* (non-Javadoc) - * @see org.olat.core.id.OLATResourceablegetId() - */ - public Long getResourceableId() { - Long id = getKey(); - if (id == null) throw new AssertException("getId() must not be called before an id has been generated by the persister"); - return id; - } - -} diff --git a/src/main/java/org/olat/modules/fo/ForumLoggingAction.java b/src/main/java/org/olat/modules/fo/ForumLoggingAction.java index f25aa3f597e..9cb78544094 100644 --- a/src/main/java/org/olat/modules/fo/ForumLoggingAction.java +++ b/src/main/java/org/olat/modules/fo/ForumLoggingAction.java @@ -51,7 +51,7 @@ import org.olat.core.logging.activity.ResourceableTypeList; * Initial Date: 20.10.2009 <br> * @author Stefan */ -/* package protected */ class ForumLoggingAction extends BaseLoggingAction { +public class ForumLoggingAction extends BaseLoggingAction { public static final ILoggingAction FORUM_MESSAGE_LIST = new ForumLoggingAction(ActionType.tracking, CrudAction.retrieve, ActionVerb.view, ActionObject.forumthread).setTypeList( diff --git a/src/main/java/org/olat/modules/fo/ForumManager.java b/src/main/java/org/olat/modules/fo/ForumManager.java deleted file mode 100644 index 4bcea1c5440..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumManager.java +++ /dev/null @@ -1,728 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.fo; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Set; - -import javax.persistence.TemporalType; - -import org.hibernate.type.StandardBasicTypes; -import org.hibernate.type.Type; -import org.olat.core.CoreSpringFactory; -import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; -import org.olat.core.commons.persistence.DB; -import org.olat.core.commons.persistence.DBFactory; -import org.olat.core.commons.persistence.DBQuery; -import org.olat.core.commons.services.mark.MarkingService; -import org.olat.core.commons.services.text.TextService; -import org.olat.core.id.Identity; -import org.olat.core.id.OLATResourceable; -import org.olat.core.logging.AssertException; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.resource.OresHelper; -import org.olat.core.util.vfs.VFSContainer; -import org.olat.core.util.vfs.VFSItem; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * - * @author Felix Jost - */ -@Service -public class ForumManager { - private static final OLog log = Tracing.createLoggerFor(ForumManager.class); - - private static ForumManager INSTANCE; - @Autowired - private TextService txtService; - @Autowired - private DB dbInstance; - - /** - * [spring] - */ - private ForumManager() { - INSTANCE = this; - } - - /** - * @return the singleton - */ - public static ForumManager getInstance() { - return INSTANCE; - } - - public int countThread(Long msgid) { - StringBuilder query = new StringBuilder(); - query.append("select count(msg) from ").append(MessageImpl.class.getName()).append(" as msg") - .append(" where (msg.key=:messageKey or msg.threadtop.key=:messageKey) "); - - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("messageKey", msgid); - Number totalCount = (Number)dbQuery.uniqueResult(); - return totalCount.intValue(); - } - - /** - * @param msgid msg id of the topthread - * @return List messages - */ - public List<Message> getThread(Long msgid) { - return getThread(msgid, 0, -1, Message.OrderBy.creationDate, true); - } - - public List<Message> getThread(Long msgid, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { - long rstart = 0; - if (log.isDebug()){ - rstart = System.currentTimeMillis(); - } - - StringBuilder query = new StringBuilder(); - query.append("select msg from ").append(MessageImpl.class.getName()).append(" as msg") - .append(" inner join fetch msg.creator as creator") - .append(" where (msg.key=:messageKey or msg.threadtop.key=:messageKey) "); - if(orderBy != null) { - query.append(" order by msg.").append(orderBy.name()).append(asc ? " ASC " : " DESC "); - } - - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("messageKey", msgid); - dbQuery.setFirstResult(firstResult); - if(maxResults > 0) { - dbQuery.setMaxResults(maxResults); - } - - List<Message> messages = dbQuery.list(); - if (log.isDebug()){ - long rstop = System.currentTimeMillis(); - log.debug("time to fetch thread with topmsg_id " + msgid + " :" + (rstop - rstart), null); - } - return messages; - } - - public List<Long> getAllForumKeys(){ - List<Long> tmpRes = DBFactory.getInstance().find("select key from org.olat.modules.fo.ForumImpl"); - return tmpRes; - } - - /** - * - * @param forum_id - * @return - */ - public int countThreadsByForumID(Long forum_id) { - return countMessagesByForumID(forum_id, true); - } - - /** - * - * @param forum_id - * @param start - * @param limit - * @param orderBy - * @param asc - * @return - */ - public List<Message> getThreadsByForumID(Long forum_id, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { - return getMessagesByForumID(forum_id, firstResult, maxResults, true, orderBy, asc); - } - - /** - * - * @param forum - * @return - */ - public List<Message> getMessagesByForum(Forum forum){ - if (forum == null) return new ArrayList<Message>(0); // fxdiff: while indexing it can somehow occur, that forum is null! - return getMessagesByForumID(forum.getKey(), 0, -1, null, true); - } - - /** - * @param forum - * @return List messages - */ - public List<Message> getMessagesByForumID(Long forum_id) { - return getMessagesByForumID(forum_id, 0, -1, false, null, true); - } - - /** - * - * @param forum_id - * @param start - * @param limit - * @param orderBy - * @param asc - * @return - */ - public List<Message> getMessagesByForumID(Long forum_id, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { - return getMessagesByForumID(forum_id, firstResult, maxResults, false, orderBy, asc); - } - - /** - * - * @param forum_id - * @param start - * @param limit - * @param onlyThreads - * @param orderBy - * @param asc - * @return - */ - private List<Message> getMessagesByForumID(Long forum_id, int firstResult, int maxResults, boolean onlyThreads, Message.OrderBy orderBy, boolean asc) { - long rstart = 0; - if(log.isDebug()){ - rstart = System.currentTimeMillis(); - } - - StringBuilder query = new StringBuilder(); - query.append("select msg from ").append(MessageImpl.class.getName()).append(" as msg") - .append(" inner join fetch msg.creator as creator") - .append(" where msg.forum.key=:forumId "); - if(onlyThreads) { - query.append(" and msg.parent is null"); - } - if(orderBy != null) { - query.append(" order by msg.").append(orderBy.name()).append(asc ? " ASC" : " DESC"); - } - - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("forumId", forum_id); - dbQuery.setFirstResult(firstResult); - if(maxResults > 0) { - dbQuery.setMaxResults(maxResults); - } - - List<Message> messages = dbQuery.list(); - if(log.isDebug()){ - long rstop = System.currentTimeMillis(); - log.debug("time to fetch forum with forum_id " + forum_id + " :" + (rstop - rstart), null); - } - return messages; - } - - private int countMessagesByForumID(Long forumId, boolean onlyThreads) { - StringBuilder query = new StringBuilder(); - query.append("select count(msg) from ").append(MessageImpl.class.getName()).append(" as msg") - .append(" where msg.forum.key=:forumId "); - if(onlyThreads) { - query.append(" and msg.parent is null"); - } - - return dbInstance.getCurrentEntityManager() - .createQuery(query.toString(), Number.class) - .setParameter("forumId", forumId) - .getSingleResult() - .intValue(); - } - - /** - * - * @param forumkey - * @return the count of all messages by this forum - */ - public Integer countMessagesByForumID(Long forum_id) { - return countMessagesByForumID(forum_id, false); - } - - /** - * Implementation with one entry per message. - * @param identity - * @param forumkey - * @return number of read messages - */ - public int countReadMessagesByUserAndForum(Identity identity, Long forumkey) { - StringBuilder query = new StringBuilder(); - query.append("select count(msg) from ").append(ReadMessageImpl.class.getName()).append(" as msg ") - .append(" where msg.identity=:ident and msg.forum=:forumId"); - - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("forumId", forumkey); - dbQuery.setLong("ident", identity.getKey()); - - return ((Number)dbQuery.uniqueResult()).intValue(); - } - - /** - * @param forumKey - * @param latestRead - * @return a List of Object[] with a key(Long), title(String), a creator(Identity), and - * the lastmodified(Date) of the messages of the forum with the given - * key and with last modification after the "latestRead" Date - */ - public List<Message> getNewMessageInfo(Long forumKey, Date latestRead) { - // FIXME:fj: lastModified has no index -> test performance with forum with - // 200 messages - StringBuilder query = new StringBuilder(); - query.append("select msg from ").append(MessageImpl.class.getName()).append(" as msg ") - .append(" inner join fetch msg.creator as creator") - .append(" where msg.forum.key =:forumKey and msg.lastModified>:latestRead order by msg.lastModified desc"); - - return DBFactory.getInstance().getCurrentEntityManager() - .createQuery(query.toString(), Message.class) - .setParameter("forumKey", forumKey.longValue()) - .setParameter("latestRead", latestRead, TemporalType.TIMESTAMP) - .getResultList(); - } - - /** - * @return the newly created and persisted forum - */ - public Forum addAForum() { - Forum fo = createForum(); - saveForum(fo); - return fo; - } - - /** - * @param forumKey - * @return the forum with the given key - */ - public Forum loadForum(Long forumKey) { - ForumImpl fo = DBFactory.getInstance().loadObject(ForumImpl.class, forumKey); - return fo; - } - - private Forum saveForum(Forum forum) { - DB db = DBFactory.getInstance(); - db.saveObject(forum); - return forum; - } - - /** - * @param forumKey - */ - public void deleteForum(Long forumKey) { - Forum foToDel = loadForum(forumKey); - if (foToDel == null) throw new AssertException("forum to delete was not found: key=" + forumKey); - // delete properties, messages and the forum itself - doDeleteForum(foToDel); - // delete directory for messages with attachments - deleteForumContainer(forumKey); - } - - /** - * deletes all messages belonging to this forum and the forum entry itself - * - * @param forum - */ - private void doDeleteForum(final Forum forum) { - Long forumKey = forum.getKey(); - DB db = DBFactory.getInstance(); - //delete read messsages - db.delete("from readMsg in class org.olat.modules.fo.ReadMessageImpl where readMsg.forum = ? ", forumKey, StandardBasicTypes.LONG); - // delete messages - db.delete("from message in class org.olat.modules.fo.MessageImpl where message.forum = ?", forumKey, StandardBasicTypes.LONG); - // delete forum - db.delete("from forum in class org.olat.modules.fo.ForumImpl where forum.key = ?", forumKey, StandardBasicTypes.LONG); - // delete properties - - //delete all flags - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, forum.getKey()); - markingService.getMarkManager().deleteMarks(ores); - } - - /** - * create (in RAM only) a new Forum - */ - private ForumImpl createForum() { - return new ForumImpl(); - } - - /** - * sets the parent and threadtop of the message automatically - * - * @param newMessage the new message which has title and body set - * @param creator - * @param replyToMessage - */ - public void replyToMessage(Message newMessage, Identity creator, Message replyToMessage) { - newMessage.setForum(replyToMessage.getForum()); - Message top = replyToMessage.getThreadtop(); - newMessage.setThreadtop((top != null ? top : replyToMessage)); - newMessage.setParent(replyToMessage); - newMessage.setCreator(creator); - saveMessage(newMessage); - } - - /** - * @param creator - * @param forum - * @param topMessage - */ - public void addTopMessage(Identity creator, Forum forum, Message topMessage) { - topMessage.setForum(forum); - topMessage.setParent(null); - topMessage.setThreadtop(null); - topMessage.setCreator(creator); - - saveMessage(topMessage); - } - - /** - * @param messageKey - * @return the message with the given messageKey - */ - public Message loadMessage(Long messageKey) { - StringBuilder sb = new StringBuilder(); - sb.append("select msg from ").append(MessageImpl.class.getName()).append(" msg where msg.key=:messageKey"); - List<Message> messages = dbInstance.getCurrentEntityManager() - .createQuery(sb.toString(), Message.class) - .setParameter("messageKey", messageKey) - .getResultList(); - return messages == null || messages.isEmpty() ? null : messages.get(0); - } - - private void saveMessage(Message m) { - // TODO: think about where maxlenrestriction comes: manager or controller - updateCounters(m); - m.setLastModified(new Date()); - DBFactory.getInstance().saveObject(m); - } - - /** - * creates (in RAM only) a new Message<br> - * fill the values and use saveMessage to make it persistent - * - * @return the message - * @see ForumManager#saveMessage(Message) - */ - public Message createMessage() { - return new MessageImpl(); - } - - /** - * Update message and fire MultiUserEvent, if any provided. If a not null - * ForumChangedEvent object is provided, then fire event to listeners. - * - * @param m - * @param updateLastModifiedDate - * true: the last modified date is updated to trigger a - * notification; false: last modified date is not modified and no - * notification is sent - * @param event - */ - public void updateMessage(final Message m, final boolean updateLastModifiedDate, final ForumChangedEvent event) { - updateCounters(m); - // OLAT-6295 Only update last modified for the operations edit(update), show, and open. - // Don't update the last modified date for the operations close, hide, move and split. - if (updateLastModifiedDate) { - m.setLastModified(new Date()); - } - DBFactory.getInstance().updateObject(m); - if (event!=null) { - CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new ForumChangedEvent("hide"), m.getForum()); - } - } - - /** - * @param forumKey - * @param m - */ - public void deleteMessageTree(Long forumKey, Message m) { - deleteMessageRecursion(forumKey, m); - } - - private void deleteMessageRecursion(final Long forumKey, Message m) { - deleteMessageContainer(forumKey, m.getKey()); - DB db = DBFactory.getInstance(); - Long message_id = m.getKey(); - List messages = db - .find("select msg from msg in class org.olat.modules.fo.MessageImpl where msg.parent = ?", message_id, StandardBasicTypes.LONG); - - for (Iterator iter = messages.iterator(); iter.hasNext();) { - Message element = (Message) iter.next(); - deleteMessageRecursion(forumKey, element); - } - - /* - * if (! db.contains(m)){ log.debug("Message " + m.getKey() + " not in - * hibernate session, reloading before delete"); m = - * loadMessage(m.getKey()); } - */ - // make sure the message is reloaded if it is not in the hibernate session - // cache - m = (Message) db.loadObject(m); - // delete all properties of one single message - deleteMessageProperties(forumKey, m); - db.deleteObject(m); - - //delete all flags - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, forumKey); - markingService.getMarkManager().deleteMarks(ores, m.getKey().toString()); - - if(log.isDebug()){ - log.debug("Deleting message ", m.getKey().toString()); - } - } - - /** - * @param m - * @return true if the message has children - */ - public boolean hasChildren(Message m) { - boolean children = false; - DB db = DBFactory.getInstance(); - Long message_id = m.getKey(); - String q = " select count(msg) from org.olat.modules.fo.MessageImpl msg where msg.parent = :input "; - - DBQuery query = db.createQuery(q); - query.setLong("input", message_id.longValue()); - List result = query.list(); - int count = ((Long) result.get(0)).intValue(); - - if (count > 0) { - children = true; - } - - return children; - } - - /** - * deletes entry of one message - */ - private void deleteMessageProperties(Long forumKey, Message m) { - DB db = DBFactory.getInstance(); - Long messageKey = m.getKey(); - - StringBuilder query = new StringBuilder(); - query.append("from readMsg in class org.olat.modules.fo.ReadMessageImpl "); - query.append("where readMsg.forum = ? "); - query.append("and readMsg.message = ? "); - - db.delete(query.toString(), new Object[] { forumKey, messageKey }, new Type[] { StandardBasicTypes.LONG, StandardBasicTypes.LONG }); - } - - /** - * @param forumKey - * @param messageKey - * @return the valid container for the attachments to place into - */ - public VFSContainer getMessageContainer(Long forumKey, Long messageKey) { - VFSContainer forumContainer = getForumContainer(forumKey); - VFSItem messageContainer = forumContainer.resolve(messageKey.toString()); - if(messageContainer == null) { - return forumContainer.createChildContainer(messageKey.toString()); - } else if(messageContainer instanceof VFSContainer) { - return (VFSContainer)messageContainer; - } - log.error("The following message container is not a directory: " + messageContainer); - return null; - } - - private void moveMessageContainer(Long fromForumKey, Long fromMessageKey, Long toForumKey, Long toMessageKey) { - // copy message container - VFSContainer toMessageContainer = getMessageContainer(toForumKey, toMessageKey); - VFSContainer fromMessageContainer = getMessageContainer(fromForumKey, fromMessageKey); - for (VFSItem vfsItem : fromMessageContainer.getItems()) { - toMessageContainer.copyFrom(vfsItem); - } - } - - private void deleteMessageContainer(Long forumKey, Long messageKey) { - VFSContainer mContainer = getMessageContainer(forumKey, messageKey); - mContainer.delete(); - } - - private void deleteForumContainer(Long forumKey) { - VFSContainer fContainer = getForumContainer(forumKey); - fContainer.delete(); - } - - private VFSContainer getForumContainer(Long forumKey) { - OlatRootFolderImpl fContainer = new OlatRootFolderImpl("/forum", null); - VFSItem forumContainer = fContainer.resolve(forumKey.toString()); - if(forumContainer == null) { - return fContainer.createChildContainer(forumKey.toString()); - } else if(forumContainer instanceof VFSContainer) { - return (VFSContainer)forumContainer; - } - log.error("The following forum container is not a directory: " + forumContainer); - return null; - } - - /** - * Splits the current thread starting from the current message. - * It updates the messages of the selected subthread by setting the Parent and the Threadtop. - * - * @param msgid - * @return the top message of the newly created thread. - */ - public Message splitThread(Message msg){ - Message newTopMessage = null; - if(msg.getThreadtop()==null) { - newTopMessage = msg; - } else { - //it only make sense to split a thread if the current message is not a threadtop message. - List<Message> threadList = this.getThread(msg.getThreadtop().getKey()); - List<Message> subthreadList = new ArrayList<Message>(); - subthreadList.add(msg); - getSubthread(msg, threadList, subthreadList); - - Iterator<Message> messageIterator = subthreadList.iterator(); - Message firstMessage = null; - final DB db = DBFactory.getInstance(); - final boolean changeLastModifiedDate = false; // OLAT-6295 - if (messageIterator.hasNext()) { - firstMessage = messageIterator.next(); - firstMessage = (Message) db.loadObject(firstMessage); - firstMessage.setParent(null); - firstMessage.setThreadtop(null); - this.updateMessage(firstMessage, changeLastModifiedDate, new ForumChangedEvent("split")); - newTopMessage = firstMessage; - } - while (firstMessage != null && messageIterator.hasNext()) { - Message message = messageIterator.next(); - message = (Message) db.loadObject(message); - message.setThreadtop(firstMessage); - this.updateMessage(message, changeLastModifiedDate, null); - } - } - return newTopMessage; - } - - /** - * Moves the current message from the current thread in another thread. - * - * @param msg - * @param topMsg - * @return the moved message - */ - public Message moveMessage(Message msg, Message topMsg) { - DB db = DBFactory.getInstance(); - List<Message> oldThreadList = getThread(msg.getThreadtop().getKey()); - List<Message> subThreadList = new ArrayList<Message>(); - this.getSubthread(msg, oldThreadList, subThreadList); - // one has to set a new parent for all childs of the moved message - // first message of sublist has to get the parent from the moved message - final boolean changeLastModifiedDate = false; // OLAT-6295 - for (Message childMessage : subThreadList) { - childMessage = (Message) db.loadObject(childMessage); - childMessage.setParent(msg.getParent()); - updateMessage(childMessage, changeLastModifiedDate, null); - } - // now move the message to the choosen thread - final Message oldMessage = (Message) db.loadObject(msg); - Message message = createMessage(); - message.setCreator(oldMessage.getCreator()); - message.setForum(oldMessage.getForum()); - message.setModifier(oldMessage.getModifier()); - message.setLastModified(oldMessage.getLastModified()); // OLAT-6295 - message.setTitle(oldMessage.getTitle()); - message.setBody(oldMessage.getBody()); - message.setThreadtop(topMsg); - message.setParent(topMsg); - Status status = Status.getStatus(oldMessage.getStatusCode()); - status.setMoved(true); - message.setStatusCode(Status.getStatusCode(status)); - saveMessage(message); - - //move marks - MarkingService markingService = (MarkingService)CoreSpringFactory.getBean(MarkingService.class); - OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, msg.getForum().getKey()); - markingService.getMarkManager().moveMarks(ores, msg.getKey().toString(), message.getKey().toString()); - - moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), message.getForum().getKey(), message.getKey()); - deleteMessageRecursion(oldMessage.getForum().getKey(), oldMessage); - return message; - } - - /** - * This is a recursive method. The subthreadList in an ordered list with all descendents of the input msg. - * @param msg - * @param threadList - * @param subthreadList - */ - private void getSubthread(Message msg, List<Message> threadList, List<Message> subthreadList) { - Iterator<Message> listIterator = threadList.iterator(); - while(listIterator.hasNext()) { - Message currMessage = listIterator.next(); - if(currMessage.getParent()!=null && currMessage.getParent().getKey().equals(msg.getKey())) { - subthreadList.add(currMessage); - getSubthread(currMessage, threadList, subthreadList); - } - } - } - - /** - * - * @param identity - * @param forum - * @return a set with the read messages keys for the input identity and forum. - */ - public Set<Long> getReadSet(Identity identity, Forum forum) { - StringBuilder query = new StringBuilder(); - query.append("select rmsg.message.key from ").append(ReadMessageImpl.class.getName()).append(" as rmsg") - .append(" inner join rmsg.message as msg") - .append(" where msg.forum.key=:forumId and rmsg.identity.key=:ident"); - - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("forumId", forum.getKey()); - dbQuery.setLong("ident", identity.getKey()); - List<Long> messageKeys = dbQuery.list(); - return new HashSet<Long>(messageKeys); - } - - /** - * Implementation with one entry per forum message. - * Adds a new entry into the ReadMessage for the input message and identity. - * @param msg - * @param identity - */ - public void markAsRead(Identity identity,Message msg) { - //Check if the message was not already deleted - Message retrievedMessage = loadMessage(msg.getKey()); - if(retrievedMessage!=null) { - ReadMessageImpl readMessage = new ReadMessageImpl(); - readMessage.setIdentity(identity); - readMessage.setMessage(msg); - readMessage.setForum(msg.getForum()); - DBFactory.getInstance().saveObject(readMessage); - } - } - - /** - * Update the counters for words and characters - * @param m the message - */ - public void updateCounters(Message m) { - String body = m.getBody(); - String unQuotedBody = new QuoteAndTagFilter().filter(body); - Locale suggestedLocale = txtService.detectLocale(unQuotedBody); - m.setNumOfWords(txtService.wordCount(unQuotedBody, suggestedLocale)); - m.setNumOfCharacters(txtService.characterCount(unQuotedBody, suggestedLocale)); - } -} diff --git a/src/main/java/org/olat/modules/fo/ForumMessagesTableDataModel.java b/src/main/java/org/olat/modules/fo/ForumMessagesTableDataModel.java deleted file mode 100644 index 67d79d45d67..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumMessagesTableDataModel.java +++ /dev/null @@ -1,78 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.fo; - -import java.util.Date; -import java.util.List; -import java.util.Set; - -import org.olat.core.gui.components.table.DefaultTableDataModel; -import org.olat.user.UserManager; - -/** -* @author Felix Jost -*/ -public class ForumMessagesTableDataModel extends DefaultTableDataModel<Message> { - - private Set<Long> readMsgs; - private UserManager userManager; - - public ForumMessagesTableDataModel(UserManager userManager, List<Message> objects, Set<Long> readMsgs) { - super(objects); - this.readMsgs = readMsgs; - this.userManager = userManager; - } - - public int getColumnCount() { - return 4; - } - - /** - * 4 columns: - * first is the title of the message - * second the (name, firstname) of the creator - * third lastModifiedDate - * fourth if it is new or not - */ - public final Object getValueAt(int row, int col) { - Message m= getObject(row); - switch (col) { - case 0 : - String title = m.getTitle(); - return title; - case 1 : - return userManager.getUserDisplayName(m.getCreator().getUser()); - case 2 : - Date mod = m.getLastModified(); - return mod; - case 3: // return if we have read this message before or not - return ( readMsgs.contains(m.getKey())? Boolean.TRUE : Boolean.FALSE ); - default : - return "error"; - } - } -} - diff --git a/src/main/java/org/olat/modules/fo/ForumModule.java b/src/main/java/org/olat/modules/fo/ForumModule.java new file mode 100644 index 00000000000..e9779a02ecc --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ForumModule.java @@ -0,0 +1,97 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo; + +import org.olat.core.configuration.AbstractSpringModule; +import org.olat.core.util.StringHelper; +import org.olat.core.util.coordinate.CoordinatorManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service("forumModule") +public class ForumModule extends AbstractSpringModule { + + @Value("${forum.anonymous.posting.enabled:disabled}") + private String anonymousPostingWithPseudonymEnabled; + @Value("${forum.course.default:disabled}") + private String courseForumDefault; + @Value("${forum.group.default:disabled}") + private String groupForumDefault; + + @Autowired + public ForumModule(CoordinatorManager coordinatorManager) { + super(coordinatorManager); + } + + @Override + public void init() { + initFromChangedProperties(); + } + + @Override + protected void initFromChangedProperties() { + String anonymousPostingObj = getStringPropertyValue("forum.anonymous.posting.enabled", true); + if(StringHelper.containsNonWhitespace(anonymousPostingObj)) { + anonymousPostingWithPseudonymEnabled = anonymousPostingObj; + } + String courseDefaultObj = getStringPropertyValue("forum.course.default", true); + if(StringHelper.containsNonWhitespace(courseDefaultObj)) { + courseForumDefault = courseDefaultObj; + } + String groupDefaultObj = getStringPropertyValue("forum.group.default", true); + if(StringHelper.containsNonWhitespace(groupDefaultObj)) { + groupForumDefault = groupDefaultObj; + } + } + + public boolean isAnonymousPostingWithPseudonymEnabled() { + return "enabled".equals(anonymousPostingWithPseudonymEnabled); + } + + public void setAnonymousPostingWithPseudonymEnabled(boolean enabled) { + anonymousPostingWithPseudonymEnabled = enabled ? "enabled" : "disabled"; + setStringProperty("forum.anonymous.posting.enabled", enabled ? "enabled" : "disabled", true); + } + + public boolean isPseudonymForCourseEnabledByDefault() { + return "enabled".equals(courseForumDefault); + } + + public void setPseudonymForCourseEnabledByDefault(boolean enabled) { + courseForumDefault = enabled ? "enabled" : "disabled"; + setStringProperty("forum.course.default", enabled ? "enabled" : "disabled", true); + } + + public boolean isPseudonymForGroupEnabledByDefault() { + return "enabled".equals(groupForumDefault); + } + + public void setPseudonymForGroupEnabledByDefault(boolean enabled) { + groupForumDefault = enabled ? "enabled" : "disabled"; + setStringProperty("forum.group.default", enabled ? "enabled" : "disabled", true); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java index 1cb40fc2fd1..61ba5102e0e 100644 --- a/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java +++ b/src/main/java/org/olat/modules/fo/ForumNotificationsHandler.java @@ -48,6 +48,7 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.Util; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; +import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryManager; /** diff --git a/src/main/java/org/olat/modules/fo/ForumThreadViewModeController.java b/src/main/java/org/olat/modules/fo/ForumThreadViewModeController.java deleted file mode 100644 index 3ab1d2820a9..00000000000 --- a/src/main/java/org/olat/modules/fo/ForumThreadViewModeController.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * <a href="http://www.openolat.org"> - * OpenOLAT - Online Learning and Training</a><br> - * <p> - * Licensed under the Apache License, Version 2.0 (the "License"); <br> - * you may not use this file except in compliance with the License.<br> - * You may obtain a copy of the License at the - * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> - * <p> - * Unless required by applicable law or agreed to in writing,<br> - * software distributed under the License is distributed on an "AS IS" BASIS, <br> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> - * See the License for the specific language governing permissions and <br> - * limitations under the License. - * <p> - * Initial code contributed and copyrighted by<br> - * frentix GmbH, http://www.frentix.com - * <p> - */ -package org.olat.modules.fo; - -import java.util.Arrays; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.form.flexible.FormItem; -import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.elements.SingleSelection; -import org.olat.core.gui.components.form.flexible.impl.FormBasicController; -import org.olat.core.gui.components.form.flexible.impl.FormEvent; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.logging.AssertException; -import org.olat.core.util.prefs.Preferences; - -/** - * Description:<br> - * Provides a Switch for all supported forum-view-modes and fires Event to ForumController. - * - * <P> - * Initial Date: 25.06.2009 <br> - * - * @author Roman Haag, roman.haag@frentix.com, frentix GmbH - */ -public class ForumThreadViewModeController extends FormBasicController { - protected static final String VIEWMODE_THREAD = "thread"; - protected static final String VIEWMODE_FLAT = "flat"; - protected static final String VIEWMODE_MESSAGE = "message"; - protected static final String VIEWMODE_MARKED = "marked"; - protected static final String VIEWMODE_NEW = "new"; - - private static final String[] viewKeys = new String[] { VIEWMODE_THREAD, VIEWMODE_FLAT, VIEWMODE_MESSAGE, VIEWMODE_MARKED, VIEWMODE_NEW }; - private static final String GUI_PREFS_VIEWMODE_KEY = "forum.threadview.mode"; - - private SingleSelection viewRadio; - private final String startingViewMode; - - /** - * @param ureq - * @param control - */ - public ForumThreadViewModeController(UserRequest ureq, WindowControl control, String startingViewMode) { - super(ureq, control); - setFormStyle("o_forum_switch"); - this.startingViewMode = startingViewMode; - initForm(ureq); - } - - /** - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose() - */ - @Override - protected void doDispose() { - // nothing - } - - /** - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest) - */ - @Override - protected void formOK(UserRequest ureq) { - // nothing to do, handled with innerEvents - } - - /** - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer, - * org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest) - */ - @Override - protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - String[] viewValues = new String[] { translate("viewswitch.threadview"), translate("viewswitch.flatview"), - translate("viewswitch.messageview"), translate("viewswitch.marked"), translate("viewswitch.new") }; - viewRadio = uifactory.addRadiosHorizontal("viewswitch.title", formLayout, viewKeys, viewValues); - viewRadio.addActionListener(FormEvent.ONCLICK); - // preselect according to user-settings - - if(startingViewMode == null) { - viewRadio.select(getThreadViewMode(ureq), true); - } else { - viewRadio.select(startingViewMode, true); - } - } - - /** - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.form.flexible.FormItem, - * org.olat.core.gui.components.form.flexible.impl.FormEvent) - */ - @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if (source == viewRadio){ - String newViewMode = viewRadio.getSelectedKey(); - if (Arrays.asList(viewKeys).contains(newViewMode)){ - saveThreadViewModePrefs(ureq, newViewMode); - fireEvent(ureq, Event.CHANGED_EVENT); - } else throw new AssertException("ForumViewController doesn't support this view-mode."); - } - } - - private void saveThreadViewModePrefs(UserRequest ureq, String viewMode){ - if(viewMode.equals(VIEWMODE_THREAD) || viewMode.equals(VIEWMODE_FLAT) || viewMode.equals(VIEWMODE_MESSAGE)){ - Preferences prefs = ureq.getUserSession().getGuiPreferences(); - prefs.putAndSave(this.getClass(), GUI_PREFS_VIEWMODE_KEY, viewMode); - } - } - - public String getSelectedViewMode() { - if(viewRadio == null) return null; - return viewRadio.getSelectedKey(); - } - - // TODO:RH:forum: move this to upgrade code or to manager, to migrate settings, or kill - // them all??? - public String getThreadViewMode(UserRequest ureq){ - Preferences prefs = ureq.getUserSession().getGuiPreferences(); - // migrate old settings, keep appropriate to new possibilities - Boolean threadview = (Boolean) prefs.get(ForumController.class, ForumController.GUI_PREFS_THREADVIEW_KEY); - if (threadview != null) { - // remove old pref - prefs.putAndSave(ForumController.class, ForumController.GUI_PREFS_THREADVIEW_KEY, null); - if (threadview) { - prefs.putAndSave(this.getClass(), GUI_PREFS_VIEWMODE_KEY, VIEWMODE_FLAT); - return VIEWMODE_FLAT; - } else { - prefs.putAndSave(this.getClass(), GUI_PREFS_VIEWMODE_KEY, VIEWMODE_MESSAGE); - return VIEWMODE_MESSAGE; - } - } - return (String) prefs.get(this.getClass(), GUI_PREFS_VIEWMODE_KEY, VIEWMODE_THREAD); - } -} diff --git a/src/main/java/org/olat/modules/fo/ForumUIFactory.java b/src/main/java/org/olat/modules/fo/ForumUIFactory.java index 2a0dd63ddbf..0e9ed885622 100644 --- a/src/main/java/org/olat/modules/fo/ForumUIFactory.java +++ b/src/main/java/org/olat/modules/fo/ForumUIFactory.java @@ -35,6 +35,7 @@ import org.olat.core.gui.control.generic.popup.PopupBrowserWindow; import org.olat.core.gui.control.generic.title.TitleInfo; import org.olat.core.gui.control.generic.title.TitledWrapperController; import org.olat.core.util.StringHelper; +import org.olat.modules.fo.ui.ForumController; /** diff --git a/src/main/java/org/olat/modules/fo/Message.java b/src/main/java/org/olat/modules/fo/Message.java index 6b89e19e10a..e4524534201 100644 --- a/src/main/java/org/olat/modules/fo/Message.java +++ b/src/main/java/org/olat/modules/fo/Message.java @@ -33,32 +33,53 @@ import org.olat.core.id.Persistable; /** * @author schneider */ -public interface Message extends CreateInfo, ModifiedInfo, Persistable, Comparable<Message> { - public abstract String getBody(); - public abstract Identity getCreator(); - public abstract Forum getForum(); - public abstract Identity getModifier(); - public abstract Message getParent(); - public abstract Message getThreadtop(); - public abstract String getTitle(); - public abstract Integer getNumOfWords(); - public abstract Integer getNumOfCharacters(); - public abstract void setBody(String string); - public abstract void setCreator(Identity identity); - public abstract void setForum(Forum forum); - public abstract void setModifier(Identity identity); - public abstract void setParent(Message message); - public abstract void setThreadtop(Message message); - public abstract void setTitle(String string); - public abstract void setNumOfWords(Integer numOfWords); - public abstract void setNumOfCharacters(Integer numOfCharacters); +public interface Message extends MessageLight, CreateInfo, ModifiedInfo, Persistable, Comparable<Message> { + + public String getTitle(); + + public void setTitle(String string); + + public String getBody(); + + public void setBody(String string); + + public Identity getCreator(); + + public boolean isGuest(); + + public String getPseudonym(); + + public void setPseudonym(String pseudonym); + + public Forum getForum(); + + public Identity getModifier(); + + public void setModifier(Identity identity); + + public Message getParent(); + + public void setParent(Message message); + + public Message getThreadtop(); + + public void setThreadtop(Message message); + + public Integer getNumOfWords(); + + public void setNumOfWords(Integer numOfWords); + + public Integer getNumOfCharacters(); + + public void setNumOfCharacters(Integer numOfCharacters); + public int getStatusCode(); + public void setStatusCode(int statusCode); public enum OrderBy { title, creationDate - } } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/MessageImpl.hbm.xml b/src/main/java/org/olat/modules/fo/MessageImpl.hbm.xml deleted file mode 100644 index b3d67af3a9a..00000000000 --- a/src/main/java/org/olat/modules/fo/MessageImpl.hbm.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD//EN" - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> - -<hibernate-mapping default-lazy="false"> - - <!-- Can't name the class user, clashes with postgres database --> - <class name="org.olat.modules.fo.MessageImpl" table="o_message"> - - <id name="key" column="message_id" type="long" unsaved-value="null"> - <generator class="hilo"/> - </id> - - <version name="version" access="field" column="version" type="int"/> - <property name="lastModified" column="lastmodified" type="timestamp" /> - <property name="creationDate" column="creationdate" type="timestamp" /> - - <property name="title" unique="false" type="string" not-null="false" length="100"/> - - <property name="body" unique="false" type="string" not-null="false"> - <column name="body" length="16777210"/> - </property> - - <many-to-one name="parent" class="org.olat.modules.fo.MessageImpl" - column="parent_id" outer-join="true" cascade="none"/> - - <many-to-one name="threadtop" class="org.olat.modules.fo.MessageImpl" - column="topthread_id" outer-join="true" cascade="none"/> - - <many-to-one name="creator" class="org.olat.basesecurity.IdentityImpl" - column="creator_id" outer-join="true" cascade="none" not-null="true"/> - - <many-to-one name="modifier" class="org.olat.basesecurity.IdentityImpl" - column="modifier_id" outer-join="true" cascade="none" not-null="false"/> - - <many-to-one name="forum" class="org.olat.modules.fo.ForumImpl" - column="forum_fk" cascade="none"/> - - <property name="statusCode" unique="false" type="int" not-null="true" /> - - <property name="numOfWords" column="numofwords" unique="false" type="int" not-null="false" /> - - <property name="numOfCharacters" column="numofcharacters" unique="false" type="int" not-null="false" /> - - </class> - -</hibernate-mapping> - diff --git a/src/main/java/org/olat/modules/fo/MessageImpl.java b/src/main/java/org/olat/modules/fo/MessageImpl.java deleted file mode 100644 index 589315848e2..00000000000 --- a/src/main/java/org/olat/modules/fo/MessageImpl.java +++ /dev/null @@ -1,205 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.fo; - -import java.util.Date; - -import org.olat.core.commons.persistence.PersistentObject; -import org.olat.core.id.Identity; -/** - * @author Felix Jost - */ - -public class MessageImpl extends PersistentObject implements Message { - - private String title; - private String body; - private Message parent; - private Message threadtop; - private Forum forum; - - private Identity creator = null; - private Identity modifier = null; - private int statusCode; - private Date lastModified; - private Integer numOfCharacters; - private Integer numOfWords; - - /** - * Default construcor - */ - MessageImpl() { - // nothing to do - } - - - /** - * @return - */ - public String getBody() { - return body; - } - - - /** - * @return - */ - public Identity getCreator() { - return creator; - } - - /** - * @return - */ - public Forum getForum() { - return forum; - } - - /** - * @return - */ - public Identity getModifier() { - return modifier; - } - - /** - * @return - */ - public Message getParent() { - return parent; - } - - /** - * @return - */ - public Message getThreadtop() { - return threadtop; - } - - /** - * @return - */ - public String getTitle() { - return title; - } - - /** - * @param string - */ - public void setBody(String string) { - body = string; - } - - /** - * @param identity - */ - public void setCreator(Identity identity) { - creator = identity; - } - - /** - * @param forum - */ - public void setForum(Forum forum) { - this.forum = forum; - } - - /** - * @param identity - */ - public void setModifier(Identity identity) { - modifier = identity; - } - - /** - * @param message - */ - public void setParent(Message message) { - parent = message; - } - - /** - * @param message - */ - public void setThreadtop(Message message) { - threadtop = message; - } - - /** - * @param string - */ - public void setTitle(String string) { - title = string; - } - - public int getStatusCode() { - return statusCode; - } - public void setStatusCode(int statusCode) { - this.statusCode = statusCode; - } - - /** - * - * @see org.olat.core.id.ModifiedInfo#getLastModified() - */ - public Date getLastModified() { - return lastModified; - } - - /** - * - * @see org.olat.core.id.ModifiedInfo#setLastModified(java.util.Date) - */ - public void setLastModified(Date date) { - this.lastModified = date; - } - - public Integer getNumOfCharacters() { - return numOfCharacters; - } - - public void setNumOfCharacters(Integer numOfCharacters) { - this.numOfCharacters = numOfCharacters; - } - - public Integer getNumOfWords() { - return numOfWords; - } - - public void setNumOfWords(Integer numOfWords) { - this.numOfWords = numOfWords; - } - - - public int compareTo(Message arg0) { - //threadtop always is on top! - if (arg0.getParent()==null) return 1; - if (getCreationDate().after(arg0.getCreationDate())) return 1; - return 0; - } - -} diff --git a/src/main/java/org/olat/modules/fo/MessageLight.java b/src/main/java/org/olat/modules/fo/MessageLight.java new file mode 100644 index 00000000000..fcace6e0567 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/MessageLight.java @@ -0,0 +1,57 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo; + +import java.util.Date; + +import org.olat.core.id.Identity; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface MessageLight extends MessageRef { + + public int getStatusCode(); + + public String getTitle(); + + public String getBody(); + + public boolean isGuest(); + + public String getPseudonym(); + + public Identity getCreator(); + + public Identity getModifier(); + + public Date getCreationDate(); + + public Date getLastModified(); + + + public Long getParentKey(); + + public MessageRef getThreadtop(); + +} diff --git a/src/main/java/org/olat/modules/fo/MessageRef.java b/src/main/java/org/olat/modules/fo/MessageRef.java new file mode 100644 index 00000000000..2e9cffa9dc8 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/MessageRef.java @@ -0,0 +1,34 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo; + +/** + * + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface MessageRef { + + public Long getKey(); + + public int getStatusCode(); + +} diff --git a/src/main/java/org/olat/modules/fo/QuoteAndTagFilter.java b/src/main/java/org/olat/modules/fo/QuoteAndTagFilter.java index af13c4dca3f..6ec5bc9ebcc 100644 --- a/src/main/java/org/olat/modules/fo/QuoteAndTagFilter.java +++ b/src/main/java/org/olat/modules/fo/QuoteAndTagFilter.java @@ -23,7 +23,8 @@ import java.io.IOException; import java.io.StringReader; import org.cyberneko.html.parsers.DOMParser; -import org.olat.core.logging.LogDelegator; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.filter.Filter; import org.w3c.dom.Document; @@ -31,7 +32,9 @@ import org.w3c.dom.Node; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -public class QuoteAndTagFilter extends LogDelegator implements Filter { +public class QuoteAndTagFilter implements Filter { + + private static final OLog log = Tracing.createLoggerFor(QuoteAndTagFilter.class); /** * @see org.olat.core.util.filter.Filter#filter(java.lang.String) @@ -46,10 +49,10 @@ public class QuoteAndTagFilter extends LogDelegator implements Filter { scanNode(document, sb); return sb.toString(); } catch (SAXException e) { - logError("", e); + log.error("", e); return null; } catch (IOException e) { - logError("", e); + log.error("", e); return null; } } diff --git a/src/main/java/org/olat/modules/fo/ReadMessage.hbm.xml b/src/main/java/org/olat/modules/fo/ReadMessage.hbm.xml deleted file mode 100644 index 0f93993e90a..00000000000 --- a/src/main/java/org/olat/modules/fo/ReadMessage.hbm.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD//EN" - "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> - -<hibernate-mapping default-lazy="false"> - <class name="org.olat.modules.fo.ReadMessageImpl" table="o_readmessage"> - - <id name="key" type="long" column="id" unsaved-value="null"> - <generator class="hilo" /> - </id> - - <version name="version" access="field" column="version" type="int"/> - <property name="creationDate" column="creationdate" type="timestamp" /> - - <many-to-one name="identity" class="org.olat.basesecurity.IdentityImpl" - column="identity_id" outer-join="false" cascade="none"/> - - <many-to-one name="forum" class="org.olat.modules.fo.ForumImpl" - column="forum_id" outer-join="false" cascade="none"/> - - <many-to-one name="message" class="org.olat.modules.fo.MessageImpl" - column="message_id" outer-join="false" cascade="none"/> - - </class> -</hibernate-mapping> diff --git a/src/main/java/org/olat/modules/fo/ReadMessage.java b/src/main/java/org/olat/modules/fo/ReadMessage.java deleted file mode 100644 index 515d186c650..00000000000 --- a/src/main/java/org/olat/modules/fo/ReadMessage.java +++ /dev/null @@ -1,46 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.modules.fo; - -import org.olat.core.id.CreateInfo; -import org.olat.core.id.Identity; -import org.olat.core.id.Persistable; - -/** - * - * Description:<br> - * TODO: Lavinia Dumitrescu Class Description for ReadMessage - * - * <P> - * Initial Date: 14.03.2008 <br> - * @author Lavinia Dumitrescu - */ -public interface ReadMessage extends CreateInfo, Persistable { - - public abstract Identity getIdentity(); - public abstract Forum getForum(); - public abstract Message getMessage(); - -} diff --git a/src/main/java/org/olat/modules/fo/ReadMessageImpl.java b/src/main/java/org/olat/modules/fo/ReadMessageImpl.java deleted file mode 100644 index 4c678de6eac..00000000000 --- a/src/main/java/org/olat/modules/fo/ReadMessageImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ -package org.olat.modules.fo; - -import org.olat.core.commons.persistence.PersistentObject; -import org.olat.core.id.Identity; - -public class ReadMessageImpl extends PersistentObject implements ReadMessage { - - private Identity identity; - private Message message; - private Forum forum; - - ReadMessageImpl() { - //default constructor - } - - public Forum getForum() { - return forum; - } - - public void setForum(Forum forum) { - this.forum = forum; - } - - public Identity getIdentity() { - return identity; - } - - public void setIdentity(Identity identity) { - this.identity = identity; - } - - public Message getMessage() { - return message; - } - - public void setMessage(Message message) { - this.message = message; - } - - - -} diff --git a/src/main/java/org/olat/modules/fo/ThreadColumnDescriptor.java b/src/main/java/org/olat/modules/fo/ThreadColumnDescriptor.java deleted file mode 100644 index 23b7e4b7c45..00000000000 --- a/src/main/java/org/olat/modules/fo/ThreadColumnDescriptor.java +++ /dev/null @@ -1,387 +0,0 @@ -/** -* OLAT - Online Learning and Training<br> -* http://www.olat.org -* <p> -* Licensed under the Apache License, Version 2.0 (the "License"); <br> -* you may not use this file except in compliance with the License.<br> -* You may obtain a copy of the License at -* <p> -* http://www.apache.org/licenses/LICENSE-2.0 -* <p> -* Unless required by applicable law or agreed to in writing,<br> -* software distributed under the License is distributed on an "AS IS" BASIS, <br> -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> -* See the License for the specific language governing permissions and <br> -* limitations under the License. -* <p> -* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> -* University of Zurich, Switzerland. -* <hr> -* <a href="http://www.openolat.org"> -* OpenOLAT - Online Learning and Training</a><br> -* This file has been modified by the OpenOLAT community. Changes are licensed -* under the Apache 2.0 license as the original file. -*/ - -package org.olat.modules.fo; - -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.olat.core.gui.components.table.DefaultColumnDescriptor; -import org.olat.core.gui.render.Renderer; -import org.olat.core.gui.render.StringOutput; -import org.olat.core.util.Formatter; - -/** - * Specialized ColumnDescriptor to display title of Forum messages in a indented - * (thread-like) way - * - * @author Felix Jost - */ -public class ThreadColumnDescriptor extends DefaultColumnDescriptor { - private static final String ONEINDENT = " "; - - private static final int MAXINDENTS = 20; - private static final String[] INDENTS; - - private List<Message> messages; - private TreeWalker tw; - private boolean toIndent; - - static { - INDENTS = new String[MAXINDENTS]; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < MAXINDENTS; i++) { - INDENTS[i] = sb.toString(); - sb.append(ONEINDENT); - } - } - - /** - * Description:<BR> - * Private class that implements a tree comparator for forum messages - * <P> - * Initial Date: Jan 19, 2005 - * - * @author gnaegi - */ - private static class MessageTreeComparator implements TreeComparator { - private class MessageComparator implements Comparator<GenericTraversalNode> { - - /** - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - public int compare(GenericTraversalNode ga, GenericTraversalNode gb) { - boolean asc = true; //ascending; - Message ma = (Message) ga.getItem(); - Message mb = (Message) gb.getItem(); - Date da = ma.getCreationDate(); - Date db = mb.getCreationDate(); - // TODO:fj: avoid allocation of lots of new Date objects - // timestamp and date did not compare? recheck. - // See also http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5103041 for the java 1.4/1.5 code bug - if (da instanceof Timestamp) { - da = new Date(da.getTime()); - } - - if (db instanceof Timestamp) { - db = new Date(db.getTime()); - } - - - return (asc ? da.compareTo(db) : db.compareTo(da)); - } - - } - - private MessageComparator msgcomp; - - - private MessageTreeComparator() { - msgcomp = new MessageComparator(); - } - - @Override - public void sort(int depth, List<GenericTraversalNode> children) { - /* - * if (depth > 1) { msgcomp.setAscending(true); } else { - * msgcomp.setAscending(false); } - */ - Collections.sort(children, msgcomp); - } - } - - /** - * @param headerKey - * @param dataColumn - * @param action - */ - public ThreadColumnDescriptor(String headerKey, int dataColumn, String action) { - super(headerKey, dataColumn, action, null); - } - - /** - * @see org.olat.core.gui.components.table.ColumnDescriptor#renderValue(org.olat.core.gui.render.StringOutput, int, org.olat.core.gui.render.Renderer) - */ - public void renderValue(StringOutput sb, int row, Renderer renderer) { - StringOutput sbuf = new StringOutput(); - super.renderValue(sbuf, row, renderer); - String val = sbuf.toString(); - Object m = messages.get(getTable().getSortedRow(row)); - GenericTraversalNode gtn = getTreeWalker().getGenericTraversalNode(m); - // + "..."+gtn.getDepth()+", vnr:"+gtn.getVisitNumber(); - sb.append("<div style=\"white-space: nowrap;"); // do not wrap titles, looks unsexy - int indent = gtn.getDepth(); // starts with 1 - if (indent > MAXINDENTS) indent = MAXINDENTS; - if (toIndent) { - sb.append("padding-left: "); - sb.append(Formatter.roundToString(((float)indent-1)/2, 2)); - sb.append("em;"); - } - sb.append("\">"); - sb.append(Formatter.truncate(val, 50-indent)); - sb.append("</div>"); - } - - /** - * - */ - private TreeWalker getTreeWalker() { - if (tw == null) { - tw = new TreeWalker(new MessageTreeComparator(), null); // no visitor, - // since we just - // need the - // traversal order - // after sorting - Iterator<Message> mit = messages.iterator(); - while (mit.hasNext()) { - Message m = mit.next(); - tw.addRelationship(m, m.getParent()); - } - tw.traverse(); // now the visitednr of each node indicates the sorting - // position - } - return tw; - } - - /** - * this special columndescriptor can only handle data from the column of the - * tablemodel if it is of type Message, since this descriptor is especially - * made for the forum - */ - public int compareTo(int rowa, int rowb) { - // we take the treewalker which we built previously and use the visitednr - // attribute to specify sort order - Object a = messages.get(rowa); - Object b = messages.get(rowb); // both are messages; to be compared - TreeWalker treeWalker = getTreeWalker(); - GenericTraversalNode gtna = treeWalker.getGenericTraversalNode(a); - GenericTraversalNode gtnb = treeWalker.getGenericTraversalNode(b); - int sortedposa = gtna.getVisitNumber(); // the visitednumber was determined - // by the sorting algorithm, - // therefore it is the sorted - // position - int sortedposb = gtnb.getVisitNumber(); - int diff = sortedposa - sortedposb; - int res = (diff == 0 ? 0 : (diff > 0 ? 1 : -1)); - return res; - } - - /** - * @see org.olat.core.gui.components.table.ColumnDescriptor#modelChanged() - */ - public void modelChanged() { - ForumMessagesTableDataModel ftdm = (ForumMessagesTableDataModel) getTable().getTableDataModel(); - // this specialized columndescriptor only works for the forumtabledatamodel - messages = ftdm.getObjects(); - tw = null; // we need to build a new TreeWalker (which does the sorting, - // since the model has changed - } - - /** - * @see org.olat.core.gui.components.table.ColumnDescriptor#sortingAboutToStart() - */ - public void sortingAboutToStart() { - toIndent = true; // only indent messages if we are sorting this column - - } - - /** - * @see org.olat.core.gui.components.table.ColumnDescriptor#otherColumnDescriptorSorted() - */ - public void otherColumnDescriptorSorted() { - toIndent = false; - } - - private static class TreeWalker { - private Map<Object,GenericTraversalNode> nodemap = new HashMap<Object,GenericTraversalNode>(); - private TreeComparator treecomp; - private Visitor v; - private GenericTraversalNode rootNode; - private int visitNumber = 0; - - /** - * @param treecomp - * @param v the visitor, may be null - */ - public TreeWalker(TreeComparator treecomp, Visitor v) { - this.treecomp = treecomp; - this.v = v; - rootNode = new GenericTraversalNode(null); - } - - /** - * - */ - public void traverse() { - doTraverse(rootNode, 0); - } - - private void doTraverse(GenericTraversalNode node, int depth) { - if (depth > 0) { // we are not at the artificial root - node.setDepth(depth); - node.setVisitNumber(++visitNumber); - // preorder traversal - if (v != null) v.visit(node); - } - List<GenericTraversalNode> children = node.getChildren(); - treecomp.sort(depth + 1, children); - for(Iterator<GenericTraversalNode> it = children.iterator(); it.hasNext(); ) { - GenericTraversalNode c = it.next(); - doTraverse(c, depth + 1); - } - } - - /** - * @param childitem the child - * @param parentitem the parent, may be null if top level - */ - public void addRelationship(Object childitem, Object parentitem) { - GenericTraversalNode gnp; - GenericTraversalNode gnc = getGenericTraversalNode(childitem); - if (parentitem != null) { - gnp = getGenericTraversalNode(parentitem); - } else { - gnp = rootNode; - } - gnp.addChild(gnc); - - } - - /** - * @param item - * @return GenericTraversalNode - */ - public GenericTraversalNode getGenericTraversalNode(Object item) { - GenericTraversalNode n = nodemap.get(item); - if (n == null) { // not existing, so create - n = new GenericTraversalNode(item); - nodemap.put(item, n); - } - return n; - } - - } - - private static class GenericTraversalNode { - private Object item; - private int depth; - private List<GenericTraversalNode> children; - private int visitNumber; - - /** - * @param item - */ - public GenericTraversalNode(Object item) { - children = new ArrayList<GenericTraversalNode>(); - this.item = item; - } - - /** - * add the child. - * - * @param n - */ - public void addChild(GenericTraversalNode n) { - if (!children.add(n)) { throw new RuntimeException("duplicate child in List"); } - } - - /** - * Returns the children. - * - * @return List - */ - public List<GenericTraversalNode> getChildren() { - return children; - } - - /** - * Returns the depth. - * - * @return int - */ - public int getDepth() { - return depth; - } - - /** - * Returns the item. - * - * @return Object - */ - public Object getItem() { - return item; - } - - /** - * Sets the depth. - * - * @param depth The depth to set - */ - public void setDepth(int depth) { - this.depth = depth; - } - - /** - * Returns the visitNumber. - * - * @return int - */ - public int getVisitNumber() { - return visitNumber; - } - - /** - * Sets the visitNumber. - * - * @param visitNumber The visitNumber to set - */ - public void setVisitNumber(int visitNumber) { - this.visitNumber = visitNumber; - } - - } - - public interface Visitor { - - public void visit(GenericTraversalNode node); - } - - public interface TreeComparator { - /** - * sorts the children of a node with depth 'depth' in a tree. depth = 1 = root children - * @param depth - * @param children - */ - public void sort(int depth, List<GenericTraversalNode> children); - } -} - diff --git a/src/main/java/org/olat/modules/fo/_content/attachments-editview.html b/src/main/java/org/olat/modules/fo/_content/attachments-editview.html deleted file mode 100644 index 7f113d55fac..00000000000 --- a/src/main/java/org/olat/modules/fo/_content/attachments-editview.html +++ /dev/null @@ -1,14 +0,0 @@ -<table class="table table-condensed table-striped"> - <tbody> - #foreach ($attachment in $attachments) - #set( $fname = $attachment.getName() ) - <tr> - <td style="width:1%"><i class="o_icon o_icon-fw $r.getFiletypeIconCss($fname)"> </i></td> - <td>$r.escapeHtml($fname)</td> - <td>$r.formatBytes($attachment.getSize())</td> - <td style="width:1%">$r.render("delete.attachment.$velocityCount")</td> - </tr> - #end - </tbody> -</table> - diff --git a/src/main/java/org/olat/modules/fo/_content/filter_for_user.html b/src/main/java/org/olat/modules/fo/_content/filter_for_user.html deleted file mode 100644 index 538c341af2c..00000000000 --- a/src/main/java/org/olat/modules/fo/_content/filter_for_user.html +++ /dev/null @@ -1,8 +0,0 @@ -#if($ajax) -<div class="o_block"> - <h4>$r.translate("filter.header.title")</h4> - $r.render("userAutoCompleter") -</div> -#end -<h4>$r.translate("filter.header.allUsers")</h4> -$r.render("userList") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/_content/filter_view.html b/src/main/java/org/olat/modules/fo/_content/filter_view.html deleted file mode 100644 index 94e85c19da3..00000000000 --- a/src/main/java/org/olat/modules/fo/_content/filter_view.html +++ /dev/null @@ -1,4 +0,0 @@ -<div class="o_block"> - $r.render("backLinkLT") -</div> -$r.render("filterForUser") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/_content/msg-preview.html b/src/main/java/org/olat/modules/fo/_content/msg-preview.html deleted file mode 100644 index 85171f55c6e..00000000000 --- a/src/main/java/org/olat/modules/fo/_content/msg-preview.html +++ /dev/null @@ -1,21 +0,0 @@ -<div class="o_forum"> - <div class="o_forum_message o_block_large_bottom" > - <div class="o_forum_message_header clearfix"> - $r.render("portrait") - <h4 class="o_forum_message_title"> - $r.escapeHtml($message.getTitle()) - </h4> - <div class="o_author"> - $r.escapeHtml($identity.getUser().getProperty("firstName", $locale)) $r.escapeHtml($identity.getUser().getProperty("lastName", $locale)) - </div> - <div class="o_date"> - $r.formatDateAndTime($message.getCreationDate()) - </div> - </div> - <div class="o_forum_message_body"> - <div class="clearfix o_scrollblock"> - $r.formatLatexFormulas($messageBody) - </div> - </div> - </div> -</div> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/_content/threadview.html b/src/main/java/org/olat/modules/fo/_content/threadview.html deleted file mode 100644 index f4e286d1de2..00000000000 --- a/src/main/java/org/olat/modules/fo/_content/threadview.html +++ /dev/null @@ -1,179 +0,0 @@ -#if($r.available("backLinkLT")) -<div class="o_block"> - $r.render("backLinkLT") -</div> -#end -<div class="o_forum"> - <div class="clearfix"> - #if($filteredForLastName) - <h3>$r.translate("filter.results.title") $r.escapeHtml($filteredForFirstName) $r.escapeHtml($filteredForLastName)</h3> - #end - <div class="pull-right"> - #if($r.available("threadViewSwitch")) - $r.render("threadViewSwitch") - #end - </div> - #if ($security.mayArchiveForum()) - $r.render("archive.thread") - #end - </div> - #if ($messages.isEmpty()) - #if ($mode == "marked") - <p class="o_important">$r.translate("msg.no_marked_message")</p> - #elseif ($mode == "new") - <p class="o_important">$r.translate("msg.no_new_message")</p> - #end - #end - -#foreach ($message in $messages) - - #if($threadMode) - #set ( $deepnessFromMap = $msgDeepMap.get($message.get("id")) ) - #end - #if($security.mayEditMessageAsModerator() && $message.get("isThreadtop")) - <div class="o_block"> - #if(!$isClosed) - $r.render("close.thread") - #else - $r.render("open.thread") - #end - - #if(!$isHidden) - $r.render("hide.thread") - #else - $r.render("show.thread") - #end - </div> - #end - - #set( $count = $velocityCount - 1) - <div #if($threadMode) style="margin-left: ${deepnessFromMap}em" #end class="o_forum_message o_block_large_bottom #if($message.get("newMessage")) o_forum_message_new #end #if($message.get("id") == $goToMessageId) o_forum_message_highlight #end" id="o_forum_message_${message.get("id")}"> - <div class="o_forum_message_header clearfix"> - #if($r.available($message.get("ePFAddComponentName"))) - <div class="o_ep_collect">$r.render($message.get("ePFAddComponentName"))</div> - #end - #if($r.available("mark_${count}")) - <div class="o_mark">$r.render("mark_${count}")</div> - #end - - #if($r.available($message.get("portraitComponentVCName"))) - $r.render($message.get("portraitComponentVCName")) - #end - <h4 class="o_forum_message_title"> - $r.escapeHtml($message.get("title")) - #if($message.get("newMessage")) <span class="o_newindicator" title="$r.translateInAttribute("message.unread")"><i class="o_icon o_icon_new" ></i><span class="o_label">$r.translate("new")</span></span>#end - </h4> - <div class="o_author"> - #if($r.available("vc_${count}")) - $r.render("vc_${count}") - #else - $r.escapeHtml($message.get("firstname")) $r.escapeHtml($message.get("lastname")) - #end - </div> - <div class="o_date"> - $r.translate("msg.creationdate") $message.get("date") - </div> - - #if(($message.get("isModified")) || ($message.get("isMoved"))) - <div class="o_modified"> - #if($message.get("isModified")) - $r.translate("msg.modified"): $r.escapeHtml($message.get("modfname")) $r.escapeHtml($message.get("modlname")) $message.get("modified") - #end - #if($message.get("isMoved")) - $r.translate("msg.moved") - #end - </div> - #end - </div> - - <div class="o_forum_message_body"> - <div class="clearfix o_scrollblock"> - $r.formatLatexFormulas($message.get("body")) - </div> - </div> - - <div class="o_forum_message_actions o_button_group"> - #if($r.available("open_in_thread_${count}")) - $r.render("open_in_thread_${count}") - #end - - #if (!$message.get("isThreadClosed")) - #set($canDelete = (($message.get("nOfCh") == 0 && $message.get("uIsMsgC") == true) || ($security.mayDeleteMessageAsModerator())) ) - #set($canEdit = (($message.get("nOfCh") == 0 && $message.get("uIsMsgC") == true) || ($security.mayEditMessageAsModerator())) ) - - #if ($canDelete && $canEdit)<div class="btn-group">#end - #if ($canDelete) - $r.render("dl_${count}") - #end - #if ($canEdit) - $r.render("ed_${count}") - #end - #if ($canDelete && $canEdit)</div>#end - #end - - #if ($security.mayReplyMessage() && !$message.get("isThreadClosed")) - <div class="btn-group"> - $r.render("qt_${count}") - $r.render("rp_${count}") - </div> - #end - - #if ($security.mayEditMessageAsModerator() && !$message.get("isThreadtop") && !$message.get("isThreadClosed")) - <div class="btn-group"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> - <i class="o_icon o_icon-fw o_icon_actions"></i> - <span class="caret"></span> - </button> - <ul class="dropdown-menu dropdown-menu-right"> - <li>$r.render("split_${count}")</li> - <li>$r.render("move_${count}")</li> - </ul> - </div> - #end - </div> - - #if ($message.get("hasAttachments")) - <div class="o_forum_message_attachments"> - <h5>$r.translate("attachments"):</h5> - <ul class="list-inline"> - #foreach( $attachment in $message.get("attachments") ) - #set($fname = $attachment.getName()) - <li class="o_attachment"> - <a href="$r.commandURI("attachment_${velocityCount}_${count}")$fname" target="_blank"> - <div class="o_filename"> - $r.escapeHtml($fname) - </div> - <div class="o_size"> - <i class="o_icon o_icon-fw $r.getFiletypeIconCss($fname)"></i> - $r.formatBytes($attachment.getSize()) - </div> - #if ($attachment.getMetaInfo() && $attachment.getMetaInfo().isThumbnailAvailable()) - <img src="${thumbMapper}/$message.get("id")/$attachment.getMetaInfo().getUUID()/$fname" class="img-thumbnail" alt="$r.escapeHtml("$fname")" title="$r.escapeHtml("$fname")"/> - <i class="o_icon o_icon-lg o_icon_enlarge"></i> - #end - </a> - </li> - #end - </ul> - </div> - #end - </div> -#end - -#if($showThreadTable) - $r.render("singleThreadTable") - <script type="text/javascript"> - /* <![CDATA[ */ - o_scrollToElement('#o_top'); - /* ]]> */ - </script> -#end -#if($goToMessage) - <script type="text/javascript"> - /* <![CDATA[ */ - o_scrollToElement('#o_forum_message_$goToMessageId'); - /* ]]> */ - </script> -#end - -</div> ## END of o_forum \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties index 93e51812b5e..4fac1a036fe 100644 --- a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_de.properties @@ -1,4 +1,14 @@ #Mon Mar 02 09:54:04 CET 2009 +admin.menu.title=Forum +admin.menu.title.alt=Konfiguration Forum +admin.title=Konfiguration Forum +anonymous.course.default=Default for course forum +anonymous.default.enabled=Pseudonym enabled +anonymous.default.disabled=Pseudonym disabled +anonymous.group.default=Default for group forum +anonymous.posting=Erlaubt anonymous posting using a pseudonym +anonymous.poster=Gastbeitrag +guest=Gast archive.forum=Forum archivieren archive.forum.dialog=Wollen Sie dieses Forum wirklich in Ihrem pers\u00F6nlichen Ordner im Unterordner "private/archive" archivieren? archive.forum.successfully=Das Forum wurde in Ihrem pers\u00F6nlichen Ordner im Unterordner "private/archive" archiviert. @@ -14,6 +24,7 @@ close.thread=Diskussion beenden delete.att.ok=Die Datei wurde gel\u00F6scht. deleteok=Der Beitrag wurde gel\u00F6scht error.field.not.empty=Dieses Feld darf nicht leer sein. +error.pseudonym=Pseudonym zu ähnlich einer existierende Benutzername filter=Personenfilter filter.header.title=Nach Personen suchen filter.header.allUsers=Beitr\u00E4ge aller Personen @@ -70,11 +81,13 @@ notifications.header=In einem von Ihnen abonnierten Forum befinden sich neue Nac notifications.header.course=Forum in Kurs "{0}" notifications.header.group=Forum in Gruppe "{0}" open.thread=Diskussion \u00F6ffnen +pseudonym.suffix=(Pseudonym) reallydeleteAtt=Wollen Sie diese Datei wirklich l\u00F6schen? reallydeleteleaf=Wollen Sie den Beitrag <i>{0}</i> wirklich l\u00F6schen? reallydeletenode1=Wollen Sie den Beitrag <i>{0}</i> mit seiner Antwort wirklich l\u00F6schen? reallydeletenodeN=Wollen Sie den Beitrag <i>{0}</i> mit seinen insgesamt <b>{1}</b> Antworten wirklich l\u00F6schen? reallysplitthread=Wollen Sie den Beitrag mit Antworten wirklich abtrennen? +remove.sticky= Entfernt Priorisierung (sticky) show.thread=Diskussion anzeigen table.closed=Beendet table.download=Tabelle downloaden @@ -99,6 +112,8 @@ table.user.firstname=Vorname table.user.lastname=Name table.user.replies=Antworten table.user.threads=Themen +use.pseudonym=Verfasst von +use.pseudonym.label=Pseudonym verwenden viewswitch.messageview=einer viewswitch.threadview=alle (geschachtelt) viewswitch.flatview=alle (flach) diff --git a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties index 8b23ad1873a..8f51ba29c89 100644 --- a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_en.properties @@ -1,4 +1,13 @@ #Sat Jan 22 13:41:44 CET 2011 +admin.menu.title=Forum +admin.menu.title.alt=Forum configuration +admin.title=Forum configuration +anonymous.course.default=Default for course forum +anonymous.default.enabled=Pseudonym enabled +anonymous.default.disabled=Pseudonym disabled +anonymous.group.default=Default for group forum +anonymous.posting=Allow anonymous posting using a pseudonym +anonymous.poster=Guest post archive.forum=Archive forum archive.forum.dialog=Do you really want to archive this forum in your personal folder, section "private/archive"? archive.forum.successfully=This forum has been archived in your personal folder, section "private/archive/". @@ -72,12 +81,14 @@ notifications.entry.modified=Message "{0}" modified by {1} notifications.header=There are new messages in a forum subscribed by you\: notifications.header.course=Forum in course "{0}" notifications.header.group=Forum in group "{0}" -open.thread=Open discussion +open.thread=Open discussion +pseudonym.suffix=(Pseudonym) reallydeleteAtt=Do you really want to delete this file? reallydeleteleaf=Do you really want to delete the post <i>{0}</i>? reallydeletenode1=Do you really want to delete the post <i>{0}</i> along with its reply? reallydeletenodeN=Do you really want to delete the post <i>{0}</i> along with its <b>{1}</b> replies? reallysplitthread=Do you really want to detach this post along with its answers? +remove.sticky=Remove prioritizing (sticky) show.thread=Show discussion table.choose=Move here table.closed=Completed @@ -104,6 +115,7 @@ table.user.lastname=Name table.user.replies=Replies table.user.threads=Threads table.userfriendlyname=Author +use.pseudonym.label=Use a pseudonym viewswitch.flatview=all (flat) viewswitch.marked=marked viewswitch.messageview=one diff --git a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_fr.properties index a8034a10cd7..2af4fad9ee7 100644 --- a/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/fo/_i18n/LocalStrings_fr.properties @@ -1,4 +1,5 @@ #Mon Oct 22 15:53:49 CEST 2012 +admin.title=Configuration des forums archive.forum=Archiver le forum archive.forum.dialog=Etes-vous s\u00FBr de vouloir archiver ce forum dans votre dossier personnel sous private? archive.forum.successfully=Ce forum a \u00E9t\u00E9 archiv\u00E9 dans votre dossier personnel sous private. @@ -104,6 +105,7 @@ table.user.lastname=Nom table.user.replies=R\u00E9ponses table.user.threads=Sujets table.userfriendlyname=Auteur +use.pseudonym.label=Utiliser un pseudonyme viewswitch.flatview=tous (plat) viewswitch.marked=marqu\u00E9e viewswitch.messageview=une diff --git a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java index 650c3669498..56eeeb5439f 100644 --- a/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java +++ b/src/main/java/org/olat/modules/fo/archiver/ForumArchiveManager.java @@ -37,10 +37,9 @@ import org.olat.core.util.tree.TreeVisitor; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; import org.olat.modules.fo.ForumHelper; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; -import org.olat.modules.fo.MessageNode; import org.olat.modules.fo.archiver.formatters.ForumFormatter; +import org.olat.modules.fo.manager.ForumManager; /** * Initial Date: Nov 11, 2005 <br> @@ -86,7 +85,6 @@ public class ForumArchiveManager { * @return the message thread as String formatted */ public String applyFormatterForOneThread(ForumFormatter forumFormatter, Long forumId, Long topMessageId){ - log.info("Archiving forum.thread: "+forumId+"."+topMessageId); MessageNode topMessageNode = convertToThreadTree(topMessageId); return formatThread(topMessageNode, forumFormatter, forumId); } diff --git a/src/main/java/org/olat/modules/fo/MessageNode.java b/src/main/java/org/olat/modules/fo/archiver/MessageNode.java similarity index 71% rename from src/main/java/org/olat/modules/fo/MessageNode.java rename to src/main/java/org/olat/modules/fo/archiver/MessageNode.java index e281a4e8a1a..e3865c00f3b 100644 --- a/src/main/java/org/olat/modules/fo/MessageNode.java +++ b/src/main/java/org/olat/modules/fo/archiver/MessageNode.java @@ -23,22 +23,29 @@ * under the Apache 2.0 license as the original file. */ -package org.olat.modules.fo; +package org.olat.modules.fo.archiver; import java.io.Serializable; import java.util.Date; import org.olat.core.id.Identity; import org.olat.core.util.nodes.GenericNode; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.Status; /** * Initial Date: 2005-11-08 * @author Alexander Schneider */ public class MessageNode extends GenericNode implements Serializable { + + private static final long serialVersionUID = -521407664860133662L; + private Long key; private String title; private String body; + private boolean guest; + private String pseudonym; private Identity creator; private Date creationDate; private Identity modifier; @@ -48,80 +55,55 @@ public class MessageNode extends GenericNode implements Serializable { private boolean isHidden; private boolean isMoved; - /** - * - * @param message - */ + public MessageNode() { + // + } + public MessageNode(Message message) { - this.key = message.getKey(); - this.title = message.getTitle(); - this.body = message.getBody(); - this.creator = message.getCreator(); - this.creationDate = message.getCreationDate(); - this.modifier = message.getModifier(); - this.modifiedDate = message.getLastModified(); + key = message.getKey(); + title = message.getTitle(); + body = message.getBody(); + creator = message.getCreator(); + creationDate = message.getCreationDate(); + modifier = message.getModifier(); + modifiedDate = message.getLastModified(); + guest = message.isGuest(); + pseudonym = message.getPseudonym(); if(message.getParent()==null) { //relevant only for the threadtop messages - this.isSticky = Status.getStatus(message.getStatusCode()).isSticky(); - this.isClosed = Status.getStatus(message.getStatusCode()).isClosed(); - this.isHidden = Status.getStatus(message.getStatusCode()).isHidden(); + isSticky = Status.getStatus(message.getStatusCode()).isSticky(); + isClosed = Status.getStatus(message.getStatusCode()).isClosed(); + isHidden = Status.getStatus(message.getStatusCode()).isHidden(); } - this.isMoved = Status.getStatus(message.getStatusCode()).isMoved(); + isMoved = Status.getStatus(message.getStatusCode()).isMoved(); } - /** - * - */ - public MessageNode() { - // - } - - /** - * @see org.olat.core.gui.components.tree.TreeNode#getTitle() - */ - public String getTitle() { - return title; - } - - - public Long getKey() { return key; } - - public void setKey(Long key) { - this.key = key; + + public String getTitle() { + return title; } - /** - * @param title - */ - public void setTitle(String title) { - this.title = title; - } - public String getBody() { return body; } - public void setBody(String body) { - this.body = body; - } - public Date getCreationDate() { return creationDate; } - public void setCreationDate(Date creationDate) { - this.creationDate = creationDate; - } - public Identity getCreator() { return creator; } - public void setCreator(Identity creator) { - this.creator = creator; + public boolean isGuest() { + return guest; + } + + public String getPseudonym() { + return pseudonym; } public Date getModifiedDate() { diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java new file mode 100644 index 00000000000..b5bc26b06b9 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumDownloadResource.java @@ -0,0 +1,177 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.archiver.formatters; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.util.Locale; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.IOUtils; +import org.olat.core.gui.media.MediaResource; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; +import org.olat.core.util.io.ShieldOutputStream; +import org.olat.core.util.openxml.DocReference; +import org.olat.core.util.openxml.OpenXMLDocumentWriter; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.archiver.ForumArchiveManager; + +/** + * + * Initial date: 13.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumDownloadResource implements MediaResource { + + private final static OLog log = Tracing.createLoggerFor(ForumDownloadResource.class); + + private final Forum forum; + private final ForumCallback foCallback; + private Long topMessageId; + + private String label; + private VFSContainer mediaContainer; + private Locale locale; + + public ForumDownloadResource(String label, Forum forum, ForumCallback foCallback, Long topMessageId, VFSContainer mediaContainer, Locale locale) { + this.locale = locale; + this.forum = forum; + this.label = label; + this.foCallback = foCallback; + this.topMessageId = topMessageId; + this.mediaContainer = mediaContainer; + } + + @Override + public boolean acceptRanges() { + return false; + } + + @Override + public String getContentType() { + return "application/zip"; + } + + @Override + public Long getSize() { + return null; + } + + @Override + public InputStream getInputStream() { + return null; + } + + @Override + public Long getLastModified() { + return null; + } + + @Override + public void release() { + // + } + + + @Override + public void prepare(HttpServletResponse hres) { + try { + hres.setCharacterEncoding("UTF-8"); + } catch (Exception e) { + log.error("", e); + } + + ZipOutputStream zout = null; + try { + String secureLabel = StringHelper.transformDisplayNameToFileSystemName(label); + + String file = secureLabel + ".zip"; + hres.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + StringHelper.urlEncodeUTF8(file)); + hres.setHeader("Content-Description", StringHelper.urlEncodeUTF8(label)); + + zout = new ZipOutputStream(hres.getOutputStream()); + zout.setLevel(9); + + ZipEntry test = new ZipEntry(secureLabel + ".docx"); + zout.putNextEntry(test); + Map<File,DocReference> attachments = exportForum(zout); + zout.closeEntry(); + + if(attachments != null && attachments.size() > 0) { + for(Map.Entry<File,DocReference> attachmentEntry : attachments.entrySet()) { + File attachment = attachmentEntry.getKey(); + DocReference ref = attachmentEntry.getValue(); + zout.putNextEntry(new ZipEntry("attachments/" + ref.getFilename())); + Files.copy(attachment.toPath(), new ShieldOutputStream(zout)); + zout.closeEntry(); + } + } + } catch (Exception e) { + log.error("", e); + } finally { + IOUtils.closeQuietly(zout); + } + } + + private Map<File,DocReference> exportForum(OutputStream out) { + ZipOutputStream zout = null; + try { + ForumOpenXMLFormatter openXmlFormatter = new ForumOpenXMLFormatter(mediaContainer, locale); + + if(topMessageId != null) { + ForumArchiveManager.getInstance() + .applyFormatterForOneThread(openXmlFormatter, forum.getKey(), topMessageId); + } else { + ForumArchiveManager.getInstance() + .applyFormatter(openXmlFormatter, forum.getKey(), foCallback); + } + + zout = new ZipOutputStream(out); + zout.setLevel(9); + + OpenXMLDocumentWriter writer = new OpenXMLDocumentWriter(); + writer.createDocument(zout, openXmlFormatter.getOpenXMLDocument()); + return openXmlFormatter.getAttachments(); + } catch (Exception e) { + log.error("", e); + return null; + } finally { + if(zout != null) { + try { + zout.finish(); + } catch (IOException e) { + log.error("", e); + } + } + } + } +} diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumFormatter.java index 0f4a0f5d90b..60d6635108e 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumFormatter.java @@ -25,26 +25,34 @@ package org.olat.modules.fo.archiver.formatters; +import java.util.Locale; + +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.Util; import org.olat.core.util.nodes.INode; import org.olat.core.util.tree.Visitor; +import org.olat.modules.fo.Forum; /** * Initial Date: Nov 11, 2005 <br> * @author Patrick Brunner, Alexander Schneider */ -public abstract class ForumFormatter implements Visitor{ +public abstract class ForumFormatter implements Visitor { protected StringBuilder sb; protected boolean isTopThread = false; protected boolean filePerThread = false; private Long forumKey; + protected final Translator translator; + /** * init string buffer * */ - protected ForumFormatter(){ - this.sb = new StringBuilder(); + protected ForumFormatter(Locale locale){ + sb = new StringBuilder(4096); + translator = Util.createPackageTranslator(Forum.class, locale); } /** * contains (translation keys, value) pairs such as: diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java new file mode 100644 index 00000000000..c756944a8aa --- /dev/null +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumOpenXMLFormatter.java @@ -0,0 +1,214 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.archiver.formatters; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import org.olat.core.id.Identity; +import org.olat.core.id.UserConstants; +import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; +import org.olat.core.util.nodes.INode; +import org.olat.core.util.openxml.DocReference; +import org.olat.core.util.openxml.OpenXMLDocument; +import org.olat.core.util.openxml.OpenXMLDocument.Spacing; +import org.olat.core.util.openxml.OpenXMLDocument.Style; +import org.olat.core.util.vfs.LocalFileImpl; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; +import org.olat.modules.fo.archiver.MessageNode; +import org.olat.modules.fo.ui.MessageEditController; + +/** + * + * Initial date: 13.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumOpenXMLFormatter extends ForumFormatter { + + private final VFSItemExcludePrefixFilter filter = new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES); + + private boolean firstThread = true; + + private final Formatter formatter; + private final VFSContainer forumContainer; + private final OpenXMLDocument document = new OpenXMLDocument(); + + private final Set<String> attachmentsFilenames = new HashSet<>(); + private final Map<File,DocReference> fileToAttachmentsMap = new HashMap<>(); + + public ForumOpenXMLFormatter(VFSContainer forumContainer, Locale locale) { + super(locale); + document.setMediaContainer(forumContainer); + this.forumContainer = forumContainer; + formatter = Formatter.getInstance(locale); + } + + public OpenXMLDocument getOpenXMLDocument() { + return document; + } + + public Map<File,DocReference> getAttachments() { + return fileToAttachmentsMap; + } + + @Override + public void openForum() { + // + } + + @Override + public void openThread() { + if(firstThread) { + firstThread = false; + } else { + document.appendPageBreak(); + } + super.openThread(); + } + + @Override + public void visit(INode node) { + MessageNode m = (MessageNode) node; + + StringBuilder creatorAndDate = new StringBuilder(); + if(StringHelper.containsNonWhitespace(m.getPseudonym())) { + creatorAndDate.append(m.getPseudonym()) + .append(" ") + .append(translator.translate("pseudonym.suffix")); + } else if(m.isGuest()) { + creatorAndDate.append(translator.translate("guest")); + } else { + creatorAndDate.append(m.getCreator().getUser().getProperty(UserConstants.FIRSTNAME, null)); + creatorAndDate.append(" "); + creatorAndDate.append(m.getCreator().getUser().getProperty(UserConstants.LASTNAME, null)); + } + creatorAndDate.append(" "); + creatorAndDate.append(formatter.formatDateAndTime(m.getCreationDate())); + + if (isTopThread) { + document.appendHeading1(m.getTitle(), creatorAndDate.toString()); + this.isTopThread = false; + } else { + document.appendHeading2(m.getTitle(), creatorAndDate.toString()); + } + + Identity modifier = m.getModifier(); + if (modifier != null) { + StringBuilder modSb = new StringBuilder(); + modSb.append(translator.translate("msg.modified")).append(": ") + .append(modifier.getUser().getProperty(UserConstants.FIRSTNAME, null)) + .append(" ") + .append(modifier.getUser().getProperty(UserConstants.LASTNAME, null)) + .append(" ") + .append(formatter.formatDateAndTime(m.getModifiedDate())); + document.appendSubtitle(modSb.toString()); + } + + String body = m.getBody(); + document.appendHtmlText(body, new Spacing(180, 0)); + + // message attachments + VFSItem attachmentsItem = forumContainer.resolve(m.getKey().toString()); + if(attachmentsItem instanceof VFSContainer) { + processAttachments((VFSContainer)attachmentsItem); + } + } + + private void processAttachments(VFSContainer attachmentsContainer) { + List<VFSItem> attachments = new ArrayList<VFSItem>(attachmentsContainer.getItems(filter)); + for(VFSItem attachment:attachments) { + if(attachment instanceof LocalFileImpl) { + //add the text + document.appendText(translator.translate("attachments"), true, Style.bold); + } + } + + + for(VFSItem attachment:attachments) { + if(attachment instanceof LocalFileImpl) { + File file = ((LocalFileImpl)attachment).getBasefile(); + String filename = file.getName(); + int lastDot = filename.lastIndexOf('.'); + + boolean attach = true; + if (lastDot > 0) { + String extension = filename.substring(lastDot + 1).toLowerCase(); + if("jpeg".equals(extension) || "jpg".equals(extension) || "gif".equals(extension) || "png".equals(extension)) { + document.appendImage(file); + attach = false; + } + } + + if(attach) { + StringBuilder attachSb = new StringBuilder(64); + String uniqueFilename = getUniqueFilename(file); + fileToAttachmentsMap.put(file, new DocReference("", uniqueFilename, null, file)); + attachSb.append(filename).append(": /attachments/").append(uniqueFilename); + document.appendText(attachSb.toString(), true); + } + } + } + } + + @Override + public StringBuilder closeThread() { + return super.closeThread(); + } + + @Override + public StringBuilder closeForum() { + return new StringBuilder(); + } + + private String getUniqueFilename(File image) { + String filename = image.getName().toLowerCase(); + int extensionIndex = filename.lastIndexOf('.'); + if(extensionIndex > 0) { + String name = filename.substring(0, extensionIndex); + String extension = filename.substring(extensionIndex); + filename = StringHelper.transformDisplayNameToFileSystemName(name) + extension; + } else { + filename = StringHelper.transformDisplayNameToFileSystemName(filename); + } + if(attachmentsFilenames.contains(filename)) { + for(int i=1; i<1000; i++) { + String nextFilename = i +"_" + filename; + if(!attachmentsFilenames.contains(nextFilename)) { + filename = nextFilename; + attachmentsFilenames.add(filename); + break; + } + } + } else { + attachmentsFilenames.add(filename); + } + return filename; + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java index e7939387212..f48c1a4eb61 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumRTFFormatter.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -46,6 +47,7 @@ import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; import org.olat.core.util.ZipUtil; import org.olat.core.util.filter.FilterFactory; @@ -55,8 +57,8 @@ import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; -import org.olat.modules.fo.ForumManager; -import org.olat.modules.fo.MessageNode; +import org.olat.modules.fo.archiver.MessageNode; +import org.olat.modules.fo.manager.ForumManager; /** * Initial Date: Nov 09, 2005 <br> @@ -88,16 +90,16 @@ public class ForumRTFFormatter extends ForumFormatter { //TODO: (LD) translate this! private String HIDDEN_STR = "VERBORGEN"; - + /** * * @param container * @param filePerThread */ - public ForumRTFFormatter(VFSContainer container, boolean filePerThread) { + public ForumRTFFormatter(VFSContainer container, boolean filePerThread, Locale locale) { // init String Buffer in ForumFormatter - super(); + super(locale); // where to write this.container = container; this.filePerThread = filePerThread; @@ -140,9 +142,17 @@ public class ForumRTFFormatter extends ForumFormatter { sb.append("} \\line "); sb.append("{\\pard \\f0\\fs15 created: "); // Creator and creation date - sb.append(mn.getCreator().getUser().getProperty(UserConstants.FIRSTNAME, null)); - sb.append(", "); - sb.append(mn.getCreator().getUser().getProperty(UserConstants.LASTNAME, null)); + if(StringHelper.containsNonWhitespace(mn.getPseudonym())) { + sb.append(mn.getPseudonym()) + .append(" ") + .append(translator.translate("pseudonym.suffix")); + } else if(mn.isGuest()) { + sb.append(translator.translate("guest")); + } else { + sb.append(mn.getCreator().getUser().getProperty(UserConstants.FIRSTNAME, null)); + sb.append(", "); + sb.append(mn.getCreator().getUser().getProperty(UserConstants.LASTNAME, null)); + } sb.append(" "); sb.append(mn.getCreationDate().toString()); // Modifier and modified date @@ -411,10 +421,10 @@ public class ForumRTFFormatter extends ForumFormatter { * and adds it to the input container. * * @param messageNode - * @param container + * @param imageContainer * @return */ - private List<String> addImagesToVFSContainer(MessageNode messageNode, VFSContainer container) { + private List<String> addImagesToVFSContainer(MessageNode messageNode, VFSContainer imageContainer) { List<String> fileNameList = new ArrayList<String>(); String iconPath = null; if(messageNode.isClosed() && messageNode.isSticky()) { @@ -428,7 +438,7 @@ public class ForumRTFFormatter extends ForumFormatter { File file = new File(iconPath); if (file.exists()) { LocalFileImpl imgFile = new LocalFileImpl(file); - container.copyFrom(imgFile); + imageContainer.copyFrom(imgFile); fileNameList.add(file.getName()); } else { log.error("Could not find image for forum RTF formatter::" + iconPath); diff --git a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java index ea3c1df4ca2..b040af9caa0 100644 --- a/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java +++ b/src/main/java/org/olat/modules/fo/archiver/formatters/ForumStreamedRTFFormatter.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; @@ -43,14 +44,15 @@ import org.olat.core.id.UserConstants; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; import org.olat.core.util.WebappHelper; import org.olat.core.util.ZipUtil; import org.olat.core.util.filter.FilterFactory; import org.olat.core.util.nodes.INode; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; -import org.olat.modules.fo.ForumManager; -import org.olat.modules.fo.MessageNode; +import org.olat.modules.fo.archiver.MessageNode; +import org.olat.modules.fo.manager.ForumManager; /** * Initial Date: Dec 19, 2013 <br> @@ -88,9 +90,9 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { * @param filePerThread */ - public ForumStreamedRTFFormatter(ZipOutputStream exportStream, String path, boolean filePerThread) { + public ForumStreamedRTFFormatter(ZipOutputStream exportStream, String path, boolean filePerThread, Locale locale) { // init String Buffer in ForumFormatter - super(); + super(locale); // where to write this.exportStream = exportStream; this.filePerThread = filePerThread; @@ -126,9 +128,17 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { sb.append("} \\line "); sb.append("{\\pard \\f0\\fs15 created: "); // Creator and creation date - sb.append(mn.getCreator().getUser().getProperty(UserConstants.FIRSTNAME, null)); - sb.append(", "); - sb.append(mn.getCreator().getUser().getProperty(UserConstants.LASTNAME, null)); + if(StringHelper.containsNonWhitespace(mn.getPseudonym())) { + sb.append(mn.getPseudonym()) + .append(" ") + .append(translator.translate("pseudonym.suffix")); + } else if(mn.isGuest()) { + sb.append(translator.translate("guest")); + } else { + sb.append(mn.getCreator().getUser().getProperty(UserConstants.FIRSTNAME, null)); + sb.append(", "); + sb.append(mn.getCreator().getUser().getProperty(UserConstants.LASTNAME, null)); + } sb.append(" "); sb.append(mn.getCreationDate().toString()); // Modifier and modified date @@ -353,14 +363,14 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { * @return title prefix for hidden forum threads. */ private String getTitlePrefix(MessageNode messageNode) { - StringBuilder sb = new StringBuilder(); + StringBuilder titleSb = new StringBuilder(); if(messageNode.isHidden()) { - sb.append(HIDDEN_STR); + titleSb.append(HIDDEN_STR); } - if(sb.length()>1) { - sb.append(": "); + if(titleSb.length()>1) { + titleSb.append(": "); } - return sb.toString(); + return titleSb.toString(); } /** @@ -369,13 +379,13 @@ public class ForumStreamedRTFFormatter extends ForumFormatter { * @return the RTF image section for the input messageNode. */ private String getImageRTF(MessageNode messageNode) { - StringBuilder sb = new StringBuilder(); - for(String fileName : addImagesToVFSContainer(messageNode)) { - sb.append("{\\field\\fldedit{\\*\\fldinst { INCLUDEPICTURE ") - .append("\"").append(fileName).append("\"") + StringBuilder imgSb = new StringBuilder(); + for(String imageName : addImagesToVFSContainer(messageNode)) { + imgSb.append("{\\field\\fldedit{\\*\\fldinst { INCLUDEPICTURE ") + .append("\"").append(imageName).append("\"") .append(" \\\\d }}{\\fldrslt {}}}"); } - return sb.toString(); + return imgSb.toString(); } /** diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java new file mode 100644 index 00000000000..a85da0265a2 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java @@ -0,0 +1,974 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.modules.fo.manager; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import javax.persistence.TemporalType; +import javax.persistence.TypedQuery; + +import org.olat.basesecurity.IdentityRef; +import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.commons.persistence.DB; +import org.olat.core.commons.services.mark.MarkingService; +import org.olat.core.commons.services.mark.impl.MarkImpl; +import org.olat.core.commons.services.text.TextService; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; +import org.olat.core.logging.AssertException; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumChangedEvent; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.MessageLight; +import org.olat.modules.fo.MessageRef; +import org.olat.modules.fo.QuoteAndTagFilter; +import org.olat.modules.fo.Status; +import org.olat.modules.fo.model.ForumImpl; +import org.olat.modules.fo.model.ForumThread; +import org.olat.modules.fo.model.ForumUserStatistics; +import org.olat.modules.fo.model.MessageImpl; +import org.olat.modules.fo.model.MessageLightImpl; +import org.olat.modules.fo.model.MessageStatistics; +import org.olat.modules.fo.model.ReadMessageImpl; +import org.olat.modules.fo.ui.MessagePeekview; +import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * @author Felix Jost + */ +@Service +public class ForumManager { + private static final OLog log = Tracing.createLoggerFor(ForumManager.class); + + private static ForumManager INSTANCE; + @Autowired + private DB dbInstance; + @Autowired + private TextService txtService; + @Autowired + private UserManager userManager; + @Autowired + private MarkingService markingService; + + /** + * [spring] + */ + private ForumManager() { + INSTANCE = this; + } + + /** + * @return the singleton + */ + public static ForumManager getInstance() { + return INSTANCE; + } + + public int countThread(Long messageKey) { + String query = "select count(msg) from fomessage as msg where msg.key=:messageKey or msg.threadtop.key=:messageKey"; + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(query, Number.class) + .setParameter("messageKey", messageKey) + .getResultList(); + return count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); + } + + /** + * @param msgid msg id of the topthread + * @return List messages + */ + public List<Message> getThread(Long msgid) { + return getThread(msgid, 0, -1, Message.OrderBy.creationDate, true); + } + + public List<Message> getThread(Long msgid, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" where msg.key=:messageKey or msg.threadtop.key=:messageKey"); + if(orderBy != null) { + query.append(" order by msg.").append(orderBy.name()).append(asc ? " ASC " : " DESC "); + } + + TypedQuery<Message> dbQuery = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Message.class) + .setParameter("messageKey", msgid) + .setFirstResult(firstResult); + if(maxResults > 0) { + dbQuery.setMaxResults(maxResults); + } + return dbQuery.getResultList(); + } + + public List<Long> getAllForumKeys(){ + return dbInstance.getCurrentEntityManager() + .createNamedQuery("getAllForumKeys", Long.class) + .getResultList(); + } + + /** + * + * @param forum_id + * @return + */ + public int countThreadsByForumID(Long forum_id) { + return countMessagesByForumID(forum_id, true); + } + + /** + * + * @param forum_id + * @param start + * @param limit + * @param orderBy + * @param asc + * @return + */ + public List<Message> getThreadsByForumID(Long forum_id, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { + return getMessagesByForumID(forum_id, firstResult, maxResults, true, orderBy, asc); + } + + /** + * + * @param forum + * @return + */ + public List<Message> getMessagesByForum(Forum forum){ + if (forum == null) return new ArrayList<Message>(0); // fxdiff: while indexing it can somehow occur, that forum is null! + return getMessagesByForumID(forum.getKey(), 0, -1, null, true); + } + + /** + * + * @param forum_id + * @param start + * @param limit + * @param orderBy + * @param asc + * @return + */ + public List<Message> getMessagesByForumID(Long forum_id, int firstResult, int maxResults, Message.OrderBy orderBy, boolean asc) { + return getMessagesByForumID(forum_id, firstResult, maxResults, false, orderBy, asc); + } + + /** + * + * @param forumKey + * @param start + * @param limit + * @param onlyThreads + * @param orderBy + * @param asc + * @return + */ + private List<Message> getMessagesByForumID(Long forumKey, int firstResult, int maxResults, boolean onlyThreads, Message.OrderBy orderBy, boolean asc) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg") + .append(" inner join fetch msg.creator as creator") + .append(" where msg.forum.key=:forumKey "); + if(onlyThreads) { + query.append(" and msg.parent is null"); + } + if(orderBy != null) { + query.append(" order by msg.").append(orderBy.name()).append(asc ? " ASC" : " DESC"); + } + + TypedQuery<Message> dbQuery = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Message.class) + .setParameter("forumKey", forumKey) + .setFirstResult(firstResult); + if(maxResults > 0) { + dbQuery.setMaxResults(maxResults); + } + return dbQuery.getResultList(); + } + + private int countMessagesByForumID(Long forumKey, boolean onlyThreads) { + StringBuilder query = new StringBuilder(); + query.append("select count(msg) from fomessage as msg") + .append(" where msg.forum.key=:forumKey"); + if(onlyThreads) { + query.append(" and msg.parent is null"); + } + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Number.class) + .setParameter("forumKey", forumKey) + .getSingleResult() + .intValue(); + } + + /** + * Return the title of a message of the forum. + */ + public Integer countMessagesByForumID(Long forum_id) { + return countMessagesByForumID(forum_id, false); + } + + public List<MessagePeekview> getPeekviewMessages(Forum forum, int maxResults) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fopeekviewmessage as msg where msg.forumKey=:forumKey order by msg.creationDate desc"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessagePeekview.class) + .setParameter("forumKey", forum.getKey()) + .setFirstResult(0) + .setMaxResults(maxResults) + .getResultList(); + } + + public String getForumNameForLogging(Forum forum) { + StringBuilder query = new StringBuilder(); + query.append("select msg.title from fomessage as msg where msg.forum.key=:forumKey"); + + List<String> titles = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), String.class) + .setParameter("forumKey", forum.getKey()) + .setFirstResult(0) + .setMaxResults(1) + .getResultList(); + return titles == null || titles.isEmpty() || titles.get(0) == null ? null : titles.get(0); + } + + + public List<ForumThread> getForumThreads(Forum forum, Identity identity) { + StringBuilder sb = new StringBuilder(); + sb.append("select msg ") + .append(" , (select count(replies.key) from fomessage as replies") + .append(" where replies.threadtop.key=msg.key and replies.forum.key=:forumKey") + .append(" ) as numOfMessages") + .append(" , (select max(replies.lastModified) from fomessage as replies") + .append(" where replies.threadtop.key=msg.key and replies.forum.key=:forumKey") + .append(" ) as lastModified"); + if(identity != null) { + sb.append(" ,(select count(mark.key) from ").append(MarkImpl.class.getName()).append(" as mark ") + .append(" where mark.creator.key=:identityKey and mark.resId=:forumKey and cast(msg.key as string) = mark.resSubPath and mark.resName='Forum'") + .append(" ) as marks"); + + } + + sb.append(" from fomessage as msg ") + .append(" left join fetch msg.creator as creator") + .append(" where msg.forum.key=:forumKey and msg.threadtop is null"); + + TypedQuery<Object[]> objectsQuery = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Object[].class) + .setParameter("forumKey", forum.getKey()); + if(identity != null) { + objectsQuery.setParameter("identityKey", identity.getKey()); + } + + List<Object[]> objects = objectsQuery.getResultList(); + List<ForumThread> threadList = new ArrayList<>(objects.size()); + for(Object[] object:objects) { + Message msg = (Message)object[0]; + Number numOfMessagesLong = (Number)object[1]; + Date lastModifed = (Date)object[2]; + int numOfMessages = numOfMessagesLong == null ? 1 : numOfMessagesLong.intValue() + 1; + String creator = userManager.getUserDisplayName(msg.getCreator()); + ForumThread thread = new ForumThread(msg, creator, lastModifed, numOfMessages); + + if(identity != null) { + Number numOfMarkedMessagesLong = (Number)object[3]; + int numOfMarkedMessages = numOfMarkedMessagesLong == null ? 0 : numOfMarkedMessagesLong.intValue(); + thread.setMarkedMessages(numOfMarkedMessages); + } + + threadList.add(thread); + } + return threadList; + } + + public Message getMessageById(Long messageKey) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as creator") + .append(" where msg.key=:messageKey"); + + List<Message> messages = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Message.class) + .setParameter("messageKey", messageKey) + .getResultList(); + return messages == null || messages.isEmpty() ? null : messages.get(0); + } + + public String getPseudonym(Forum forum, IdentityRef identity) { + StringBuilder query = new StringBuilder(); + query.append("select msg.pseudonym from fomessage as msg") + .append(" where msg.creator.key=:identityKey and msg.forum.key=:forumKey and msg.pseudonym is not null"); + + List<String> pseudonyms = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), String.class) + .setParameter("identityKey", identity.getKey()) + .setParameter("forumKey", forum.getKey()) + .getResultList(); + return pseudonyms == null || pseudonyms.isEmpty() ? null : pseudonyms.get(0); + } + + public MessageLight getLightMessageById(Long messageKey) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" where msg.key=:messageKey "); + + List<MessageLight> messages = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("messageKey", messageKey) + .getResultList(); + return messages == null || messages.isEmpty() ? null : messages.get(0); + } + + public List<MessageLight> getLightMessagesByForum(Forum forum) { + StringBuilder query = new StringBuilder(); + query.append("select msg from folightmessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" left join fetch msg.threadtop as threadtop") + .append(" where msg.forumKey=:forumKey"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("forumKey", forum.getKey()) + .getResultList(); + } + + public List<MessageLight> getLightMessagesByThread(Forum forum, MessageRef thread) { + StringBuilder query = new StringBuilder(); + query.append("select msg from folightmessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" inner join fetch msg.threadtop as threadtop") + .append(" where msg.forumKey=:forumKey and threadtop.key=:threadKey"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("forumKey", forum.getKey()) + .setParameter("threadKey", thread.getKey()) + .getResultList(); + } + + public List<MessageLight> getLightMessagesOfGuests(Forum forum) { + StringBuilder query = new StringBuilder(); + query.append("select msg from folightmessage as msg") + .append(" left join fetch msg.modifier as modifier") + .append(" left join fetch msg.threadtop as threadtop") + .append(" where msg.forumKey=:forumKey and msg.guest=true"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("forumKey", forum.getKey()) + .getResultList(); + } + + public List<MessageLight> getLightMessagesByUser(Forum forum, IdentityRef user) { + StringBuilder query = new StringBuilder(); + query.append("select msg from folightmessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" left join fetch msg.threadtop as threadtop") + .append(" where msg.forumKey=:forumKey and msg.creator.key=:userKey and msg.pseudonym is null"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("forumKey", forum.getKey()) + .setParameter("userKey", user.getKey()) + .getResultList(); + } + + public List<MessageLight> getLightMessagesByUserUnderPseudo(Forum forum, IdentityRef user, String pseudonym) { + StringBuilder query = new StringBuilder(); + query.append("select msg from folightmessage as msg") + .append(" left join fetch msg.creator as creator") + .append(" left join fetch msg.modifier as modifier") + .append(" left join fetch msg.threadtop as threadtop") + .append(" where msg.forumKey=:forumKey and msg.creator.key=:userKey and msg.pseudonym=:pseudonym"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageLight.class) + .setParameter("forumKey", forum.getKey()) + .setParameter("userKey", user.getKey()) + .setParameter("pseudonym", pseudonym) + .getResultList(); + } + + public List<ForumUserStatistics> getForumUserStatistics(Forum forum) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessageforstatistics as msg") + .append(" left join msg.creator as creator") + .append(" where msg.forumKey=:forumKey"); + + List<MessageStatistics> statistics = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), MessageStatistics.class) + .setParameter("forumKey", forum.getKey()) + .getResultList(); + + + Map<StatisticsKey, ForumUserStatistics> identityKeyToStats = new HashMap<>(); + for(MessageStatistics statistic:statistics) { + StatisticsKey key = new StatisticsKey(statistic); + + ForumUserStatistics userStats; + if(identityKeyToStats.containsKey(key)) { + userStats = identityKeyToStats.get(key); + } else { + userStats = new ForumUserStatistics(statistic.getCreator(), statistic.getPseudonym(), statistic.isGuest()); + identityKeyToStats.put(key, userStats); + } + + userStats.addNumOfCharacters(statistic.getNumOfCharacters()); + userStats.addNumOfWords(statistic.getNumOfWords()); + if(statistic.getThreadtopKey() == null) { + userStats.addNumOfThreads(1); + } else { + userStats.addNumOfReplies(1); + } + if(userStats.getLastModified() == null || + (statistic.getLastModified() != null + && statistic.getLastModified().after(userStats.getLastModified()))) { + userStats.setLastModified(statistic.getLastModified()); + } + } + return new ArrayList<>(identityKeyToStats.values()); + } + + private static class StatisticsKey { + + private boolean guest; + private String pseudonym; + private Long identityKey; + + public StatisticsKey(MessageStatistics statistic) { + guest = statistic.isGuest(); + pseudonym = statistic.getPseudonym(); + if(statistic.getCreator() != null) { + identityKey = statistic.getCreator().getKey(); + } + } + + @Override + public int hashCode() { + return guest ? 27534 : + ((identityKey == null ? 3467 : identityKey.hashCode()) + (pseudonym == null ? 567 : pseudonym.hashCode())); + } + + @Override + public boolean equals(Object obj) { + if(obj == this) { + return true; + } + if(obj instanceof StatisticsKey) { + StatisticsKey key = (StatisticsKey)obj; + if(guest && key.guest) { + return (pseudonym == null && key.pseudonym == null) || (pseudonym != null && pseudonym.equals(key.pseudonym)); + } + return identityKey != null && identityKey.equals(key.identityKey) + && ((pseudonym == null && key.pseudonym == null) || (pseudonym != null && pseudonym.equals(key.pseudonym))); + } + return false; + } + } + + /** + * Implementation with one entry per message. + * @param identity + * @param forumkey + * @return number of read messages + */ + public int countReadMessagesByUserAndForum(IdentityRef identity, Long forumkey) { + String query = "select count(msg) from foreadmessage as msg where msg.identity.key=:identityKey and msg.forum.key=:forumKey"; + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(query, Number.class) + .setParameter("identityKey", identity.getKey()) + .setParameter("forumKey", forumkey) + .getResultList(); + return count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); + } + + /** + * @param forumKey + * @param latestRead + * @return a List of Object[] with a key(Long), title(String), a creator(Identity), and + * the lastmodified(Date) of the messages of the forum with the given + * key and with last modification after the "latestRead" Date + */ + public List<Message> getNewMessageInfo(Long forumKey, Date latestRead) { + StringBuilder query = new StringBuilder(); + query.append("select msg from fomessage as msg ") + .append(" inner join fetch msg.creator as creator") + .append(" where msg.forum.key=:forumKey and msg.lastModified>:latestRead order by msg.lastModified desc"); + + return dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Message.class) + .setParameter("forumKey", forumKey.longValue()) + .setParameter("latestRead", latestRead, TemporalType.TIMESTAMP) + .getResultList(); + } + + /** + * @return the newly created and persisted forum + */ + public Forum addAForum() { + ForumImpl fo = new ForumImpl(); + fo.setCreationDate(new Date()); + dbInstance.getCurrentEntityManager().persist(fo); + return fo; + } + + /** + * @param forumKey + * @return the forum with the given key + */ + public Forum loadForum(Long forumKey) { + String q = "select fo from forum as fo where fo.key=:forumKey"; + List<Forum> forumList = dbInstance.getCurrentEntityManager() + .createQuery(q, Forum.class) + .setParameter("forumKey", forumKey) + .getResultList(); + return forumList == null || forumList.isEmpty() ? null : forumList.get(0); + } + + /** + * @param forumKey + */ + public void deleteForum(Long forumKey) { + Forum foToDel = loadForum(forumKey); + if (foToDel == null) throw new AssertException("forum to delete was not found: key=" + forumKey); + // delete properties, messages and the forum itself + doDeleteForum(foToDel); + // delete directory for messages with attachments + deleteForumContainer(forumKey); + } + + /** + * deletes all messages belonging to this forum and the forum entry itself + * + * @param forum + */ + private void doDeleteForum(final Forum forum) { + final Long forumKey = forum.getKey(); + //delete read messsages + String deleteReadMessages = "delete from foreadmessage as rmsg where rmsg.forum.key=:forumKey"; + dbInstance.getCurrentEntityManager().createQuery(deleteReadMessages) + .setParameter("forumKey", forumKey) + .executeUpdate(); + // delete messages + String deleteMessages = "delete from fomessage as msg where msg.forum.key=:forumKey"; + dbInstance.getCurrentEntityManager().createQuery(deleteMessages) + .setParameter("forumKey", forumKey) + .executeUpdate(); + // delete forum + String deleteForum = "delete from forum as fo where fo.key=:forumKey"; + dbInstance.getCurrentEntityManager().createQuery(deleteForum) + .setParameter("forumKey", forumKey) + .executeUpdate(); + //delete all flags + OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, forum.getKey()); + markingService.getMarkManager().deleteMarks(ores); + } + + /** + * sets the parent and threadtop of the message automatically + * + * @param newMessage the new message which has title and body set + * @param creator + * @param replyToMessage + */ + public void replyToMessage(Message newMessage, Message replyToMessage) { + Message top = replyToMessage.getThreadtop(); + newMessage.setThreadtop((top != null ? top : replyToMessage)); + newMessage.setParent(replyToMessage); + + saveMessage(newMessage); + } + + /** + * @param creator + * @param forum + * @param topMessage + */ + public void addTopMessage(Message topMessage) { + topMessage.setParent(null); + topMessage.setThreadtop(null); + saveMessage(topMessage); + } + + /** + * @param messageKey + * @return the message with the given messageKey + */ + public Message loadMessage(Long messageKey) { + StringBuilder sb = new StringBuilder(); + sb.append("select msg from fomessage msg where msg.key=:messageKey"); + List<Message> messages = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Message.class) + .setParameter("messageKey", messageKey) + .getResultList(); + return messages == null || messages.isEmpty() ? null : messages.get(0); + } + + private Message saveMessage(Message m) { + updateCounters(m); + m.setLastModified(new Date()); + if(m.getKey() == null) { + dbInstance.getCurrentEntityManager().persist(m); + } else { + m = dbInstance.getCurrentEntityManager().merge(m); + } + return m; + } + + /** + * creates (in RAM only) a new Message<br> + * fill the values and use saveMessage to make it persistent + * + * @return the message + * @see ForumManager#saveMessage(Message) + */ + public Message createMessage(Forum forum, Identity creator, boolean guest) { + MessageImpl message = new MessageImpl(); + message.setForum(forum); + if(guest) { + message.setGuest(guest); + } else { + message.setCreator(creator); + } + return message; + } + + /** + * Update message and fire MultiUserEvent, if any provided. If a not null + * ForumChangedEvent object is provided, then fire event to listeners. + * + * @param m + * @param updateLastModifiedDate + * true: the last modified date is updated to trigger a + * notification; false: last modified date is not modified and no + * notification is sent + * @param event + */ + public Message updateMessage(Message message, boolean updateLastModifiedDate) { + updateCounters(message); + // OLAT-6295 Only update last modified for the operations edit(update), show, and open. + // Don't update the last modified date for the operations close, hide, move and split. + if (updateLastModifiedDate) { + message.setLastModified(new Date()); + } + return dbInstance.getCurrentEntityManager().merge(message); + } + + /** + * @param forumKey + * @param m + */ + public void deleteMessageTree(Long forumKey, Message m) { + deleteMessageRecursion(forumKey, m); + } + + private void deleteMessageRecursion(final Long forumKey, Message m) { + deleteMessageContainer(forumKey, m.getKey()); + + String query = "select msg from fomessage as msg where msg.parent.key=:parentKey"; + List<Message> messages = dbInstance.getCurrentEntityManager().createQuery(query, Message.class) + .setParameter("parentKey", m.getKey()).getResultList(); + for (Message element:messages) { + deleteMessageRecursion(forumKey, element); + } + + // make sure the message is reloaded if it is not in the hibernate session cache + Message reloadedMessage = dbInstance.getCurrentEntityManager().find(MessageImpl.class, m.getKey()); + // delete all properties of one single message + deleteMessageProperties(forumKey, reloadedMessage); + dbInstance.getCurrentEntityManager().remove(reloadedMessage); + + //delete all flags + OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, forumKey); + markingService.getMarkManager().deleteMarks(ores, m.getKey().toString()); + + if(log.isDebug()){ + log.debug("Deleting message ", m.getKey().toString()); + } + } + + /** + * @param m + * @return true if the message has children + */ + public boolean hasChildren(Message m) { + String q = "select count(msg) from fomessage msg where msg.parent.key=:parentKey"; + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(q, Number.class) + .setParameter("parentKey", m.getKey()) + .getResultList(); + return count == null || count.isEmpty() || count.get(0) == null ? false : count.get(0).longValue() > 0; + } + + public int countMessageChildren(Long messageKey ) { + String q = "select count(msg) from fomessage msg where msg.parent.key=:parentKey"; + List<Number> count = dbInstance.getCurrentEntityManager() + .createQuery(q, Number.class) + .setParameter("parentKey", messageKey) + .getResultList(); + return count == null || count.isEmpty() || count.get(0) == null ? 0 : count.get(0).intValue(); + } + + /** + * deletes entry of one message + */ + private void deleteMessageProperties(Long forumKey, Message m) { + String query = "delete from foreadmessage as rmsg where rmsg.forum.key=:forumKey and rmsg.message.key=:messageKey"; + dbInstance.getCurrentEntityManager().createQuery(query) + .setParameter("forumKey", forumKey) + .setParameter("messageKey", m.getKey()) + .executeUpdate(); + } + + /** + * @param forumKey + * @param messageKey + * @return the valid container for the attachments to place into + */ + public VFSContainer getMessageContainer(Long forumKey, Long messageKey) { + VFSContainer forumContainer = getForumContainer(forumKey); + VFSItem messageContainer = forumContainer.resolve(messageKey.toString()); + if(messageContainer == null) { + return forumContainer.createChildContainer(messageKey.toString()); + } else if(messageContainer instanceof VFSContainer) { + return (VFSContainer)messageContainer; + } + log.error("The following message container is not a directory: " + messageContainer); + return null; + } + + private void moveMessageContainer(Long fromForumKey, Long fromMessageKey, Long toForumKey, Long toMessageKey) { + // copy message container + VFSContainer toMessageContainer = getMessageContainer(toForumKey, toMessageKey); + VFSContainer fromMessageContainer = getMessageContainer(fromForumKey, fromMessageKey); + for (VFSItem vfsItem : fromMessageContainer.getItems()) { + toMessageContainer.copyFrom(vfsItem); + } + } + + private void deleteMessageContainer(Long forumKey, Long messageKey) { + VFSContainer mContainer = getMessageContainer(forumKey, messageKey); + mContainer.delete(); + } + + private void deleteForumContainer(Long forumKey) { + VFSContainer fContainer = getForumContainer(forumKey); + fContainer.delete(); + } + + public VFSContainer getForumContainer(Long forumKey) { + OlatRootFolderImpl fContainer = new OlatRootFolderImpl("/forum", null); + VFSItem forumContainer = fContainer.resolve(forumKey.toString()); + if(forumContainer == null) { + return fContainer.createChildContainer(forumKey.toString()); + } else if(forumContainer instanceof VFSContainer) { + return (VFSContainer)forumContainer; + } + log.error("The following forum container is not a directory: " + forumContainer); + return null; + } + + /** + * Splits the current thread starting from the current message. + * It updates the messages of the selected subthread by setting the Parent and the Threadtop. + * The method send a SPLIT event, and make a commit before sending it. + * + * @param msgid + * @return the top message of the newly created thread. + */ + public Message splitThread(Message msg) { + Message newTopMessage = null; + if(msg.getThreadtop() == null) { + newTopMessage = msg; + } else { + //it only make sense to split a thread if the current message is not a threadtop message. + List<Message> threadList = getThread(msg.getThreadtop().getKey()); + List<Message> subthreadList = new ArrayList<Message>(); + subthreadList.add(msg); + getSubthread(msg, threadList, subthreadList); + + Iterator<Message> messageIterator = subthreadList.iterator(); + Message firstMessage = null; + if (messageIterator.hasNext()) { + firstMessage = messageIterator.next(); + firstMessage = getMessageById(firstMessage.getKey()); + firstMessage.setParent(null); + firstMessage.setThreadtop(null); + updateMessage(firstMessage, false); + newTopMessage = firstMessage; + } + while (firstMessage != null && messageIterator.hasNext()) { + Message message = messageIterator.next(); + message = getMessageById(firstMessage.getKey()); + message.setThreadtop(firstMessage); + updateMessage(message, false); + } + + dbInstance.commit();// before sending async event + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.SPLIT, newTopMessage.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus() + .fireEventToListenersOf(event, firstMessage.getForum()); + } + return newTopMessage; + } + + /** + * Moves the current message from the current thread in another thread. + * + * @param msg + * @param topMsg + * @return the moved message + */ + public Message moveMessage(Message msg, Message topMsg) { + List<Message> oldThreadList = getThread(msg.getThreadtop().getKey()); + List<Message> subThreadList = new ArrayList<Message>(); + getSubthread(msg, oldThreadList, subThreadList); + // one has to set a new parent for all childs of the moved message + // first message of sublist has to get the parent from the moved message + for (Message childMessage : subThreadList) { + childMessage = getMessageById(childMessage.getKey()); + childMessage.setParent(msg.getParent()); + updateMessage(childMessage, false); + } + + // now move the message to the choosen thread + final Message oldMessage = getMessageById(msg.getKey()); + Message message = createMessage(oldMessage.getForum(), oldMessage.getCreator(), oldMessage.isGuest()); + message.setModifier(oldMessage.getModifier()); + message.setLastModified(oldMessage.getLastModified()); // OLAT-6295 + message.setTitle(oldMessage.getTitle()); + message.setBody(oldMessage.getBody()); + message.setPseudonym(oldMessage.getPseudonym()); + message.setThreadtop(topMsg); + message.setParent(topMsg); + Status status = Status.getStatus(oldMessage.getStatusCode()); + status.setMoved(true); + message.setStatusCode(Status.getStatusCode(status)); + saveMessage(message); + + //move marks + OLATResourceable ores = OresHelper.createOLATResourceableInstance(Forum.class, msg.getForum().getKey()); + markingService.getMarkManager().moveMarks(ores, msg.getKey().toString(), message.getKey().toString()); + + moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), message.getForum().getKey(), message.getKey()); + deleteMessageRecursion(oldMessage.getForum().getKey(), oldMessage); + return message; + } + + /** + * This is a recursive method. The subthreadList in an ordered list with all descendents of the input msg. + * @param msg + * @param threadList + * @param subthreadList + */ + private void getSubthread(Message msg, List<Message> threadList, List<Message> subthreadList) { + Iterator<Message> listIterator = threadList.iterator(); + while(listIterator.hasNext()) { + Message currMessage = listIterator.next(); + if(currMessage.getParent()!=null && currMessage.getParent().getKey().equals(msg.getKey())) { + subthreadList.add(currMessage); + getSubthread(currMessage, threadList, subthreadList); + } + } + } + + /** + * + * @param identity + * @param forum + * @return a set with the read messages keys for the input identity and forum. + */ + public Set<Long> getReadSet(IdentityRef identity, Forum forum) { + StringBuilder query = new StringBuilder(); + query.append("select rmsg.message.key from foreadmessage as rmsg") + .append(" inner join rmsg.message as msg") + .append(" where rmsg.forum.key=:forumKey and rmsg.identity.key=:identityKey"); + List<Long> messageKeys = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Long.class) + .setParameter("forumKey", forum.getKey()) + .setParameter("identityKey", identity.getKey()) + .getResultList(); + return new HashSet<Long>(messageKeys); + } + + /** + * Implementation with one entry per forum message. + * Adds a new entry into the ReadMessage for the input message and identity. + * @param msg + * @param identity + */ + public void markAsRead(Identity identity, Forum forum, MessageLight msg) { + //Check if the message was not already deleted + Message retrievedMessage = loadMessage(msg.getKey()); + if(retrievedMessage != null) { + ReadMessageImpl readMessage = new ReadMessageImpl(); + readMessage.setIdentity(identity); + if(msg instanceof MessageLightImpl) { + readMessage.setMessage(msg); + } else { + msg = dbInstance.getCurrentEntityManager().getReference(MessageLightImpl.class, msg.getKey()); + readMessage.setMessage(msg); + } + + readMessage.setForum(forum); + dbInstance.getCurrentEntityManager().persist(readMessage); + } + } + + /** + * Update the counters for words and characters + * @param m the message + */ + public void updateCounters(Message m) { + String body = m.getBody(); + String unQuotedBody = new QuoteAndTagFilter().filter(body); + Locale suggestedLocale = txtService.detectLocale(unQuotedBody); + m.setNumOfWords(txtService.wordCount(unQuotedBody, suggestedLocale)); + m.setNumOfCharacters(txtService.characterCount(unQuotedBody, suggestedLocale)); + } +} diff --git a/src/main/java/org/olat/modules/fo/model/ForumImpl.java b/src/main/java/org/olat/modules/fo/model/ForumImpl.java new file mode 100644 index 00000000000..35716ef06de --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/ForumImpl.java @@ -0,0 +1,126 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Version; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Persistable; +import org.olat.core.logging.AssertException; +import org.olat.core.util.resource.OresHelper; +import org.olat.modules.fo.Forum; + +/** + * Implementation of the Forum Interface + * + * @author Felix Jost + */ +@Entity(name="forum") +@Table(name="o_forum") +@NamedQueries({ + @NamedQuery(name="getAllForumKeys", query="select fo.key from forum as fo") +}) +public class ForumImpl implements Forum, CreateInfo, Persistable{ + + private static final long serialVersionUID = 3240047228287740990L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="forum_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + @Version + private int version = 0; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=true, updatable=false) + private Date creationDate; + + @Override + public Long getKey() { + return key; + } + + public void setKey(Long key) { + this.key = key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + @Override + public String getResourceableTypeName() { + return OresHelper.calculateTypeName(Forum.class); + } + + @Override + public Long getResourceableId() { + Long id = getKey(); + if (id == null) { + throw new AssertException("getId() must not be called before an id has been generated by the persister"); + } + return id; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof ForumImpl) { + ForumImpl other = (ForumImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/model/ForumThread.java b/src/main/java/org/olat/modules/fo/model/ForumThread.java new file mode 100644 index 00000000000..0f9762692ec --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/ForumThread.java @@ -0,0 +1,111 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import java.util.Date; + +import org.olat.modules.fo.Message; +import org.olat.modules.fo.MessageRef; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumThread implements MessageRef { + + private int type; + private Long key; + private String title; + private Date lastModified; + + private boolean guest; + private String pseudonym; + private String creatorFullname; + + private int markedMessages; + private int newMessages; + private int numOfPosts; + + public ForumThread(Message message, String creatorFullname, Date lastModified, int numOfPosts) { + this.key = message.getKey(); + this.type = message.getStatusCode(); + this.title = message.getTitle(); + if(lastModified == null || lastModified.after(message.getLastModified())) { + this.lastModified = message.getLastModified(); + } else { + this.lastModified = lastModified; + } + this.guest = message.isGuest(); + this.creatorFullname = creatorFullname; + this.numOfPosts = numOfPosts; + } + + @Override + public Long getKey() { + return key; + } + + @Override + public int getStatusCode() { + return type; + } + + public boolean isGuest() { + return guest; + } + + public String getPseudonym() { + return pseudonym; + } + + public String getTitle() { + return title; + } + + public Date getLastModified() { + return lastModified; + } + + public String getCreatorFullname() { + return creatorFullname; + } + + public int getNumOfPosts() { + return numOfPosts; + } + + public int getMarkedMessages() { + return markedMessages; + } + + public void setMarkedMessages(int markedMessages) { + this.markedMessages = markedMessages; + } + + public int getNewMessages() { + return newMessages; + } + + public void setNewMessages(int newMessages) { + this.newMessages = newMessages; + } +} diff --git a/src/main/java/org/olat/modules/fo/model/ForumUser.java b/src/main/java/org/olat/modules/fo/model/ForumUser.java new file mode 100644 index 00000000000..9b8ef12949c --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/ForumUser.java @@ -0,0 +1,84 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import org.olat.user.UserPropertiesRow; +import org.olat.user.propertyhandlers.UserPropertyHandler; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumUser extends UserPropertiesRow { + + private final boolean guest; + private final String pseudonym; + + private final int numOfThreads; + private final int numOfReplies; + private final int numOfWords; + private final int numOfCharacters; + private final Date lastModified; + + public ForumUser(ForumUserStatistics statistics, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { + super(statistics.getIdentity(), userPropertyHandlers, locale); + guest = statistics.isGuest(); + pseudonym = statistics.getPseudonym(); + numOfCharacters = statistics.getNumOfCharacters(); + numOfWords = statistics.getNumOfWords(); + numOfReplies = statistics.getNumOfReplies(); + numOfThreads = statistics.getNumOfThreads(); + lastModified = statistics.getLastModified(); + } + + public boolean isGuest() { + return guest; + } + + public String getPseudonym() { + return pseudonym; + } + + public int getNumOfThreads() { + return numOfThreads; + } + + public int getNumOfReplies() { + return numOfReplies; + } + + public int getNumOfWords() { + return numOfWords; + } + + public int getNumOfCharacters() { + return numOfCharacters; + } + + public Date getLastModified() { + return lastModified; + } +} diff --git a/src/main/java/org/olat/modules/fo/model/ForumUserStatistics.java b/src/main/java/org/olat/modules/fo/model/ForumUserStatistics.java new file mode 100644 index 00000000000..59c8cc819eb --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/ForumUserStatistics.java @@ -0,0 +1,106 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import java.util.Date; + +import org.olat.core.id.Identity; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumUserStatistics { + + private final boolean guest; + private final Identity identity; + private final String pseudonym; + + private int numOfThreads = 0; + private int numOfReplies = 0; + private int numOfWords = 0; + private int numOfCharacters = 0; + private Date lastModified; + + public ForumUserStatistics(Identity identity, String pseudonym, boolean guest) { + this.identity = identity; + this.guest = guest; + this.pseudonym = pseudonym; + } + + public boolean isGuest() { + return guest; + } + + public String getPseudonym() { + return pseudonym; + } + + public Identity getIdentity() { + return identity; + } + + public int getNumOfThreads() { + return numOfThreads; + } + + public void addNumOfThreads(int threads) { + this.numOfThreads += threads; + } + + public int getNumOfReplies() { + return numOfReplies; + } + + public void addNumOfReplies(int replies) { + this.numOfReplies += replies; + } + + public int getNumOfWords() { + return numOfWords; + } + + public void addNumOfWords(int words) { + this.numOfWords += words; + } + + public int getNumOfCharacters() { + return numOfCharacters; + } + + public void addNumOfCharacters(int characters) { + this.numOfCharacters += characters; + } + + public Date getLastModified() { + return lastModified; + } + + public void setLastModified(Date lastModified) { + this.lastModified = lastModified; + } + + + + + +} diff --git a/src/main/java/org/olat/modules/fo/model/MessageImpl.java b/src/main/java/org/olat/modules/fo/model/MessageImpl.java new file mode 100644 index 00000000000..6a1509c75ab --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/MessageImpl.java @@ -0,0 +1,311 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Version; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.basesecurity.IdentityImpl; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.Message; + +/** + * @author Felix Jost + */ +@Entity(name="fomessage") +@Table(name="o_message") +public class MessageImpl implements CreateInfo, Persistable, Message { + + private static final long serialVersionUID = -7701717903560643010L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="message_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + @Version + private int version = 0; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=true, updatable=false) + private Date creationDate; + @Temporal(TemporalType.TIMESTAMP) + @Column(name="lastmodified", nullable=false, insertable=true, updatable=true) + private Date lastModified; + + @Column(name="statuscode", nullable=false, insertable=true, updatable=true) + private int statusCode; + + @Column(name="title", nullable=false, insertable=true, updatable=true) + private String title; + @Column(name="body", nullable=false, insertable=true, updatable=true) + private String body; + @Column(name="numofcharacters", nullable=true, insertable=true, updatable=true) + private Integer numOfCharacters; + @Column(name="numofwords", nullable=true, insertable=true, updatable=true) + private Integer numOfWords; + + @ManyToOne(targetEntity=MessageImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="parent_id", nullable=true, insertable=true, updatable=true) + private Message parent; + @ManyToOne(targetEntity=MessageImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="topthread_id", nullable=true, insertable=true, updatable=true) + private Message threadtop; + @ManyToOne(targetEntity=ForumImpl.class,fetch=FetchType.LAZY,optional=false) + @JoinColumn(name="forum_fk", nullable=false, insertable=true, updatable=false) + private Forum forum; + + @Column(name="pseudonym", nullable=true, insertable=true, updatable=false) + private String pseudonym; + @Column(name="guest", nullable=true, insertable=true, updatable=false) + private boolean guest; + + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="creator_id", nullable=true, insertable=true, updatable=false) + private Identity creator; + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="modifier_id", nullable=true, insertable=true, updatable=true) + private Identity modifier; + + @Override + public Long getKey() { + return key; + } + + public void setKey(Long key) { + this.key = key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + + /** + * @return + */ + public String getBody() { + return body; + } + + + /** + * @return + */ + public Identity getCreator() { + return creator; + } + + /** + * @param identity + */ + public void setCreator(Identity identity) { + creator = identity; + } + + public String getPseudonym() { + return pseudonym; + } + + public void setPseudonym(String pseudonym) { + this.pseudonym = pseudonym; + } + + public boolean isGuest() { + return guest; + } + + public void setGuest(boolean guest) { + this.guest = guest; + } + + /** + * @return + */ + public Forum getForum() { + return forum; + } + + public void setForum(Forum forum) { + this.forum = forum; + } + + /** + * @return + */ + public Identity getModifier() { + return modifier; + } + + /** + * @return + */ + public Message getParent() { + return parent; + } + + @Override + public Long getParentKey() { + return parent == null ? null : parent.getKey(); + } + + /** + * @return + */ + public Message getThreadtop() { + return threadtop; + } + + /** + * @return + */ + public String getTitle() { + return title; + } + + /** + * @param string + */ + public void setBody(String string) { + body = string; + } + + /** + * @param identity + */ + public void setModifier(Identity identity) { + modifier = identity; + } + + /** + * @param message + */ + public void setParent(Message message) { + parent = message; + } + + /** + * @param message + */ + public void setThreadtop(Message message) { + threadtop = message; + } + + /** + * @param string + */ + public void setTitle(String string) { + title = string; + } + + public int getStatusCode() { + return statusCode; + } + public void setStatusCode(int statusCode) { + this.statusCode = statusCode; + } + + /** + * + * @see org.olat.core.id.ModifiedInfo#getLastModified() + */ + public Date getLastModified() { + return lastModified; + } + + /** + * + * @see org.olat.core.id.ModifiedInfo#setLastModified(java.util.Date) + */ + public void setLastModified(Date date) { + this.lastModified = date; + } + + public Integer getNumOfCharacters() { + return numOfCharacters; + } + + public void setNumOfCharacters(Integer numOfCharacters) { + this.numOfCharacters = numOfCharacters; + } + + public Integer getNumOfWords() { + return numOfWords; + } + + public void setNumOfWords(Integer numOfWords) { + this.numOfWords = numOfWords; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof MessageImpl) { + MessageImpl other = (MessageImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } + + @Override + public int compareTo(Message arg0) { + //threadtop always is on top! + if (arg0.getParent()==null) return 1; + if (getCreationDate().after(arg0.getCreationDate())) return 1; + return 0; + } +} diff --git a/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java b/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java new file mode 100644 index 00000000000..5e1f3dd7c8f --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/MessageLightImpl.java @@ -0,0 +1,184 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.basesecurity.IdentityImpl; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; +import org.olat.modules.fo.MessageLight; +import org.olat.modules.fo.MessageRef; + +/** + * + * A mapping which reduce the number of join and associated sub-queries. + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="folightmessage") +@Table(name="o_message") +public class MessageLightImpl implements MessageLight, CreateInfo, Persistable, Comparable<MessageLight> { + + private static final long serialVersionUID = -7701717903560643010L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="message_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=false, updatable=false) + private Date creationDate; + @Temporal(TemporalType.TIMESTAMP) + @Column(name="lastmodified", nullable=false, insertable=false, updatable=false) + private Date lastModified; + + @Column(name="statuscode", nullable=false, insertable=false, updatable=false) + private int statusCode; + + @Column(name="title", nullable=false, insertable=false, updatable=false) + private String title; + @Column(name="body", nullable=false, insertable=false, updatable=false) + private String body; + + @Column(name="parent_id", nullable=true, insertable=false, updatable=false) + private Long parentKey; + @ManyToOne(targetEntity=MessageRefImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="topthread_id", nullable=true, insertable=false, updatable=false) + private MessageRef threadtop; + @Column(name="forum_fk", nullable=false, insertable=false, updatable=false) + private Long forumKey; + + @Column(name="pseudonym", nullable=true, insertable=false, updatable=false) + private String pseudonym; + @Column(name="guest", nullable=true, insertable=false, updatable=false) + private boolean guest; + + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="creator_id", nullable=true, insertable=true, updatable=false) + private Identity creator; + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="modifier_id", nullable=true, insertable=true, updatable=true) + private Identity modifier; + + @Override + public Long getKey() { + return key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public int getStatusCode() { + return statusCode; + } + + public String getTitle() { + return title; + } + + public String getBody() { + return body; + } + + public Identity getCreator() { + return creator; + } + + public String getPseudonym() { + return pseudonym; + } + + public boolean isGuest() { + return guest; + } + + public Long getForumKey() { + return forumKey; + } + + public Identity getModifier() { + return modifier; + } + + public Long getParentKey() { + return parentKey; + } + + public MessageRef getThreadtop() { + return threadtop; + } + + public Date getLastModified() { + return lastModified; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof MessageImpl) { + MessageImpl other = (MessageImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } + + @Override + public int compareTo(MessageLight arg0) { + if (arg0.getParentKey() == null) { + return 1; + } + if (getCreationDate().after(arg0.getCreationDate())) { + return 1; + } + return 0; + } +} diff --git a/src/main/java/org/olat/modules/fo/model/MessagePeekviewImpl.java b/src/main/java/org/olat/modules/fo/model/MessagePeekviewImpl.java new file mode 100644 index 00000000000..45f8416cace --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/MessagePeekviewImpl.java @@ -0,0 +1,121 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.core.id.Persistable; +import org.olat.modules.fo.MessageRef; +import org.olat.modules.fo.ui.MessagePeekview; + +/** + * + * A mapping which reduce the number of join and associated sub-queries. + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="fopeekviewmessage") +@Table(name="o_message") +public class MessagePeekviewImpl implements MessagePeekview, Persistable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="message_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=false, updatable=false) + private Date creationDate; + + @Column(name="statuscode", nullable=false, insertable=false, updatable=false) + private int statusCode; + + @Column(name="title", nullable=false, insertable=false, updatable=false) + private String title; + @Column(name="body", nullable=false, insertable=false, updatable=false) + private String body; + + @ManyToOne(targetEntity=MessageRefImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="topthread_id", nullable=true, insertable=false, updatable=false) + private MessageRef threadtop; + @Column(name="forum_fk", nullable=false, insertable=false, updatable=false) + private Long forumKey; + + @Override + public Long getKey() { + return key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public int getStatusCode() { + return statusCode; + } + + public String getTitle() { + return title; + } + + public String getBody() { + return body; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof MessageImpl) { + MessageImpl other = (MessageImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} diff --git a/src/main/java/org/olat/modules/fo/model/MessageRefImpl.java b/src/main/java/org/olat/modules/fo/model/MessageRefImpl.java new file mode 100644 index 00000000000..a47daf318fe --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/MessageRefImpl.java @@ -0,0 +1,77 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.model; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.modules.fo.MessageRef; + +/** + * Companion for the thread top of the message light. + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="forefmessage") +@Table(name="o_message") +public class MessageRefImpl implements MessageRef { + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="message_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Column(name="statuscode", nullable=false, insertable=false, updatable=false) + private int statusCode; + + + @Override + public Long getKey() { + return key; + } + + public int getStatusCode() { + return statusCode; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof MessageImpl) { + MessageImpl other = (MessageImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } +} diff --git a/src/main/java/org/olat/modules/fo/model/MessageStatistics.java b/src/main/java/org/olat/modules/fo/model/MessageStatistics.java new file mode 100644 index 00000000000..cffbc626a62 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/MessageStatistics.java @@ -0,0 +1,152 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.basesecurity.IdentityImpl; +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; + +/** + * + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Entity(name="fomessageforstatistics") +@Table(name="o_message") +public class MessageStatistics implements Persistable { + + private static final long serialVersionUID = -7701717903560643010L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="message_id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="lastmodified", nullable=false, insertable=false, updatable=false) + private Date lastModified; + + @Column(name="statuscode", nullable=false, insertable=false, updatable=false) + private int statusCode; + + @Column(name="numofcharacters", nullable=true, insertable=false, updatable=false) + private Integer numOfCharacters; + @Column(name="numofwords", nullable=true, insertable=false, updatable=false) + private Integer numOfWords; + + @Column(name="topthread_id", nullable=true, insertable=false, updatable=false) + private Long threadtopKey; + + @Column(name="forum_fk", nullable=true, insertable=false, updatable=false) + private Long forumKey; + + @Column(name="pseudonym", nullable=true, insertable=false, updatable=false) + private String pseudonym; + @Column(name="guest", nullable=true, insertable=false, updatable=false) + private boolean guest; + + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="creator_id", nullable=true, insertable=false, updatable=false) + private Identity creator; + + @Override + public Long getKey() { + return key; + } + + /** + * @return + */ + public Identity getCreator() { + return creator; + } + + public String getPseudonym() { + return pseudonym; + } + + public boolean isGuest() { + return guest; + } + + public Long getThreadtopKey() { + return threadtopKey; + } + + public int getStatusCode() { + return statusCode; + } + + public Date getLastModified() { + return lastModified; + } + + public Integer getNumOfCharacters() { + return numOfCharacters; + } + + public Integer getNumOfWords() { + return numOfWords; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof MessageStatistics) { + MessageStatistics other = (MessageStatistics) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} diff --git a/src/main/java/org/olat/modules/fo/model/ReadMessageImpl.java b/src/main/java/org/olat/modules/fo/model/ReadMessageImpl.java new file mode 100644 index 00000000000..2f7447e0cdd --- /dev/null +++ b/src/main/java/org/olat/modules/fo/model/ReadMessageImpl.java @@ -0,0 +1,143 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ +package org.olat.modules.fo.model; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Version; + +import org.hibernate.annotations.GenericGenerator; +import org.olat.basesecurity.IdentityImpl; +import org.olat.core.id.CreateInfo; +import org.olat.core.id.Identity; +import org.olat.core.id.Persistable; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.MessageLight; + + +@Entity(name="foreadmessage") +@Table(name="o_readmessage") +public class ReadMessageImpl implements CreateInfo, Persistable { + + private static final long serialVersionUID = 1411870563218649869L; + + @Id + @GeneratedValue(generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "hilo") + @Column(name="id", nullable=false, unique=true, insertable=true, updatable=false) + private Long key; + @Version + private int version = 0; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="creationdate", nullable=false, insertable=true, updatable=false) + private Date creationDate; + + @ManyToOne(targetEntity=IdentityImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="identity_id", nullable=true, insertable=true, updatable=false) + private Identity identity; + + @ManyToOne(targetEntity=MessageLightImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="message_id", nullable=true, insertable=true, updatable=false) + private MessageLight message; + + @ManyToOne(targetEntity=ForumImpl.class,fetch=FetchType.LAZY,optional=true) + @JoinColumn(name="forum_id", nullable=true, insertable=true, updatable=false) + private Forum forum; + + @Override + public Long getKey() { + return key; + } + + public void setKey(Long key) { + this.key = key; + } + + @Override + public Date getCreationDate() { + return creationDate; + } + + public void setCreationDate(Date creationDate) { + this.creationDate = creationDate; + } + + public Forum getForum() { + return forum; + } + + public void setForum(Forum forum) { + this.forum = forum; + } + + public Identity getIdentity() { + return identity; + } + + public void setIdentity(Identity identity) { + this.identity = identity; + } + + public MessageLight getMessage() { + return message; + } + + public void setMessage(MessageLight message) { + this.message = message; + } + + @Override + public int hashCode() { + return key == null ? 835245 : key.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof ReadMessageImpl) { + ReadMessageImpl other = (ReadMessageImpl) obj; + return getKey().equals(other.getKey()); + } + return false; + } + + @Override + public boolean equalsByPersistableKey(Persistable persistable) { + return equals(persistable); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java index 18d50153996..6850fbf8ce2 100755 --- a/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java +++ b/src/main/java/org/olat/modules/fo/portfolio/ForumArtefactHandler.java @@ -27,8 +27,8 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.id.OLATResourceable; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.portfolio.EPAbstractHandler; import org.olat.portfolio.model.artefacts.AbstractArtefact; diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java index 595fe79fa51..34d5202c0b1 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java @@ -68,8 +68,8 @@ import org.olat.course.run.userview.CourseTreeVisitor; import org.olat.course.run.userview.VisibleTreeFilter; import org.olat.modules.ModuleConfiguration; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.properties.Property; import org.olat.restapi.repository.course.AbstractCourseNodeWebService; import org.olat.restapi.repository.course.CourseWebService; @@ -403,7 +403,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { if(parentMessageId == null || parentMessageId == 0L) { // creating the thread (a message without a parent message) - Message newThread = fom.createMessage(); + Message newThread = fom.createMessage(forum, identity, false); if (isSticky != null && isSticky.booleanValue()) { // set sticky org.olat.modules.fo.Status status = new org.olat.modules.fo.Status(); @@ -413,7 +413,7 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { newThread.setTitle(title); newThread.setBody(body); // open a new thread - fom.addTopMessage(identity, forum, newThread); + fom.addTopMessage(newThread); vo = new MessageVO(newThread); } else { @@ -424,11 +424,10 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } // create new message - Message message = fom.createMessage(); + Message message = fom.createMessage(forum, identity, false); message.setTitle(title); message.setBody(body); - - fom.replyToMessage(message, identity, threadMessage); + fom.replyToMessage(message, threadMessage); vo = new MessageVO(message); } diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java index 82e51c903f0..d15989eed7a 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java @@ -28,7 +28,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; +import org.olat.modules.fo.manager.ForumManager; /** * diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java index 4517f5b0ca5..123c49c4ff3 100644 --- a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java @@ -74,8 +74,8 @@ import org.olat.core.util.vfs.VFSManager; import org.olat.core.util.vfs.restapi.SystemItemFilter; import org.olat.core.util.vfs.restapi.VFSStreamingOutput; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.restapi.support.MediaTypeVariants; import org.olat.restapi.support.MultipartReader; import org.olat.restapi.support.vo.File64VO; @@ -220,11 +220,11 @@ public class ForumWebService { Identity author = getMessageAuthor(authorKey, httpRequest); // creating the thread (a message without a parent message) - Message newThread = fom.createMessage(); + Message newThread = fom.createMessage(forum, author, false); newThread.setTitle(title); newThread.setBody(body); // open a new thread - fom.addTopMessage(author, forum, newThread); + fom.addTopMessage(newThread); MessageVO vo = new MessageVO(newThread); return Response.ok(vo).build(); @@ -259,7 +259,6 @@ public class ForumWebService { return Response.serverError().status(Status.NOT_FOUND).build(); } - ForumManager fom = ForumManager.getInstance(); if(MediaTypeVariants.isPaged(httpRequest, request)) { int totalCount = fom.countThread(threadKey); Message.OrderBy order = toEnum(orderBy); @@ -383,10 +382,10 @@ public class ForumWebService { } // creating the thread (a message without a parent message) - Message newMessage = fom.createMessage(); + Message newMessage = fom.createMessage(forum, author, false); newMessage.setTitle(reply.getTitle()); newMessage.setBody(reply.getBody()); - fom.replyToMessage(newMessage, author, mess); + fom.replyToMessage(newMessage, mess); if(reply.getAttachments() != null) { for(File64VO attachment:reply.getAttachments()) { byte[] fileAsBytes = Base64.decodeBase64(attachment.getFile()); diff --git a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java index 2faeab563b7..2bb964a688c 100644 --- a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java +++ b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java @@ -42,7 +42,6 @@ import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Request; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -130,13 +129,12 @@ public class MyForumsWebService { * @response.representation.401.doc The roles of the authenticated user are not sufficient * @param identityKey The key of the user (IdentityImpl) * @param httpRequest The HTTP request - * @param request The REST request * @return The forums */ @GET @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Response getForums(@PathParam("identityKey") Long identityKey, - @Context HttpServletRequest httpRequest, @Context Request request) { + @Context HttpServletRequest httpRequest) { Roles roles; Identity retrievedUser = getIdentity(httpRequest); diff --git a/src/main/java/org/olat/modules/fo/ui/ForumAdminController.java b/src/main/java/org/olat/modules/fo/ui/ForumAdminController.java new file mode 100644 index 00000000000..57b45124ffb --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumAdminController.java @@ -0,0 +1,126 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.util.Util; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumModule; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumAdminController extends FormBasicController { + + private static final String[] anonymousPostingKeys = new String[]{ "on" }; + private static final String[] defaultKeys = new String[]{ "enabled", "disabled" }; + + private MultipleSelectionElement anonymousPostingEl; + private SingleSelection defaultCourseEl, defaultGroupEl; + + @Autowired + private ForumModule forumModule; + + public ForumAdminController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + setFormTitle("admin.title"); + + String[] anonymousPostingValues = new String[]{ "" }; + anonymousPostingEl = uifactory.addCheckboxesHorizontal("anonymous.posting", "anonymous.posting", formLayout, + anonymousPostingKeys, anonymousPostingValues); + if(forumModule.isAnonymousPostingWithPseudonymEnabled()) { + anonymousPostingEl.select(anonymousPostingKeys[0], true); + } + anonymousPostingEl.addActionListener(FormEvent.ONCHANGE); + + String[] defaultValues = new String[]{ + translate("anonymous.default.enabled"), translate("anonymous.default.disabled") + }; + defaultCourseEl = uifactory.addRadiosHorizontal("anonymous.course.default", "anonymous.course.default", formLayout, + defaultKeys, defaultValues); + if(forumModule.isPseudonymForCourseEnabledByDefault()) { + defaultCourseEl.select(defaultKeys[0], true); + } else { + defaultCourseEl.select(defaultKeys[1], true); + } + defaultCourseEl.addActionListener(FormEvent.ONCHANGE); + /* + defaultGroupEl = uifactory.addRadiosHorizontal("anonymous.group.default", "anonymous.group.default", formLayout, + defaultKeys, defaultValues); + if(forumModule.isPseudonymForGroupEnabledByDefault()) { + defaultGroupEl.select(defaultKeys[0], true); + } else { + defaultGroupEl.select(defaultKeys[1], true); + } + defaultGroupEl.addActionListener(FormEvent.ONCHANGE); + */ + + updateUI(); + } + + private void updateUI() { + defaultCourseEl.setVisible(anonymousPostingEl.isAtLeastSelected(1)); + //defaultGroupEl.setVisible(anonymousPostingEl.isAtLeastSelected(1)); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(anonymousPostingEl == source) { + forumModule.setAnonymousPostingWithPseudonymEnabled(anonymousPostingEl.isAtLeastSelected(1)); + updateUI(); + } else if(defaultGroupEl == source) { + boolean enabled = defaultGroupEl.isOneSelected() && defaultGroupEl.isSelected(0); + forumModule.setPseudonymForGroupEnabledByDefault(enabled); + } else if(defaultCourseEl == source) { + boolean enabled = defaultCourseEl.isOneSelected() && defaultCourseEl.isSelected(0); + forumModule.setPseudonymForCourseEnabledByDefault(enabled); + } + super.formInnerEvent(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/ForumController.java b/src/main/java/org/olat/modules/fo/ui/ForumController.java new file mode 100644 index 00000000000..9f5a9e575a9 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumController.java @@ -0,0 +1,369 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.orgrmform +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <p> +*/ + +package org.olat.modules.fo.ui; + +import java.util.List; + +import org.olat.basesecurity.BaseSecurity; +import org.olat.core.commons.services.notifications.PublisherData; +import org.olat.core.commons.services.notifications.SubscriptionContext; +import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.gui.control.generic.dtabs.Activateable2; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; +import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; +import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.event.GenericEventListener; +import org.olat.core.util.resource.OresHelper; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.ForumChangedEvent; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.ui.events.SelectMessageEvent; +import org.olat.modules.fo.ui.events.SelectUserEvent; +import org.olat.modules.fo.ui.events.SelectUserListEvent; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Description: <br> + * CREATE: - new thread (topmessage) -> ask ForumCallback 'mayOpenNewThread' - + * new message -> ask ForumCallback 'mayReplyMessage' <br> + * READ: - everybody may read every message <br> + * UPDATE: - who wrote a message may edit and save his message as long as it has + * no children. - if somebody want to edit a message of somebodyelse -> ask + * ForumCallback 'mayEditMessageAsModerator' <br> + * DELETE: - who wrote a message may delete his message as long as it has no + * children. - if somebody want to delete a message of somebodyelse -> ask + * ForumCallback 'mayDeleteMessageAsModerator' <br> + * <br> + * Notifications: notified when: <br> + * a new thread is opened <br> + * a new reply is given <br> + * a message has been edited <br> + * but not when a message has been deleted <br> + * + * @author Felix Jost + * @author Refactorings: Roman Haag, roman.haag@frentix.com, frentix GmbH + */ +public class ForumController extends BasicController implements GenericEventListener, Activateable2 { + + protected static final String GUI_PREFS_THREADVIEW_KEY = "forum.threadview.enabled"; + + private VelocityContainer forumPanel; + + private ThreadListController threadListCtrl; + private ForumUserListController userListCtrl; + private MessageListController viewCtrl, userViewCtrl; + + private Forum forum; + private ForumCallback focallback; + private boolean reloadThreadList = false; + + private SubscriptionContext subsContext; + private ContextualSubscriptionController csc; + + @Autowired + private ForumManager fm; + @Autowired + private BaseSecurity securityManager; + + /** + * @param forum + * @param focallback + * @param ureq + * @param wControl + */ + public ForumController(UserRequest ureq, WindowControl wControl, + Forum forum, ForumCallback focallback, boolean showSubscriptionButton) { + super(ureq, wControl); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + + this.forum = forum; + this.focallback = focallback; + addLoggingResourceable(LoggingResourceable.wrap(forum)); + + forumPanel = createVelocityContainer("forum"); + + // --- subscription --- + subsContext = focallback.getSubscriptionContext(); + // if sc is null, then no subscription is desired + if (subsContext != null && showSubscriptionButton) { + String businessPath = wControl.getBusinessControl().getAsString(); + String data = String.valueOf(forum.getKey()); + PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(Forum.class), data, businessPath); + + csc = new ContextualSubscriptionController(ureq, getWindowControl(), subsContext, pdata); + listenTo(csc); + forumPanel.put("subscription", csc.getInitialComponent()); + } + + threadListCtrl = new ThreadListController(ureq, getWindowControl(), forum, focallback); + listenTo(threadListCtrl); + threadListCtrl.loadModel(); + + // Default view + putInitialPanel(forumPanel); + putContent(threadListCtrl); + + // Register for forum events + CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, getIdentity(), forum); + } + + @Override + protected void doDispose() { + CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, forum); + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + if(entries == null || entries.isEmpty()) { + doThreadList(ureq); + } else { + String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); + if("Message".equalsIgnoreCase(type)) { + Long resId = entries.get(0).getOLATResourceable().getResourceableId(); + if (resId.longValue() != 0) { + Message message = fm.getMessageById(resId); + if (message != null) { + doThreadList(ureq); + Message thread = message.getThreadtop() == null ? message : message.getThreadtop(); + + String subType = null; + if(entries.size() > 1) { + subType = entries.get(1).getOLATResourceable().getResourceableTypeName(); + } + + if("Marked".equalsIgnoreCase(subType)) { + doMarkedView(ureq, thread, message); + } else if("New".equalsIgnoreCase(subType)) { + doMarkedView(ureq, thread, message); + } else { + doThreadView(ureq, thread, message); + } + } + } + } else if("Identity".equalsIgnoreCase(type)) { + Long resId = entries.get(0).getOLATResourceable().getResourceableId(); + doUserList(ureq); + if (resId.longValue() > 0) { + doUserMessageList(ureq, resId); + } + } + } + } + + @Override + public void event(Event event) { + if(event instanceof ForumChangedEvent) { + ForumChangedEvent fce = (ForumChangedEvent)event; + if(fce.getMessageKey() == null) { + reloadThreadList = true; + } + } + } + + @Override + public void event(UserRequest ureq, Component source, Event event) { + // + } + + @Override + public void event(UserRequest ureq, Controller source, Event event) { + if (threadListCtrl == source) { + if(event instanceof SelectMessageEvent) { + doProcessSelectEvent(ureq, (SelectMessageEvent)event); + } else if(event instanceof SelectUserListEvent) { + doUserList(ureq); + } + } else if(viewCtrl == source) { + if(event == Event.BACK_EVENT) { + doThreadList(ureq); + } else if(event instanceof SelectMessageEvent) { + doProcessSelectEvent(ureq, (SelectMessageEvent)event); + } + } else if(userViewCtrl == source) { + if(event == Event.BACK_EVENT) { + cleanUpMessageViews(); + doUserList(ureq); + } else if(event instanceof SelectMessageEvent) { + doProcessSelectEvent(ureq, (SelectMessageEvent)event); + } + } else if(userListCtrl == source) { + if(event == Event.BACK_EVENT) { + removeAsListenerAndDispose(userListCtrl); + userListCtrl = null; + + doThreadList(ureq); + } else if(event instanceof SelectUserEvent) { + SelectUserEvent sue = (SelectUserEvent)event; + if(sue.isGuest()) { + doGuestMessageList(ureq); + } else if(StringHelper.containsNonWhitespace(sue.getPseudonym())) { + doPseudonymMessageList(ureq, sue.getIdentityKey(), sue.getPseudonym()); + } else if(sue.getIdentityKey() != null) { + doUserMessageList(ureq, sue.getIdentityKey()); + } + } + } + } + + private void doProcessSelectEvent(UserRequest ureq, SelectMessageEvent sme) { + Message thread = fm.getMessageById(sme.getMessageKey()); + Message scrollTo = null; + if(sme.getScrollToMessageKey() != null) { + scrollTo = fm.getMessageById(sme.getScrollToMessageKey()); + } + if(SelectMessageEvent.SELECT_THREAD.equals(sme.getCommand())) { + doThreadView(ureq, thread, scrollTo); + } else if(SelectMessageEvent.SELECT_MARKED.equals(sme.getCommand())) { + doMarkedView(ureq, thread, scrollTo); + } else if(SelectMessageEvent.SELECT_NEW.equals(sme.getCommand())) { + doNewView(ureq, thread, scrollTo); + } + } + + private void doThreadView(UserRequest ureq, Message thread, Message scrollTo) { + cleanUpMessageViews(); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Message", thread.getKey()); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + viewCtrl = new MessageListController(ureq, bwControl, forum, focallback); + viewCtrl.loadThread(ureq, thread); + viewCtrl.scrollTo(scrollTo); + listenTo(viewCtrl); + putContent(viewCtrl); + addToHistory(ureq, viewCtrl); + } + + private void doMarkedView(UserRequest ureq, Message thread, Message scrollTo) { + cleanUpMessageViews(); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Message", thread.getKey()); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + OLATResourceable markedOres = OresHelper.createOLATResourceableInstance("Marked", 0l); + WindowControl bbwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(markedOres, null, bwControl); + + viewCtrl = new MessageListController(ureq, bbwControl, forum, focallback); + viewCtrl.loadThread(ureq, thread); + viewCtrl.scrollTo(scrollTo); + viewCtrl.doShowMarked(); + listenTo(viewCtrl); + putContent(viewCtrl); + addToHistory(ureq, viewCtrl); + } + + private void doNewView(UserRequest ureq, Message thread, Message scrollTo) { + cleanUpMessageViews(); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Message", thread.getKey()); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + OLATResourceable markedOres = OresHelper.createOLATResourceableInstance("New", 0l); + WindowControl bbwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(markedOres, null, bwControl); + + viewCtrl = new MessageListController(ureq, bbwControl, forum, focallback); + viewCtrl.loadThread(ureq, thread); + viewCtrl.scrollTo(scrollTo); + viewCtrl.doShowMarked(); + listenTo(viewCtrl); + putContent(viewCtrl); + addToHistory(ureq, viewCtrl); + } + + private void doUserMessageList(UserRequest ureq, Long identityKey) { + cleanUpMessageViews(); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Identity", identityKey); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + userViewCtrl = new MessageListController(ureq, bwControl, forum, focallback); + Identity user = securityManager.loadIdentityByKey(identityKey); + userViewCtrl.loadUserMessages(ureq, user); + listenTo(userViewCtrl); + putContent(userViewCtrl); + addToHistory(ureq, userViewCtrl); + } + + private void doGuestMessageList(UserRequest ureq) { + cleanUpMessageViews(); + + userViewCtrl = new MessageListController(ureq, getWindowControl(), forum, focallback); + userViewCtrl.loadGuestMessages(ureq); + listenTo(userViewCtrl); + putContent(userViewCtrl); + } + + private void doPseudonymMessageList(UserRequest ureq, Long identityKey, String pseudonym) { + cleanUpMessageViews(); + + userViewCtrl = new MessageListController(ureq, getWindowControl(), forum, focallback); + Identity user = securityManager.loadIdentityByKey(identityKey); + userViewCtrl.loadUserMessagesUnderPseudo(ureq, user, pseudonym); + listenTo(userViewCtrl); + putContent(userViewCtrl); + } + + private void doThreadList(UserRequest ureq) { + cleanUpMessageViews(); + + if(reloadThreadList) { + threadListCtrl.loadModel(); + reloadThreadList = false; + } + + putContent(threadListCtrl); + addToHistory(ureq, threadListCtrl); + } + + private void doUserList(UserRequest ureq) { + cleanUpMessageViews(); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("Identity", 0l); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); + userListCtrl = new ForumUserListController(ureq, bwControl, forum); + listenTo(userListCtrl); + putContent(userListCtrl); + addToHistory(ureq, userListCtrl); + } + + private void putContent(Controller controller) { + forumPanel.put("forum", controller.getInitialComponent()); + } + + private void cleanUpMessageViews() { + removeAsListenerAndDispose(userViewCtrl); + removeAsListenerAndDispose(viewCtrl); + userViewCtrl = null; + viewCtrl = null; + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java b/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java new file mode 100644 index 00000000000..b0d34b3d8e7 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumMessageDataModel.java @@ -0,0 +1,112 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.List; +import java.util.Locale; + +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.StringHelper; +import org.olat.group.ui.main.AbstractMemberListController; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumMessageDataModel extends DefaultFlexiTableDataModel<MessageLightView> + implements SortableFlexiTableDataModel<MessageLightView> { + + private Translator translator; + + public ForumMessageDataModel(FlexiTableColumnModel columnModel, Translator translator) { + super(columnModel); + this.translator = translator; + } + + @Override + public void sort(SortKey orderBy) { + if(orderBy != null) { + List<MessageLightView> views = new ForumMessageDataModelSort(orderBy, this, null).sort(); + super.setObjects(views); + } + } + + @Override + public Object getValueAt(int row, int col) { + MessageLightView view = getObject(row); + return getValueAt(view, col); + } + + @Override + public Object getValueAt(MessageLightView row, int col) { + if(col >= 0 && col < ForumMessageCols.values().length) { + switch(ForumMessageCols.values()[col]) { + case type: return row.getStatusCode(); + case thread: return row.getTitle(); + case lastModified: return row.getLastModified(); + default: return "ERROR"; + } + } + + int propPos = col - AbstractMemberListController.USER_PROPS_OFFSET; + if(StringHelper.containsNonWhitespace(row.getPseudonym())) { + return propPos == 0 ? row.getPseudonym() : null; + } + if(row.isGuest()) { + return propPos == 0 ? translator.translate("guest") : null; + } + return row.getIdentityProp(propPos); + } + + @Override + public DefaultFlexiTableDataModel<MessageLightView> createCopyWithEmptyList() { + return new ForumMessageDataModel(getTableColumnModel(), translator); + } + + public enum ForumMessageCols { + type("table.header.typeimg"), + thread("table.thread"), + lastModified("table.lastModified"); + + private final String i18nKey; + + private ForumMessageCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + public String i18nKey() { + return i18nKey; + } + } + + public class ForumMessageDataModelSort extends SortableFlexiTableModelDelegate<MessageLightView> { + + public ForumMessageDataModelSort(SortKey orderBy, SortableFlexiTableDataModel<MessageLightView> tableModel, Locale locale) { + super(orderBy, tableModel, locale); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java b/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java new file mode 100644 index 00000000000..f56811de6e9 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumMessageListController.java @@ -0,0 +1,232 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRowCssDelegate; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.UserConstants; +import org.olat.core.util.Util; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.MessageLight; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.ui.ForumMessageDataModel.ForumMessageCols; +import org.olat.modules.fo.ui.events.SelectMessageEvent; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumMessageListController extends FormBasicController implements FlexiTableRowCssDelegate { + + protected static final String USER_PROPS_ID = ForumUserListController.class.getCanonicalName(); + + public static final int USER_PROPS_OFFSET = 500; + + private FlexiTableElement tableEl; + private ForumMessageDataModel dataModel; + + private final Forum forum; + private final boolean withType; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + private MessageView userObject, selectView; + + @Autowired + private UserManager userManager; + @Autowired + private ForumManager forumManager; + @Autowired + private BaseSecurityModule securityModule; + + public ForumMessageListController(UserRequest ureq, WindowControl wControl, + Forum forum, boolean withType) { + super(ureq, wControl, LAYOUT_BAREBONE); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); + + this.forum = forum; + this.withType = withType; + + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); + + initForm(ureq); + } + + public MessageView getUserObject() { + return userObject; + } + + public void setUserObject(MessageView userObject) { + this.userObject = userObject; + } + + public MessageView getSelectView() { + return selectView; + } + + public void setSelectView(MessageView selectView) { + this.selectView = selectView; + } + + @Override + public String getRowCssClass(int pos) { + MessageLightView row = dataModel.getObject(pos); + return row != null && selectView != null && row.getKey().equals(selectView.getKey()) ? "o_row_selected" : null; + } + + public void loadAllMessages() { + List<MessageLight> allMessages = forumManager.getLightMessagesByForum(forum); + List<MessageLightView> views = new ArrayList<>(allMessages.size()); + Map<Long,MessageLightView> keyToViews = new HashMap<>(); + for(MessageLight message:allMessages) { + MessageLightView view = new MessageLightView(message, userPropertyHandlers, getLocale()); + views.add(view); + keyToViews.put(view.getKey(), view); + } + + //TODO forum: implement a reorder method which works on threads and parent line + /*calculate depth + + for(MessageLightView view:views) { + if(view.getParentKey() == null) { + view.setDepth(0); + } else { + view.setDepth(1); + for(MessageLightView parent = keyToViews.get(view.getParentKey()); parent != null; parent = keyToViews.get(parent.getParentKey())) { + view.setDepth(view.getDepth() + 1); + } + } + } + + //order + */ + + dataModel.setObjects(views); + } + /* + private class MessageComparator implements Comparator<MessageLightView> { + + @Override + public int compare(MessageLightView v1, MessageLightView v2) { + Long tt1 = v1.getThreadtopKey() == null ? v1.getKey() : v1.getThreadtopKey(); + Long tt2 = v2.getThreadtopKey() == null ? v2.getKey() : v2.getThreadtopKey(); + int c = Long.compare(tt1.longValue(), tt2.longValue()); + if(c == 0) { + + } + return c; + } + } + */ + + public void loadMessages(List<MessageLightView> views) { + dataModel.setObjects(views); + tableEl.reloadData(); + tableEl.reset(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + if(withType) { + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ForumMessageCols.type.i18nKey(), ForumMessageCols.type.ordinal(), + true, ForumMessageCols.type.name(), new StatusTypeCellRenderer())); + } + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(ForumMessageCols.thread.i18nKey(), ForumMessageCols.thread.ordinal(), + "select", true, ForumMessageCols.thread.name(), new StaticFlexiCellRenderer("select", new IndentCellRenderer()))); + + int colPos = USER_PROPS_OFFSET; + for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { + if (userPropertyHandler == null) continue; + + String propName = userPropertyHandler.getName(); + boolean visible = userManager.isMandatoryUserProperty(USER_PROPS_ID , userPropertyHandler); + + FlexiColumnModel col; + if(UserConstants.FIRSTNAME.equals(propName) || UserConstants.LASTNAME.equals(propName)) { + col = new StaticFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, "select", true, propName, + new StaticFlexiCellRenderer("select", new TextFlexiCellRenderer())); + } else { + col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, true, propName); + } + columnsModel.addFlexiColumnModel(col); + colPos++; + } + + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ForumMessageCols.lastModified.i18nKey(), ForumMessageCols.lastModified.ordinal(), + true, ForumMessageCols.lastModified.name())); + + dataModel = new ForumMessageDataModel(columnsModel, getTranslator()); + tableEl = uifactory.addTableElement(getWindowControl(), "messages", dataModel, getTranslator(), formLayout); + tableEl.setRowCssDelegate(this); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(tableEl == source) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + String cmd = se.getCommand(); + if("select".equals(cmd)) { + MessageLightView message = dataModel.getObject(se.getIndex()); + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_MESSAGE, message.getKey())); + } + } + } + super.formInnerEvent(ureq, source, event); + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/ForumUserDataModel.java b/src/main/java/org/olat/modules/fo/ui/ForumUserDataModel.java new file mode 100644 index 00000000000..4eca55c8002 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumUserDataModel.java @@ -0,0 +1,116 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.List; +import java.util.Locale; + +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.StringHelper; +import org.olat.group.ui.main.AbstractMemberListController; +import org.olat.modules.fo.model.ForumUser; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumUserDataModel extends DefaultFlexiTableDataModel<ForumUser> + implements SortableFlexiTableDataModel<ForumUser> { + + private Translator translator; + + public ForumUserDataModel(FlexiTableColumnModel columnsModel, Translator translator) { + super(columnsModel); + this.translator = translator; + } + + @Override + public void sort(SortKey orderBy) { + if(orderBy != null) { + List<ForumUser> views = new ForumUserDataModelSort(orderBy, this, null).sort(); + super.setObjects(views); + } + } + + @Override + public Object getValueAt(int row, int col) { + ForumUser forumUser = getObject(row); + return getValueAt(forumUser, col); + } + + @Override + public Object getValueAt(ForumUser row, int col) { + if(col >= 0 && col < UserCols.values().length) { + switch(UserCols.values()[col]) { + case replies: return row.getNumOfReplies(); + case threads: return row.getNumOfThreads(); + case lastModified: return row.getLastModified(); + case numOfWords: return row.getNumOfWords(); + case numOfCharacters: return row.getNumOfCharacters(); + } + } + + int propPos = col - AbstractMemberListController.USER_PROPS_OFFSET; + if(StringHelper.containsNonWhitespace(row.getPseudonym())) { + return propPos == 0 ? row.getPseudonym() : null; + } + if(row.isGuest()) { + return propPos == 0 ? translator.translate("guest") : null; + } + return row.getIdentityProp(propPos); + } + + @Override + public DefaultFlexiTableDataModel<ForumUser> createCopyWithEmptyList() { + return new ForumUserDataModel(getTableColumnModel(), translator); + } + + public enum UserCols { + replies("table.user.replies"), + threads("table.user.threads"), + lastModified("table.lastModified"), + numOfWords("table.numOfCharacters"), + numOfCharacters("table.numOfWords"); + + private final String i18nKey; + + private UserCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + public String i18nKey() { + return i18nKey; + } + } + + public class ForumUserDataModelSort extends SortableFlexiTableModelDelegate<ForumUser> { + + public ForumUserDataModelSort(SortKey orderBy, SortableFlexiTableDataModel<ForumUser> tableModel, Locale locale) { + super(orderBy, tableModel, locale); + } + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/ForumUserListController.java b/src/main/java/org/olat/modules/fo/ui/ForumUserListController.java new file mode 100644 index 00000000000..3c28ecb92a8 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ForumUserListController.java @@ -0,0 +1,177 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.UserConstants; +import org.olat.core.util.Util; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.model.ForumUser; +import org.olat.modules.fo.model.ForumUserStatistics; +import org.olat.modules.fo.ui.ForumUserDataModel.UserCols; +import org.olat.modules.fo.ui.events.SelectUserEvent; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ForumUserListController extends FormBasicController { + + protected static final String USER_PROPS_ID = ForumUserListController.class.getCanonicalName(); + + public static final int USER_PROPS_OFFSET = 500; + + private FormLink backLink; + private FlexiTableElement tableEl; + private ForumUserDataModel dataModel; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + + private final Forum forum; + + @Autowired + private UserManager userManager; + @Autowired + private ForumManager forumManager; + @Autowired + private BaseSecurityModule securityModule; + + public ForumUserListController(UserRequest ureq, WindowControl wControl, Forum forum) { + super(ureq, wControl, "user_list"); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); + + this.forum = forum; + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); + + initForm(ureq); + loadModel(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + backLink = uifactory.addFormLink("back", formLayout, Link.LINK_BACK); + + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + + int colPos = USER_PROPS_OFFSET; + for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { + if (userPropertyHandler == null) continue; + + String propName = userPropertyHandler.getName(); + boolean visible = userManager.isMandatoryUserProperty(USER_PROPS_ID , userPropertyHandler); + + FlexiColumnModel col; + if(UserConstants.FIRSTNAME.equals(propName) || UserConstants.LASTNAME.equals(propName)) { + col = new StaticFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, "select", true, propName, + new StaticFlexiCellRenderer("select", new TextFlexiCellRenderer())); + } else { + col = new DefaultFlexiColumnModel(visible, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos, true, propName); + } + columnsModel.addFlexiColumnModel(col); + colPos++; + } + + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserCols.threads.i18nKey(), UserCols.threads.ordinal(), + true, UserCols.threads.name())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserCols.replies.i18nKey(), UserCols.replies.ordinal(), + true, UserCols.replies.name())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserCols.lastModified.i18nKey(), UserCols.lastModified.ordinal(), + true, UserCols.lastModified.name())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserCols.numOfWords.i18nKey(), UserCols.numOfWords.ordinal(), + true, UserCols.numOfWords.name())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(UserCols.numOfCharacters.i18nKey(), UserCols.numOfCharacters.ordinal(), + true, UserCols.numOfCharacters.name())); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("viewswitch.title", translate("viewswitch.title"), "select")); + + dataModel = new ForumUserDataModel(columnsModel, getTranslator()); + tableEl = uifactory.addTableElement(getWindowControl(), "users", dataModel, getTranslator(), formLayout); + tableEl.setPageSize(50); + } + + private void loadModel() { + List<ForumUserStatistics> statisticsList = forumManager.getForumUserStatistics(forum); + List<ForumUser> users = new ArrayList<>(statisticsList.size()); + for(ForumUserStatistics statistics:statisticsList) { + users.add(new ForumUser(statistics, userPropertyHandlers, getLocale())); + } + dataModel.setObjects(users); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(backLink == source) { + fireEvent(ureq, Event.BACK_EVENT); + } else if(tableEl == source) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + String cmd = se.getCommand(); + if("select".equals(cmd)) { + ForumUser user = dataModel.getObject(se.getIndex()); + doSelect(ureq, user.getIdentityKey(), user.getPseudonym(), user.isGuest()); + } + } + } + super.formInnerEvent(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + private void doSelect(UserRequest ureq, Long identityKey, String pseudonym, boolean guest) { + fireEvent(ureq, new SelectUserEvent(identityKey, pseudonym, guest)); + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java b/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java new file mode 100644 index 00000000000..d4bdcf7de56 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/IndentCellRenderer.java @@ -0,0 +1,59 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.Formatter; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class IndentCellRenderer implements FlexiCellRenderer { + + private static final int MAXINDENTS = 20; + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + + Object m = source.getFlexiTableElement().getTableDataModel().getObject(row); + if(m instanceof MessageLightView && cellValue instanceof String) { + MessageLightView message = (MessageLightView)m; + int indent = message.getDepth(); + if (indent > MAXINDENTS) { + indent = MAXINDENTS; + } + target.append("<div style=\"white-space: nowrap;") + .append("padding-left: ").append(indent).append("em;\">") + .append(Formatter.truncate((String)cellValue, 50 - indent)) + .append("</div>"); + } else if(cellValue instanceof String) { + target.append((String)cellValue); + } + } +} diff --git a/src/main/java/org/olat/modules/fo/MessageEditController.java b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java similarity index 57% rename from src/main/java/org/olat/modules/fo/MessageEditController.java rename to src/main/java/org/olat/modules/fo/ui/MessageEditController.java index aed86d9b60c..e9522f34a55 100644 --- a/src/main/java/org/olat/modules/fo/MessageEditController.java +++ b/src/main/java/org/olat/modules/fo/ui/MessageEditController.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.fo; +package org.olat.modules.fo.ui; import java.io.File; import java.io.IOException; @@ -25,15 +25,16 @@ import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Iterator; import java.util.List; +import org.olat.basesecurity.BaseSecurity; +import org.olat.basesecurity.IdentityShort; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; +import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.FormUIFactory; import org.olat.core.gui.components.form.flexible.elements.FileElement; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; @@ -50,17 +51,27 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.Identity; import org.olat.core.logging.AssertException; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.CodeHelper; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.WebappHelper; +import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.vfs.LocalFolderImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.ForumChangedEvent; +import org.olat.modules.fo.ForumLoggingAction; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.user.DisplayPortraitController; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<br> @@ -74,10 +85,6 @@ import org.olat.user.DisplayPortraitController; */ public class MessageEditController extends FormBasicController { - protected static final String EDITMODE_NEWTHREAD = "newthread"; - protected static final String EDITMODE_EDITMSG = "editmsg"; - protected static final String EDITMODE_REPLYMSG = "replymsg"; - private static final String STICKY_SET_IDENTIFIER = "stickyset"; private static final String CMD_DELETE_ATTACHMENT = "delete.attachment."; protected static final Integer MAX_BODY_LENGTH = 32000; @@ -86,25 +93,42 @@ public class MessageEditController extends FormBasicController { // attached files anywhere at the time of deleting it // likely to be resolved after user logs out, caches get cleared - and if not the server // restart overnight definitely removes those .nfs files. - protected static final String[] ATTACHMENT_EXCLUDE_PREFIXES = new String[]{".nfs", ".CVS", ".DS_Store"}; - - private ForumCallback forumCallback; - private TextElement msgTitle; - private RichTextElement msgBody; - private MultipleSelectionElement stickyCheckBox; - private String editMode; + public static final String[] ATTACHMENT_EXCLUDE_PREFIXES = new String[]{".nfs", ".CVS", ".DS_Store"}; + private static final String[] enableKeys = new String[]{ "on" }; + + private RichTextElement bodyEl; + private TextElement titleEl, pseudonymEl; + private MultipleSelectionElement usePseudonymEl; private FileElement fileUpload; - private Message message, replyMessage = null; + private DisplayPortraitController portraitCtr; - private ForumManager fm; - private DialogBoxController delAttCtr; + private DialogBoxController confirmDeleteAttachmentCtrl; + private VFSContainer tempUploadFolder; private boolean userIsMsgCreator; private boolean msgHasChildren; private VFSItemExcludePrefixFilter exclFilter; - + private final Forum forum; + private final EditMode editMode; + private final boolean guestOnly; + private String proposedPseudonym; + private final ForumCallback foCallback; + private Message message, parentMessage; + + @Autowired + private ForumManager fm; + @Autowired + private BaseSecurity securityManager; + @Autowired + private NotificationsManager notificationsManager; + + public enum EditMode { + newThread, + edit, + reply + } /** * @@ -114,29 +138,21 @@ public class MessageEditController extends FormBasicController { * @param message may be a new message created by ForumManager.createMessage() which is not yet saved in db * @param quoteMessage may be null if Editor isn't used to reply to a message */ - public MessageEditController(UserRequest ureq, WindowControl control, ForumCallback forumCallback, Message message, Message quoteMessage) { + public MessageEditController(UserRequest ureq, WindowControl control, Forum forum, ForumCallback foCallback, + Message message, Message parentMessage, EditMode mode) { super(ureq, control, FormBasicController.LAYOUT_VERTICAL); - this.forumCallback = forumCallback; + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + + this.forum = forum; + this.editMode = mode; this.message = message; - this.fm = ForumManager.getInstance(); + this.foCallback = foCallback; + this.parentMessage = parentMessage; + this.guestOnly = ureq.getUserSession().getRoles().isGuestOnly(); tempUploadFolder = new LocalFolderImpl(new File(WebappHelper.getTmpDir(), CodeHelper.getUniqueID())); - // nfs creates .nfs12345 - files during deletion, those shouldn't be displayed / copied after save - // See OLAT-4182 and OLAT-4219 exclFilter = new VFSItemExcludePrefixFilter(ATTACHMENT_EXCLUDE_PREFIXES); - // decide which mode is used - this.editMode = ""; - if (message.getKey() == null) { - editMode = EDITMODE_NEWTHREAD; - } else if (quoteMessage == null && message.getKey() != null) { - editMode = EDITMODE_EDITMSG; - } else if (quoteMessage != null) { - editMode = EDITMODE_REPLYMSG; - this.replyMessage = message; - this.message = quoteMessage; - } else throw new AssertException( - "EditModus for Forum could not be determined. Error in logic or wrong parameters for this constructor", null); initForm(ureq); } @@ -148,40 +164,61 @@ public class MessageEditController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { formLayout.setElementCssClass("o_sel_forum_message_form"); - msgTitle = uifactory.addTextElement("msgTitle", "msg.title", 100, message.getTitle(), formLayout); - msgTitle.setElementCssClass("o_sel_forum_message_title"); - msgTitle.setMandatory(true); - msgTitle.setNotEmptyCheck("error.field.not.empty"); - msgBody = uifactory.addRichTextElementForStringData("msgBody", "msg.body", message.getBody(), 15, -1, true, null, null, + titleEl = uifactory.addTextElement("msgTitle", "msg.title", 100, message.getTitle(), formLayout); + titleEl.setElementCssClass("o_sel_forum_message_title"); + titleEl.setMandatory(true); + titleEl.setNotEmptyCheck("error.field.not.empty"); + bodyEl = uifactory.addRichTextElementForStringData("msgBody", "msg.body", message.getBody(), 15, -1, true, null, null, formLayout, ureq.getUserSession(), getWindowControl()); - msgBody.setMandatory(true); - msgBody.setNotEmptyCheck("error.field.not.empty"); - msgBody.setMaxLength(MAX_BODY_LENGTH); - msgBody.setNotLongerThanCheck(MAX_BODY_LENGTH, "input.toolong"); - - // attachment upload - uifactory.addStaticTextElement("attachmentTitle", null, translate("attachments"), formLayout);//null -> no label + bodyEl.setMandatory(true); + bodyEl.setNotEmptyCheck("error.field.not.empty"); + bodyEl.setMaxLength(MAX_BODY_LENGTH); + bodyEl.setNotLongerThanCheck(MAX_BODY_LENGTH, "input.toolong"); - setEditPermissions(ureq, message); + setEditPermissions(message); // list existing attachments. init attachment layout now, to place it in // right position createOrUpdateAttachmentListLayout(formLayout); // provide upload field - if (forumCallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (msgHasChildren == false))) { + if (foCallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (msgHasChildren == false))) { fileUpload = uifactory.addFileElement(getWindowControl(), "msg.upload", formLayout); fileUpload.addActionListener(FormEvent.ONCHANGE); fileUpload.setMaxUploadSizeKB((int) FolderConfig.getLimitULKB(), "attachments.too.big", new String[] { ((Long) (FolderConfig .getLimitULKB() / 1024)).toString() }); } - - // show stickyCheckBox only if moderator and message is threadtop - stickyCheckBox = uifactory.addCheckboxesHorizontal("stickyCheckBox", null, formLayout, new String[] { STICKY_SET_IDENTIFIER }, - new String[] { translate("msg.sticky") }); - Status msgStatus = Status.getStatus(message.getStatusCode()); - if (msgStatus.isSticky()) stickyCheckBox.select(STICKY_SET_IDENTIFIER, true); - if (!(forumCallback.mayEditMessageAsModerator() && message.getParent() == null)) { - stickyCheckBox.setVisible(false); + + if(foCallback.mayUsePseudonym() || guestOnly) { + String[] enablePseudonymValues = new String[]{ translate("use.pseudonym.label") }; + usePseudonymEl = uifactory.addCheckboxesHorizontal("use.pseudonym", formLayout, enableKeys, enablePseudonymValues); + if(StringHelper.containsNonWhitespace(message.getPseudonym()) || guestOnly) { + usePseudonymEl.select(enableKeys[0], true); + } + pseudonymEl = uifactory.addTextElement("pseudonym", "pseudonym", 128, message.getPseudonym(), formLayout); + + if(guestOnly) { + usePseudonymEl.setVisible(false); + pseudonymEl.setLabel("use.pseudonym", null); + pseudonymEl.setMandatory(true); + proposedPseudonym = (String)ureq.getUserSession().getEntry("FOPseudo" + forum.getKey()); + if(StringHelper.containsNonWhitespace(proposedPseudonym)) { + pseudonymEl.setValue(proposedPseudonym); + } + } else if(userIsMsgCreator) { + pseudonymEl.setLabel(null, null); + usePseudonymEl.addActionListener(FormEvent.ONCHANGE); + proposedPseudonym = fm.getPseudonym(forum, getIdentity()); + if(StringHelper.containsNonWhitespace(proposedPseudonym)) { + pseudonymEl.setValue(proposedPseudonym); + usePseudonymEl.select(enableKeys[0], true); + } + usePseudonymEl.setMandatory(usePseudonymEl.isAtLeastSelected(1)); + pseudonymEl.setVisible(usePseudonymEl.isAtLeastSelected(1)); + } else { + usePseudonymEl.setVisible(false); + pseudonymEl.setLabel("use.pseudonym", null); + pseudonymEl.setEnabled(false); + } } // save and cancel buttons @@ -191,38 +228,44 @@ public class MessageEditController extends FormBasicController { uifactory.addFormCancelButton("msg.cancel", buttonLayout, ureq, getWindowControl()); // show message replying to, if in reply modus - if (editMode.equals(EDITMODE_REPLYMSG)) { - FormLayoutContainer replyMsgLayout = FormLayoutContainer.createCustomFormLayout("replyMsg", getTranslator(), Util - .getPackageVelocityRoot(this.getClass()) - + "/msg-preview.html"); + if (editMode == EditMode.reply) { + String previewPage = Util.getPackageVelocityRoot(this.getClass()) + "/msg-preview.html"; + FormLayoutContainer replyMsgLayout = FormLayoutContainer.createCustomFormLayout("replyMsg", getTranslator(), previewPage); uifactory.addSpacerElement("spacer1", formLayout, false); formLayout.add(replyMsgLayout); - replyMsgLayout.setLabel("label.replytomsg", new String[] { StringHelper.escapeHtml(replyMessage.getTitle()) }); - Identity identity = replyMessage.getCreator(); - replyMsgLayout.contextPut("identity", identity); - replyMsgLayout.contextPut("messageBody", replyMessage.getBody()); - replyMsgLayout.contextPut("message", replyMessage); - portraitCtr = new DisplayPortraitController(ureq, getWindowControl(), identity, true, true); - replyMsgLayout.put("portrait", portraitCtr.getInitialComponent()); + + replyMsgLayout.setLabel("label.replytomsg", new String[] { StringHelper.escapeHtml(parentMessage.getTitle()) }); + replyMsgLayout.contextPut("messageBody", parentMessage.getBody()); + replyMsgLayout.contextPut("message", parentMessage); + replyMsgLayout.contextPut("guestOnly", new Boolean(guestOnly)); + + Identity creator = parentMessage.getCreator(); + if(creator != null) { + replyMsgLayout.contextPut("identity", creator); + portraitCtr = new DisplayPortraitController(ureq, getWindowControl(), creator, true, true); + replyMsgLayout.put("portrait", portraitCtr.getInitialComponent()); + } } - } - private void setEditPermissions(UserRequest ureq, Message msg){ + private void setEditPermissions(Message msg){ // defaults for a new message userIsMsgCreator = true; msgHasChildren = false; // set according to message if (msg.getKey() != null) { - userIsMsgCreator = ureq.getIdentity().getKey().equals(msg.getCreator().getKey()); - msgHasChildren = fm.hasChildren(msg); + if(msg.getCreator() != null) { + + } else { + userIsMsgCreator = getIdentity().equals(msg.getCreator()); + msgHasChildren = fm.hasChildren(msg); + } } } // adds or updates the list of already existing attachments with a delete // button for each private void createOrUpdateAttachmentListLayout(FormItemContainer formLayout) { - FormUIFactory formUIf = FormUIFactory.getInstance(); FormItem attachLayout = formLayout.getFormComponent("attachLayout"); List<VFSItem> attachments = new ArrayList<VFSItem>(); @@ -252,10 +295,9 @@ public class MessageEditController extends FormBasicController { // add delete links for each attachment if user is allowed to see them int attNr = 1; - for (Iterator<VFSItem> iterator = attachments.iterator(); iterator.hasNext();) { - VFSItem tmpFile = iterator.next(); - FormLink tmpLink = formUIf.addFormLink(CMD_DELETE_ATTACHMENT + attNr, tmpLayout, Link.BUTTON_XSMALL); - if (!(forumCallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (msgHasChildren == false)))) { + for (VFSItem tmpFile : attachments) { + FormLink tmpLink = uifactory.addFormLink(CMD_DELETE_ATTACHMENT + attNr, tmpLayout, Link.BUTTON_XSMALL); + if (!(foCallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (msgHasChildren == false)))) { tmpLink.setEnabled(false); tmpLink.setVisible(false); } @@ -275,10 +317,43 @@ public class MessageEditController extends FormBasicController { portraitCtr.dispose(); portraitCtr = null; } - if (delAttCtr != null) { - delAttCtr.dispose(); - delAttCtr = null; + if (confirmDeleteAttachmentCtrl != null) { + confirmDeleteAttachmentCtrl.dispose(); + confirmDeleteAttachmentCtrl = null; + } + } + + @Override + protected boolean validateFormLogic(UserRequest ureq) { + boolean allOk = true; + if(usePseudonymEl != null) { + pseudonymEl.clearError(); + if(guestOnly || usePseudonymEl.isAtLeastSelected(1)) { + if(!StringHelper.containsNonWhitespace(pseudonymEl.getValue())) { + pseudonymEl.setErrorKey("form.legende.mandatory", null); + allOk &= false; + } else if(!validatePseudonym(pseudonymEl.getValue())) { + pseudonymEl.setErrorKey("error.pseudonym", null); + allOk &= false; + } + } + } + return allOk & super.validateFormLogic(ureq); + } + + private boolean validatePseudonym(String value) { + boolean allOk = true; + + if(proposedPseudonym == null || !proposedPseudonym.equalsIgnoreCase(value)) { + List<IdentityShort> sameValues = securityManager.searchIdentityShort(value, 250); + if(sameValues.size() == 1) { + allOk &= !sameValues.get(0).getKey().equals(getIdentity().getKey()); + } else if(sameValues.size() > 1) { + allOk &= false; + } } + + return allOk; } /** @@ -288,21 +363,76 @@ public class MessageEditController extends FormBasicController { protected void formOK(UserRequest ureq) { // if msg exist -> persist uploads directly to final dest if (message.getKey() != null) { - persistTempUploadedFiles(message); - } - // prevent modifying an old object! - if (getLastEditModus().equals(EDITMODE_EDITMSG)) { message = fm.loadMessage(message.getKey()); } + // set values from form to message - saveValuesToMessage(message); + message.setTitle(titleEl.getValue()); + String body = bodyEl.getValue(); + + String tinyBlanc = "<p> "; + if(body.startsWith(tinyBlanc)) { + body = "<p>" + body.substring(tinyBlanc.length(), body.length()); + } + + message.setBody(body.trim()); + if(usePseudonymEl != null && usePseudonymEl.isAtLeastSelected(1)) { + message.setPseudonym(pseudonymEl.getValue()); + if(guestOnly) { + ureq.getUserSession().putEntry("FOPseudo" + forum.getKey(), message.getPseudonym()); + } + } else if(message.getCreator() != null && message.getCreator().equals(getIdentity())) { + message.setPseudonym(null); + } + + if(editMode == EditMode.newThread) { + if(foCallback.mayOpenNewThread()) { + // save a new thread + fm.addTopMessage(message); + fm.markAsRead(getIdentity(), forum, message); + // if notification is enabled -> notify the publisher about news + + notifiySubscription(); + addLoggingResourceable(LoggingResourceable.wrap(message)); + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.NEW, message.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forum); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_CREATE, getClass()); + } else { + showWarning("may.not.save.msg.as.author"); + } + + } else if(editMode == EditMode.edit) { + boolean children = fm.countMessageChildren(message.getKey()) > 0; + if (foCallback.mayEditMessageAsModerator() || (userIsMsgCreator && !children)) { + message.setModifier(getIdentity()); + message = fm.updateMessage(message, true); + persistTempUploadedFiles(message); + + notifiySubscription(); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_EDIT, getClass(), + LoggingResourceable.wrap(message)); + } else { + showWarning("may.not.save.msg.as.author"); + } + } else if(editMode == EditMode.reply) { + fm.replyToMessage(message, parentMessage); + fm.markAsRead(getIdentity(), forum, message); + persistTempUploadedFiles(message); + + notifiySubscription(); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_REPLY_MESSAGE_CREATE, getClass(), + LoggingResourceable.wrap(message)); + } + fireEvent(ureq, Event.DONE_EVENT); } + + private void notifiySubscription() { + if (foCallback.getSubscriptionContext() != null) { + notificationsManager.markPublisherNews(foCallback.getSubscriptionContext(), getIdentity(), true); + } + } - /** - * - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formCancelled(org.olat.core.gui.UserRequest) - */ @Override protected void formCancelled(UserRequest ureq) { // remove uploaded files if editing is canceled @@ -310,14 +440,12 @@ public class MessageEditController extends FormBasicController { fireEvent(ureq, Event.CANCELLED_EVENT); } - /** - * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.form.flexible.FormItem, - * org.olat.core.gui.components.form.flexible.impl.FormEvent) - */ @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if (source == fileUpload) { + if(usePseudonymEl == source) { + usePseudonymEl.setMandatory(usePseudonymEl.isAtLeastSelected(1)); + pseudonymEl.setVisible(usePseudonymEl.isAtLeastSelected(1)); + } else if (source == fileUpload) { if (fileUpload.isUploadSuccess()) { String fileName = fileUpload.getUploadFileName(); if (fileUpload.getUploadSize() / 1024 < fileUpload.getMaxUploadSizeKB()) { @@ -359,12 +487,12 @@ public class MessageEditController extends FormBasicController { // attachment delete button may have been pressed Object userObj = activeLink.getUserObject(); if (userObj != null) { - setEditPermissions(ureq, message); + setEditPermissions(message); if (userObj instanceof VFSLeaf) { VFSLeaf file = (VFSLeaf) userObj; - if (forumCallback.mayEditMessageAsModerator() || ((userIsMsgCreator) && (msgHasChildren == false))) { - delAttCtr = activateYesNoDialog(ureq, null, translate("reallydeleteAtt"), delAttCtr); - delAttCtr.setUserObject(file); + if (foCallback.mayEditMessageAsModerator() || (userIsMsgCreator && !msgHasChildren)) { + confirmDeleteAttachmentCtrl = activateYesNoDialog(ureq, null, translate("reallydeleteAtt"), confirmDeleteAttachmentCtrl); + confirmDeleteAttachmentCtrl.setUserObject(file); } else { if ((userIsMsgCreator) && (msgHasChildren == true)) { // user is author of the current message but it has already at @@ -394,50 +522,30 @@ public class MessageEditController extends FormBasicController { @Override protected void event(UserRequest ureq, Controller source, Event event) { super.event(ureq, source, event); - if (source == delAttCtr) { - if (DialogBoxUIFactory.isYesEvent(event)) { // ok to really delete this - // attachment - DialogBoxController dbCtr = (DialogBoxController) source; - Object userObj = dbCtr.getUserObject(); + if (source == confirmDeleteAttachmentCtrl) { + if (DialogBoxUIFactory.isYesEvent(event)) { // ok to really delete this // attachment + Object userObj = confirmDeleteAttachmentCtrl.getUserObject(); if (userObj instanceof VFSLeaf) { - VFSLeaf file = (VFSLeaf) userObj; - file.delete(); + ((VFSLeaf)userObj).delete(); showInfo("delete.att.ok"); - createOrUpdateAttachmentListLayout(this.flc); + createOrUpdateAttachmentListLayout(flc); } } } } - private void saveValuesToMessage(Message tmpMessage) { - tmpMessage.setTitle(msgTitle.getValue()); - String newBody = msgBody.getValue(); - // strip 1 empty line from beginning and end. - if (newBody.startsWith(ForumController.TINYMCE_EMPTYLINE_CODE)) { - newBody = newBody - .substring(newBody.indexOf(ForumController.TINYMCE_EMPTYLINE_CODE) + ForumController.TINYMCE_EMPTYLINE_CODE.length()); - } - if (newBody.endsWith(ForumController.TINYMCE_EMPTYLINE_CODE)) { - newBody = newBody.substring(0, newBody.lastIndexOf(ForumController.TINYMCE_EMPTYLINE_CODE)); - } - newBody = newBody.trim(); - tmpMessage.setBody(newBody); - Status msgStatus = Status.getStatus(tmpMessage.getStatusCode()); - boolean isSticky = stickyCheckBox.getSelectedKeys().contains(STICKY_SET_IDENTIFIER); - msgStatus.setSticky(isSticky); - tmpMessage.setStatusCode(Status.getStatusCode(msgStatus)); - } - /** * Used to get the message edited right before. the new values got saved to it * locally by formOK() * * @return the edited message */ - public Message getMessageBackAfterEdit() { + public Message getMessage() { if (!StringHelper.containsNonWhitespace(message.getTitle()) && message == null) { throw new AssertException("Getting back the edited message failed! You first have to edit one and intialize properly!"); - } else return message; + } else { + return message; + } } /** @@ -446,7 +554,7 @@ public class MessageEditController extends FormBasicController { * @return editMode which can be matched against static Strings from this * class */ - public String getLastEditModus() { + public EditMode getLastEditModus() { return editMode; } @@ -459,7 +567,7 @@ public class MessageEditController extends FormBasicController { */ public void persistTempUploadedFiles(Message tmpMessage) { if (tmpMessage == null) throw new AssertException("Message may not be null to persist temp files"); - VFSContainer msgContainer = fm.getMessageContainer(message.getForum().getKey(), message.getKey()); + VFSContainer msgContainer = fm.getMessageContainer(forum.getKey(), message.getKey()); if (msgContainer != null) { List<VFSItem> tmpFList = getTempFolderFileList(); for (VFSItem file : tmpFList) { @@ -485,5 +593,4 @@ public class MessageEditController extends FormBasicController { tempUploadFolder = null; } } - } diff --git a/src/main/java/org/olat/modules/fo/ui/MessageLightView.java b/src/main/java/org/olat/modules/fo/ui/MessageLightView.java new file mode 100644 index 00000000000..3f7cbd13fc6 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/MessageLightView.java @@ -0,0 +1,123 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import org.olat.modules.fo.MessageLight; +import org.olat.modules.fo.MessageRef; +import org.olat.user.UserPropertiesRow; +import org.olat.user.propertyhandlers.UserPropertyHandler; + +/** + * + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class MessageLightView extends UserPropertiesRow implements MessageRef { + + private final int type; + private final Long key; + private final String title; + + private final Long parentKey; + private final Date lastModified; + + private final boolean guest; + private final String pseudonym; + + private Long threadtopKey; + + private int depth; + private int numOfChildren = 0; + + public MessageLightView(MessageLight message, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { + super(message.getCreator(), userPropertyHandlers, locale); + key = message.getKey(); + type = message.getStatusCode(); + title = message.getTitle(); + guest = message.isGuest(); + pseudonym = message.getPseudonym(); + lastModified = message.getLastModified(); + parentKey = message.getParentKey(); + threadtopKey = message.getThreadtop().getKey(); + } + + @Override + public Long getKey() { + return key; + } + + public Long getParentKey() { + return parentKey; + } + + public Long getThreadtopKey() { + return threadtopKey; + } + + @Override + public int getStatusCode() { + return type; + } + + public String getTitle() { + return title; + } + + public Date getLastModified() { + return lastModified; + } + + public boolean isGuest() { + return guest; + } + + public String getPseudonym() { + return pseudonym; + } + + public int getDepth() { + return depth; + } + + public void setDepth(int depth) { + this.depth = depth; + } + + public boolean isHasChildren() { + return numOfChildren > 0; + } + + public int getNumOfChildren() { + return numOfChildren; + } + + public void setNumOfChildren(int numOfChildren) { + this.numOfChildren = numOfChildren; + } + + public boolean isThreadTop() { + return threadtopKey != null; + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/MessageListController.java b/src/main/java/org/olat/modules/fo/ui/MessageListController.java new file mode 100644 index 00000000000..81d76f0e1af --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java @@ -0,0 +1,1173 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.commons.modules.bc.meta.MetaInfo; +import org.olat.core.commons.modules.bc.meta.tagged.MetaTagged; +import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.services.mark.Mark; +import org.olat.core.commons.services.mark.MarkResourceStat; +import org.olat.core.commons.services.mark.MarkingService; +import org.olat.core.dispatcher.mapper.Mapper; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.link.LinkPopupSettings; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; +import org.olat.core.gui.control.generic.modal.DialogBoxController; +import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.gui.media.MediaResource; +import org.olat.core.gui.media.NotFoundMediaResource; +import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.User; +import org.olat.core.id.UserConstants; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.ConsumableBoolean; +import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; +import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.resource.OresHelper; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSMediaResource; +import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.ForumChangedEvent; +import org.olat.modules.fo.ForumLoggingAction; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.MessageLight; +import org.olat.modules.fo.MessageRef; +import org.olat.modules.fo.Status; +import org.olat.modules.fo.archiver.formatters.ForumDownloadResource; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.ui.MessageEditController.EditMode; +import org.olat.modules.fo.ui.events.SelectMessageEvent; +import org.olat.portfolio.EPUIFactory; +import org.olat.portfolio.manager.EPFrontendManager; +import org.olat.user.DisplayPortraitController; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * The list of messages in a thread. + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class MessageListController extends BasicController { + + protected static final String USER_PROPS_ID = ForumUserListController.class.getCanonicalName(); + + private final VelocityContainer mainVC; + + private Link backLink, archiveThreadButton, + stickyButton, removeStickyButton, + closeThreadButton, openThreadButton, + hideThreadButton, showThreadButton, + allButton, allFlatButton, oneButton, markedButton, newButton; + + private CloseableModalController cmc; + private MessageEditController editMessageCtrl, replyMessageCtrl; + private DialogBoxController confirmDeleteCtrl, confirmSplitCtrl; + private ForumMessageListController moveCtrl, messageTableCtrl; + + private Message thread; + + private final Forum forum; + private final boolean guestOnly; + private final Formatter formatter; + private final String thumbnailMapper; + private final ForumCallback foCallback; + private final OLATResourceable forumOres; + private final boolean isAdministrativeUser; + private final List<UserPropertyHandler> userPropertyHandlers; + + private LoadMode loadMode; + private List<MessageView> backupViews; + + @Autowired + private UserManager userManager; + @Autowired + private ForumManager forumManager; + @Autowired + private MarkingService markingService; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private EPFrontendManager epMgr; + + public MessageListController(UserRequest ureq, WindowControl wControl, + Forum forum, ForumCallback foCallback) { + super(ureq, wControl); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + + this.forum = forum; + this.foCallback = foCallback; + formatter = Formatter.getInstance(getLocale()); + forumOres = OresHelper.createOLATResourceableInstance("Forum", forum.getKey()); + guestOnly = ureq.getUserSession().getRoles().isGuestOnly(); + isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); + + thumbnailMapper = registerCacheableMapper(ureq, "fo_att_" + forum.getKey(), new AttachmentsMapper()); + + mainVC = createVelocityContainer("threadview"); + mainVC.contextPut("threadMode", Boolean.TRUE); + mainVC.contextPut("thumbMapper", thumbnailMapper); + mainVC.contextPut("guestOnly", new Boolean(guestOnly)); + + messageTableCtrl = new ForumMessageListController(ureq, getWindowControl(), forum, false); + listenTo(messageTableCtrl); + mainVC.put("singleThreadTable", messageTableCtrl.getInitialComponent()); + + putInitialPanel(mainVC); + initButtons(); + } + + private void initButtons() { + backLink = LinkFactory.createCustomLink("backLinkLT", "back", "listalltitles", Link.LINK_BACK, mainVC, this); + + archiveThreadButton = LinkFactory.createButtonSmall("archive.thread", mainVC, this); + archiveThreadButton.setIconLeftCSS("o_icon o_icon-fw o_icon_archive_tool"); + + stickyButton = LinkFactory.createLink("msg.sticky", mainVC, this); + stickyButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_sticky_icon"); + removeStickyButton = LinkFactory.createLink("remove.sticky", mainVC, this); + removeStickyButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_thread_icon"); + + closeThreadButton = LinkFactory.createLink("close.thread", mainVC, this); + closeThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_closed_icon"); + openThreadButton = LinkFactory.createLink("open.thread", mainVC, this); + openThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_opened_icon"); + + hideThreadButton = LinkFactory.createLink("hide.thread", mainVC, this); + hideThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_hidden_icon"); + showThreadButton = LinkFactory.createLink("show.thread", mainVC, this); + showThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_visible_icon"); + + allButton = LinkFactory.createButtonSmall("viewswitch.threadview", mainVC, this); + allButton.setIconLeftCSS("o_icon o_icon-fw o_icon-flip-vertical o_forum_all_icon"); + allFlatButton = LinkFactory.createButtonSmall("viewswitch.flatview", mainVC, this); + allFlatButton.setIconLeftCSS("o_icon o_icon-fw o_forum_all_flat_icon"); + oneButton = LinkFactory.createButtonSmall("viewswitch.messageview", mainVC, this); + oneButton.setIconLeftCSS("o_icon o_icon-fw o_forum_one_icon"); + markedButton = LinkFactory.createButtonSmall("viewswitch.marked", mainVC, this); + markedButton.setIconLeftCSS("o_icon o_icon-fw o_forum_marked_icon"); + newButton = LinkFactory.createButtonSmall("viewswitch.new", mainVC, this); + newButton.setIconLeftCSS("o_icon o_icon-fw o_forum_new_icon"); + } + + private void updateButtons(Link activeLink) { + allButton.setCustomEnabledLinkCSS(activeButton(allButton, activeLink)); + allFlatButton.setCustomEnabledLinkCSS(activeButton(allFlatButton, activeLink)); + oneButton.setCustomEnabledLinkCSS(activeButton(oneButton, activeLink)); + markedButton.setCustomEnabledLinkCSS(activeButton(markedButton, activeLink)); + newButton.setCustomEnabledLinkCSS(activeButton(newButton, activeLink)); + + archiveThreadButton.setVisible(thread != null && foCallback.mayArchiveForum()); + if(thread == null || guestOnly || !foCallback.mayEditMessageAsModerator()) { + closeThreadButton.setVisible(false); + openThreadButton.setVisible(false); + hideThreadButton.setVisible(false); + showThreadButton.setVisible(false); + stickyButton.setVisible(false); + removeStickyButton.setVisible(false); + } else { + Status status = Status.getStatus(thread.getStatusCode()); + boolean isClosed = status.isClosed(); + boolean isHidden = status.isHidden(); + boolean isSticky = status.isSticky(); + closeThreadButton.setVisible(!isClosed); + openThreadButton.setVisible(isClosed); + hideThreadButton.setVisible(!isHidden); + showThreadButton.setVisible(isHidden); + stickyButton.setVisible(foCallback.mayEditMessageAsModerator() && thread != null && !isSticky); + removeStickyButton.setVisible(foCallback.mayEditMessageAsModerator() && thread != null && isSticky); + } + } + + private String activeButton(Link link, Link activeLink) { + return "btn btn-sm btn-default o_forum_tool " + (link == activeLink ? "active" : ""); + } + + private void reloadModel(UserRequest ureq, Message message) { + if(loadMode == LoadMode.thread) { + loadThread(ureq, thread); + scrollTo(message); + } else if(message != null) { + MessageView view = loadView(ureq, message); + backupViews.add(view); + + mainVC.contextPut("messages", backupViews); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + scrollTo(message); + } + } + + /** + * The method doesn't scroll has the delete poped a blue box + * @param ureq + * @param message + */ + private void reloadModelAfterDelete(UserRequest ureq, MessageView message) { + if(loadMode == LoadMode.thread) { + loadThread(ureq, thread); + } else if(message != null) { + for(MessageView msg:backupViews) { + if(msg.getKey().equals(message.getKey())) { + backupViews.remove(msg); + break; + } + } + + mainVC.contextPut("messages", backupViews); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + } + } + + public void scrollTo(MessageRef ref) { + if(ref != null && (thread == null || !thread.getKey().equals(ref.getKey()))) { + mainVC.contextPut("goToMessage", new ConsumableBoolean(true)); + mainVC.contextPut("goToMessageId", ref.getKey()); + } + } + + public void loadUserMessages(UserRequest ureq, Identity user) { + loadMode = LoadMode.userMessages; + List<MessageLight> messages = forumManager.getLightMessagesByUser(forum, user); + backupViews = loadThread(ureq, messages, false); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + allButton.setVisible(false); + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextPut("filteredForFirstName", user.getUser().getProperty(UserConstants.FIRSTNAME, getLocale())); + mainVC.contextPut("filteredForLastName", user.getUser().getProperty(UserConstants.LASTNAME, getLocale())); + } + + public void loadUserMessagesUnderPseudo(UserRequest ureq, Identity user, String pseudonym) { + loadMode = LoadMode.userMessagesUnderPseudo; + List<MessageLight> messages = forumManager.getLightMessagesByUserUnderPseudo(forum, user, pseudonym); + backupViews = loadThread(ureq, messages, false); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + allButton.setVisible(false); + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextRemove("filteredForFirstName"); + mainVC.contextPut("filteredForLastName", pseudonym); + } + + public void loadGuestMessages(UserRequest ureq) { + loadMode = LoadMode.guestMessages; + List<MessageLight> messages = forumManager.getLightMessagesOfGuests(forum); + backupViews = loadThread(ureq, messages, false); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + allButton.setVisible(false); + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextRemove("filteredForFirstName"); + mainVC.contextPut("filteredForLastName", translate("guest")); + } + + public void loadThread(UserRequest ureq, Message threadMessage) { + loadMode = LoadMode.thread; + thread = threadMessage; + + List<MessageLight> messages = forumManager.getLightMessagesByThread(forum, thread); + messages.add(0, thread); + backupViews = loadThread(ureq, messages, true); + messageTableCtrl.loadMessages(new ArrayList<>(0)); + + allButton.setVisible(true); + updateButtons(allButton); + mainVC.contextPut("threadMode", Boolean.TRUE); + mainVC.contextRemove("filteredForFirstName"); + mainVC.contextRemove("filteredForLastName"); + } + + private MessageView loadView(UserRequest ureq, MessageLight message) { + Set<Long> rms = null; + Map<String,Mark> marks = Collections.emptyMap(); + Map<String,Long> artefactStats = Collections.emptyMap(); + List<String> subPaths = Collections.singletonList(message.getKey().toString()); + if(!guestOnly) { + String businessPath = BusinessControlFactory.getInstance().getAsString(getWindowControl().getBusinessControl()) + "[Message:" + message.getKey() + "]"; + artefactStats = epMgr.getNumOfArtefactsByStartingBusinessPath(businessPath, getIdentity()); + + marks = new HashMap<>(); + List<Mark> markList = markingService.getMarkManager().getMarks(forumOres, getIdentity(), subPaths); + for(Mark mark:markList) { + marks.put(mark.getResSubPath(), mark); + } + } + + List<MarkResourceStat> statList = markingService.getMarkManager().getStats(forumOres, subPaths, getIdentity()); + Map<String,MarkResourceStat> stats = new HashMap<String,MarkResourceStat>(statList.size() * 2 + 1); + for(MarkResourceStat stat:statList) { + stats.put(stat.getSubPath(), stat); + } + + MessageView view = new MessageView(message, userPropertyHandlers, getLocale()); + view.setNumOfChildren(0); + addMessageToCurrentMessagesAndVC(ureq, message, view, backupViews.size(), marks, stats, artefactStats, rms); + return view; + } + + private List<MessageView> loadThread(UserRequest ureq, List<MessageLight> messages, boolean reorder) { + Set<Long> rms = null; + Map<String,Mark> marks = Collections.emptyMap(); + Map<String,Long> artefactStats = Collections.emptyMap(); + if(!guestOnly) { + rms = forumManager.getReadSet(getIdentity(), forum); + + String businessPath = BusinessControlFactory.getInstance().getAsString(getWindowControl().getBusinessControl()) + "[Message:"; + artefactStats = epMgr.getNumOfArtefactsByStartingBusinessPath(businessPath, getIdentity()); + + marks = new HashMap<>(marks.size() * 2 + 1); + List<Mark> markList = markingService.getMarkManager().getMarks(forumOres, getIdentity(), null); + for(Mark mark:markList) { + marks.put(mark.getResSubPath(), mark); + } + } + + List<MarkResourceStat> statList = markingService.getMarkManager().getStats(forumOres, null, getIdentity()); + Map<String,MarkResourceStat> stats = new HashMap<String,MarkResourceStat>(statList.size() * 2 + 1); + for(MarkResourceStat stat:statList) { + stats.put(stat.getSubPath(), stat); + } + + if(reorder) { + List<MessageLight> orderedMessages = new ArrayList<MessageLight>(); + orderMessagesThreaded(messages, orderedMessages, thread); + messages = orderedMessages; + } + + List<MessageView> views = new ArrayList<>(messages.size()); + Map<Long,MessageView> keyToViews = new HashMap<>(); + for(MessageLight msg:messages) { + MessageView view = new MessageView(msg, userPropertyHandlers, getLocale()); + view.setNumOfChildren(0); + views.add(view); + keyToViews.put(msg.getKey(), view); + } + + //calculate depth and number of children + for(MessageView view:views) { + if(view.getParentKey() == null) { + view.setDepth(0); + } else { + view.setDepth(1); + for(MessageView parent = keyToViews.get(view.getParentKey()); parent != null; parent = keyToViews.get(parent.getParentKey())) { + parent.setNumOfChildren(parent.getNumOfChildren() + 1); + view.setDepth(view.getDepth() + 1); + } + } + } + + int msgNum = 0; + //append ui things + for (MessageLight msg: messages) { + addMessageToCurrentMessagesAndVC(ureq, msg, keyToViews.get(msg.getKey()), msgNum++, marks, stats, artefactStats, rms); + } + + mainVC.contextPut("messages", views); + return views; + } + + /** + * Orders the messages in the logical instead of chronological order. + * @param messages + * @param orderedList + * @param startMessage + */ + private void orderMessagesThreaded(List<MessageLight> messages, List<MessageLight> orderedList, MessageRef startMessage) { + if (messages == null || orderedList == null || startMessage == null) return; + Iterator<MessageLight> iterMsg = messages.iterator(); + while (iterMsg.hasNext()) { + MessageLight msg = iterMsg.next(); + if (msg.getParentKey() == null) { + orderedList.add(msg); + List<MessageLight> copiedMessages = new ArrayList<>(messages); + copiedMessages.remove(msg); + messages = copiedMessages; + continue; + } + if ((msg.getParentKey() != null) && (msg.getParentKey().equals(startMessage.getKey()))) { + orderedList.add(msg); + orderMessagesThreaded(messages, orderedList, msg); + } + } + } + + private void markRead(MessageLight message) { + if(!guestOnly) { + forumManager.markAsRead(getIdentity(), forum, message); + } + } + + private void addMessageToCurrentMessagesAndVC(UserRequest ureq, MessageLight m, MessageView messageView, int msgCount, + Map<String,Mark> marks, Map<String,MarkResourceStat> stats, Map<String,Long> artefactStats, + Set<Long> readSet) { + + // all values belonging to a message are stored in this map + // these values can be accessed in velocity. make sure you clean up + // everything + // you create here in disposeCurrentMessages()! + String keyString = m.getKey().toString(); + if (readSet == null || readSet.contains(m.getKey())) { + messageView.setNewMessage(false); + } else {// mark now as read + markRead(m); + messageView.setNewMessage(true); + } + // add some data now + messageView.setFormattedCreationDate(formatter.formatDateAndTime(m.getCreationDate())); + messageView.setFormattedLastModified(formatter.formatDateAndTime(m.getLastModified())); + + Identity modifier = m.getModifier(); + if (modifier != null) { + messageView.setModified(true); + messageView.setModifierFirstName(modifier.getUser().getProperty(UserConstants.FIRSTNAME, getLocale())); + messageView.setModifierLastName(modifier.getUser().getProperty(UserConstants.LASTNAME, getLocale())); + } else { + messageView.setModified(false); + } + + Identity creator = m.getCreator(); + boolean userIsMsgCreator = false; + //keeps the first 15 chars + if(creator != null) { + userIsMsgCreator = getIdentity().equals(creator); + if(!StringHelper.containsNonWhitespace(m.getPseudonym())) { + messageView.setCreatorFirstname(Formatter.truncate(creator.getUser().getProperty(UserConstants.FIRSTNAME, getLocale()), 18)); + messageView.setCreatorLastname(Formatter.truncate(creator.getUser().getProperty(UserConstants.LASTNAME, getLocale()), 18)); + } + } + + // message attachments + VFSContainer msgContainer = forumManager.getMessageContainer(forum.getKey(), m.getKey()); + messageView.setMessageContainer(msgContainer); + List<VFSItem> attachments = new ArrayList<VFSItem>(msgContainer.getItems(new VFSItemExcludePrefixFilter(MessageEditController.ATTACHMENT_EXCLUDE_PREFIXES))); + messageView.setAttachments(attachments); + + // number of children and modify/delete permissions + int numOfChildren = messageView.getNumOfChildren(); + + messageView.setAuthor(userIsMsgCreator); + boolean threadTop = m.getThreadtop() == null; + messageView.setThreadTop(threadTop); + boolean isThreadClosed; + if(threadTop) { + isThreadClosed = Status.getStatus(m.getStatusCode()).isClosed(); + } else { + if(thread == null) { + isThreadClosed = Status.getStatus(m.getThreadtop().getStatusCode()).isClosed(); + } else { + isThreadClosed = Status.getStatus(thread.getStatusCode()).isClosed(); + } + } + messageView.setClosed(isThreadClosed); + + if(!guestOnly && !m.isGuest() && !StringHelper.containsNonWhitespace(m.getPseudonym())) { + // add portrait to map for later disposal and key for rendering in velocity + DisplayPortraitController portrait = new DisplayPortraitController(ureq, getWindowControl(), m.getCreator(), true, true, false, true); + messageView.setPortrait(portrait); + mainVC.put("portrait_".concat(keyString), portrait.getInitialComponent()); + + // Add link with username that is clickable + String creatorFullName = StringHelper.escapeHtml(UserManager.getInstance().getUserDisplayName(creator)); + Link visitingCardLink = LinkFactory.createCustomLink("vc_"+msgCount, "vc_"+msgCount, creatorFullName, Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, mainVC, this); + visitingCardLink.setUserObject(messageView); + + LinkPopupSettings settings = new LinkPopupSettings(800, 600, "_blank"); + visitingCardLink.setPopup(settings); + } + + if(!isThreadClosed) { + if((numOfChildren == 0 && userIsMsgCreator) || foCallback.mayDeleteMessageAsModerator()) { + Link deleteLink = LinkFactory.createCustomLink("dl_"+msgCount, "dl_"+msgCount, "msg.delete", Link.BUTTON_SMALL, mainVC, this); + deleteLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item"); + deleteLink.setUserObject(messageView); + } + + if((numOfChildren == 0 && userIsMsgCreator) || foCallback.mayEditMessageAsModerator()) { + Link editLink = LinkFactory.createCustomLink("ed_"+msgCount, "ed_"+msgCount, "msg.update", Link.BUTTON_SMALL, mainVC, this); + editLink.setIconLeftCSS("o_icon o_icon-fw o_icon_edit"); + editLink.setUserObject(messageView); + } + + if(foCallback.mayReplyMessage()) { + Link quoteLink = LinkFactory.createCustomLink("qt_"+msgCount, "qt_"+msgCount, "msg.quote", Link.BUTTON_SMALL, mainVC, this); + quoteLink.setElementCssClass("o_sel_forum_reply_quoted"); + quoteLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply_with_quote"); + quoteLink.setUserObject(messageView); + + Link replyLink = LinkFactory.createCustomLink("rp_"+msgCount, "rp_"+msgCount, "msg.reply", Link.BUTTON_SMALL, mainVC, this); + replyLink.setElementCssClass("o_sel_forum_reply"); + replyLink.setIconLeftCSS("o_icon o_icon-fw o_icon_reply"); + replyLink.setUserObject(messageView); + } + + if(foCallback.mayEditMessageAsModerator() && !threadTop) { + Link splitLink = LinkFactory.createCustomLink("split_"+msgCount, "split_"+msgCount, "msg.split", Link.LINK, mainVC, this); + splitLink.setIconLeftCSS("o_icon o_icon-fw o_icon_split"); + splitLink.setUserObject(messageView); + + Link moveLink = LinkFactory.createCustomLink("move_"+msgCount, "move_"+msgCount, "msg.move", Link.LINK, mainVC, this); + moveLink.setIconLeftCSS("o_icon o_icon-fw o_icon_move"); + moveLink.setUserObject(messageView); + } + } + + Mark currentMark = marks.get(keyString); + MarkResourceStat stat = stats.get(keyString); + if(!guestOnly) { + String businessPath = currentMark == null ? + getWindowControl().getBusinessControl().getAsString() + "[Message:" + m.getKey() + "]" + : currentMark.getBusinessPath(); + Controller markCtrl = markingService.getMarkController(ureq, getWindowControl(), currentMark, stat, forumOres, keyString, businessPath); + mainVC.put("mark_" + msgCount, markCtrl.getInitialComponent()); + } + + if(userIsMsgCreator) { + OLATResourceable messageOres = OresHelper.createOLATResourceableInstance("Forum", m.getKey()); + String businessPath = BusinessControlFactory.getInstance().getAsString(getWindowControl().getBusinessControl()) + + "[Message:" + m.getKey() + "]"; + Long artefact = artefactStats.get(businessPath); + int numOfArtefact = artefact == null ? 0 : artefact.intValue(); + Controller ePFCollCtrl = EPUIFactory + .createArtefactCollectWizzardController(ureq, getWindowControl(), numOfArtefact, messageOres, businessPath); + if (ePFCollCtrl != null) { + messageView.setArtefact(ePFCollCtrl); + mainVC.put("eportfolio_" + keyString, ePFCollCtrl.getInitialComponent()); + } + } + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + if(backLink == source) { + fireEvent(ureq, Event.BACK_EVENT); + } else if(archiveThreadButton == source) { + doArchiveThread(ureq, thread); + } else if (closeThreadButton == source) { + doCloseThread(); + } else if (openThreadButton == source) { + doOpenThread(); + } else if (hideThreadButton == source) { + doHideThread(); + } else if (showThreadButton == source) { + doShowThread(); + } else if (allButton == source) { + doShowAll(); + } else if (allFlatButton == source) { + doShowAllFlat(); + } else if (oneButton == source) { + doShowOne(); + } else if (markedButton == source) { + doShowMarked(); + } else if (newButton == source) { + doShowNew(); + } else if(stickyButton == source || removeStickyButton == source) { + doToogleSticky(); + } else if (source instanceof Link) { + Link link = (Link)source; + String command = link.getCommand(); + Object uobject = link.getUserObject(); + + if (command.startsWith("qt_")) { + doReply(ureq, (MessageView)uobject, true); + } else if (command.startsWith("rp_")) { + doReply(ureq, (MessageView)uobject, false); + } else if (command.startsWith("dl_")) { + doConfirmDeleteMessage(ureq, (MessageView)uobject); + } else if (command.startsWith("ed_")) { + doEditMessage(ureq, (MessageView)uobject); + } else if (command.startsWith("split_")) { + doConfirmSplit(ureq, (MessageView)uobject); + } else if (command.startsWith("move_")) { + doMoveMessage(ureq, (MessageView)uobject); + } + } else if(mainVC == source) { + String cmd = event.getCommand(); + if (cmd.startsWith("attachment_")) { + doDeliverAttachment(ureq, cmd); + } + } + } + + private void doDeliverAttachment(UserRequest ureq, String cmd) { + MediaResource res = null; + try { + int index = cmd.lastIndexOf("_"); + String attachmentPosition = cmd.substring(cmd.indexOf("_") + 1, index); + String messageKey = cmd.substring(index + 1); + + int position = Integer.parseInt(attachmentPosition); + Long key = new Long(messageKey); + for(MessageView view:backupViews) { + if(view.getKey().equals(key)) { + List<VFSItem> attachments = view.getAttachments(); + VFSLeaf attachment = (VFSLeaf)attachments.get(position - 1);//velocity counter start with 1 + VFSMediaResource fileResource = new VFSMediaResource(attachment); + fileResource.setDownloadable(true); // prevent XSS attack + res = fileResource; + } + } + } catch (Exception e) { + logError("Cannot deliver message attachment", e); + } + if(res == null) { + res = new NotFoundMediaResource(cmd); + } + ureq.getDispatchResult().setResultingMediaResource(res); + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == confirmDeleteCtrl) { + if (DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { + MessageView deletedMessage = (MessageView)confirmDeleteCtrl.getUserObject(); + doDeleteMessage(deletedMessage); + reloadModelAfterDelete(ureq, deletedMessage); + } + } else if(editMessageCtrl == source) { + // edit done -> save + Message message = editMessageCtrl.getMessage(); + if(message != null) { + reloadModel(ureq, message); + } else { + showInfo("header.cannoteditmessage"); + } + cmc.deactivate(); + } else if(replyMessageCtrl == source) { + Message reply = replyMessageCtrl.getMessage(); + if(reply != null) { + reloadModel(ureq, reply); + } else { + showInfo("header.cannotsavemessage"); + } + cmc.deactivate(); + } else if(messageTableCtrl == source) { + if(event instanceof SelectMessageEvent) { + SelectMessageEvent sme = (SelectMessageEvent)event; + doSelectTheOne(sme.getMessageKey()); + } + } else if(moveCtrl == source) { + if(event instanceof SelectMessageEvent) { + SelectMessageEvent sme = (SelectMessageEvent)event; + doFinalizeMove(ureq, moveCtrl.getSelectView(), sme.getMessageKey()); + cmc.deactivate(); + } + } else if(confirmSplitCtrl == source) { + if (DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { + MessageView splitedMessage = (MessageView)confirmSplitCtrl.getUserObject(); + doSplitThread(ureq, splitedMessage); + } + } else if(source == cmc) { + cleanUp(); + } + super.event(ureq, source, event); + } + + private void cleanUp() { + removeAsListenerAndDispose(replyMessageCtrl); + removeAsListenerAndDispose(editMessageCtrl); + removeAsListenerAndDispose(cmc); + replyMessageCtrl = null; + editMessageCtrl = null; + cmc = null; + } + + private void doReply(UserRequest ureq, MessageView parent, boolean quote) { + // user has clicked on button 'reply' + if (foCallback.mayReplyMessage()) { + Message newMessage = forumManager.createMessage(forum, getIdentity(), guestOnly); + Message parentMessage = forumManager.getMessageById(parent.getKey()); + + String reString = ""; + if(parent != null && parent.isThreadTop()) { + //add reString only for the first answer + reString = translate("msg.title.re"); + } + newMessage.setTitle(reString + parentMessage.getTitle()); + if (quote) { + // load message to form as quotation + StringBuilder quoteSb = new StringBuilder(); + quoteSb.append("<p></p><div class=\"o_quote_wrapper\"><div class=\"o_quote_author mceNonEditable\">"); + String date = formatter.formatDateAndTime(parentMessage.getCreationDate()); + String creatorName; + if(StringHelper.containsNonWhitespace(parentMessage.getPseudonym())) { + creatorName = parentMessage.getPseudonym(); + } else if(parentMessage.isGuest()) { + creatorName = translate("guest"); + } else { + User creator = parentMessage.getCreator().getUser(); + creatorName = creator.getProperty(UserConstants.FIRSTNAME, getLocale()) + " " + creator.getProperty(UserConstants.LASTNAME, getLocale()); + } + + quoteSb.append(translate("msg.quote.intro", new String[]{ date, creatorName})) + .append("</div><blockquote class=\"o_quote\">") + .append(parentMessage.getBody()) + .append("</blockquote></div>") + .append("<p></p>"); + newMessage.setBody(quoteSb.toString()); + } + + replyMessageCtrl = new MessageEditController(ureq, getWindowControl(), forum, foCallback, newMessage, parentMessage, EditMode.reply); + listenTo(replyMessageCtrl); + + String title = quote ? translate("msg.quote") : translate("msg.reply"); + cmc = new CloseableModalController(getWindowControl(), "close", replyMessageCtrl.getInitialComponent(), true, title); + listenTo(cmc); + cmc.activate(); + } else { + showInfo("may.not.reply.msg"); + } + } + + private void doConfirmDeleteMessage(UserRequest ureq, MessageView message) { + // user has clicked on button 'delete' + // -> display modal dialog 'Do you really want to delete this message?' + // 'yes': back to allThreadTable, 'no' back to messageDetails + + int numOfChildren = forumManager.countMessageChildren(message.getKey()); + boolean children = numOfChildren > 0; + boolean userIsMsgCreator = message.isAuthor() ; + String currentMsgTitle = StringHelper.escapeHtml(message.getTitle()); + + if (foCallback.mayDeleteMessageAsModerator()) { + // user is forum-moderator -> may delete every message on every level + if (numOfChildren == 0) { + confirmDeleteCtrl = activateYesNoDialog(ureq, null, translate("reallydeleteleaf", currentMsgTitle), confirmDeleteCtrl); + confirmDeleteCtrl.setUserObject(message); + } else if (numOfChildren == 1) { + confirmDeleteCtrl = activateYesNoDialog(ureq, null, translate("reallydeletenode1", currentMsgTitle), confirmDeleteCtrl); + confirmDeleteCtrl.setUserObject(message); + } else { + confirmDeleteCtrl = activateYesNoDialog(ureq, null, getTranslator().translate("reallydeletenodeN", new String[] { currentMsgTitle, Integer.toString(numOfChildren) }), confirmDeleteCtrl); + confirmDeleteCtrl.setUserObject(message); + } + } else if (userIsMsgCreator && !children ) { + // user may delete his own message if it has no children + confirmDeleteCtrl = activateYesNoDialog(ureq, null, translate("reallydeleteleaf", currentMsgTitle), confirmDeleteCtrl); + confirmDeleteCtrl.setUserObject(message); + } else if (userIsMsgCreator && children) { + // user may not delete his own message because it has at least one child + showWarning("may.not.delete.msg.as.author"); + } else { + // user isn't author of the current message + showInfo("may.not.delete.msg"); + } + } + + private void doDeleteMessage(MessageView message) { + boolean userIsMsgCreator = message.isAuthor(); + if (foCallback.mayDeleteMessageAsModerator() + || (userIsMsgCreator && forumManager.countMessageChildren(message.getKey()) == 0)) { + Message reloadedMessage = forumManager.getMessageById(message.getKey()); + if(reloadedMessage != null) { + boolean hasParent = reloadedMessage.getParent() != null; + forumManager.deleteMessageTree(forum.getKey(), reloadedMessage); + showInfo("deleteok"); + // do logging + if(hasParent) { + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_DELETE, getClass(), + LoggingResourceable.wrap(reloadedMessage)); + } else { + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_DELETE, getClass(), + LoggingResourceable.wrap(reloadedMessage)); + } + } + } else { + showWarning("may.not.delete.msg.as.author"); + } + } + + private void doEditMessage(UserRequest ureq, MessageView message) { + // user has clicked on button 'edit' + boolean userIsMsgCreator = message.isAuthor(); + boolean children = forumManager.countMessageChildren(message.getKey()) > 0; + if (foCallback.mayEditMessageAsModerator() || (userIsMsgCreator && !children)) { + Message reloadedMessage = forumManager.loadMessage(message.getKey()); + editMessageCtrl = new MessageEditController(ureq, getWindowControl(), forum, foCallback, reloadedMessage, null, EditMode.edit); + listenTo(editMessageCtrl); + + String title = translate("msg.update"); + cmc = new CloseableModalController(getWindowControl(), "close", editMessageCtrl.getInitialComponent(), true, title); + listenTo(editMessageCtrl); + cmc.activate(); + } else if ((userIsMsgCreator) && (children == true)) { + // user is author of the current message but it has already at least + // one child + showWarning("may.not.save.msg.as.author"); + } else { + // user isn't author of the current message + showInfo("may.not.edit.msg"); + } + } + + private void doConfirmSplit(UserRequest ureq, MessageView message) { + if (foCallback.mayEditMessageAsModerator()) { + // user is forum-moderator -> may delete every message on every level + int numOfChildren = forumManager.countMessageChildren(message.getKey()); + // provide yesNoSplit as argument, this ensures that dc is disposed before newly created + String text = translate("reallysplitthread", new String[] { message.getTitle(), Integer.toString(numOfChildren) }); + confirmSplitCtrl = activateYesNoDialog(ureq, null, text, confirmSplitCtrl); + confirmSplitCtrl.setUserObject(message); + } + } + + private void doSplitThread(UserRequest ureq, MessageView message) { + if (foCallback.mayEditMessageAsModerator()) { + Message reloadedMessage = forumManager.getMessageById(message.getKey()); + Message newTopMessage = forumManager.splitThread(reloadedMessage); + //do logging + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_SPLIT, getClass(), LoggingResourceable.wrap(newTopMessage)); + //open the new thread + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_THREAD, newTopMessage.getKey())); + } else { + showWarning("may.not.split.thread"); + } + } + + private void doArchiveThread(UserRequest ureq, Message currMsg) { + Message m = currMsg.getThreadtop(); + Long topMessageId = (m == null) ? currMsg.getKey() : m.getKey(); + + VFSContainer forumContainer = forumManager.getForumContainer(forum.getKey()); + ForumDownloadResource download = new ForumDownloadResource("Forum", forum, foCallback, topMessageId, forumContainer, getLocale()); + ureq.getDispatchResult().setResultingMediaResource(download); + } + + private void doToogleSticky() { + Status status = Status.getStatus(thread.getStatusCode()); + status.setSticky(!status.isSticky()); + thread.setStatusCode(Status.getStatusCode(status)); + thread = forumManager.updateMessage(thread, false); + DBFactory.getInstance().commit(); + + stickyButton.setVisible(!status.isSticky() && foCallback.mayEditMessageAsModerator()); + removeStickyButton.setVisible(status.isSticky() && foCallback.mayEditMessageAsModerator()); + mainVC.setDirty(true); + + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.STICKY, thread.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forumOres); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_EDIT, getClass(), LoggingResourceable.wrap(thread)); + } + + /** + * Sets the closed status to the thread message. + * @param ureq + * @param msg + * @param closed + */ + private void doCloseThread() { + if (thread != null) { + thread = forumManager.getMessageById(thread.getKey()); + Status status = Status.getStatus(thread.getStatusCode()); + status.setClosed(true); + thread.setStatusCode(Status.getStatusCode(status)); + thread = forumManager.updateMessage(thread, false); + DBFactory.getInstance().commit();// before sending async event + + closeThreadButton.setVisible(false); + openThreadButton.setVisible(true && !guestOnly); + mainVC.setDirty(true); + + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.CLOSE, thread.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forumOres); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_CLOSE, getClass(), LoggingResourceable.wrap(thread)); + } + } + + private void doOpenThread() { + if (thread != null) { + thread = forumManager.getMessageById(thread.getKey()); + Status status = Status.getStatus(thread.getStatusCode()); + status.setClosed(false); + thread.setStatusCode(Status.getStatusCode(status)); + thread = forumManager.updateMessage(thread, true); + DBFactory.getInstance().commit();// before sending async event + + closeThreadButton.setVisible(true && !guestOnly); + openThreadButton.setVisible(false); + mainVC.setDirty(true); + + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.OPEN, thread.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forumOres); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_REOPEN, getClass(), LoggingResourceable.wrap(thread)); + } + } + + /** + * Sets the hidden status to the thread message. + * @param ureq + * @param msg + * @param hidden + */ + private void doHideThread() { + if (thread != null) { + thread = forumManager.getMessageById(thread.getKey()); + Status status = Status.getStatus(thread.getStatusCode()); + status.setHidden(true); + thread.setStatusCode(Status.getStatusCode(status)); + thread = forumManager.updateMessage(thread, false); + DBFactory.getInstance().commit();// before sending async event + + hideThreadButton.setVisible(false); + showThreadButton.setVisible(true && !guestOnly); + mainVC.setDirty(true); + + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.HIDE, thread.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forumOres); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_HIDE, getClass(), LoggingResourceable.wrap(thread)); + } + } + + /** + * Sets the hidden status to the threadtop message. + * @param ureq + * @param msg + * @param hidden + */ + private void doShowThread() { + if (thread != null) { + thread = forumManager.getMessageById(thread.getKey()); + Status status = Status.getStatus(thread.getStatusCode()); + status.setHidden(false); + thread.setStatusCode(Status.getStatusCode(status)); + thread = forumManager.updateMessage(thread, true); + DBFactory.getInstance().commit();// before sending async event + + hideThreadButton.setVisible(true && !guestOnly); + showThreadButton.setVisible(false); + mainVC.setDirty(true); + + ForumChangedEvent event = new ForumChangedEvent(ForumChangedEvent.SHOW, thread.getKey(), null); + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(event, forumOres); + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_THREAD_SHOW, getClass(), LoggingResourceable.wrap(thread)); + } + } + + private void doShowAll() { + updateButtons(allButton); + mainVC.contextPut("threadMode", Boolean.TRUE); + mainVC.contextPut("messages", backupViews); + mainVC.contextRemove("mode"); + } + + private void doShowAllFlat() { + updateButtons(allFlatButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextPut("messages", backupViews); + mainVC.contextRemove("mode"); + } + + private void doShowOne() { + updateButtons(oneButton); + mainVC.contextPut("mode", "one"); + mainVC.contextPut("threadMode", Boolean.FALSE); + + if(backupViews != null && backupViews.size() > 0) { + List<MessageView> oneView = new ArrayList<>(1); + oneView.add(backupViews.get(0)); + mainVC.contextPut("messages", oneView); + messageTableCtrl.setSelectView(oneView.get(0)); + messageTableCtrl.loadMessages(new ArrayList<>(backupViews)); + } + } + + private void doSelectTheOne(Long messageKey) { + updateButtons(oneButton); + mainVC.contextPut("mode", "one"); + mainVC.contextPut("threadMode", Boolean.FALSE); + + if(backupViews != null && backupViews.size() > 0) { + List<MessageView> oneView = new ArrayList<>(1); + for(MessageView message:backupViews) { + if(message.getKey().equals(messageKey)) { + oneView.add(message); + } + } + mainVC.contextPut("messages", oneView); + messageTableCtrl.setSelectView(oneView.get(0)); + messageTableCtrl.loadMessages(new ArrayList<>(backupViews)); + } + } + + protected void doShowMarked() { + updateButtons(markedButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextPut("mode", "marked"); + + List<Mark> markList = markingService.getMarkManager().getMarks(forumOres, getIdentity(), null); + Set<String> marks = new HashSet<>(markList.size() * 2 + 1); + for(Mark mark:markList) { + marks.add(mark.getResSubPath()); + } + + List<MessageView> views = new ArrayList<>(); + for(MessageView view:backupViews) { + if(marks.contains(view.getKey().toString())) { + views.add(view); + } + } + + mainVC.contextPut("messages", views); + } + + protected void doShowNew() { + updateButtons(newButton); + mainVC.contextPut("threadMode", Boolean.FALSE); + mainVC.contextPut("mode", "new"); + + Set<Long> rms = forumManager.getReadSet(getIdentity(), forum); + List<MessageView> views = new ArrayList<>(); + for(MessageView view:backupViews) { + if(!rms.contains(view.getKey())) { + views.add(view); + } + } + mainVC.contextPut("messages", views); + } + + private void doMoveMessage(UserRequest ureq, MessageView message) { + removeAsListenerAndDispose(moveCtrl); + removeAsListenerAndDispose(cmc); + + if (foCallback.mayEditMessageAsModerator()) { + moveCtrl = new ForumMessageListController(ureq, getWindowControl(), forum, true); + moveCtrl.loadAllMessages(); + moveCtrl.setSelectView(message); + listenTo(moveCtrl); + + //push the modal dialog with the table as content + String title = ""; + cmc = new CloseableModalController(getWindowControl(), "close", moveCtrl.getInitialComponent(), true, title); + listenTo(cmc); + + cmc.activate(); + } + } + + private void doFinalizeMove(UserRequest ureq, MessageView messageToMove, Long parentMessageKey) { + if (foCallback.mayEditMessageAsModerator()) { + Message message = forumManager.getMessageById(messageToMove.getKey()); + Message parentMessage = forumManager.getMessageById(parentMessageKey); + message = forumManager.moveMessage(message, parentMessage); + markRead(message); + + ThreadLocalUserActivityLogger.log(ForumLoggingAction.FORUM_MESSAGE_MOVE, getClass(), LoggingResourceable.wrap(message)); + Long threadKey = parentMessage.getThreadtop() == null ? parentMessage.getKey() : parentMessage.getThreadtop().getKey(); + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_THREAD, threadKey, message.getKey())); + } else { + showWarning("may.not.move.message"); + } + } + + public enum LoadMode { + thread, + userMessages, + userMessagesUnderPseudo, + guestMessages, + } + + private class AttachmentsMapper implements Mapper { + + @Override + public MediaResource handle(String relPath, HttpServletRequest request) { + String[] query = relPath.split("/"); // expected path looks like this /messageId/attachmentUUID/filename + if (query.length == 4) { + try { + Long mId = Long.valueOf(Long.parseLong(query[1])); + MessageView view = null; + for (MessageView m : backupViews) { + // search for message in current message map + if (m.getKey().equals(mId)) { + view = m; + break; + } + } + if (view != null) { + List<VFSItem> attachments = view.getAttachments(); + for (VFSItem vfsItem : attachments) { + MetaInfo meta = ((MetaTagged)vfsItem).getMetaInfo(); + if (meta.getUUID().equals(query[2])) { + if (meta.isThumbnailAvailable()) { + VFSLeaf thumb = meta.getThumbnail(200, 200, false); + if(thumb != null) { + // Positive lookup, send as response + return new VFSMediaResource(thumb); + } + } + break; + } + } + } + } catch (NumberFormatException e) { + // + } + } + // In any error case, send not found + return new NotFoundMediaResource(request.getRequestURI()); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/MessagePeekview.java b/src/main/java/org/olat/modules/fo/ui/MessagePeekview.java new file mode 100644 index 00000000000..52c2159feb2 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/MessagePeekview.java @@ -0,0 +1,40 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.Date; + +import org.olat.modules.fo.MessageRef; + +/** + * + * Initial date: 13.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface MessagePeekview extends MessageRef { + + public Date getCreationDate(); + + public String getTitle(); + + public String getBody(); + +} diff --git a/src/main/java/org/olat/modules/fo/ui/MessageView.java b/src/main/java/org/olat/modules/fo/ui/MessageView.java new file mode 100644 index 00000000000..39ccffb7a6b --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/MessageView.java @@ -0,0 +1,221 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.List; +import java.util.Locale; + +import org.olat.core.gui.control.Controller; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.modules.fo.MessageLight; +import org.olat.user.DisplayPortraitController; +import org.olat.user.propertyhandlers.UserPropertyHandler; + +/** + * + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class MessageView extends MessageLightView { + + private final String body; + + private String formattedCreationDate; + private String formattedLastModified; + + private boolean modified; + private String modifierFirstName; + private String modifierLastName; + + private String creatorFirstname; + private String creatorLastname; + + private boolean author; + private boolean threadTop; + private boolean closed; + private boolean moved; + + private int depth = -1; + + private boolean newMessage; + private List<VFSItem> attachments; + private VFSContainer messageContainer; + + private Controller artefact; + private DisplayPortraitController portrait; + + public MessageView(MessageLight message, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { + super(message, userPropertyHandlers, locale); + body = message.getBody(); + } + + public String getBody() { + return body; + } + + public String getFormattedCreationDate() { + return formattedCreationDate; + } + + public void setFormattedCreationDate(String formattedCreationDate) { + this.formattedCreationDate = formattedCreationDate; + } + + public String getFormattedLastModified() { + return formattedLastModified; + } + + public void setFormattedLastModified(String formattedLastModified) { + this.formattedLastModified = formattedLastModified; + } + + public boolean getNewMessage() { + return newMessage; + } + + public void setNewMessage(boolean newMessage) { + this.newMessage = newMessage; + } + + public String getCreatorFirstname() { + return creatorFirstname; + } + + public void setCreatorFirstname(String creatorFirstname) { + this.creatorFirstname = creatorFirstname; + } + + public String getCreatorLastname() { + return creatorLastname; + } + + public void setCreatorLastname(String creatorLastname) { + this.creatorLastname = creatorLastname; + } + + public int getDepth() { + return depth; + } + + public void setDepth(int depth) { + this.depth = depth; + } + + public boolean isMoved() { + return moved; + } + + public void setMoved(boolean moved) { + this.moved = moved; + } + + public boolean isModified() { + return modified; + } + + public void setModified(boolean modified) { + this.modified = modified; + } + + public String getModifierFirstName() { + return modifierFirstName; + } + + public void setModifierFirstName(String modifierFirstName) { + this.modifierFirstName = modifierFirstName; + } + + public String getModifierLastName() { + return modifierLastName; + } + + public void setModifierLastName(String modifierLastName) { + this.modifierLastName = modifierLastName; + } + + public boolean isAuthor() { + return author; + } + + public void setAuthor(boolean author) { + this.author = author; + } + + public boolean isThreadTop() { + return threadTop; + } + + public void setThreadTop(boolean threadTop) { + this.threadTop = threadTop; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + public List<VFSItem> getAttachments() { + return attachments; + } + + public void setAttachments(List<VFSItem> attachments) { + this.attachments = attachments; + } + + public boolean hasAttachments() { + return attachments != null && attachments.size() > 0; + } + + public VFSContainer getMessageContainer() { + return messageContainer; + } + + public void setMessageContainer(VFSContainer msgContainer) { + this.messageContainer = msgContainer; + } + + public DisplayPortraitController getPortrait() { + return portrait; + } + + public void setPortrait(DisplayPortraitController portrait) { + this.portrait = portrait; + } + + public Controller getArtefact() { + return artefact; + } + + public void setArtefact(Controller artefact) { + this.artefact = artefact; + } + + + + + + + +} diff --git a/src/main/java/org/olat/modules/fo/ui/StatusTypeCellRenderer.java b/src/main/java/org/olat/modules/fo/ui/StatusTypeCellRenderer.java new file mode 100644 index 00000000000..a64d6e8f1c0 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/StatusTypeCellRenderer.java @@ -0,0 +1,63 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; +import org.olat.modules.fo.Status; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class StatusTypeCellRenderer implements FlexiCellRenderer { + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + + if(cellValue instanceof Number) { + int status = ((Number)cellValue).intValue(); + + Status messageStatus = Status.getStatus(status); + boolean isSticky = messageStatus.isSticky(); + boolean isClosed = messageStatus.isClosed(); + + target.append("<i class='o_icon o_forum_"); + + if(isSticky && isClosed) { + target.append("status_sticky_closed"); + } else if (isSticky) { + target.append("status_sticky"); + } else if (isClosed) { + target.append("status_closed"); + } else { + target.append("status_thread"); + } + target.append("_icon'> </i>"); + } + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/StickyCellRenderer.java b/src/main/java/org/olat/modules/fo/ui/StickyCellRenderer.java new file mode 100644 index 00000000000..2dd46ce762f --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/StickyCellRenderer.java @@ -0,0 +1,61 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; +import org.olat.modules.fo.Status; +import org.olat.modules.fo.ui.ThreadListDataModel.ThreadListCols; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class StickyCellRenderer implements FlexiCellRenderer { + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + if(cellValue instanceof String) { + String title = (String)cellValue; + if (renderer == null) { + target.append(title); + } else { + Object type = source.getFlexiTableElement().getTableDataModel().getValueAt(row, ThreadListCols.type.ordinal()); + if(type instanceof Integer) { + boolean sticky = Status.getStatus((Integer)type).isSticky(); + if(sticky) { + target.append("<span class='o_forum_thread_sticky'>").append(title).append("</span>"); + } else { + target.append(title); + } + } else { + target.append(title); + } + } + } + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/ThreadListController.java b/src/main/java/org/olat/modules/fo/ui/ThreadListController.java new file mode 100644 index 00000000000..119493afa58 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ThreadListController.java @@ -0,0 +1,260 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.List; + +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; +import org.olat.core.id.Identity; +import org.olat.core.util.Util; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.modules.fo.Forum; +import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.Message; +import org.olat.modules.fo.MessageRef; +import org.olat.modules.fo.archiver.formatters.ForumDownloadResource; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.model.ForumThread; +import org.olat.modules.fo.ui.MessageEditController.EditMode; +import org.olat.modules.fo.ui.ThreadListDataModel.ThreadListCols; +import org.olat.modules.fo.ui.events.SelectMessageEvent; +import org.olat.modules.fo.ui.events.SelectUserListEvent; +import org.olat.search.SearchServiceUIFactory; +import org.olat.search.SearchServiceUIFactory.DisplayOption; +import org.olat.search.ui.SearchInputController; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ThreadListController extends FormBasicController { + + private FlexiTableElement threadTable; + private ThreadListDataModel threadTableModel; + private FormLink archiveForumButton, newThreadButton, userListButton; + + private CloseableModalController cmc; + private MessageEditController newThreadCtrl; + private SearchInputController searchController; + + private final Forum forum; + private final boolean guestOnly; + private final ForumCallback foCallback; + + @Autowired + private ForumManager forumManager; + @Autowired + private BaseSecurityModule securityModule; + + public ThreadListController(UserRequest ureq, WindowControl wControl, Forum forum, ForumCallback foCallback) { + super(ureq, wControl, "threads"); + setTranslator(Util.createPackageTranslator(Forum.class, getLocale(), getTranslator())); + + this.forum = forum; + this.foCallback = foCallback; + guestOnly = ureq.getUserSession().getRoles().isGuestOnly(); + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + if(foCallback.mayOpenNewThread()) { + newThreadButton = uifactory.addFormLink("msg.create", formLayout, Link.BUTTON_SMALL); + newThreadButton.setIconLeftCSS("o_icon o_icon-fw o_forum_status_thread_icon"); + newThreadButton.setElementCssClass("o_sel_forum_thread_new"); + } + if(foCallback.mayArchiveForum()) { + archiveForumButton = uifactory.addFormLink("archive.forum", formLayout, Link.BUTTON_SMALL); + archiveForumButton.setIconLeftCSS("o_icon o_icon-fw o_icon_archive_tool"); + archiveForumButton.setElementCssClass("o_sel_forum_archive"); + } + if(securityModule.isUserAllowedAutoComplete(ureq.getUserSession().getRoles()) && foCallback.mayFilterForUser() ) { + userListButton = uifactory.addFormLink("filter", formLayout, Link.BUTTON_SMALL); + userListButton.setIconLeftCSS("o_icon o_icon-fw o_icon_user"); + userListButton.setElementCssClass("o_sel_forum_filter"); + } + + if(!guestOnly && formLayout instanceof FormLayoutContainer) { + SearchServiceUIFactory searchServiceUIFactory = (SearchServiceUIFactory)CoreSpringFactory.getBean(SearchServiceUIFactory.class); + searchController = searchServiceUIFactory.createInputController(ureq, getWindowControl(), DisplayOption.STANDARD, mainForm); + listenTo(searchController); + ((FormLayoutContainer)formLayout).put("search_input", searchController.getInitialComponent()); + } + + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ThreadListCols.type.i18nKey(), ThreadListCols.type.ordinal(), + true, ThreadListCols.type.name(), new StatusTypeCellRenderer())); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(ThreadListCols.thread.i18nKey(), ThreadListCols.thread.ordinal(), "select", + true, ThreadListCols.thread.name(), new StaticFlexiCellRenderer("select", new StickyCellRenderer()))); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ThreadListCols.creator.i18nKey(), ThreadListCols.creator.ordinal(), + true, ThreadListCols.creator.name())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ThreadListCols.lastModified.i18nKey(), ThreadListCols.lastModified.ordinal(), + true, ThreadListCols.lastModified.name())); + if(!guestOnly) { + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(ThreadListCols.markedMessages.i18nKey(), ThreadListCols.markedMessages.ordinal(), + "marked", true, ThreadListCols.markedMessages.name(), new StaticFlexiCellRenderer("marked", new TextFlexiCellRenderer()))); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(ThreadListCols.unreadMessages.i18nKey(), ThreadListCols.unreadMessages.ordinal(), + "unread", true, ThreadListCols.unreadMessages.name(), new StaticFlexiCellRenderer("unread", new TextFlexiCellRenderer()))); + } + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ThreadListCols.totalMessages.i18nKey(), ThreadListCols.totalMessages.ordinal())); + + threadTableModel = new ThreadListDataModel(columnsModel, getTranslator()); + threadTable = uifactory.addTableElement(getWindowControl(), "threads", threadTableModel, getTranslator(), formLayout); + threadTable.setCustomizeColumns(false); + } + + @Override + protected void doDispose() { + // + } + + public void loadModel() { + Identity identity = guestOnly ? null : getIdentity(); + List<ForumThread> threads = forumManager.getForumThreads(forum, identity); + threadTableModel.setObjects(threads); + threadTableModel.sort(new SortKey(ThreadListCols.thread.name(), true)); + threadTable.reloadData(); + threadTable.reset(); + + if(archiveForumButton != null) { + archiveForumButton.setVisible(threads.size() > 0); + } + if(userListButton != null) { + userListButton.setVisible(threads.size() > 0); + } + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if(newThreadCtrl == source) { + if(event == Event.DONE_EVENT) { + DBFactory.getInstance().commit(); + loadModel(); + doSelect(ureq, newThreadCtrl.getMessage()); + } + cmc.deactivate(); + cleanUp(); + } else if(cmc == source) { + cleanUp(); + } + super.event(ureq, source, event); + } + + private void cleanUp() { + removeAsListenerAndDispose(newThreadCtrl); + removeAsListenerAndDispose(cmc); + newThreadCtrl = null; + cmc = null; + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(archiveForumButton == source) { + doArchiveForum(ureq); + } else if(newThreadButton == source) { + doNewThread(ureq); + } else if(userListButton == source) { + doOpenUserList(ureq); + } else if(source == threadTable) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + String cmd = se.getCommand(); + ForumThread row = threadTableModel.getObject(se.getIndex()); + if("select".equals(cmd)) { + doSelect(ureq, row); + } else if("marked".equals(cmd)) { + doSelectMarked(ureq, row); + } else if("unread".equals(cmd)) { + doSelectNew(ureq, row); + } + } + } + super.formInnerEvent(ureq, source, event); + } + + @Override + protected void formOK(UserRequest ureq) { + // + } + + private void doSelect(UserRequest ureq, MessageRef message) { + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_THREAD, message.getKey())); + } + + private void doSelectMarked(UserRequest ureq, MessageRef message) { + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_MARKED, message.getKey())); + } + + private void doSelectNew(UserRequest ureq, MessageRef message) { + fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_NEW, message.getKey())); + } + + private void doArchiveForum(UserRequest ureq) { + VFSContainer forumContainer = forumManager.getForumContainer(forum.getKey()); + ForumDownloadResource download = new ForumDownloadResource("Forum", forum, foCallback, null, forumContainer, getLocale()); + ureq.getDispatchResult().setResultingMediaResource(download); + } + + private void doNewThread(UserRequest ureq) { + removeAsListenerAndDispose(newThreadCtrl); + removeAsListenerAndDispose(cmc); + + // user has clicked on button 'open new thread'. + Message m = forumManager.createMessage(forum, getIdentity(), guestOnly); + newThreadCtrl = new MessageEditController(ureq, getWindowControl(), forum, foCallback, m, null, EditMode.newThread); + listenTo(newThreadCtrl); + + String title = translate("msg.create"); + cmc = new CloseableModalController(getWindowControl(), "close", newThreadCtrl.getInitialComponent(), true, title); + listenTo(newThreadCtrl); + cmc.activate(); + } + + private void doOpenUserList(UserRequest ureq) { + fireEvent(ureq, new SelectUserListEvent()); + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java b/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java new file mode 100644 index 00000000000..b59fd868ef5 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/ThreadListDataModel.java @@ -0,0 +1,155 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.StringHelper; +import org.olat.modules.fo.Status; +import org.olat.modules.fo.model.ForumThread; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class ThreadListDataModel extends DefaultFlexiTableDataModel<ForumThread> + implements SortableFlexiTableDataModel<ForumThread> { + + private Translator translator; + + public ThreadListDataModel(FlexiTableColumnModel columnModel, Translator translator) { + super(columnModel); + this.translator = translator; + } + + @Override + public void sort(SortKey orderBy) { + if(orderBy != null) { + List<ForumThread> views = new ThreadListDataModelSort(orderBy, this, null).sort(); + super.setObjects(views); + } + } + + @Override + public Object getValueAt(int row, int col) { + ForumThread thread = getObject(row); + return getValueAt(thread, col); + } + + @Override + public Object getValueAt(ForumThread row, int col) { + switch(ThreadListCols.values()[col]) { + case type: return row.getStatusCode(); + case thread: return row.getTitle(); + case creator: { + if(StringHelper.containsNonWhitespace(row.getPseudonym())) { + return row.getPseudonym(); + } + if(row.isGuest()) { + return translator.translate("anonymous.poster"); + } + return row.getCreatorFullname(); + } + case lastModified: return row.getLastModified(); + case markedMessages: return row.getMarkedMessages(); + case unreadMessages: return row.getNewMessages(); + case totalMessages: return row.getNumOfPosts(); + default: return "ERROR"; + } + } + + @Override + public DefaultFlexiTableDataModel<ForumThread> createCopyWithEmptyList() { + return new ThreadListDataModel(getTableColumnModel(), translator); + } + + public enum ThreadListCols { + type("table.header.typeimg"), + thread("table.thread"), + creator("table.userfriendlyname"), + lastModified("table.lastModified"), + markedMessages("table.marked"), + unreadMessages("table.unread"), + totalMessages("table.total"); + + private final String i18nKey; + + private ThreadListCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + public String i18nKey() { + return i18nKey; + } + } + + public class ThreadListDataModelSort extends SortableFlexiTableModelDelegate<ForumThread> { + + public ThreadListDataModelSort(SortKey orderBy, SortableFlexiTableDataModel<ForumThread> tableModel, Locale locale) { + super(orderBy, tableModel, locale); + } + + @Override + public List<ForumThread> sort() { + SortableFlexiTableDataModel<ForumThread> model = getTableModel(); + int rowCount = model.getRowCount(); + List<ForumThread> rows = new ArrayList<>(rowCount); + for(int i=0; i<rowCount; i++) { + rows.add(model.getObject(i)); + } + Collections.sort(rows, new StickyComparator(isAsc())); + return rows; + } + + public class StickyComparator extends DefaultComparator { + + private final boolean asc; + + public StickyComparator(boolean asc) { + this.asc = asc; + } + + @Override + public int compare(ForumThread t1, ForumThread t2) { + boolean s1 = Status.getStatus(t1.getStatusCode()).isSticky(); + boolean s2 = Status.getStatus(t2.getStatusCode()).isSticky(); + + if(s1 && !s2) { + return -1; + } + if(!s1 && s2) { + return 1; + } + return (asc ? 1 : -1) * super.compare(t1, t2); + } + } + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/_content/attachments-editview.html b/src/main/java/org/olat/modules/fo/ui/_content/attachments-editview.html new file mode 100644 index 00000000000..c139cf4af62 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/_content/attachments-editview.html @@ -0,0 +1,14 @@ +#if($attachments && $attachments.size() > 0) +$r.translate("attachments") +<table class="table table-condensed table-striped"><tbody> + #foreach ($attachment in $attachments) + #set( $fname = $attachment.getName() ) + <tr> + <td style="width:1%"><i class="o_icon o_icon-fw $r.getFiletypeIconCss($fname)"> </i></td> + <td>$r.escapeHtml($fname)</td> + <td>$r.formatBytes($attachment.getSize())</td> + <td style="width:1%">$r.render("delete.attachment.$velocityCount")</td> + </tr> + #end +</tbody></table> +#end \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/_content/forum.html b/src/main/java/org/olat/modules/fo/ui/_content/forum.html new file mode 100644 index 00000000000..bfe00d39239 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/_content/forum.html @@ -0,0 +1,4 @@ +#if($r.available("subscription")) + $r.render("subscription") +#end +$r.render("forum") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/_content/msg-preview.html b/src/main/java/org/olat/modules/fo/ui/_content/msg-preview.html new file mode 100644 index 00000000000..643eeab622f --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/_content/msg-preview.html @@ -0,0 +1,17 @@ +<div class="o_forum"> + <div class="o_forum_message o_block_large_bottom"> + <div class="o_forum_message_header clearfix"> + #if(!$guestOnly && $r.available("portrait")) + $r.render("portrait") + #end + <h4 class="o_forum_message_title">$r.escapeHtml($message.getTitle())</h4> + <div class="o_author"> + $r.escapeHtml($identity.getUser().getProperty("firstName", $locale)) $r.escapeHtml($identity.getUser().getProperty("lastName", $locale)) + </div> + <div class="o_date">$r.formatDateAndTime($message.getCreationDate())</div> + </div> + <div class="o_forum_message_body"> + <div class="clearfix o_scrollblock">$r.formatLatexFormulas($messageBody)</div> + </div> + </div> +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/_content/list_titles.html b/src/main/java/org/olat/modules/fo/ui/_content/threads.html similarity index 51% rename from src/main/java/org/olat/modules/fo/_content/list_titles.html rename to src/main/java/org/olat/modules/fo/ui/_content/threads.html index 2e3fe4ef06b..e2e65e78f08 100644 --- a/src/main/java/org/olat/modules/fo/_content/list_titles.html +++ b/src/main/java/org/olat/modules/fo/ui/_content/threads.html @@ -1,18 +1,13 @@ -#if ($r.available("subscription")) - $r.render("subscription") -#end -<h3> - $r.translate("header.overview") -</h3> +<h3>$r.translate("header.overview")</h3> <div class="clearfix o_block"> <div class="o_forum_toolbar btn-group"> - #if ($security.mayOpenNewThread()) + #if($r.available("msg.create")) $r.render("msg.create") #end - #if ($security.mayArchiveForum() && $hasThreads) + #if($r.available("archive.forum")) $r.render("archive.forum") #end - #if ($security.mayFilterForUser() && $hasThreads && $r.available("filter")) + #if($r.available("filter")) $r.render("filter") #end </div> @@ -22,6 +17,4 @@ </div> #end </div> -<div> - $r.render("allThreadTable") -</div> +$r.render("threads") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/_content/threadview.html b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html new file mode 100644 index 00000000000..343bcaaf258 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/_content/threadview.html @@ -0,0 +1,198 @@ +#if($r.available("backLinkLT")) +<div class="o_block">$r.render("backLinkLT")</div> +#end +<div class="o_forum"> + <div class="clearfix o_block"> + #if($filteredForLastName) + <h3>$r.translate("filter.results.title") $r.escapeHtml($filteredForFirstName) $r.escapeHtml($filteredForLastName)</h3> + #end + <div class="o_forum_toolbar btn-group"> + #if($r.available("archive.thread") && $r.visible("archive.thread")) + $r.render("archive.thread") + #end + #if(!$guestOnly && (($r.available("close.thread") && $r.visible("close.thread")) || ($r.available("open.thread") && $r.visible("open.thread")) || ($r.available("hide.thread") && $r.visible("hide.thread")) || ($r.available("show.thread") && $r.visible("show.thread")) || ($r.available("msg.sticky") && $r.visible("msg.sticky")) || ($r.available("remove.sticky") && $r.visible("remove.sticky")))) + <button type="button" class="btn btn-sm dropdown-toggle" data-toggle="dropdown"> + <i class="o_icon o_icon-fw o_icon_actions"></i> + <span class="caret"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right"> + #if($r.available("close.thread") && $r.visible("close.thread")) + <li>$r.render("close.thread")</li> + #end + #if($r.available("open.thread") && $r.visible("open.thread")) + <li>$r.render("open.thread")</li> + #end + #if($r.available("hide.thread") && $r.visible("hide.thread")) + <li>$r.render("hide.thread")</li> + #end + #if($r.available("show.thread") && $r.visible("show.thread")) + <li>$r.render("show.thread")</li> + #end + #if($r.available("msg.sticky") && $r.visible("msg.sticky")) + <li>$r.render("msg.sticky")</li> + #end + #if($r.available("remove.sticky") && $r.visible("remove.sticky")) + <li>$r.render("remove.sticky")</li> + #end + </ul> + #end + </div> + + <div class="o_forum_toolbar btn-group pull-right"> + #if ($r.available("viewswitch.threadview") && $r.visible("viewswitch.threadview")) + $r.render("viewswitch.threadview") + #end + #if ($r.available("viewswitch.flatview")) + $r.render("viewswitch.flatview") + #end + #if ($r.available("viewswitch.messageview")) + $r.render("viewswitch.messageview") + #end + #if ($r.available("viewswitch.marked")) + $r.render("viewswitch.marked") + #end + #if ($r.available("viewswitch.new")) + $r.render("viewswitch.new") + #end + </div> + </div> + #if ($messages.isEmpty()) + #if ($mode == "marked") + <p class="o_important">$r.translate("msg.no_marked_message")</p> + #elseif ($mode == "new") + <p class="o_important">$r.translate("msg.no_new_message")</p> + #end + #end + +#foreach ($message in $messages) + #set( $count = $velocityCount - 1) + <div #if($threadMode) style="margin-left: ${message.depth}em" #end class="o_forum_message o_block_large_bottom #if($message.newMessage) o_forum_message_new #end #if($message.key == $goToMessageId) o_forum_message_highlight #end" id="o_forum_message_${message.key}"> + <div class="o_forum_message_header clearfix"> + #if($r.available("eportfolio_${message.key}")) + <div class="o_ep_collect">$r.render("eportfolio_${message.key}")</div> + #end + #if($r.available("mark_${count}")) + <div class="o_mark">$r.render("mark_${count}")</div> + #end + #if(!$guestOnly) + #if($message.guest || ($message.pseudonym && !${message.pseudonym.isEmpty()})) + <div class="o_portrait"><div class="o_portrait_image"><img src="$r.staticLink("images/transparent.gif")" class="o_portrait_avatar o_portrait_anonymous" /></div></div> + #elseif($r.available("portrait_${message.key}")) + $r.render("portrait_${message.key}") + #end + #end + + <h4 class="o_forum_message_title"> + $r.escapeHtml($message.title) + #if($message.newMessage) + <span class="o_newindicator" title="$r.translateInAttribute("message.unread")"><i class="o_icon o_icon_new" > </i> <span class="o_label">$r.translate("new")</span></span> + #end + </h4> + <div class="o_author"> + #if($message.pseudonym && !${message.pseudonym.isEmpty()}) + $r.escapeHtml($message.pseudonym) + #elseif($message.guest) + $r.translate("anonymous.poster") + #elseif($r.available("vc_${count}")) + $r.render("vc_${count}") + #else + $r.escapeHtml($message.creatorFirstname) $r.escapeHtml($message.creatorLastname) + #end + </div> + <div class="o_date"> + $r.translate("msg.creationdate") $message.formattedCreationDate + </div> + + #if($message.modified || $message.moved) + <div class="o_modified"> + #if($message.modified) + $r.translate("msg.modified"): $r.escapeHtml($message.modifierFirstName) $r.escapeHtml($message.modifierLastName) $message.formattedLastModified + #end + #if($message.moved) + $r.translate("msg.moved") + #end + </div> + #end + </div> + + <div class="o_forum_message_body"> + <div class="clearfix o_scrollblock">$r.formatLatexFormulas($message.body)</div> + </div> + + <div class="o_forum_message_actions o_button_group"> + #if($r.available("open_in_thread_${count}")) + $r.render("open_in_thread_${count}") + #end + + #if ($r.available("dl_${count}") || $r.available("ed_${count}")) + <div class="btn-group"> + #if($r.available("dl_${count}")) + $r.render("dl_${count}") + #end + #if ($r.available("ed_${count}")) + $r.render("ed_${count}") + #end + </div> + #end + + #if ($r.available("rp_${count}")) + <div class="btn-group">$r.render("qt_${count}") $r.render("rp_${count}")</div> + #end + + #if($r.available("split_${count}")) + <div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + <i class="o_icon o_icon-fw o_icon_actions"></i> + <span class="caret"></span> + </button> + <ul class="dropdown-menu dropdown-menu-right"> + <li>$r.render("split_${count}")</li> + <li>$r.render("move_${count}")</li> + </ul> + </div> + #end + </div> + + #if(${message.hasAttachments()}) + <div class="o_forum_message_attachments"> + <h5>$r.translate("attachments"):</h5> + <ul class="list-inline"> + #foreach($attachment in $message.attachments) + #set($fname = $attachment.getName()) + <li class="o_attachment"> + <a href="$r.commandURI("attachment_${velocityCount}_${message.key}")$fname" target="_blank"> + <div class="o_filename">$r.escapeHtml($fname)</div> + <div class="o_size"> + <i class="o_icon o_icon-fw $r.getFiletypeIconCss($fname)"></i> + $r.formatBytes($attachment.getSize()) + </div> + #if ($attachment.getMetaInfo() && $attachment.getMetaInfo().isThumbnailAvailable()) + <img src="${thumbMapper}/$message.key/$attachment.getMetaInfo().getUUID()/$fname" class="img-thumbnail" alt="$r.escapeHtml("$fname")" title="$r.escapeHtml("$fname")"/> + <i class="o_icon o_icon-lg o_icon_enlarge"></i> + #end + </a> + </li> + #end + </ul> + </div> + #end + </div> +#end + +#if($mode == "one") + $r.render("singleThreadTable") + <script type="text/javascript"> + /* <![CDATA[ */ + o_scrollToElement('#o_top'); + /* ]]> */ + </script> +#end +#if(${goToMessage.isTrue()}) + <script type="text/javascript"> + /* <![CDATA[ */ + o_scrollToElement('#o_forum_message_$goToMessageId'); + /* ]]> */ + </script> +#end + +</div> ## END of o_forum \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/_content/user_list.html b/src/main/java/org/olat/modules/fo/ui/_content/user_list.html new file mode 100644 index 00000000000..df9e5453be2 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/_content/user_list.html @@ -0,0 +1,4 @@ +#if($r.available("back")) +<div class="o_block">$r.render("back")</div> +#end +$r.render("users") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/fo/ui/events/SelectMessageEvent.java b/src/main/java/org/olat/modules/fo/ui/events/SelectMessageEvent.java new file mode 100644 index 00000000000..5e6ddab81c8 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/events/SelectMessageEvent.java @@ -0,0 +1,58 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui.events; + +import org.olat.core.gui.control.Event; + +/** + * + * Initial date: 10.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class SelectMessageEvent extends Event { + + private static final long serialVersionUID = -478977517193199740L; + public static final String SELECT_THREAD = "select-thread"; + public static final String SELECT_MARKED = "select-marked"; + public static final String SELECT_NEW = "select-new"; + public static final String SELECT_MESSAGE = "select-message"; + + private Long messageKey; + private Long scrollToMessageKey; + + public SelectMessageEvent(String cmd, Long messageKey) { + this(cmd, messageKey, null); + } + + public SelectMessageEvent(String cmd, Long messageKey, Long scrollToMessageKey) { + super(cmd); + this.messageKey = messageKey; + this.scrollToMessageKey = scrollToMessageKey; + } + + public Long getMessageKey() { + return messageKey; + } + + public Long getScrollToMessageKey() { + return scrollToMessageKey; + } +} diff --git a/src/main/java/org/olat/modules/fo/ui/events/SelectUserEvent.java b/src/main/java/org/olat/modules/fo/ui/events/SelectUserEvent.java new file mode 100644 index 00000000000..0c59bb5cd25 --- /dev/null +++ b/src/main/java/org/olat/modules/fo/ui/events/SelectUserEvent.java @@ -0,0 +1,69 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.fo.ui.events; + +import org.olat.core.gui.control.Event; + +/** + * + * Initial date: 12.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class SelectUserEvent extends Event { + + private static final long serialVersionUID = -4325949984308787246L; + public static final String SELECT_USER = "select-user"; + + private Long identityKey; + private String pseudonym; + private boolean guest; + + public SelectUserEvent(Long identityKey, String pseudonym, boolean guest) { + super(SELECT_USER); + this.identityKey = identityKey; + this.pseudonym = pseudonym; + this.guest = guest; + } + + public Long getIdentityKey() { + return identityKey; + } + + public void setIdentityKey(Long identityKey) { + this.identityKey = identityKey; + } + + public String getPseudonym() { + return pseudonym; + } + + public void setPseudonym(String pseudonym) { + this.pseudonym = pseudonym; + } + + public boolean isGuest() { + return guest; + } + + public void setGuest(boolean guest) { + this.guest = guest; + } +} diff --git a/src/main/java/org/olat/modules/fo/OpenMessageInThreadEvent.java b/src/main/java/org/olat/modules/fo/ui/events/SelectUserListEvent.java similarity index 60% rename from src/main/java/org/olat/modules/fo/OpenMessageInThreadEvent.java rename to src/main/java/org/olat/modules/fo/ui/events/SelectUserListEvent.java index e6d1ec97579..94872af7212 100644 --- a/src/main/java/org/olat/modules/fo/OpenMessageInThreadEvent.java +++ b/src/main/java/org/olat/modules/fo/ui/events/SelectUserListEvent.java @@ -17,33 +17,23 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.modules.fo; +package org.olat.modules.fo.ui.events; import org.olat.core.gui.control.Event; /** * - * Description:<br> - * This event trigger the openning of the message in its thread - * - * <P> - * Initial Date: 18 sept. 2009 <br> - * @author srosse + * Initial date: 11.11.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * */ -public class OpenMessageInThreadEvent extends Event { - - private static final long serialVersionUID = -1215014162134562259L; +public class SelectUserListEvent extends Event { - public static final String OPEN_MSG_IN_THREAD = "open_msg_in_thread"; - - private final Message message; + private static final long serialVersionUID = -8837394501164914406L; + public static final String SELECT_USER_LIST = "select-user-list"; - public OpenMessageInThreadEvent(Message message) { - super(OPEN_MSG_IN_THREAD); - this.message = message; - } - - public Message getMessage() { - return message; + public SelectUserListEvent() { + super(SELECT_USER_LIST); } + } diff --git a/src/main/java/org/olat/modules/wiki/WikiForumCallback.java b/src/main/java/org/olat/modules/wiki/WikiForumCallback.java index e7309b6d071..996fc008df5 100644 --- a/src/main/java/org/olat/modules/wiki/WikiForumCallback.java +++ b/src/main/java/org/olat/modules/wiki/WikiForumCallback.java @@ -48,6 +48,11 @@ public class WikiForumCallback implements ForumCallback { this.context = context; } + @Override + public boolean mayUsePseudonym() { + return false; + } + @Override public boolean mayOpenNewThread() { return !isGuestOnly ; diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java index 6a36b585aa2..f7ff86a9312 100644 --- a/src/main/java/org/olat/modules/wiki/WikiMainController.java +++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java @@ -94,8 +94,8 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSMediaResource; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; -import org.olat.modules.fo.ForumController; -import org.olat.modules.fo.ForumManager; +import org.olat.modules.fo.manager.ForumManager; +import org.olat.modules.fo.ui.ForumController; import org.olat.modules.wiki.gui.components.wikiToHtml.ErrorEvent; import org.olat.modules.wiki.gui.components.wikiToHtml.FilterUtil; import org.olat.modules.wiki.gui.components.wikiToHtml.RequestImageEvent; diff --git a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java index e0225a5912c..195d547ab97 100644 --- a/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java +++ b/src/main/java/org/olat/modules/wiki/WikiPageChangeOrCreateNotificationHandler.java @@ -60,9 +60,9 @@ import org.olat.fileresource.types.WikiResource; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.modules.ModuleConfiguration; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.ForumNotificationsHandler; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; diff --git a/src/main/java/org/olat/portfolio/EPUIFactory.java b/src/main/java/org/olat/portfolio/EPUIFactory.java index ba1c244dc15..b88a0c2cc9a 100755 --- a/src/main/java/org/olat/portfolio/EPUIFactory.java +++ b/src/main/java/org/olat/portfolio/EPUIFactory.java @@ -88,7 +88,8 @@ public class EPUIFactory { * @param businessPath * @return */ - public static Controller createArtefactCollectWizzardController(UserRequest ureq, WindowControl wControl, OLATResourceable ores, String businessPath) { + public static Controller createArtefactCollectWizzardController(UserRequest ureq, WindowControl wControl, + OLATResourceable ores, String businessPath) { PortfolioModule portfolioModule = (PortfolioModule) CoreSpringFactory.getBean("portfolioModule"); EPArtefactHandler<?> handler = portfolioModule.getArtefactHandler(ores.getResourceableTypeName()); if (portfolioModule.isEnabled() && handler != null && handler.isEnabled()) { @@ -97,6 +98,16 @@ public class EPUIFactory { return null; } + public static Controller createArtefactCollectWizzardController(UserRequest ureq, WindowControl wControl, + int numOfArtefact, OLATResourceable ores, String businessPath) { + PortfolioModule portfolioModule = (PortfolioModule) CoreSpringFactory.getBean("portfolioModule"); + EPArtefactHandler<?> handler = portfolioModule.getArtefactHandler(ores.getResourceableTypeName()); + if (portfolioModule.isEnabled() && handler != null && handler.isEnabled()) { + return new ArtefactWizzardStepsController(ureq, wControl, numOfArtefact, ores, businessPath); + } + return null; + } + /** * opens an artefact in an overlay window with all available details in read-only mode * @param artefact diff --git a/src/main/java/org/olat/portfolio/manager/EPArtefactManager.java b/src/main/java/org/olat/portfolio/manager/EPArtefactManager.java index 6c2eba2dbbf..f3cb94f368a 100755 --- a/src/main/java/org/olat/portfolio/manager/EPArtefactManager.java +++ b/src/main/java/org/olat/portfolio/manager/EPArtefactManager.java @@ -23,12 +23,16 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; +import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBQuery; @@ -483,6 +487,30 @@ public class EPArtefactManager extends BasicManager { if (artefacts.isEmpty()) return null; return artefacts; } + + protected Map<String,Long> loadNumOfArtefactsByStartingBusinessPath(String startOfBusinessPath, IdentityRef author) { + if (!StringHelper.containsNonWhitespace(startOfBusinessPath) || author == null) { + return Collections.emptyMap(); + } + + StringBuilder sb = new StringBuilder(); + sb.append("select artefact.businessPath, count(artefact.key) from ").append(AbstractArtefact.class.getName()).append(" artefact") + .append(" where artefact.businessPath like :bpath and artefact.author.key=:identityKey") + .append(" group by artefact.businessPath"); + + List<Object[]> objectsList = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Object[].class) + .setParameter("bpath", startOfBusinessPath + "%") + .setParameter("identityKey", author.getKey()) + .getResultList(); + Map<String,Long> stats = new HashMap<>(); + for(Object[] objects:objectsList) { + String bp = (String)objects[0]; + Long count = (Long)objects[1]; + stats.put(bp, count); + } + return stats; + } protected void deleteArtefact(AbstractArtefact artefact) { getArtefactContainer(artefact).delete(); diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java index c371c95c3f3..8783d2fb537 100755 --- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java +++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java @@ -306,6 +306,10 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData return artefactManager.loadArtefactsByBusinessPath(businessPath, author); } + public Map<String,Long> getNumOfArtefactsByStartingBusinessPath(String businessPath, IdentityRef author){ + return artefactManager.loadNumOfArtefactsByStartingBusinessPath(businessPath, author); + } + /** * List artefacts for indexing * @param author (optional) diff --git a/src/main/java/org/olat/portfolio/ui/artefacts/collect/ArtefactWizzardStepsController.java b/src/main/java/org/olat/portfolio/ui/artefacts/collect/ArtefactWizzardStepsController.java index 9e48cc7ac7e..e68f807022f 100755 --- a/src/main/java/org/olat/portfolio/ui/artefacts/collect/ArtefactWizzardStepsController.java +++ b/src/main/java/org/olat/portfolio/ui/artefacts/collect/ArtefactWizzardStepsController.java @@ -22,7 +22,6 @@ package org.olat.portfolio.ui.artefacts.collect; import java.util.Date; import java.util.List; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; @@ -41,6 +40,7 @@ import org.olat.portfolio.EPArtefactHandler; import org.olat.portfolio.PortfolioModule; import org.olat.portfolio.manager.EPFrontendManager; import org.olat.portfolio.model.artefacts.AbstractArtefact; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -55,17 +55,21 @@ import org.olat.portfolio.model.artefacts.AbstractArtefact; public class ArtefactWizzardStepsController extends BasicController { private Controller collectStepsCtrl; - EPFrontendManager ePFMgr; - private PortfolioModule portfolioModule; + private Link addLink; AbstractArtefact artefact; private OLATResourceable ores; private String businessPath; private VFSContainer tmpFolder = null; + + @Autowired + private EPFrontendManager ePFMgr; + @Autowired + private PortfolioModule portfolioModule; public ArtefactWizzardStepsController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); - setManagersAndModule(); + EPArtefactHandler<?> handler = portfolioModule.getArtefactHandler("Forum"); AbstractArtefact newArtefact = handler.createArtefact(); this.artefact = newArtefact; @@ -84,7 +88,7 @@ public class ArtefactWizzardStepsController extends BasicController { */ public ArtefactWizzardStepsController(UserRequest ureq, WindowControl wControl, AbstractArtefact artefact, VFSContainer tmpFolder) { super(ureq, wControl); - setManagersAndModule(); + this.artefact = artefact; this.tmpFolder = tmpFolder; @@ -105,7 +109,6 @@ public class ArtefactWizzardStepsController extends BasicController { */ public ArtefactWizzardStepsController(UserRequest ureq, WindowControl wControl, OLATResourceable ores, String businessPath) { super(ureq, wControl); - setManagersAndModule(); this.ores = ores; this.businessPath = businessPath; initCollectLinkVelocity(); @@ -121,35 +124,40 @@ public class ArtefactWizzardStepsController extends BasicController { */ public ArtefactWizzardStepsController(UserRequest ureq, WindowControl wControl, AbstractArtefact artefact) { super(ureq, wControl); - setManagersAndModule(); this.artefact = artefact; this.businessPath = artefact.getBusinessPath(); initCollectLinkVelocity(); } - - /** - * @param ureq - * @param artefact - */ + + public ArtefactWizzardStepsController(UserRequest ureq, WindowControl wControl, int numOfArtefacts, + OLATResourceable ores, String businessPath) { + super(ureq, wControl); + this.ores = ores; + this.businessPath = businessPath; + initCollectLinkVelocity(numOfArtefacts); + } + private void initCollectLinkVelocity() { + List<AbstractArtefact> existingArtefacts = ePFMgr.loadArtefactsByBusinessPath(businessPath, getIdentity()); + int numOfArtefacts = existingArtefacts == null ? 0 : existingArtefacts.size(); + initCollectLinkVelocity(numOfArtefacts); + } + + private void initCollectLinkVelocity(int numOfArtefacts) { addLink = LinkFactory.createCustomLink("add.to.eportfolio", "add.to.eportfolio", "", Link.LINK_CUSTOM_CSS + Link.NONTRANSLATED, null, this); addLink.setCustomEnabledLinkCSS("o_eportfolio_add"); addLink.setIconLeftCSS("o_icon o_icon-lg o_icon_eportfolio_add"); addLink.setTooltip(translate("add.to.eportfolio")); addLink.setTranslator(getTranslator()); - // check for an already existing artefact with same businessPath, change collect-item - List<AbstractArtefact> existingArtefacts = ePFMgr.loadArtefactsByBusinessPath(businessPath, getIdentity()); - if (existingArtefacts!=null){ - int amount = existingArtefacts.size(); + if (numOfArtefacts > 0) { addLink.setIconLeftCSS("o_icon o_icon-lg o_icon_eportfolio_add"); addLink.setCustomEnabledLinkCSS("o_eportfolio_add_again"); - addLink.setTooltip(translate("add.to.eportfolio.again", String.valueOf(amount))); + addLink.setTooltip(translate("add.to.eportfolio.again", String.valueOf(numOfArtefacts))); } putInitialPanel(addLink); getInitialComponent().setSpanAsDomReplaceable(true); // special case since controller is actually just a link } - /** * @param ores @@ -165,10 +173,7 @@ public class ArtefactWizzardStepsController extends BasicController { this.artefact = artefact1; } - private void setManagersAndModule() { - ePFMgr = (EPFrontendManager) CoreSpringFactory.getBean("epFrontendManager"); - portfolioModule = (PortfolioModule) CoreSpringFactory.getBean("portfolioModule"); - } + private void initCollectionStepWizzard(UserRequest ureq) { if (artefact == null && ores != null) prepareNewArtefact(); diff --git a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java index 148823b261c..47b6c1b25e1 100644 --- a/src/main/java/org/olat/search/service/indexer/ForumIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/ForumIndexer.java @@ -31,8 +31,8 @@ import java.util.List; import org.apache.lucene.document.Document; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.search.service.SearchResourceContext; import org.olat.search.service.document.ForumMessageDocument; diff --git a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java index 85a1bf3a083..d9903a8d540 100644 --- a/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/group/GroupForumIndexer.java @@ -39,9 +39,9 @@ import org.olat.core.logging.AssertException; import org.olat.group.BusinessGroup; import org.olat.group.ui.run.BusinessGroupMainRunController; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; import org.olat.modules.fo.Status; +import org.olat.modules.fo.manager.ForumManager; import org.olat.properties.NarrowedPropertyManager; import org.olat.properties.Property; import org.olat.search.service.SearchResourceContext; diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java index c6142f03e09..102a71a4656 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/course/DialogCourseNodeIndexer.java @@ -52,9 +52,9 @@ import org.olat.modules.dialog.DialogElementsController; import org.olat.modules.dialog.DialogElementsPropertyManager; import org.olat.modules.dialog.DialogPropertyElements; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; import org.olat.modules.fo.Status; +import org.olat.modules.fo.manager.ForumManager; import org.olat.search.service.SearchResourceContext; import org.olat.search.service.document.ForumMessageDocument; import org.olat.search.service.document.file.DocumentAccessException; diff --git a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java index fd11d7357f8..a033e559dd9 100644 --- a/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java +++ b/src/main/java/org/olat/search/service/indexer/repository/course/FOCourseNodeIndexer.java @@ -40,9 +40,9 @@ import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.FOCourseNode; import org.olat.course.properties.CoursePropertyManager; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; import org.olat.modules.fo.Status; +import org.olat.modules.fo.manager.ForumManager; import org.olat.properties.Property; import org.olat.search.service.SearchResourceContext; import org.olat.search.service.indexer.ForumIndexer; diff --git a/src/main/java/org/olat/user/UserPropertiesRow.java b/src/main/java/org/olat/user/UserPropertiesRow.java index 7eb5f571914..94509e219de 100644 --- a/src/main/java/org/olat/user/UserPropertiesRow.java +++ b/src/main/java/org/olat/user/UserPropertiesRow.java @@ -35,17 +35,21 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; */ public class UserPropertiesRow { - private Long identityKey; - private String identityName; - private String[] identityProps; + private final Long identityKey; + private final String identityName; + private final String[] identityProps; public UserPropertiesRow(Identity identity, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { - identityKey = identity.getKey(); - identityName = identity.getName(); - identityProps = new String[userPropertyHandlers.size()]; - for(int i=userPropertyHandlers.size(); i-->0; ) { - identityProps[i] = userPropertyHandlers.get(i).getUserProperty(identity.getUser(), locale); + if(identity == null) { + identityKey = null; + identityName = null; + } else { + identityKey = identity.getKey(); + identityName = identity.getName(); + for(int i=userPropertyHandlers.size(); i-->0; ) { + identityProps[i] = userPropertyHandlers.get(i).getUserProperty(identity.getUser(), locale); + } } } diff --git a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml index 341d44841c4..9b827e0978e 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml @@ -242,6 +242,26 @@ </bean> </entry> + <entry key="org.olat.modules.fo.ui.ForumUserListController"> + <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> + <property name="propertyHandlers"> + <list> + <ref bean="userPropertyFirstName" /> + <ref bean="userPropertyLastName" /> + </list> + </property> + <property name="adminViewOnlyProperties"> + <set></set> + </property> + <property name="mandatoryProperties"> + <set> + <ref bean="userPropertyFirstName" /> + <ref bean="userPropertyLastName" /> + </set> + </property> + </bean> + </entry> + <entry key="org.olat.group.ui.main.MemberInfoController"> <!-- First name and last name are already shown --> <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> diff --git a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java index 2a2ef6e9fc9..2b047a83a55 100644 --- a/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java +++ b/src/main/java/org/olat/util/logging/activity/LoggingResourceable.java @@ -27,7 +27,6 @@ package org.olat.util.logging.activity; import java.io.UnsupportedEncodingException; -import java.util.List; import org.olat.commons.calendar.model.Kalendar; import org.olat.core.id.Identity; @@ -46,8 +45,8 @@ import org.olat.group.BusinessGroup; import org.olat.group.area.BGArea; import org.olat.group.ui.run.BusinessGroupMainRunController; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.webFeed.models.Feed; import org.olat.modules.webFeed.models.Item; import org.olat.repository.RepositoryEntry; @@ -388,13 +387,7 @@ public class LoggingResourceable implements ILoggingResourceable { * @return a LoggingResourceable wrapping the given Forum */ public static LoggingResourceable wrap(Forum forum) { - final String name; - List<Message> forumMessages = ForumManager.getInstance().getMessagesByForumID(forum.getKey(), 0, 1, null, true); - if (forumMessages==null || forumMessages.size()==0) { - name = null; - } else { - name = forumMessages.get(0).getTitle(); - } + final String name = ForumManager.getInstance().getForumNameForLogging(forum); return new LoggingResourceable(forum, OlatResourceableType.forum, forum.getResourceableTypeName(), String.valueOf(forum.getResourceableId()), name, false); } diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml index 6ceed4375b6..20a571cfc2c 100644 --- a/src/main/resources/META-INF/persistence.xml +++ b/src/main/resources/META-INF/persistence.xml @@ -38,9 +38,6 @@ <mapping-file>org/olat/course/nodes/projectbroker/datamodel/Project.hbm.xml</mapping-file> <mapping-file>org/olat/course/nodes/projectbroker/datamodel/ProjectBroker.hbm.xml</mapping-file> <mapping-file>org/olat/course/assessment/model/UserEfficiencyStatementImpl.hbm.xml</mapping-file> - <mapping-file>org/olat/modules/fo/ForumImpl.hbm.xml</mapping-file> - <mapping-file>org/olat/modules/fo/MessageImpl.hbm.xml</mapping-file> - <mapping-file>org/olat/modules/fo/ReadMessage.hbm.xml</mapping-file> <mapping-file>org/olat/modules/openmeetings/model/OpenMeetingsReference.hbm.xml</mapping-file> <mapping-file>org/olat/properties/Property.hbm.xml</mapping-file> <mapping-file>org/olat/registration/TemporaryKeyImpl.hbm.xml</mapping-file> @@ -136,6 +133,13 @@ <class>org.olat.instantMessaging.model.InstantMessageNotificationImpl</class> <class>org.olat.ims.qti.statistics.model.QTIStatisticResult</class> <class>org.olat.ims.qti.statistics.model.QTIStatisticResultSet</class> + <class>org.olat.modules.fo.model.ForumImpl</class> + <class>org.olat.modules.fo.model.MessageImpl</class> + <class>org.olat.modules.fo.model.MessageRefImpl</class> + <class>org.olat.modules.fo.model.MessageLightImpl</class> + <class>org.olat.modules.fo.model.MessagePeekviewImpl</class> + <class>org.olat.modules.fo.model.ReadMessageImpl</class> + <class>org.olat.modules.fo.model.MessageStatistics</class> <class>org.olat.modules.qpool.model.PoolImpl</class> <class>org.olat.modules.qpool.model.PoolToItem</class> <class>org.olat.modules.qpool.model.PoolItemShortView</class> diff --git a/src/main/resources/database/mysql/alter_10_3_4_to_10_4_0.sql b/src/main/resources/database/mysql/alter_10_3_4_to_10_4_0.sql index 128fabaf984..ff56ea65e94 100644 --- a/src/main/resources/database/mysql/alter_10_3_4_to_10_4_0.sql +++ b/src/main/resources/database/mysql/alter_10_3_4_to_10_4_0.sql @@ -1,3 +1,9 @@ +alter table o_message modify creator_id bigint NULL DEFAULT NULL; +alter table o_message add column pseudonym varchar(255); +alter table o_message add column guest bit default 0; + + + create table o_cal_use_config ( id bigint not null, creationdate datetime not null, diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 22332ce509b..9a62caa817d 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -228,9 +228,11 @@ create table if not exists o_message ( creationdate datetime, title varchar(100), body longtext, + pseudonym varchar(255), + guest bit default 0, parent_id bigint, topthread_id bigint, - creator_id bigint not null, + creator_id bigint, modifier_id bigint, forum_fk bigint, statuscode integer, @@ -238,6 +240,9 @@ create table if not exists o_message ( numofcharacters integer, primary key (message_id) ); + + + create table if not exists o_gp_bgtoarea_rel ( bgtoarea_id bigint not null, version mediumint unsigned not null, diff --git a/src/main/resources/database/oracle/alter_10_3_4_to_10_4_0.sql b/src/main/resources/database/oracle/alter_10_3_4_to_10_4_0.sql index 657661f9253..93dfccc0392 100644 --- a/src/main/resources/database/oracle/alter_10_3_4_to_10_4_0.sql +++ b/src/main/resources/database/oracle/alter_10_3_4_to_10_4_0.sql @@ -1,3 +1,9 @@ +alter table o_message modify (creator_id null); +alter table o_message add pseudonym varchar2(255 char); +alter table o_message add guest number default 0 not null; + + + create table o_cal_use_config ( id number(20) not null, creationdate date not null, diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 1f6e91e45a5..b598fedb4b7 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -264,9 +264,11 @@ CREATE TABLE o_message ( creationdate date, title varchar2(100 char), body CLOB, + pseudonym varchar2(255 char), + guest number default 0 not null, parent_id number(20), topthread_id number(20), - creator_id number(20) NOT NULL, + creator_id number(20), modifier_id number(20), forum_fk number(20), statuscode number(11), diff --git a/src/main/resources/database/postgresql/alter_10_3_4_to_10_4_0.sql b/src/main/resources/database/postgresql/alter_10_3_4_to_10_4_0.sql index a84581abca9..0adfaa68b53 100644 --- a/src/main/resources/database/postgresql/alter_10_3_4_to_10_4_0.sql +++ b/src/main/resources/database/postgresql/alter_10_3_4_to_10_4_0.sql @@ -1,3 +1,10 @@ +alter table o_message alter column creator_id DROP NOT NULL; +alter table o_message add column pseudonym varchar(255); +alter table o_message add column guest bool not null default false; + + + + create table o_cal_use_config ( id int8 not null, creationdate timestamp not null, diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 047f864e378..0f90d4bda37 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -226,9 +226,11 @@ create table o_message ( creationdate timestamp, title varchar(100), body text, + pseudonym varchar(255), + guest bool not null default false, parent_id int8, topthread_id int8, - creator_id int8 not null, + creator_id int8, modifier_id int8, forum_fk int8, statuscode int4, diff --git a/src/main/webapp/static/themes/light/modules/_forum.scss b/src/main/webapp/static/themes/light/modules/_forum.scss index ff862aaf867..6bc571d2129 100644 --- a/src/main/webapp/static/themes/light/modules/_forum.scss +++ b/src/main/webapp/static/themes/light/modules/_forum.scss @@ -21,6 +21,10 @@ .o_forum_fulltextsearch { float: left; } + + .o_forum_toolbar .o_forum_tool span { + display: none; + } } .o_forum { diff --git a/src/main/webapp/static/themes/light/modules/_icons.scss b/src/main/webapp/static/themes/light/modules/_icons.scss index f2b175ec1e4..0b414e0d3b8 100644 --- a/src/main/webapp/static/themes/light/modules/_icons.scss +++ b/src/main/webapp/static/themes/light/modules/_icons.scss @@ -346,6 +346,12 @@ $fa-css-prefix: "o_icon" !default; .o_forum_status_hidden_icon:before { content: $fa-var-eye-slash; color: $state-danger-text} .o_forum_status_visible_icon:before { content: $fa-var-eye; color: $state-success-text} +.o_forum_all_icon:before { content: $fa-var-align-right; } +.o_forum_all_flat_icon:before { content: $fa-var-align-justify; } +.o_forum_one_icon:before { content: $fa-var-eye; } +.o_forum_marked_icon:before { content: $fa-var-bookmark; } +.o_forum_new_icon:before { content: $fa-var-asterisk; } + /* tests icons */ .o_mi_qpool_import:before { content: $fa-var-database; } .o_mi_qtisection:before { content: $fa-var-cubes; } diff --git a/src/main/webapp/static/themes/light/theme.css b/src/main/webapp/static/themes/light/theme.css index 943c5c01321..9b7a1504757 100644 --- a/src/main/webapp/static/themes/light/theme.css +++ b/src/main/webapp/static/themes/light/theme.css @@ -22,5 +22,5 @@ * @author gnaegi, www.frentix.com * @date April. 2014 * ======================================================== -**//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]: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}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail,.o_form .o_filepreview img,.o_feed .o_media{padding:4px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,.o_cal .fc-header-title h2,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,.o_cal .fc-header-title h2 small,h4 .small,.o_cal .fc-header-title h2 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.o_cal .fc-header-title h2,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.o_cal .fc-header-title h2 small,h4 .small,.o_cal .fc-header-title h2 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.o_cal .fc-header-title h2,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width: 768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff}.bg-primary{background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857}dt{font-weight:bold}dd{margin-left:0}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}@media (min-width: 768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-15px;margin-right:-15px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.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>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-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-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px}input[type="date"].input-sm,.input-group-sm>input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.input-group-sm>input[type="time"].form-control,.input-group-sm>input[type="time"].input-group-addon,.input-group-sm>.input-group-btn>input[type="time"].btn,input[type="datetime-local"].input-sm,.input-group-sm>input[type="datetime-local"].form-control,.input-group-sm>input[type="datetime-local"].input-group-addon,.input-group-sm>.input-group-btn>input[type="datetime-local"].btn,input[type="month"].input-sm,.input-group-sm>input[type="month"].form-control,.input-group-sm>input[type="month"].input-group-addon,.input-group-sm>.input-group-btn>input[type="month"].btn{line-height:30px}input[type="date"].input-lg,.input-group-lg>input[type="date"].form-control,.input-group-lg>input[type="date"].input-group-addon,.input-group-lg>.input-group-btn>input[type="date"].btn,input[type="time"].input-lg,.input-group-lg>input[type="time"].form-control,.input-group-lg>input[type="time"].input-group-addon,.input-group-lg>.input-group-btn>input[type="time"].btn,input[type="datetime-local"].input-lg,.input-group-lg>input[type="datetime-local"].form-control,.input-group-lg>input[type="datetime-local"].input-group-addon,.input-group-lg>.input-group-btn>input[type="datetime-local"].btn,input[type="month"].input-lg,.input-group-lg>input[type="month"].form-control,.input-group-lg>input[type="month"].input-group-addon,.input-group-lg>.input-group-btn>input[type="month"].btn{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,fieldset[disabled] .radio-inline,.checkbox-inline.disabled,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,fieldset[disabled] .radio label,.checkbox.disabled label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn,.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,.form-group-sm .form-control,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn,.form-group-sm .form-control{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn,.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,.form-group-lg .form-control,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn,.form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-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}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label ~ .form-control-feedback{top:25px}.has-feedback label.sr-only ~ .form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-group,.o_navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.o_navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static,.o_navbar-form .form-control-static{display:inline-block}.form-inline .input-group,.o_navbar-form .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.o_navbar-form .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.o_navbar-form .input-group .input-group-btn,.form-inline .input-group .form-control,.o_navbar-form .input-group .form-control{width:auto}.form-inline .input-group>.form-control,.o_navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.o_navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.o_navbar-form .radio,.form-inline .checkbox,.o_navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.o_navbar-form .radio label,.form-inline .checkbox label,.o_navbar-form .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.o_navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.o_navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback,.o_navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}@media (min-width: 768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled].active,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.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:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.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;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;visibility:visible !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width: 480px) and (orientation: landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 768px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width: 768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width: 768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width: 768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right ~ .navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:hover,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:hover,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.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;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.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:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.jumbotron,.o_repo_details .o_lead{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.o_repo_details .o_lead h1,.jumbotron .h1,.o_repo_details .o_lead .h1{color:inherit}.jumbotron p,.o_repo_details .o_lead p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr,.o_repo_details .o_lead>hr{border-top-color:#d5d5d5}.container .jumbotron,.container .o_repo_details .o_lead,.o_repo_details .container .o_lead,.container-fluid .jumbotron,.container-fluid .o_repo_details .o_lead,.o_repo_details .container-fluid .o_lead{border-radius:6px}.jumbotron .container,.o_repo_details .o_lead .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron,.o_repo_details .o_lead{padding:48px 0}.container .jumbotron,.container .o_repo_details .o_lead,.o_repo_details .container .o_lead,.container-fluid .jumbotron,.container-fluid .o_repo_details .o_lead,.o_repo_details .container-fluid .o_lead{padding-left:60px;padding-right:60px}.jumbotron h1,.o_repo_details .o_lead h1,.jumbotron .h1,.o_repo_details .o_lead .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border 0.2s ease-in-out;-o-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#333}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4,.alert .o_cal .fc-header-title h2,.o_cal .fc-header-title .alert h2{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 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:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-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-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{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:-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);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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:-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-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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:-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-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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:-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-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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:-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table,.panel-collapse>.table,.panel-collapse>.table-responsive>.table,.panel-collapse>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption,.panel-collapse>.table caption,.panel-collapse>.table-responsive>.table caption,.panel-collapse>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child,.panel-collapse>.table:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child,.panel-collapse>.table:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body,.panel-collapse>.panel-body+.table,.panel-collapse>.panel-body+.table-responsive,.panel-collapse>.table+.panel-body,.panel-collapse>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td,.panel-collapse>.table>tbody:first-child>tr:first-child th,.panel-collapse>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered,.panel-collapse>.table-bordered,.panel-collapse>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel-collapse>.table-bordered>thead>tr>th:first-child,.panel-collapse>.table-bordered>thead>tr>td:first-child,.panel-collapse>.table-bordered>tbody>tr>th:first-child,.panel-collapse>.table-bordered>tbody>tr>td:first-child,.panel-collapse>.table-bordered>tfoot>tr>th:first-child,.panel-collapse>.table-bordered>tfoot>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel-collapse>.table-bordered>thead>tr>th:last-child,.panel-collapse>.table-bordered>thead>tr>td:last-child,.panel-collapse>.table-bordered>tbody>tr>th:last-child,.panel-collapse>.table-bordered>tbody>tr>td:last-child,.panel-collapse>.table-bordered>tfoot>tr>th:last-child,.panel-collapse>.table-bordered>tfoot>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel-collapse>.table-bordered>thead>tr:first-child>td,.panel-collapse>.table-bordered>thead>tr:first-child>th,.panel-collapse>.table-bordered>tbody>tr:first-child>td,.panel-collapse>.table-bordered>tbody>tr:first-child>th,.panel-collapse>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel-collapse>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel-collapse>.table-bordered>tbody>tr:last-child>td,.panel-collapse>.table-bordered>tbody>tr:last-child>th,.panel-collapse>.table-bordered>tfoot>tr:last-child>td,.panel-collapse>.table-bordered>tfoot>tr:last-child>th,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive,.panel-collapse>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-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-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{content:" ";display:table}.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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.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:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;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.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-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}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:normal;line-height:1.42857;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.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{content:" ";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{content:" ";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{content:" ";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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width: 767px){.visible-xs-block{display:block !important}}@media (max-width: 767px){.visible-xs-inline{display:inline !important}}@media (max-width: 767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width: 1200px){.visible-lg-block{display:block !important}}@media (min-width: 1200px){.visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}body .modal{position:absolute;overflow:visible}body div.tooltip-inner{max-width:400px}body div.popover{max-width:450px}body .modal-body.alert{border-radius:0}body .progress{margin-bottom:0}.panel-body:nth-child(n+2){border-top:1px solid #ddd}.panel .panel-heading[data-toggle="collapse"]{cursor:pointer}#o_ajax_busy_backdrop{bottom:0;z-index:1020}.form-control-feedback{top:10px}.form-horizontal .has-feedback .form-control-feedback{top:10px}.btn.btn-primary.o_disabled{color:#fff !important}body .progress-bar[aria-valuenow="1"],body .progress-bar[aria-valuenow="2"]{min-width:1px}@-moz-document url-prefix(){fieldset{display:table-cell}}@font-face{font-family:'openolat';src:url("../light/fonts/openolat/openolat.eot?4yacgg");src:url("../light/fonts/openolat/openolat.eot?#iefix4yacgg") format("embedded-opentype"),url("../light/fonts/openolat/openolat.woff?4yacgg") format("woff"),url("../light/fonts/openolat/openolat.ttf?4yacgg") format("truetype"),url("../light/fonts/openolat/openolat.svg?4yacgg#openolat") format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'FontAwesome';src:url("../../font-awesome/fonts/fontawesome-webfont.eot?v=4.3.0");src:url("../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../../font-awesome/fonts/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../../font-awesome/fonts/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../../font-awesome/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.o_icon-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.o_icon-2x{font-size:2em}.o_icon-3x{font-size:3em}.o_icon-4x{font-size:4em}.o_icon-5x{font-size:5em}.o_icon-fw{width:1.28571em;text-align:center}.o_icon-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.o_icon-ul>li{position:relative}.o_icon-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.o_icon-li.o_icon-lg{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.o_icon.pull-left{margin-right:.3em}.o_icon.pull-right{margin-left:.3em}.o_icon-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.o_icon-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .o_icon-rotate-90,:root .o_icon-rotate-180,:root .o_icon-rotate-270,:root .o_icon-flip-horizontal,:root .o_icon-flip-vertical{filter:none}.o_icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.o_icon-stack-1x,.o_icon-stack-2x{position:absolute;left:0;width:100%;text-align:center}.o_icon-stack-1x{line-height:inherit}.o_icon-stack-2x{font-size:2em}.o_icon-inverse{color:#fff}.o_icon_accepted:before{content:"ï…¤"}.o_icon_accessibility:before{content:""}.o_icon_actions:before{content:"ï‚…"}.o_icon_archive_tool:before{content:""}.o_icon_assessment_mode:before{content:"ï„"}.o_icon_assessment_tool:before{content:"ï‚‘"}.o_icon_attempt_limit:before{content:""}.o_icon_accept:before{content:"";color:#5cb85c}.o_icon_add:before{content:"ï•"}.o_icon_add_member:before{content:""}.o_icon_add_search:before{content:""}.o_icon_audio:before{content:""}.o_icon_back:before{content:"ï“"}.o_icon_back_history:before{content:""}.o_icon_banned:before{content:"";color:#d9534f}.o_icon_bold:before{content:""}.o_icon_booking:before{content:"ïº"}.o_icon_bookmark:before{content:"";color:#bc2d0c}.o_icon_bookmark_add:before{content:"ï‚—"}.o_icon_bookmark_header:before{content:""}.o_icon_browse:before{content:""}.o_icon_browsercheck:before{content:"ï…¤"}.o_icon_busy:before{content:"ï„"}.o_icon_calendar:before{content:"ï³"}.o_icon_calendar_enabled:before{content:"ï†"}.o_icon_calendar_disabled:before{content:"ï‚–"}.o_icon_calendar:before{content:"ï³"}.o_icon_calendar_sync:before{content:""}.o_icon_caret:before{content:""}.o_icon_caret_right:before{content:""}.o_icon_catalog:before{content:""}.o_icon_catalog_sub:before{content:"ï»"}.o_icon_certificate:before{content:"ï‚£"}.o_icon_chat:before{content:""}.o_icon_check:before{content:""}.o_icon_check_off:before{content:"ï‚–"}.o_icon_check_on:before{content:"ï†"}.o_icon_checkbox:before{content:"ï‚–"}.o_icon_checkbox_checked:before{content:"ï…Š"}.o_icon_cleanup:before{content:""}.o_icon_close:before{content:"ï€"}.o_icon_close_resource:before{content:""}.o_icon_close_tab:before{content:"ï€"}.o_icon_close_tool:before{content:"ï€"}.o_icon_close_tree:before{content:""}.o_icon_close_togglebox:before,.o_togglebox_wrapper .o_opener.o_in i:before{content:""}.o_icon_code:before{content:"ï„¡"}.o_icon_color_picker:before{content:"ïƒ"}.o_icon_copy:before{content:""}.o_icon_courseareas:before{content:""}.o_icon_coursedb:before{content:""}.o_icon_courseeditor:before{content:"ï„"}.o_icon_coursefolder:before{content:"ï„”"}.o_icon_courserun:before{content:""}.o_icon_comments:before{content:""}.o_icon_comments_none:before{content:""}.o_icon_content_popup:before{content:"ï‚Ž"}.o_icon_correct_answer:before{content:"";color:#5cb85c}.o_icon_customize:before{content:""}.o_icon_delete_item:before{content:""}.o_icon_delete:before{content:"ï–";color:#A87E7E}.o_icon_details:before{content:""}.o_icon_description:before{content:"ïš"}.o_icon_dev:before{content:""}.o_icon_disabled:before{content:"ï„Œ"}.o_icon_download:before{content:""}.o_icon_edit:before{content:"ï„"}.o_icon_edit_file:before{content:"ï„"}.o_icon_edit_metadata:before{content:""}.o_icon_enabled:before{content:"ï„‘"}.o_icon_enlarge:before{content:""}.o_icon_eportfolio_add:before{content:"ï„®"}.o_icon_eportfolio_link:before{content:"ï„®"}.o_icon_error:before{content:"ïª";color:#d9534f}.o_icon_expenditure:before{content:""}.o_icon_export:before{content:"ï…"}.o_icon_external_link:before{content:"ï‚Ž"}.o_icon_failed:before{content:"ï—"}.o_icon_filter:before{content:"ï‚°"}.o_icon_graduate:before{content:"ï†"}.o_icon_group:before,.o_BusinessGroup_icon:before{content:""}.o_icon_header:before{content:""}.o_icon_help:before{content:"ï™";cursor:help}.o_icon_home:before{content:""}.o_icon_impress:before{content:"ïš"}.o_icon_important:before{content:"ï±";color:#f0ad4e}.o_icon_import:before{content:"ï‚“"}.o_icon_info:before{content:"ïš";color:#5bc0de}.o_icon_info_msg:before{content:"ïª";color:#d9534f}.o_icon_info_resource:before{content:"ïš"}.o_icon_inline_editable:before{content:"ï„"}.o_icon_institution:before{content:""}.o_icon_italic:before{content:""}.o_icon_landingpage:before{content:"ï…€"}.o_icon_language:before{content:""}.o_icon_layout:before{content:""}.o_icon_link:before{content:"ïƒ"}.o_icon_link_extern:before{content:"ï‚Ž"}.o_icon_list:before{content:""}.o_icon_list_num :before{content:""}.o_icon_lifecycle:before{content:"ï³"}.o_icon_locked:before{content:""}.o_icon_login:before{content:"ï‚"}.o_icon_logout:before{content:"ï‚‹"}.o_icon_mandatory:before{content:"ï©";color:#f0ad4e}.o_icon_managed:before{content:"ï¹";color:#777}.o_icon_manual:before{content:"ï€";cursor:help}.o_icon_mail:before{content:""}.o_icon_math:before{content:""}.o_icon_membersmanagement:before{content:""}.o_icon_menuhandel:before{content:""}.o_icon_message:before{content:"ïƒ "}.o_icon_mobile:before{content:"ï„‹"}.o_icon_move:before{content:"ï‡"}.o_icon_move_down:before{content:""}.o_icon_move_left:before{content:"ï„€"}.o_icon_move_right:before{content:"ï„"}.o_icon_move_up:before{content:"ï„‚"}.o_icon_new:before{content:"ï©";color:#5cb85c}.o_icon_new_document:before{content:"ï…œ"}.o_icon_new_folder:before{content:"ï»"}.o_icon_news:before{content:"ïš"}.o_icon_next:before{content:""}.o_icon_next_page:before{content:"ï„"}.o_icon_next_toolbar:before{content:""}.o_icon_node_after:before{content:"ï…µ"}.o_icon_node_before:before{content:"ï…¶"}.o_icon_node_under:before{content:"ï„’"}.o_icon_notes:before{content:"ï€"}.o_icon_notification:before{content:"ï‚ž"}.o_icon_ok:before{content:"";color:#5cb85c}.o_icon_open_tree:before{content:""}.o_icon_open_togglebox:before,.o_togglebox_wrapper .o_opener i:before{content:""}.o_icon_openolat:before,.o_icon_provider_olat:before{content:"\E600";font-family:openolat;font-size:10px}.o_icon_options:before{content:""}.o_icon_pageing:before{content:"ï…"}.o_icon_passed:before{content:"ï˜"}.o_icon_password:before{content:""}.o_icon_pending:before{content:"ï„"}.o_icon_phone:before{content:"ï‚•"}.o_icon_post:before{content:""}.o_icon_preview:before{content:"ï®"}.o_icon_previous:before{content:"ï„·"}.o_icon_previous_page:before{content:"ï„€"}.o_icon_previous_toolbar:before{content:""}.o_icon_print:before{content:""}.o_icon_private:before{content:""}.o_icon_provider_adfs:before{content:"ï…º"}.o_icon_provider_facebook:before{content:"ï‚š"}.o_icon_provider_google:before{content:""}.o_icon_provider_guest:before{content:""}.o_icon_provider_ldap:before{content:""}.o_icon_provider_linkedin:before{content:""}.o_icon_provider_oauth:before{content:""}.o_icon_provider_performx:before{content:""}.o_icon_provider_shibboleth:before{content:""}.o_icon_provider_twitter:before{content:"ï‚™"}.o_icon_publish:before{content:"ï¤"}.o_icon_qrcode:before{content:""}.o_icon_quickview:before{content:"ï®"}.o_icon_radio_off:before{content:"ï„Œ"}.o_icon_radio_on:before{content:"ï"}.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:""}.o_icon_rating_off:before{content:""}.o_icon_read:before{content:"ï„Œ"}.o_icon_readonly:before{content:"ï„";color:red}.o_icon_readwrite:before{content:"ï„"}.o_icon_recycle:before{content:""}.o_icon_refresh:before{content:""}.o_icon_reject:before{content:"ï€";color:#d9534f}.o_icon_rejected:before{content:"ï…¥"}.o_icon_reminder:before{content:""}.o_icon_remove:before{content:"ï€"}.o_icon_replace:before{content:""}.o_icon_reply:before{content:"ï„’"}.o_icon_reply_with_quote:before{content:"ï„¢"}.o_icon_response_feedback:before{content:""}.o_icon_review:before{content:"ï®"}.o_icon_rss:before{content:"ï‚ž"}.o_icon_rss_unsubscribe:before{content:"ï‚ž";color:#996633}.o_icon_search:before{content:""}.o_icon_select:before{content:""}.o_icon_send:before{content:"ïƒ "}.o_icon_settings:before{content:"ï‚…"}.o_icon_share:before{content:"ï¤"}.o_icon_show_more:before{content:"ï…"}.o_icon_show_less:before{content:"ï…‘"}.o_icon_show_send:before{content:""}.o_icon_sign_out:before{content:"ï‚‹"}.o_icon_spacer:before{content:"ï¾"}.o_icon_split:before{content:""}.o_icon_sort:before{content:""}.o_icon_sort_asc:before{content:""}.o_icon_sort_desc:before{content:"ïƒ"}.o_icon_sort_menu:before{content:"ï… "}.o_icon_start:before{content:"ï”"}.o_icon_status_available:before{content:"ï„‘";color:#063}.o_icon_status_chat:before{content:"ïµ"}.o_icon_status_dnd:before{content:"";color:#cc3}.o_icon_status_unavailable:before{content:"ïœ";color:#963}.o_icon_statistics_tool:before{content:"ï‚€"}.o_icon_submit:before{content:""}.o_icon_table:before{content:""}.o_icon_table_large:before{content:""}.o_icon_tags:before{content:""}.o_icon_timelimit:before{content:""}.o_icon_toggle:before{content:"ï„‘"}.o_icon_to_read:before{content:"ï„‘"}.o_icon_tool:before{content:""}.o_icon_tools:before{content:"ï‚"}.o_icon_top:before{content:"ï·"}.o_icon_translation_item:before{content:""}.o_icon_translation_package:before{content:"ï„•"}.o_icon_user:before{content:""}.o_icon_user_vip:before{content:"ï†"}.o_icon_user_anonymous:before{content:""}.o_icon_upload:before{content:"ï‚“"}.o_icon_version:before{content:""}.o_icon_video:before{content:""}.o_icon_waiting:before{content:""}.o_icon_warn:before{content:"ï±";color:#f0ad4e}.o_icon_wizard:before{content:"ïƒ"}.o_CourseModule_icon:before,.o_course_icon:before{content:""}.o_EPStructuredMapTemplate_icon:before{content:"ï„®"}.o_FileResource-BLOG_icon:before{content:"ï‚¡"}.o_FileResource-IMSCP_icon:before{content:""}.o_FileResource-PODCAST_icon:before{content:""}.o_FileResource-SHAREDFOLDER:before{content:"ï‚Ž"}.o_FileResource-SCORMCP_icon:before{content:""}.o_FileResource-SURVEY_icon:before{content:"ï„š"}.o_FileResource-TEST_icon:before{content:"ï„"}.o_FileResource-WIKI_icon:before{content:""}.o_FileResource-SHAREDFOLDER_icon:before{content:"ï„•"}.o_FileResource-GLOSSARY_icon:before{content:"ï†"}.o_FileResource-PDF_icon:before{content:"ï‡"}.o_FileResource-XLS_icon:before{content:""}.o_FileResource-PPT_icon:before{content:""}.o_FileResource-DOC_icon:before{content:""}.o_FileResource-ANIM_icon:before{content:""}.o_FileResource-IMAGE_icon:before{content:""}.o_FileResource-SOUND_icon:before{content:""}.o_FileResource-MOVIE_icon:before{content:""}.o_FileResource-FILE_icon:before{content:""}.o_CourseModule_icon_closed:before{content:"ïž"}.o_sp_icon:before{content:""}.o_st_icon:before{content:""}.o_tu_icon:before{content:"ï‚Ž"}.o_bc_icon:before{content:"ï„•"}.o_lti_icon:before{content:"ï‚Ž"}.o_cp_icon:before{content:""}.o_cp_item:before{content:""}.o_scorm_icon:before{content:""}.o_en_icon:before{content:"ï‚"}.o_fo_icon:before{content:""}.o_co_icon:before{content:""}.o_infomsg_icon:before{content:"ïš"}.o_cal_icon:before{content:"ï³"}.o_wiki_icon:before{content:""}.o_podcast_icon:before{content:""}.o_blog_icon:before{content:"ï‚¡"}.o_ep_icon:before{content:"ï„®"}.o_iqtest_icon:before{content:"ï„"}.o_iqself_icon:before{content:"ï„"}.o_iqsurv_icon:before{content:"ï„š"}.o_ta_icon:before{content:"ï‚®"}.o_gta_icon:before{content:"ï‚®"}.o_ms_icon:before{content:""}.o_dialog_icon:before{content:""}.o_projectbroker_icon:before{content:"ï„Œ"}.o_ll_icon:before{content:"ïƒ"}.o_den_icon:before{content:""}.o_cmembers_icon:before{content:""}.o_cl_icon:before{content:"ï†"}.o_vc_icon:before{content:""}.o_vitero_icon:before{content:""}.o_openmeetings_icon:before{content:""}.o_portlet_infomsg_icon:before{content:"ïš"}.o_portlet_quickstart_icon:before{content:""}.o_portlet_bookmark_icon:before{content:""}.o_portlet_groups_icon:before{content:""}.o_portlet_notes_icon:before{content:""}.o_portlet_noti_icon:before{content:"ï‚ž"}.o_portlet_eff_icon:before{content:"ï‚£"}.o_portlet_repository_student_icon:before{content:""}.o_portlet_repository_teacher_icon:before{content:"ï†"}.o_portlet_iframe_icon:before{content:""}.o_portlet_sysinfo_icon:before{content:""}.o_portlet_dyk_icon:before{content:""}.o_portlet_infomessages_icon:before{content:""}.o_portlet_cal_icon:before{content:"ï³"}.o_portlet_institutions_icon:before{content:""}.o_portlet_links_icon:before{content:"ïƒ"}.o_portlet_shibboleth_icon:before{content:"ï‚"}.o_icon_qpool:before{content:""}.o_icon_pool_private:before{content:"ï‚–"}.o_icon_pool_public:before{content:"ï†"}.o_icon_pool_my_items:before{content:""}.o_icon_pool_favorits:before{content:""}.o_icon_pool_collection:before{content:""}.o_icon_pool_pool:before{content:""}.o_icon_pool_share:before{content:""}.o_forum_message_icon:before{content:""}.o_calendar_icon:before{content:"ï³"}.o_forum_status_thread_icon:before{content:""}.o_forum_status_sticky_closed_icon:before{content:"ïž"}.o_forum_status_sticky_icon:before{content:""}.o_forum_status_closed_icon:before{content:"ïž";color:#a94442}.o_forum_status_opened_icon:before{content:"ïž";color:#3c763d}.o_forum_status_hidden_icon:before{content:"ï°";color:#a94442}.o_forum_status_visible_icon:before{content:"ï®";color:#3c763d}.o_mi_qpool_import:before{content:""}.o_mi_qtisection:before{content:""}.o_mi_qtisc:before{content:""}.o_mi_qtimc:before{content:"ï†"}.o_mi_qtikprim:before{content:"ï…Š"}.o_mi_qtifib:before{content:"ï…"}.o_mi_qtiessay:before{content:""}.o_as_mode_leadtime:before{content:""}.o_as_mode_assessment:before{content:"ï‹"}.o_as_mode_followup:before{content:"ïž"}.o_as_mode_closed:before{content:'-'}.o_black_led:before{content:"ï„‘";color:#337ab7}.o_green_led:before{content:"ï„‘";color:#5cb85c}.o_yellow_led:before{content:"ï„‘";color:#f0ad4e}.o_red_led:before{content:"ï„‘";color:#d9534f}.o_ac_token_icon:before{content:"ï‚„"}.o_ac_free_icon:before{content:"ï«"}.o_ac_group_icon:before{content:""}.o_ac_membersonly_icon:before{content:""}.o_ac_paypal_icon:before{content:""}.o_ac_status_canceled_icon:before{content:"ï¨";color:#f0ad4e}.o_ac_status_error_icon:before{content:"ï€";color:#d9534f}.o_ac_status_new_icon:before{content:"ï©";color:#337ab7}.o_ac_status_succes_icon:before{content:"";color:#5cb85c}.o_ac_status_waiting_icon:before{content:"";color:#337ab7}.o_ac_order_status_new_icon:before{content:"ï©";color:#337ab7}.o_ac_order_status_prepayment_icon:before{content:"";color:#5bc0de}.o_ac_order_status_payed_icon:before{content:"";color:#5cb85c}.o_ac_order_status_canceled_icon:before{content:"ï¨";color:#f0ad4e}.o_ac_order_status_error_icon:before{content:"ï€";color:#d9534f}.o_ac_order_status_warning_icon:before{content:"";color:#f0ad4e}.o_scorm_org:before{content:""}.o_scorm_item:before{content:""}.o_scorm_completed:before,.o_scorm_passed:before{content:"ï˜"}.o_scorm_failed:before{content:"ï±"}.o_scorm_incomplete:before{content:"ï±"}.o_scorm_not_attempted:before{background:none}.o_midpub:before{content:"ï˜"}.o_midwarn:before{content:"ï±"}.o_midlock:before{content:""}.o_miderr:before{content:"ïª"}.o_middel:before{content:"ï„"}.o_filetype_file:before,.o_filetype_ico:before{content:""}.o_filetype_folder:before{content:"ï„”"}.o_filetype_folder_open:before{content:"ï„•"}.o_filetype_zip:before,.o_filetype_gz:before,.o_filetype_tar:before,.o_filetype_tgz:before{content:""}.o_filetype_css:before,.o_filetype_js:before,.o_filetype_java:before,.o_filetype_numbers:before,.o_filetype_ods:before,.o_filetype_xml:before,.o_filetype_xsl:before{content:""}.o_filetype_bat_icon:before,.o_filetype_bat:before,.o_filetype_exe:before,.o_filetype_app:before,.o_filetype_sh:before{content:""}.o_filetype_xls:before,.o_filetype_xlsx:before{content:""}.o_filetype_png:before,.o_filetype_tiff:before,.o_filetype_webp:before,.o_filetype_gif:before,.o_filetype_ico:before,.o_filetype_jpeg:before,.o_filetype_bmp:before,.o_filetype_odg:before,.o_filetype_eps:before,.o_filetype_jpg:before{content:""}.o_filetype_psd:before,.o_filetype_avi:before,.o_filetype_dvi:before,.o_filetype_mp4:before,.o_filetype_m4v:before,.o_filetype_webm:before,.o_filetype_ogg:before,.o_filetype_video:before,.o_filetype_mov:before,.o_filetype_mpeg:before,.o_filetype_mpg:before,.o_filetype_qt:before,.o_filetype_ra:before,.o_filetype_ram:before,.o_filetype_swf:before,.o_filetype_flv:before{content:""}.o_filetype_midi:before,.o_filetype_audio:before,.o_filetype_mp3:before,.o_filetype_m3u:before,.o_filetype_wav:before{content:""}.o_filetype_ps:before,.o_filetype_pdf:before{content:"ï‡"}.o_filetype_key:before,.o_filetype_odp:before,.o_filetype_ppt:before,.o_filetype_pptx:before{content:""}.o_filetype_odf:before,.o_filetype_rtf:before,.o_filetype_readme:before,.o_filetype_README:before,.o_filetype_log:before,.o_filetype_txt:before,.o_filetype_htm:before,.o_filetype_html:before{content:""}.o_filetype_odt:before,.o_filetype_pages:before,.o_filetype_doc:before,.o_filetype_docx:before{content:""}.o_icon_share_social:before{content:"ï…"}.o_icon_apple:before{content:"ï…¹"}.o_icon_facebook:before{content:"ï‚‚"}.o_icon_twitter:before{content:"ï‚"}.o_icon_google:before{content:""}.o_icon_delicious:before{content:""}.o_icon_digg:before{content:""}.o_icon_mailto:before{content:""}.o_icon_link:before{content:"ïƒ"}.o_icon_yahoo:before{content:""}a.o_icon:hover,a.o_icon:focus{text-decoration:none}img.o_emoticons_angel{background:url(../light/images/emoticons/smiley-angel.png);width:16px;height:16px}img.o_emoticons_angry{background:url(../light/images/emoticons/smiley-mad.png);width:16px;height:16px}img.o_emoticons_blushing{background:url(../light/images/emoticons/smiley-red.png);width:16px;height:16px}img.o_emoticons_confused{background:url(../light/images/emoticons/smiley-confuse.png);width:16px;height:16px}img.o_emoticons_cool{background:url(../light/images/emoticons/smiley-cool.png);width:16px;height:16px}img.o_emoticons_cry{background:url(../light/images/emoticons/smiley-cry.png);width:16px;height:16px}img.o_emoticons_devil{background:url(../light/images/emoticons/smiley-evil.png);width:16px;height:16px}img.o_emoticons_grin{background:url(../light/images/emoticons/smiley-grin.png);width:16px;height:16px}img.o_emoticons_kiss{background:url(../light/images/emoticons/smiley-kiss.png);width:16px;height:16px}img.o_emoticons_ohoh{background:url(../light/images/emoticons/smiley-eek.png);width:16px;height:16px}img.o_emoticons_sad{background:url(../light/images/emoticons/smiley-sad.png);width:16px;height:16px}img.o_emoticons_sick{background:url(../light/images/emoticons/smiley-sad-blue.png);width:16px;height:16px}img.o_emoticons_smile{background:url(../light/images/emoticons/smiley.png);width:16px;height:16px}img.o_emoticons_tongue{background:url(../light/images/emoticons/smiley-razz.png);width:16px;height:16px}img.o_emoticons_ugly{background:url(../light/images/emoticons/smiley-money.png);width:16px;height:16px}img.o_emoticons_weird{background:url(../light/images/emoticons/smiley-nerd.png);width:16px;height:16px}img.o_emoticons_wink{background:url(../light/images/emoticons/smiley-wink.png);width:16px;height:16px}img.o_emoticons_worried{background:url(../light/images/emoticons/smiley-roll-blue.png);width:16px;height:16px}img.o_emoticons_up{background:url(../light/images/emoticons/thumb-up.png);width:16px;height:16px}img.o_emoticons_down{background:url(../light/images/emoticons/thumb.png);width:16px;height:16px}.o_block_bottom,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry,.o_header_with_buttons,.o_search_result{margin-bottom:1em}.o_block_top,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry{margin-top:1em}.o_block_large_bottom,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-bottom:2em}.o_block_large_top,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-top:2em}.o_block_inline,.o_block_inline_left,.o_block_inline_both,.o_block_inline_right{display:inline-block}.o_block_inline_left,.o_block_inline_both{margin-left:0.5em}.o_block_inline_right,.o_block_inline_both{margin-right:0.5em}.o_scrollblock,div.b_scrollblock{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_button_group{text-align:center}.o_button_group a,.o_button_group input,.o_button_group button,.o_button_group .btn-group{margin-right:5px;margin-bottom:0.5em}.o_button_group a:last-child,.o_button_group input:last-child,.o_button_group button:last-child,.o_button_group .btn-group:last-child{margin-right:0}.o_button_group .btn-group a,.o_button_group .btn-group input,.o_button_group .btn-group button{margin-right:0;margin-bottom:0}.o_button_group .dropdown-menu{text-align:left}.o_button_group_left{text-align:left}.o_button_group_right{text-align:right}.o_button_group_top{margin-top:0}.o_header_with_buttons:before,.o_header_with_buttons:after{content:" ";display:table}.o_header_with_buttons:after{clear:both}.o_header_with_buttons h1,.o_header_with_buttons h3,.o_header_with_buttons h4,.o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_header_with_buttons h2{display:inline-block}.o_header_with_buttons .o_button_group{margin-top:10px;margin-bottom:0;float:right}.panel-heading.o_header_with_buttons{margin-bottom:0}.o_xsmall,.b_xsmall,p.b_xsmall,div.b_xsmall{font-size:12px}.o_small,.b_small,p.b_small,div.b_small,.o_comments .o_comment_wrapper h5,.o_comments .o_comment_wrapper .o_comment,.o_bc_meta,.tooltip,.o_htmleditor .o_metadata .o_lastmodified,.o_noti,.o_block_with_datecomp .o_meta,.o_togglebox_wrapper div.o_togglebox_content .o_hide,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label,.o_course_run .o_toc .o_entry{font-size:12px}.o_large,.b_large,p.b_large,div.b_large{font-size:18px}.o_xlarge,.b_xlarge,p.b_xlarge,div.b_xlarge{font-size:18px}.o_disabled,.b_disabled,p.b_disabled,div.b_disabled{color:#777 !important;cursor:default}.o_disabled:hover,.b_disabled:hover{color:#777 !important}.o_dimmed,.b_dimmed,p.b_dimmed,div.b_dimmed{opacity:0.4;filter:alpha(opacity=40)}.o_selected,.b_selected,p.b_selected,div.b_selected{font-weight:bold}.o_deleted,.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.o_clickable{cursor:pointer}.o_ochre{color:#c8a959}.o_blue{color:#12223F}.o_undecorated:hover,.o_undecorated:focus,.o_disabled:hover,.b_disabled:hover,#o_main_wrapper #o_toplink:hover,#o_footer_powered a:hover,#o_share a:hover,#o_share_social_container a:hover,.o_toolbar .o_tools_container a:hover,.o_button_toggle:hover,.o_im_message_group .o_im_from:hover,.o_noti .o_label:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover,.o_catalog .o_level .o_meta .o_title a:hover,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover,.o_repo_details .o_social .o_comments:hover,.o_login .o_login_register:hover,.o_disabled:focus,.b_disabled:focus,#o_main_wrapper #o_toplink:focus,#o_footer_powered a:focus,#o_share a:focus,#o_share_social_container a:focus,.o_toolbar .o_tools_container a:focus,.o_button_toggle:focus,.o_im_message_group .o_im_from:focus,.o_noti .o_label:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:focus,.o_catalog .o_level .o_meta .o_title a:focus,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:focus,.o_repo_details .o_social .o_comments:focus,.o_login .o_login_register:focus{text-decoration:none}.o_copy_code,.b_copy_code,p.b_copy_code,div.b_copy_code,code,pre{overflow-x:auto;overflow-y:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}.o_nowrap,.b_copy_code,p.b_copy_code,div.b_copy_code,code{white-space:nowrap}.o_titled_wrapper .o_content{margin-top:20px}.o_video,.o_video video,.b_video,.o_video_wrapper{display:inline-block;max-width:100%;height:auto;max-width:100%}.o_image,.o_image img,img,.b_image{display:inline-block;max-width:100%;height:auto;max-width:100%}.o_with_hyphens{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}h1{color:#337ab7}h2{color:#337ab7}h3{color:#337ab7}h4,.o_cal .fc-header-title h2{color:#337ab7}h5{color:#337ab7}h5{color:#337ab7}fieldset legend{color:#333}.b_border_box,p.b_border_box,div.b_border_box{border:1px solid #777;padding:1em;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}table td{vertical-align:top}table.b_grid{width:99.5%;background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:1px 5px;border:1px solid #777}table.b_grid th{background:#eee}table.b_border{width:99.5%;background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:1px 5px;border:1px solid #777}table.b_border th{background:#eee}table.b_borderless{width:99.5%;background:transparent;border-collapse:separate}table.b_borderless td,table.b_borderless th{padding:1px 5px;border:0}table.b_full{width:99.5%}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.b_align_justified{text-align:justify}a.b_link_extern{color:#337ab7}a.b_link_extern:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"ï‚Ž"}a.b_link_mailto{color:#337ab7}a.b_link_mailto:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:""}a.b_link_forward{color:#337ab7}a.b_link_forward:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"ï¤"}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_left_clear{clear:both;margin:0 2em 2em 0;display:block}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_float_right_clear{clear:both;display:block;margin:0 0 2em auto}img.b_centered{clear:both;display:block;margin:0 auto 2em auto}img.b_circle{border-radius:50%}img.b_with_border{border:1px solid #ddd;padding:3px;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}span.olatFlashMovieViewer{max-width:100% !important;border:none !important}.mejs-container,.mejs-mediaelement video,.mejs-layers div,.me-cannotplay{max-width:100%}.b_clear_float,p.b_clear_float,div.b_clear_float{clear:both}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:80px}#o_main_wrapper{background:#fff;z-index:3}#o_main_wrapper #o_main_container{background:#fff}#o_main_wrapper #o_main_container #o_main_left{float:left;z-index:2;position:relative;background:#fff}#o_main_wrapper #o_main_container #o_main_left #o_main_left_content{padding:0 0 0 15px}#o_main_wrapper #o_main_container #o_main_left #o_main_left_toggle{position:absolute;display:none;right:0;top:70px;margin-right:-30px;font-size:25px;line-height:35px;text-align:center;width:30px;height:35px;z-index:3;border:1px solid #ddd;border-left:none;border-bottom-right-radius:4px;border-top-right-radius:4px;background-color:#fbfbfb;-webkit-box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);color:#337ab7}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas{background:#fbfbfb;-webkit-box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);min-width:250px}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas #o_main_left_content{padding:0 0 0 0}#o_main_wrapper #o_main_container #o_main_right{float:right;z-index:2;position:relative;background:inherit}#o_main_wrapper #o_main_container #o_main_right #o_main_right_content{padding:0 15px 0 0}#o_main_wrapper #o_main_container #o_main_center{position:relative;z-index:1;background:inherit}#o_main_wrapper #o_main_container #o_main_center h2:first-child{margin-top:0}@media screen and (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center{margin-left:0 !important}}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:0 15px}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content #o_main_center_content_inner{padding-bottom:15px}#o_main_wrapper #o_toplink{position:absolute;bottom:0;right:15px;text-align:center;z-index:3}@media (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:15px}}#o_back_wrapper,#o_preview_wrapper{margin-top:10px}#o_back_wrapper.o_toolbar .o_breadcrumb .breadcrumb,#o_preview_wrapper.o_toolbar .o_breadcrumb .breadcrumb{font-size:14px}#o_footer_wrapper{position:absolute;bottom:0;width:100%;height:70px;overflow:hidden;background-color:#f5f5f5;color:#999;line-height:16px;font-size:12px}#o_footer_wrapper a{color:#999}#o_footer_wrapper a:hover{color:#000}#o_footer_container{position:relative;padding-top:10px;min-height:70px;background:#f5f5f5;z-index:1}#o_footer_user{position:absolute;left:15px;top:10px;z-index:1}#o_footer_user #o_counter{white-space:nowrap}#o_footer_user #o_username{white-space:nowrap;margin-right:1em}#o_footer_version{position:absolute;right:15px;top:10px;text-align:right;z-index:1}@media (max-width: 767px){#o_footer_version{padding-top:10px;text-align:left}}#o_footer_powered{position:absolute;top:30px;right:15px;z-index:1}#o_footer_powered img{opacity:0.6;filter:alpha(opacity=60)}#o_footer_powered img:hover{opacity:1;filter:alpha(opacity=100)}#o_footer_impressum{position:absolute;top:10px;width:100%;text-align:center;z-index:-1}#o_footer_impressum i{display:none}#o_footer_textline{position:absolute;top:30px;width:100%;text-align:center;z-index:-1}#o_share{margin-top:10px}#o_share a{opacity:0.6;filter:alpha(opacity=60)}#o_share a:hover{opacity:1;filter:alpha(opacity=100)}#o_share a,#o_share_social_container a{color:#999;margin:0 0.25em 0 0}#o_share a:hover,#o_share_social_container a:hover{color:#000}@media (max-width: 767px){#o_counter,#o_footer_version,#o_share{display:none}#o_footer_impressum{top:30px;text-align:left}#o_footer_textline{top:50px;text-align:left}#o_footer_powered{top:10px}#o_footer_powered a:after{content:"\221E";font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;font-size:14px}#o_footer_powered img{display:none}}#o_navbar_wrapper{z-index:4;border-top:1px solid #e7e7e7;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1)}#o_navbar_wrapper #o_navbar_container{position:relative}a.o_disabled.navbar-text{margin:0}.o_navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid #e7e7e7;background-color:#f8f8f8}.o_navbar:before,.o_navbar:after{content:" ";display:table}.o_navbar:after{clear:both}.o_navbar .o_navbar_tabs li{max-width:150px}.o_navbar .o_navbar_tabs li a{padding-right:30px}.o_navbar .o_navbar_tabs li a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_navbar .o_navbar_tabs .o_icon-fw{position:absolute;top:15px;left:0.5em;padding-top:3px;width:1em;height:1em;display:none}.o_navbar .o_navbar_tabs .o_navbar_tab_close{position:absolute;top:15px;right:0.5em;padding:0;width:1em;height:1em}.o_navbar .o_navbar_tabs .o_navbar_tab_close i:before{color:#d9534f}.o_navbar .o_navbar_tabs .o_navbar_tab_close:hover i:before{color:#c9302c}.o_navbar .o_custom_navbar-brand{background-position:5px 0;background-repeat:no-repeat;height:50px;width:120px}.o_navbar #o_navbar_langchooser{color:#777;padding:7px 15px}.o_navbar #o_navbar_langchooser form span+div{display:inline}.o_navbar #o_navbar_tools_permanent #o_navbar_print a,.o_navbar #o_navbar_tools_permanent #o_navbar_impress a,.o_navbar #o_navbar_tools_permanent #o_navbar_help a{color:#777;padding-right:0}.o_navbar #o_navbar_tools_permanent #o_navbar_login a{color:#f0ad4e}.o_navbar .o_navbar_tools>#o_navbar_tools_permanent>li>a>span{display:none}@media (min-width: 768px){.o_navbar .o_navbar_tools li.o_portrait>a>span{display:inline}}.o_navbar #o_navbar_tools_personal .o_navbar_tool a,.o_navbar #o_navbar_tools_permanent .o_navbar_tool a{padding-right:5px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu a{padding-left:45px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .dropdown-menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .dropdown-menu a{padding-left:15px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .o_portrait,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .o_portrait{position:absolute;left:7px;top:10px}.o_navbar #o_navbar_tools_personal .o_logout,.o_navbar #o_navbar_tools_permanent .o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar_tab_close{top:10px;right:10px}.o_navbar.o_navbar-offcanvas .o_navbar-right a{padding:3px 20px;color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-right a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a:focus{color:#fff;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:focus{color:#c9302c}.o_navbar.o_navbar-offcanvas .o_navbar-right a .o_icon-lg{font-size:1.0em;vertical-align:baseline}.o_navbar.o_navbar-offcanvas .o_navbar-right .divider{height:1px;margin:9px 0;overflow:hidden;background-color:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-header{padding-left:15px}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-toggle{display:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu{box-shadow:none;position:relative;top:0;left:0;display:block;float:none;background-color:#222;color:#9d9d9d;font-size:14px;border:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu .divider{background:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a{color:#9d9d9d;text-shadow:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav a:focus{background-color:transparent;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:focus{background-color:#090909;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link{color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link:hover{color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a{color:#777}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}#o_navbar_impress a span,#o_navbar_search_opener a span{display:none}body.o_dmz #o_navbar_print a span,body.o_dmz #o_navbar_impress a span,body.o_dmz #o_navbar_help a span,body.o_dmz #o_navbar_search_opener a span{display:inline}.o_navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;-webkit-overflow-scrolling:touch}.o_navbar-collapse:before,.o_navbar-collapse:after{content:" ";display:table}.o_navbar-collapse:after{clear:both}.o_navbar-collapse.o_collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.o_navbar-offcanvas .o_navbar-collapse{width:auto;box-shadow:none;margin-top:10px;margin-right:-15px;margin-left:-15px}.o_navbar-brand{float:left;font-size:18px;line-height:20px;height:50px;color:#777}.o_navbar-brand:hover,.o_navbar-brand:focus{text-decoration:none;color:#5e5e5e;background-color:transparent}.o_navbar-toggle{position:relative;margin-right:15px;margin-left:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;border:1px solid #ddd;border-radius:4px;background-color:transparent;background-image:none}.o_navbar-toggle:hover,.o_navbar-toggle:focus{outline:none;background-color:#ddd}.o_navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#888}.o_navbar-toggle .icon-bar+.icon-bar{margin-top:4px}#o_navbar_left-toggle{float:left}#o_navbar_right-toggle{float:right}.o_navbar-link{color:#777}.o_navbar-link:hover{color:#333}.o_navbar-nav{margin:7.5px -15px}.o_navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px;color:#777}.o_navbar-nav>li>a:hover,.o_navbar-nav>li>a:focus{color:#333;background-color:transparent}.o_navbar-nav>.active>a,.o_navbar-nav>.active>a:hover,.o_navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar-nav>.disabled>a,.o_navbar-nav>.disabled>a:hover,.o_navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.o_navbar-nav>.open>a,.o_navbar-nav>.open>a:hover,.o_navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}.o_collapse .o_navbar-nav{float:left;margin:0}.o_collapse .o_navbar-nav>li{float:left}.o_collapse .o_navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.o_collapse .o_navbar-nav.o_navbar-right:last-child{margin-right:-15px}.o_collapse.o_navbar-collapse .o_navbar-left{float:left !important}.o_collapse.o_navbar-collapse .o_navbar-right{float:right !important}.o_navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (max-width: 767px){.o_navbar-form .form-group{margin-bottom:5px}}.o_collapse .o_navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.o_collapse .o_navbar-form.o_navbar-right:last-child{margin-right:-15px}.o_navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.o_navbar-fixed-bottom .o_navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.o_navbar-btn{margin-top:8px;margin-bottom:8px}.o_navbar-btn.btn-sm,.btn-group-sm>.o_navbar-btn.btn{margin-top:10px;margin-bottom:10px}.o_navbar-btn.btn-xs,.btn-group-xs>.o_navbar-btn.btn{margin-top:14px;margin-bottom:14px}.o_navbar-text{margin-top:15px;margin-bottom:15px;color:#777}.o_collapse .o_navbar-text{float:left;margin-left:15px;margin-right:15px}.o_collapse .o_navbar-text.o_navbar-right:last-child{margin-right:0}.o_dropdown_tab{position:relative}.o_dropdown_tab>a:first-child{padding-right:30px}.o_dropdown_tab>a:first-child .o_icon-fw{display:none;position:absolute;top:0;left:10px;padding-top:3px;line-height:20px}.o_dropdown_tab>a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_dropdown_tab .o_navbar_tab_close{position:absolute;top:0px;right:10px;padding-left:0px;padding-right:0px;color:#d9534f;background-color:inherit}.o_dropdown_tab .o_navbar_tab_close:focus,.o_dropdown_tab .o_navbar_tab_close:hover{color:#c9302c;background-color:inherit}#o_navbar_more .dropdown-menu .divider:last-child{display:none}@media (min-width: 768px){#o_navbar_more .dropdown-menu{max-width:300px}}@media (max-width: 767px){#o_navbar_more>li{position:inherit}#o_navbar_more .dropdown-menu{left:0px;right:0px}#o_navbar_more .dropdown-menu a,#o_navbar_more .dropdown-menu i{line-height:30px}#o_navbar_more .dropdown-menu .o_navbar_tab_close{line-height:inherit}}.o_body_popup #o_topnav_printview{display:inline-block}.o_body_popup #o_topnav_close{float:right}.o_body_popup #o_topnav_close span{display:block}.o_body_popup #o_navbar_tools_permanent li>a{background-color:transparent}.o_toolbar{position:relative;margin-bottom:20px;margin-top:-10px;border:1px solid #e7e7e7}.o_toolbar:before,.o_toolbar:after{content:" ";display:table}.o_toolbar:after{clear:both}@media (min-width: 768px){.o_toolbar{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}}.o_toolbar .o_breadcrumb:before,.o_toolbar .o_breadcrumb:after{content:" ";display:table}.o_toolbar .o_breadcrumb:after{clear:both}.o_toolbar .o_breadcrumb .breadcrumb{margin-bottom:0;padding:5px 9px;font-size:11px;line-height:15px;border-radius:0;background:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a span{display:none}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close:before{content:none}.o_toolbar .o_tools_container{text-align:center;min-height:37px;position:realtive;background-color:#f8f8f8;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:1px solid #e7e7e7}.o_toolbar .o_tools_container:before,.o_toolbar .o_tools_container:after{content:" ";display:table}.o_toolbar .o_tools_container:after{clear:both}@media (max-width: 991px){.o_toolbar .o_tools_container{min-height:35px}}@media (max-width: 767px){.o_toolbar .o_tools_container{min-height:22px;text-align:left}}.o_toolbar .o_tools_container a{color:#777;display:inline-block}.o_toolbar .o_tools_container a:hover{color:#333}.o_toolbar .o_tools_container a.o_disabled{color:#aaa !important}.o_toolbar .o_tools_container a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tools_container a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools_container .dropdown-menu a{display:block}.o_toolbar .o_tools_container .dropdown-menu a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools{margin-top:8px;margin-bottom:5px}.o_toolbar .o_tool,.o_toolbar .o_text{position:relative;margin:0 10px}.o_toolbar .o_tool:first-child,.o_toolbar .o_text:first-child{margin-left:0}.o_toolbar .o_tool:last-child,.o_toolbar .o_text:last-child{margin-right:0}.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:18px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:block;font-size:12px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{position:absolute;right:50%;top:-18px;margin-right:-12px;font-size:13px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:16px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{font-size:11px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{top:-16.5px;margin-right:-11px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:20px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:none}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{display:block;position:relative;top:0;left:0;margin-right:0}}.o_toolbar .o_tool .o_chelp,.o_toolbar .o_text .o_chelp{position:relative;top:-1em;vertical-align:top;color:#fff}.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{padding:0;margin-top:5px;border:1px solid #ccc;background-color:#eee}.o_toolbar .o_tool_next a,.o_toolbar .o_tool_previous a{color:#777}.o_toolbar .o_tool_next a:hover,.o_toolbar .o_tool_previous a:hover{color:#333}.o_toolbar .o_tool_next a.o_disabled,.o_toolbar .o_tool_previous a.o_disabled{color:#aaa !important}.o_toolbar .o_tool_next a.o_disabled:hover,.o_toolbar .o_tool_previous a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:21px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:4px}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:18px}}@media (max-width: 767px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:0}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:20px}}.o_toolbar .o_tool_previous{margin-left:10px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-right:0}.o_toolbar .o_tool_next{border-bottom-right-radius:4px;border-top-right-radius:4px}.o_toolbar .o_tool_dropdown{margin:0 10px}.o_toolbar .o_tool_dropdown:first-child{margin-left:0}.o_toolbar .o_tool_dropdown:last-child{margin-right:0}.o_toolbar .o_tool_dropdown a.dropdown-toggle{position:relative}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:18px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:block;font-size:12px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{position:absolute;right:50%;top:4px;margin-right:-20px;font-size:14px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:16px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span,.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{font-size:11px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{top:4px;margin-right:-18px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool_dropdown a.dropdown-toggle{padding:0 10px 0 5px}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:20px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:none}}.o_toolbar .o_tool_dropdown .dropdown-menu{text-align:left}.o_toolbar .o_tools_left{float:left}.o_toolbar .o_tools_right{float:right}.o_toolbar .o_tools_right_edge{float:right}@media (max-width: 991px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tool span{max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 5px}}@media (max-width: 767px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools .o_chelp{top:0;vertical-align:top}.o_toolbar .o_tools_center{float:left}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 0;position:static}.o_toolbar .o_tool_dropdown .dropdown-menu{left:0px;right:0px}.o_toolbar .o_tool_dropdown .dropdown-menu a,.o_toolbar .o_tool_dropdown .dropdown-menu i{line-height:30px}.o_toolbar .o_tool_dropdown .dropdown-menu .o_navbar_tab_close{line-height:inherit}}body{overflow-x:hidden}.o_container_offcanvas{position:relative;max-width:1324px;-webkit-transition:all .25s ease-in-out;-moz-transition:all .25s ease-in-out;-o-transition:all .25s ease-in-out;-m-transition:all .25s ease-in-out;transition:all .25s ease-in-out}#o_offcanvas_right{position:absolute;top:0;right:-250px;width:250px;padding:15px 15px;background-color:#222;color:#9d9d9d;border:1px solid #090909;-webkit-box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);min-height:100%;z-index:10;display:none}#o_offcanvas_right:before,#o_offcanvas_right:after{content:" ";display:table}#o_offcanvas_right:after{clear:both}@media screen and (max-width: 767px){.row-offcanvas{position:relative;-webkit-transition:all .25s ease-out;-moz-transition:all .25s ease-out;transition:all .25s ease-out}.row-offcanvas-right{right:0}.row-offcanvas-right .sidebar-offcanvas{right:-50%}.row-offcanvas-right.active{right:50%}.row-offcanvas-left{left:0}.row-offcanvas-left .sidebar-offcanvas{left:-50%}.row-offcanvas-left.active{left:50%}.sidebar-offcanvas{position:absolute;top:0;width:50%}}.o_info,.b_info,p.b_info,div.b_info,.o_form .o_info,.o_togglebox_wrapper div.o_togglebox_content,div.o_qti_item_itemfeedback{margin:20px 0;padding:20px;border-left:3px solid #777;background-color:#eee}.o_info h2,.o_info h3,.o_info h4,.o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_info h2,.o_info h5,.b_info h2,.o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback h2,.b_info h3,.o_form .o_info h3,.o_togglebox_wrapper div.o_togglebox_content h3,div.o_qti_item_itemfeedback h3,.b_info h4,.o_form .o_info h4,.o_togglebox_wrapper div.o_togglebox_content h4,div.o_qti_item_itemfeedback h4,.b_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_info h2,.o_form .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback .o_cal .fc-header-title h2,.o_cal .fc-header-title div.o_qti_item_itemfeedback h2,.b_info h5,.o_form .o_info h5,.o_togglebox_wrapper div.o_togglebox_content h5,div.o_qti_item_itemfeedback h5{color:#777}.o_note,.b_note,p.b_note,div.b_note,.o_form .o_desc,.o_course_run .o_statusinfo,.o_course_stats .o_desc{margin:20px 0;padding:20px;border-left:3px solid #31708f;background-color:#d9edf7}.o_note h2,.o_note h3,.o_note h4,.o_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_note h2,.o_note h5,.b_note h2,.o_form .o_desc h2,.o_course_run .o_statusinfo h2,.o_course_stats .o_desc h2,.b_note h3,.o_form .o_desc h3,.o_course_run .o_statusinfo h3,.o_course_stats .o_desc h3,.b_note h4,.o_form .o_desc h4,.o_course_run .o_statusinfo h4,.o_course_stats .o_desc h4,.b_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_note h2,.o_form .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_desc h2,.o_course_run .o_statusinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_statusinfo h2,.o_course_stats .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_stats .o_desc h2,.b_note h5,.o_form .o_desc h5,.o_course_run .o_statusinfo h5,.o_course_stats .o_desc h5{color:#31708f}.o_important,.b_important,p.b_important,div.b_important,.o_bc_empty,.o_course_run .o_no_scoreinfo{margin:20px 0;padding:20px;border-left:3px solid #F4D000;background-color:#FFF1A4}.o_important h2,.o_important h3,.o_important h4,.o_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_important h2,.o_important h5,.b_important h2,.o_bc_empty h2,.o_course_run .o_no_scoreinfo h2,.b_important h3,.o_bc_empty h3,.o_course_run .o_no_scoreinfo h3,.b_important h4,.o_bc_empty h4,.o_course_run .o_no_scoreinfo h4,.b_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_important h2,.o_bc_empty .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_bc_empty h2,.o_course_run .o_no_scoreinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_no_scoreinfo h2,.b_important h5,.o_bc_empty h5,.o_course_run .o_no_scoreinfo h5{color:#F4D000}.o_success,.b_success,p.b_success,div.b_success{margin:20px 0;padding:20px;border-left:3px solid #3c763d;background-color:#dff0d8}.o_success h2,.o_success h3,.o_success h4,.o_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_success h2,.o_success h5,.b_success h2,.b_success h3,.b_success h4,.b_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_success h2,.b_success h5{color:#3c763d}.o_warning,.b_warning,p.b_warning,div.b_warning,.o_form .o_warning{margin:20px 0;padding:20px;border-left:3px solid #8a6d3b;background-color:#fcf8e3}.o_warning h2,.o_warning h3,.o_warning h4,.o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_warning h2,.o_warning h5,.b_warning h2,.o_form .o_warning h2,.b_warning h3,.o_form .o_warning h3,.b_warning h4,.o_form .o_warning h4,.b_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_warning h2,.o_form .o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_warning h2,.b_warning h5,.o_form .o_warning h5{color:#8a6d3b}.o_error,.b_error,p.b_error,div.b_error{margin:20px 0;padding:20px;border-left:3px solid #a94442;background-color:#f2dede}.o_error h2,.o_error h3,.o_error h4,.o_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_error h2,.o_error h5,.b_error h2,.b_error h3,.b_error h4,.b_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_error h2,.b_error h5{color:#a94442}div.o_callout_overlay{position:fixed;top:0;left:0;width:100%;height:100%;zoom:1;background:#000;opacity:0;filter:alpha(opacity=0)}.o_alert_info{position:fixed;top:-100%;left:0;display:none;z-index:2000;width:100%;text-align:center}.o_alert_info .alert{position:relative;width:auto;margin:0 auto;text-align:left;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.o_alert_info .alert .o_icon_close{float:right;color:#777}.o_alert_info .alert .o_icon_close:hover{color:#555}@media (min-width: 768px){.o_alert_info .alert{width:600px}}#o_msg_sticky,#o_msg_sticky_preview{position:relative;color:#a94442;background-color:#f2dede;border:1px solid #ebccd1;padding:10px 16px 10px 60px;min-height:40px;margin:-20px 0 20px 0}#o_msg_sticky .o_icon_info_msg,#o_msg_sticky_preview .o_icon_info_msg{position:absolute;left:10px;top:5px;font-size:40px}#o_msg_sticky.o_msg_sticky_fullscreen,#o_msg_sticky_preview.o_msg_sticky_fullscreen{margin-top:0}@media (min-width: 768px){.modal .o_modal_fullwidth{width:90%}}@media (min-width: 992px){.modal .o_modal_fullwidth{width:80%}}.modal .modal-header h4,.modal .modal-header .o_cal .fc-header-title h2,.o_cal .fc-header-title .modal .modal-header h2{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.o_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_tree a{color:#777;background-color:none}.o_tree a:hover,.o_tree a:focus{color:#333}.o_tree .o_tree_link{background-color:none}.o_tree .o_tree_link:hover,.o_tree .o_tree_link:focus{background-color:#f8f8f8}.o_tree .o_tree_link:first-child{background-color:transparent}.o_tree .o_tree_link:last-child:hover,.o_tree .o_tree_link:last-child:focus{background-color:#f8f8f8}.o_tree .o_insertion_point>a>span{padding:5px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_insertion_source>a>span.o_tree_item,.o_tree .o_insertion_source>a>span.o_dnd_item{border-bottom:solid #f90 4px;background-color:#fefbf6}.o_tree ul{margin:0;padding:0;list-style-type:none}.o_tree ul li{margin:0;padding:0;white-space:nowrap}.o_tree ul li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_tree ul li div.popover{position:absolute;left:auto;right:0}.o_tree ul li div a.o_tree_oc_l0{position:absolute;top:10px;left:-4px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l0,.o_tree ul .o_tree_level_close.b_tree_oc_l0{z-index:10}.o_tree ul li div a.o_tree_oc_l1{position:absolute;top:10px;left:11px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l1,.o_tree ul .o_tree_level_close.b_tree_oc_l1{z-index:10}.o_tree ul li div a.o_tree_oc_l2{position:absolute;top:10px;left:26px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l2,.o_tree ul .o_tree_level_close.b_tree_oc_l2{z-index:10}.o_tree ul li div a.o_tree_oc_l3{position:absolute;top:10px;left:41px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l3,.o_tree ul .o_tree_level_close.b_tree_oc_l3{z-index:10}.o_tree ul li div a.o_tree_oc_l4{position:absolute;top:10px;left:56px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l4,.o_tree ul .o_tree_level_close.b_tree_oc_l4{z-index:10}.o_tree ul li div a.o_tree_oc_l5{position:absolute;top:10px;left:71px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l5,.o_tree ul .o_tree_level_close.b_tree_oc_l5{z-index:10}.o_tree ul li div a.o_tree_oc_l6{position:absolute;top:10px;left:86px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l6,.o_tree ul .o_tree_level_close.b_tree_oc_l6{z-index:10}.o_tree ul li div a.o_tree_oc_l7{position:absolute;top:10px;left:101px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l7,.o_tree ul .o_tree_level_close.b_tree_oc_l7{z-index:10}.o_tree ul li div a.o_tree_oc_l8{position:absolute;top:10px;left:116px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l8,.o_tree ul .o_tree_level_close.b_tree_oc_l8{z-index:10}.o_tree ul li div a.o_tree_oc_l9{position:absolute;top:10px;left:131px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l9,.o_tree ul .o_tree_level_close.b_tree_oc_l9{z-index:10}.o_tree ul li div a.o_tree_oc_l10{position:absolute;top:10px;left:146px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l10,.o_tree ul .o_tree_level_close.b_tree_oc_l10{z-index:10}.o_tree ul li div a.o_tree_oc_l11{position:absolute;top:10px;left:161px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l11,.o_tree ul .o_tree_level_close.b_tree_oc_l11{z-index:10}.o_tree ul li div span.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_tree ul li div span.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_tree ul li div span.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_tree ul li div span.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_tree ul li div span.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_tree ul li div span.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_tree ul li div span.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_tree ul li div span.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_tree ul li div span.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_tree ul li div span.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_tree ul li div span.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_tree ul li div span.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_tree ul span.o_tree_leaf{display:none}.o_tree ul span.o_tree_link>input[type=checkbox]{margin-right:5px}.o_tree ul li .badge{position:absolute;font-size:70%}.o_tree ul li .badge:before{content:none}.o_tree ul li .badge.o_badge_1{top:3px;right:1px}.o_tree ul li .badge.o_badge_2{bottom:3px;right:1px}.o_tree ul li .badge.o_badge_3{top:3px;right:25px}.o_tree ul li .badge.o_badge_4{bottom:3px;right:25px}.o_tree ul li div.o_dnd_sibling{margin:0;padding:0;border-bottom:none}.o_tree ul li .active.o_tree_link{background-color:none;font-weight:bold}.o_tree ul li .active.o_tree_link a{color:#337ab7}.o_tree ul li .active.o_tree_link:hover,.o_tree ul li .active.o_tree_link:focus{background-color:#eee}.o_tree ul li .active.o_tree_link:hover a,.o_tree ul li .active.o_tree_link:focus a{color:#23527c}.o_tree ul li .active_parent.o_tree_link{font-weight:bold}.o_tree ul li .active_parent.o_tree_link a{color:#777}.o_tree ul li .active_parent.o_tree_link a:hover,.o_tree ul li .active_parent.o_tree_link a:focus{color:#333}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l0{left:6px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l1{left:21px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l2{left:36px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l3{left:51px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l4{left:66px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l5{left:81px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l6{left:96px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l7{left:111px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l8{left:126px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l9{left:141px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l10{left:156px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l11{left:171px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l0{padding:10px 2px 10px 20px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l1{padding:10px 2px 10px 35px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l2{padding:10px 2px 10px 50px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l3{padding:10px 2px 10px 65px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l4{padding:10px 2px 10px 80px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l5{padding:10px 2px 10px 95px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l6{padding:10px 2px 10px 110px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l7{padding:10px 2px 10px 125px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l8{padding:10px 2px 10px 140px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l9{padding:10px 2px 10px 155px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l10{padding:10px 2px 10px 170px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l11{padding:10px 2px 10px 185px}.o_tree .o_dnd_item{cursor:move;z-index:100}.o_tree .o_dnd_proxy{opacity:0.4;filter:alpha(opacity=40);background-color:#f0ad4e;padding:5px 10px 5px 10px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_dnd_item.o_dnd_over{background-color:#ffff60}.o_tree .o_dnd_sibling{height:7px;width:100%}.o_tree .o_dnd_sibling.o_dnd_over{background:transparent url(../light/images/arrow_dd.png) top left no-repeat}.o_tree .o_dnd_l1{margin-left:0 !important}.o_tree .o_dnd_l2{margin-left:1em !important}.o_tree .o_dnd_l3{margin-left:2em !important}.o_tree .o_dnd_l4{margin-left:3em !important}.o_tree .o_dnd_l5{margin-left:4em !important}.o_tree .o_dnd_l6{margin-left:5em !important}.o_tree .o_dnd_l7{margin-left:6em !important}.o_tree .o_dnd_l8{margin-left:7em !important}.o_tree .o_dnd_l9{margin-left:8em !important}.o_tree .o_dnd_l10{margin-left:9em !important}.o_tree .o_dnd_l11{margin-left:10em !important}.o_tree.o_tree_insert_tool span.o_tree_link a{display:block}.o_offcanvas .o_tree{border:0}.o_selection_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_selection_tree ul{margin:0;padding:0;list-style-type:none}.o_selection_tree li{margin:0;padding:0;white-space:nowrap}.o_selection_tree li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_selection_tree li>div>span.o_tree_l0,.o_selection_tree li>div>div.checkbox.o_tree_l0,.o_selection_tree li>div>div.radio.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_selection_tree li>div>span.o_tree_l1,.o_selection_tree li>div>div.checkbox.o_tree_l1,.o_selection_tree li>div>div.radio.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_selection_tree li>div>span.o_tree_l2,.o_selection_tree li>div>div.checkbox.o_tree_l2,.o_selection_tree li>div>div.radio.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_selection_tree li>div>span.o_tree_l3,.o_selection_tree li>div>div.checkbox.o_tree_l3,.o_selection_tree li>div>div.radio.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_selection_tree li>div>span.o_tree_l4,.o_selection_tree li>div>div.checkbox.o_tree_l4,.o_selection_tree li>div>div.radio.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_selection_tree li>div>span.o_tree_l5,.o_selection_tree li>div>div.checkbox.o_tree_l5,.o_selection_tree li>div>div.radio.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_selection_tree li>div>span.o_tree_l6,.o_selection_tree li>div>div.checkbox.o_tree_l6,.o_selection_tree li>div>div.radio.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_selection_tree li>div>span.o_tree_l7,.o_selection_tree li>div>div.checkbox.o_tree_l7,.o_selection_tree li>div>div.radio.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_selection_tree li>div>span.o_tree_l8,.o_selection_tree li>div>div.checkbox.o_tree_l8,.o_selection_tree li>div>div.radio.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_selection_tree li>div>span.o_tree_l9,.o_selection_tree li>div>div.checkbox.o_tree_l9,.o_selection_tree li>div>div.radio.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_selection_tree li>div>span.o_tree_l10,.o_selection_tree li>div>div.checkbox.o_tree_l10,.o_selection_tree li>div>div.radio.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_selection_tree li>div>span.o_tree_l11,.o_selection_tree li>div>div.checkbox.o_tree_l11,.o_selection_tree li>div>div.radio.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_breadcrumb{position:relative}.o_breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_breadcrumb .o_breadcrumb_close a span{display:none}.o_breadcrumb .o_breadcrumb_close:before{content:none}.o_form .o_icon_mandatory{margin-right:0.25em}.o_form .o_form_chelp{padding-left:0.25em;margin-right:-1.25em}.o_form .o_form_example{font-size:90%}.o_form .o_error{margin-top:1px;margin-bottom:0;padding:10px}.o_form hr.o_spacer_noline{border-top:1px solid transparent}.o_form hr.o_spacer.form,.o_form hr.o_spacer_noline.form{margin-top:0px;margin-bottom:0px}.o_form .form-group.o_omit_margin{margin-bottom:0}.o_form .o_date{position:relative;padding-right:34px}.o_form .o_date.form-inline .form-group,.o_form .o_date.o_navbar-form .form-group{margin-left:0}.o_form input.o_date_ms{width:3em}.o_form .o_date.form-inline .o_date_ms.form-group,.o_form .o_date.o_navbar-form .o_date_ms.form-group{margin-left:25px}.o_form .has-feedback .o_date.form-inline .form-control.o_date_ms,.o_form .has-feedback .o_date.o_navbar-form .form-control.o_date_ms{padding-right:0}.o_form .o_form_element.form-inline .o_form_element.form-group,.o_form .o_form_element.o_navbar-form .o_form_element.form-group{margin-left:25px}.o_form .input-group.o_date_picker{width:16em}.o_form .o_filepreview{margin-bottom:10px}.o_form .o_fileinput{cursor:pointer;position:relative}.o_form .o_fileinput .o_fakechooser{position:relative;z-index:1}.o_form .o_fileinput .o_realchooser{position:absolute;top:0;right:0;z-index:2;opacity:0;filter:alpha(opacity=0)}.o_form .o_fileinput .o_realchooser.o_chooser_with_delete{right:38px}.o_centered_form{text-align:center}.o_centered_form fieldset.o_form{display:inline-block;text-align:left}.o_choice_checkrow,.o_choice_textrow{vertical-align:text-top;padding-bottom:2px}.o_choice_textrow{padding-left:1em}.o_togglecheck a{white-space:nowrap}.o_catalog .o_catalog_delete_img{position:relative;top:-0.5em}.o_button_dirty{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_button_dirty:hover,.o_button_dirty:focus,.o_button_dirty.focus,.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{background-image:none}.o_button_dirty.disabled,.o_button_dirty.disabled:hover,.o_button_dirty.disabled:focus,.o_button_dirty.disabled.focus,.o_button_dirty.disabled:active,.o_button_dirty.disabled.active,.o_button_dirty[disabled],.o_button_dirty[disabled]:hover,.o_button_dirty[disabled]:focus,.o_button_dirty[disabled].focus,.o_button_dirty[disabled]:active,.o_button_dirty[disabled].active,fieldset[disabled] .o_button_dirty,fieldset[disabled] .o_button_dirty:hover,fieldset[disabled] .o_button_dirty:focus,fieldset[disabled] .o_button_dirty.focus,fieldset[disabled] .o_button_dirty:active,fieldset[disabled] .o_button_dirty.active{background-color:#f0ad4e;border-color:#eea236}.o_button_dirty .badge{color:#f0ad4e;background-color:#fff}.o_button_toggle{border:1px solid #777;border-top-right-radius:9px;border-top-left-radius:9px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;background:#eee;display:inline-block;height:18px;line-height:16px;font-size:16px;text-align:left;padding:0 0.5em 0 0;margin:0}.o_button_toggle i{color:#777;text-shadow:1px 0 2px rgba(0,0,0,0.25)}.o_button_toggle span{line-height:16px;vertical-align:top;font-size:60%;color:#777;text-transform:uppercase}.o_button_toggle.o_on{text-align:right;padding:0 0 0 0.5em}.o_button_toggle.o_on i{color:#337ab7;text-shadow:-1px 0 2px rgba(0,0,0,0.25)}.o_table_wrapper{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_table_wrapper.o_table_flexi .o_table_body{margin-top:20px}.o_table_wrapper.o_table_flexi .table{margin-top:20px}.o_table_wrapper.o_table_flexi .table td ul{margin:0}.o_table_wrapper.o_table_edit table tbody{border-top:solid #f90 4px;background-color:#fefbf6}.o_table_wrapper .o_table_search{max-width:50em}.o_table_wrapper .o_table_footer .o_table_pagination{text-align:center}.o_table_wrapper .o_table_rows_infos{float:left;padding-left:0;padding-right:20px;margin:20px 0}.o_table_wrapper .o_row_selected td{background-color:#dff0d8 !important}.o_table_wrapper .o_table{margin-bottom:0}.o_table_wrapper .o_marked{font-weight:bold}.o_table_wrapper .table{margin-bottom:0}.o_table_wrapper th{color:#333}@media (max-width: 767px){.o_table_wrapper .o_table_rows_infos{clear:both}}a.o_orderby,a.o_orderby:hover{color:#333;text-decoration:none}a.o_orderby.o_orderby_asc,a.o_orderby.o_orderby_desc,a.o_orderby:hover.o_orderby_asc,a.o_orderby:hover.o_orderby_desc{border-bottom:1px solid #ddd}.o_table_row_count{padding-top:6px;padding-bottom:6px;vertical-align:middle}.o_table_row_details td{background-color:white !important}.o_table_config{font-size:12px}.o_table_buttons{text-align:center}.o_table_buttons input{margin-right:1em}.o_table_buttons input:last-child{margin-right:0}.o_table_tools{margin-left:6px}.o_table_tools_indications{margin-left:10px;padding-top:3px;font-size:66%}.o_table_count{max-width:20em;float:left;padding:0 15px}.o_info .table-bordered td,o_note .table-bordered td,o_important .table-bordered td,o_warning .table-bordered td,o_error .table-bordered td{border-color:#333}.panel .o_table_layout{border-top:1px solid #ddd;padding-top:6px}.panel .o_table_count{padding:0 15px}#o_navbar_imclient .o_im_messages{float:left}#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary{float:left;position:relative;padding:15px 3px}#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_message{padding-left:15px}#o_navbar_imclient #o_im_summary .badge{color:#fff;background-color:#777}#o_navbar_imclient #o_im_status li>a>span{display:inline}#o_navbar_imclient #o_im_status div.o_chelp_wrapper{right:0.5em}#o_navbar_imclient #o_im_message a:hover,#o_navbar_imclient #o_im_message a:focus{text-decoration:none}#o_navbar_imclient #o_im_message .o_icon_message{color:#d9534f}#o_navbar_imclient #o_im_message .o_icon_message:hover{color:#f4c37d}.o_im_load_history{margin-bottom:6px}.o_im_load_history .o_label{font-size:12px;padding-right:0.5em;line-height:1.5em;color:#777}.o_im_chat_history{height:170px;font-size:90%;border:1px solid #eee;margin:0 0 1em 0;overflow:scroll;overflow-x:auto}.o_im_message_group{padding:3px 3px 3px 40px;min-height:40px;position:relative;border-top:1px solid #eee;background:#fff}.o_im_message_group.o_odd{background:#F4F4F4}.o_im_message_group .o_portrait{position:absolute;top:3px;left:3px}.o_im_message_group .o_im_from{color:#777;font-size:12px;font-weight:bold}.o_im_message_group .o_im_from:hover{color:#5e5e5e}.o_im_message_group div.o_im_body{padding:3px 0 3px 0;font-size:12px}.o_im_message_group div.o_im_body .o_date{float:right;color:#777;font-size:9px}.o_groupchat_roster{font-size:12px}.o_groupchat_roster li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.o_groupchat_roster li.o_vip{color:#3c763d}.o_groupchat_roster li.o_anonymous{color:#31708f}.o_im_buddieslist .o_im_buddieslist_toggler .btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_im_buddieslist ul{font-size:12px}.o_im_buddieslist ul ul{padding-left:1em}.o_im_buddieslist ul a{color:#337ab7}.o_im_buddieslist ul a:hover{color:#23527c}.o_flag{position:relative;top:1px;display:inline-block;line-height:1;width:16px;height:16px;background-repeat:no-repeat;background-position:0 100%}option.o_with_flag{padding-left:23px;min-height:16px;background-repeat:no-repeat;background-position:2px 50%}.o_flag_en{background-image:url("../light/images/flags/gb.png")}.o_flag_de{background-image:url("../light/images/flags/de.png")}.o_flag_fr{background-image:url("../light/images/flags/fr.png")}.o_flag_it{background-image:url("../light/images/flags/it.png")}.o_flag_es{background-image:url("../light/images/flags/es.png")}.o_flag_da{background-image:url("../light/images/flags/dk.png")}.o_flag_cs{background-image:url("../light/images/flags/cz.png")}.o_flag_el{background-image:url("../light/images/flags/gr.png")}.o_flag_ee{background-image:url("../light/images/flags/ee.png")}.o_flag_ru{background-image:url("../light/images/flags/ru.png")}.o_flag_pl{background-image:url("../light/images/flags/pl.png")}.o_flag_zh_CN{background-image:url("../light/images/flags/cn.png")}.o_flag_zh_TW{background-image:url("../light/images/flags/tw.png")}.o_flag_lt{background-image:url("../light/images/flags/lt.png")}.o_flag_fa{background-image:url("../light/images/flags/ir.png")}.o_flag_pt_PT{background-image:url("../light/images/flags/pt.png")}.o_flag_pt_BR{background-image:url("../light/images/flags/br.png")}.o_flag_tr{background-image:url("../light/images/flags/tr.png")}.o_flag_hu{background-image:url("../light/images/flags/hu.png")}.o_flag_sq{background-image:url("../light/images/flags/al.png")}.o_flag_in{background-image:url("../light/images/flags/id.png")}.o_flag_ar{background-image:url("../light/images/flags/eg.png")}.o_flag_rm{background-image:url("../light/images/flags/rm.png")}.o_flag_af{background-image:url("../light/images/flags/za.png")}.o_flag_vi{background-image:url("../light/images/flags/vn.png")}.o_flag_mn{background-image:url("../light/images/flags/mn.png")}.o_flag_iw{background-image:url("../light/images/flags/il.png")}.o_flag_ko{background-image:url("../light/images/flags/kr.png")}.o_flag_nl_NL{background-image:url("../light/images/flags/nl.png")}.o_flag_jp{background-image:url("../light/images/flags/jp.png")}.o_flag_nb_NO{background-image:url("../light/images/flags/no.png")}.o_flag_et_EE{background-image:url("../light/images/flags/ee.png")}.o_flag_bg{background-image:url("../light/images/flags/bg.png")}.o_flag_hi_IN_ASIA{background-image:url("../light/images/flags/in.png")}.o_flag_ar_LB{background-image:url("../light/images/flags/lb.png")}.o_flag_gl_ES{background-image:url("../light/images/flags/galicia.png")}.o_flag_sk{background-image:url("../light/images/flags/sk.png")}.o_rating .o_rating_title{font-size:12px}.o_rating .o_rating_items{white-space:nowrap}.o_rating .o_rating_items .o_icon{color:#f0ad4e}.o_rating .o_rating_items .o_icon:hover{color:#337ab7}.o_rating .o_rating_items .o_legend{margin-left:1em;font-size:12px;line-height:normal}.o_rating .o_rating_explanation{font-size:12px;color:#777}@media (max-width: 991px){.o_rating .o_rating_title,.o_rating .o_rating_explanation{display:none}}.o_comments .o_comment_wrapper .o_avatar{float:left;margin:0 1em 0 0}.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{float:right}.o_comments .o_comment_wrapper .o_comment_wrapper{margin-left:16px}.o_ratings_and_comments .o_rating_wrapper{vertical-align:middle;display:inline-block}.o_ratings_and_comments a.o_comments{margin-left:10px;position:relative;top:0.1em}.d3chart .bar{shape-rendering:crispEdges}.d3chart .bar_default_light{fill:#64a0d3}.d3chart .bar_default{fill:#337ab7}.d3chart .bar_default_dark{fill:#23527c}.d3chart .axis{font:12px sans-serif}.d3chart .axis path,.d3chart .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_forum_peekview .o_quote_wrapper,.o_forum_peekview .b_quote_wrapper{display:none}.o_forum_thread_sticky{font-weight:bold}.o_forum_switch{font-size:12px}.o_forum_toolbar{margin-bottom:6px;float:left}.o_forum_fulltextsearch{float:right}@media (max-width: 767px){.o_forum_fulltextsearch{float:left}}.o_forum .o_mark,.o_forum .o_ep_collect{float:right;position:relative;width:2em;margin-left:12px}.o_forum .o_portrait{float:left;margin-right:16px}.o_forum .o_portrait_avatar{width:70px;height:70px}.o_forum .o_newindicator{font-size:10px;color:#5cb85c;text-transform:uppercase;padding-left:1em;vertical-align:text-top;white-space:nowrap}.o_forum .o_author,.o_forum .o_date{display:inline-block;color:#777}.o_forum .o_date{font-size:12px}.o_forum .o_modified{color:#8a6d3b;font-size:12px;font-style:italic}.o_forum .o_forum_message{margin-bottom:20px;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_forum .o_forum_message_new{-webkit-box-shadow:0 1px 10px rgba(92,184,92,0.3);box-shadow:0 1px 10px rgba(92,184,92,0.3)}.o_forum .o_forum_message_highlight{-webkit-box-shadow:0 1px 10px rgba(240,173,78,0.5);box-shadow:0 1px 10px rgba(240,173,78,0.5)}.o_forum .o_forum_message_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:3px;border-top-left-radius:3px}.o_forum .o_forum_message_title{margin-top:0}.o_forum .o_forum_message_body{padding:10px 15px}.o_forum .o_forum_message_attachments{border-top:1px solid #ddd;padding:10px 15px;font-size:12px;background-color:#f7f7f9}.o_forum .o_attachment{position:relative;max-width:250px;vertical-align:top;margin:6px 12px 10px 0}.o_forum .o_attachment img{margin-top:6px}.o_forum .o_filename{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_forum .o_icon_enlarge{position:absolute;left:1em;bottom:1em;text-shadow:1px 1px 2px #fff, -1px 1px 2px #fff, 1px -1px 2px #fff, -1px -1px 2px #fff}@media (min-width: 768px) and (max-width: 991px){.o_forum .o_attachments{font-size:10px}.o_forum .o_attachment{max-width:200px}.o_forum .o_attachment img{max-width:150px}.o_forum .o_filename{max-width:200px}}@media (max-width: 767px){.o_forum .o_attachments{font-size:9px}.o_forum .o_attachment{max-width:150px}.o_forum .o_attachment img{max-width:100px}.o_forum .o_filename{max-width:150px}}.o_quote_wrapper,.b_quote_wrapper{position:relative;margin:10px 0}.o_quote_author,.b_quote_author{color:#777;font-size:12px}.o_quote_author:before,.b_quote_author:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"ï„Ž";font-size:21px;padding-right:0.5em}blockquote.o_quote,blockquote.b_quote{color:#555;font-size:12px;margin-top:6px;padding:0 12px}a.o_chelp{display:inline-block;padding:1px 3px;text-align:center;vertical-align:middle;white-space:nowrap;font-size:10px;font-weight:normal;line-height:15px;color:#fff;background-color:#337ab7;border:1px solid #2e6da4;border-radius:2px;cursor:help;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a.o_chelp:active,a.o_chelp:hover,a.o_chelp:focus{text-decoration:none;color:#fff;background-color:#2a6598;border-color:#204d74}a.o_chelp i{font-size:10px !important}.o_chelp_wrapper{position:relative;float:right;display:inline-block;line-height:normal;margin-bottom:10px;margin-left:10px}.o_form_chelp,.o_chelp_tooltip{color:#737373}.o_iframedisplay iframe{width:100%}.o_singlepage .o_edit{position:absolute;top:10px;right:37px}.o_content_popup{position:absolute;top:10px;right:12px}.o_module_cp_wrapper .o_tools{position:absolute;top:10px;right:12px;text-align:right;vertical-align:middle}.o_module_cp_wrapper .o_tools .o_search_wrapper{display:inline-block;position:relative;top:-2px}ul.o_dropdown{margin:-5px -14px}ul.o_dropdown .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}ul.o_dropdown>li>a{display:block;padding:5px 14px;clear:both;font-weight:normal;line-height:1.42857;color:#333;background:#fff;white-space:nowrap}ul.o_dropdown>li>a:hover,ul.o_dropdown>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.badge.o_scorm_completed{background-color:#3c763d}.badge.o_scorm_failed{background-color:#a94442}.badge.o_scorm_incomplete{background-color:#8a6d3b}.badge.o_scorm_not_attempted{background:none}.o_bc_meta h5,.o_bc_meta .o_author,.o_bc_meta .o_comment,.tooltip h5,.tooltip .o_author,.tooltip .o_comment{color:#fff;margin:5px 0}.o_bc_meta .o_thumbnail,.tooltip .o_thumbnail{width:200px;height:200px;background-color:#fff;margin:0 -5px}.o_htmleditor .o_metadata{border:1px solid #999;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom:0;background:#eee;position:relative;top:1px;padding:5px}.o_htmleditor .o_metadata #o_filename{float:left}.o_htmleditor .o_metadata .o_lastmodified{float:right;color:#777;line-height:1.42857}.o_htmleditor #o_save{margin-top:10px;text-align:center}.o_htmleditor #o_save input{margin-right:1em}.o_htmleditor #o_save input:last-child{margin-right:0}.o_notifications_news_wrapper .o_notifications_news_subscription{margin:10px 0}.o_notifications_news_wrapper .o_notifications_news_subscription h4 i,.o_notifications_news_wrapper .o_notifications_news_subscription .o_cal .fc-header-title h2 i,.o_cal .fc-header-title .o_notifications_news_wrapper .o_notifications_news_subscription h2 i{display:none}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_context{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content{margin-left:1.5em;position:relative}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_icon{position:absolute;left:-1.5em;line-height:1.5em;top:0}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_date{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_url{margin-left:1.5em}.o_noti{margin:6px 0 6px 12px;float:right;color:#777}.o_noti .o_label{color:#777;cursor:help}@media (max-width: 767px){.o_noti .o_label span{display:none}}.panel-body .o_noti{margin:0}.o_portrait{display:inline-block}.o_portrait img{border-radius:50%;border:none;background-color:#eee;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.o_portrait_name{margin-top:6px}.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start,.o_repo_details .o_book{margin:2em 0}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0}.o_cmembers .o_cmember .o_portrait{margin-right:10px}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{line-height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:"ï„"}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.onyx_iframe{width:100%;height:100%;border:none;min-height:60em}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:"ï‚¡"}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_userbulk_changedcell{font-style:italic;font-weight:bold}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#010101;border-color:#000}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#1a1a1a;background-color:#fff}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_ratings_and_comments .o_rating_title,.o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_members_pagination{text-align:center}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"ï€" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"ï¡";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"ï ";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"ï™";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}body.o_dmz{background:white !important}.progress{-webkit-print-color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px} +**//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]: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}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail,.o_form .o_filepreview img,.o_feed .o_media{padding:4px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,.o_cal .fc-header-title h2,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h1 .small,h2 small,h2 .small,h3 small,h3 .small,h4 small,.o_cal .fc-header-title h2 small,h4 .small,.o_cal .fc-header-title h2 .small,h5 small,h5 .small,h6 small,h6 .small,.h1 small,.h1 .small,.h2 small,.h2 .small,.h3 small,.h3 .small,.h4 small,.h4 .small,.h5 small,.h5 .small,.h6 small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.o_cal .fc-header-title h2,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.o_cal .fc-header-title h2 small,h4 .small,.o_cal .fc-header-title h2 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.o_cal .fc-header-title h2,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width: 768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff}.bg-primary{background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857}dt{font-weight:bold}dd{margin-left:0}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}@media (min-width: 768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-15px;margin-right:-15px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.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>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-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-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px}input[type="date"].input-sm,.input-group-sm>input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.input-group-sm>input[type="time"].form-control,.input-group-sm>input[type="time"].input-group-addon,.input-group-sm>.input-group-btn>input[type="time"].btn,input[type="datetime-local"].input-sm,.input-group-sm>input[type="datetime-local"].form-control,.input-group-sm>input[type="datetime-local"].input-group-addon,.input-group-sm>.input-group-btn>input[type="datetime-local"].btn,input[type="month"].input-sm,.input-group-sm>input[type="month"].form-control,.input-group-sm>input[type="month"].input-group-addon,.input-group-sm>.input-group-btn>input[type="month"].btn{line-height:30px}input[type="date"].input-lg,.input-group-lg>input[type="date"].form-control,.input-group-lg>input[type="date"].input-group-addon,.input-group-lg>.input-group-btn>input[type="date"].btn,input[type="time"].input-lg,.input-group-lg>input[type="time"].form-control,.input-group-lg>input[type="time"].input-group-addon,.input-group-lg>.input-group-btn>input[type="time"].btn,input[type="datetime-local"].input-lg,.input-group-lg>input[type="datetime-local"].form-control,.input-group-lg>input[type="datetime-local"].input-group-addon,.input-group-lg>.input-group-btn>input[type="datetime-local"].btn,input[type="month"].input-lg,.input-group-lg>input[type="month"].form-control,.input-group-lg>input[type="month"].input-group-addon,.input-group-lg>.input-group-btn>input[type="month"].btn{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"].disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"].disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,fieldset[disabled] .radio-inline,.checkbox-inline.disabled,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,fieldset[disabled] .radio label,.checkbox.disabled label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.form-control-static.input-sm,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn,.form-group-sm .form-control{height:30px;line-height:30px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,.form-group-sm .form-control,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn,.form-group-sm .form-control{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn,.form-group-lg .form-control{height:46px;line-height:46px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,.form-group-lg .form-control,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn,.form-group-lg .form-control{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-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}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label ~ .form-control-feedback{top:25px}.has-feedback label.sr-only ~ .form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-group,.o_navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.o_navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static,.o_navbar-form .form-control-static{display:inline-block}.form-inline .input-group,.o_navbar-form .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.o_navbar-form .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.o_navbar-form .input-group .input-group-btn,.form-inline .input-group .form-control,.o_navbar-form .input-group .form-control{width:auto}.form-inline .input-group>.form-control,.o_navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.o_navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.o_navbar-form .radio,.form-inline .checkbox,.o_navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.o_navbar-form .radio label,.form-inline .checkbox label,.o_navbar-form .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.o_navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.o_navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback,.o_navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}@media (min-width: 768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width: 768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width: 768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn.focus,.btn:active:focus,.btn:active.focus,.btn.active:focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default.focus,.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:hover,.btn-primary:focus,.btn-primary.focus,.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success.focus,.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled].active,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info.focus,.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning.focus,.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger.focus,.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none;visibility:hidden}.collapse.in{display:block;visibility:visible}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.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:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.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;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none;visibility:hidden}.tab-content>.active{display:block;visibility:visible}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;visibility:visible !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width: 480px) and (orientation: landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 768px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width: 768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width: 768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width: 768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right ~ .navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width: 767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:hover,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:hover,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.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;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.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:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.jumbotron,.o_repo_details .o_lead{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.o_repo_details .o_lead h1,.jumbotron .h1,.o_repo_details .o_lead .h1{color:inherit}.jumbotron p,.o_repo_details .o_lead p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr,.o_repo_details .o_lead>hr{border-top-color:#d5d5d5}.container .jumbotron,.container .o_repo_details .o_lead,.o_repo_details .container .o_lead,.container-fluid .jumbotron,.container-fluid .o_repo_details .o_lead,.o_repo_details .container-fluid .o_lead{border-radius:6px}.jumbotron .container,.o_repo_details .o_lead .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron,.o_repo_details .o_lead{padding:48px 0}.container .jumbotron,.container .o_repo_details .o_lead,.o_repo_details .container .o_lead,.container-fluid .jumbotron,.container-fluid .o_repo_details .o_lead,.o_repo_details .container-fluid .o_lead{padding-left:60px;padding-right:60px}.jumbotron h1,.o_repo_details .o_lead h1,.jumbotron .h1,.o_repo_details .o_lead .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border 0.2s ease-in-out;-o-transition:border 0.2s ease-in-out;transition:border 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#333}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4,.alert .o_cal .fc-header-title h2,.o_cal .fc-header-title .alert h2{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 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:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-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-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{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:-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);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{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:-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-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{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:-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-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{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:-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-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{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:-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)}.media{margin-top:15px}.media:first-child{margin-top:0}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table,.panel-collapse>.table,.panel-collapse>.table-responsive>.table,.panel-collapse>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption,.panel-collapse>.table caption,.panel-collapse>.table-responsive>.table caption,.panel-collapse>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child,.panel-collapse>.table:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel-collapse>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel-collapse>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel-collapse>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child,.panel-collapse>.table:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel-collapse>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel-collapse>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel-collapse>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body,.panel-collapse>.panel-body+.table,.panel-collapse>.panel-body+.table-responsive,.panel-collapse>.table+.panel-body,.panel-collapse>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td,.panel-collapse>.table>tbody:first-child>tr:first-child th,.panel-collapse>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered,.panel-collapse>.table-bordered,.panel-collapse>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel-collapse>.table-bordered>thead>tr>th:first-child,.panel-collapse>.table-bordered>thead>tr>td:first-child,.panel-collapse>.table-bordered>tbody>tr>th:first-child,.panel-collapse>.table-bordered>tbody>tr>td:first-child,.panel-collapse>.table-bordered>tfoot>tr>th:first-child,.panel-collapse>.table-bordered>tfoot>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel-collapse>.table-bordered>thead>tr>th:last-child,.panel-collapse>.table-bordered>thead>tr>td:last-child,.panel-collapse>.table-bordered>tbody>tr>th:last-child,.panel-collapse>.table-bordered>tbody>tr>td:last-child,.panel-collapse>.table-bordered>tfoot>tr>th:last-child,.panel-collapse>.table-bordered>tfoot>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel-collapse>.table-bordered>thead>tr:first-child>td,.panel-collapse>.table-bordered>thead>tr:first-child>th,.panel-collapse>.table-bordered>tbody>tr:first-child>td,.panel-collapse>.table-bordered>tbody>tr:first-child>th,.panel-collapse>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel-collapse>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel-collapse>.table-bordered>tbody>tr:last-child>td,.panel-collapse>.table-bordered>tbody>tr:last-child>th,.panel-collapse>.table-bordered>tfoot>tr:last-child>td,.panel-collapse>.table-bordered>tfoot>tr:last-child>th,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel-collapse>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel-collapse>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive,.panel-collapse>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-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-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:absolute;top:0;right:0;left:0;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{content:" ";display:table}.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}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;visibility:visible;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:normal;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.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:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;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.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-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}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:normal;line-height:1.42857;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-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;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.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{content:" ";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{content:" ";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{content:" ";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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width: 767px){.visible-xs-block{display:block !important}}@media (max-width: 767px){.visible-xs-inline{display:inline !important}}@media (max-width: 767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width: 1200px){.visible-lg-block{display:block !important}}@media (min-width: 1200px){.visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}body .modal{position:absolute;overflow:visible}body div.tooltip-inner{max-width:400px}body div.popover{max-width:450px}body .modal-body.alert{border-radius:0}body .progress{margin-bottom:0}.panel-body:nth-child(n+2){border-top:1px solid #ddd}.panel .panel-heading[data-toggle="collapse"]{cursor:pointer}#o_ajax_busy_backdrop{bottom:0;z-index:1020}.form-control-feedback{top:10px}.form-horizontal .has-feedback .form-control-feedback{top:10px}.btn.btn-primary.o_disabled{color:#fff !important}body .progress-bar[aria-valuenow="1"],body .progress-bar[aria-valuenow="2"]{min-width:1px}@-moz-document url-prefix(){fieldset{display:table-cell}}@font-face{font-family:'openolat';src:url("../light/fonts/openolat/openolat.eot?4yacgg");src:url("../light/fonts/openolat/openolat.eot?#iefix4yacgg") format("embedded-opentype"),url("../light/fonts/openolat/openolat.woff?4yacgg") format("woff"),url("../light/fonts/openolat/openolat.ttf?4yacgg") format("truetype"),url("../light/fonts/openolat/openolat.svg?4yacgg#openolat") format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'FontAwesome';src:url("../../font-awesome/fonts/fontawesome-webfont.eot?v=4.3.0");src:url("../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0") format("embedded-opentype"),url("../../font-awesome/fonts/fontawesome-webfont.woff2?v=4.3.0") format("woff2"),url("../../font-awesome/fonts/fontawesome-webfont.woff?v=4.3.0") format("woff"),url("../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.3.0") format("truetype"),url("../../font-awesome/fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.o_icon-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.o_icon-2x{font-size:2em}.o_icon-3x{font-size:3em}.o_icon-4x{font-size:4em}.o_icon-5x{font-size:5em}.o_icon-fw{width:1.28571em;text-align:center}.o_icon-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.o_icon-ul>li{position:relative}.o_icon-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.o_icon-li.o_icon-lg{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.o_icon.pull-left{margin-right:.3em}.o_icon.pull-right{margin-left:.3em}.o_icon-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.o_icon-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .o_icon-rotate-90,:root .o_icon-rotate-180,:root .o_icon-rotate-270,:root .o_icon-flip-horizontal,:root .o_icon-flip-vertical{filter:none}.o_icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.o_icon-stack-1x,.o_icon-stack-2x{position:absolute;left:0;width:100%;text-align:center}.o_icon-stack-1x{line-height:inherit}.o_icon-stack-2x{font-size:2em}.o_icon-inverse{color:#fff}.o_icon_accepted:before{content:"ï…¤"}.o_icon_accessibility:before{content:""}.o_icon_actions:before{content:"ï‚…"}.o_icon_archive_tool:before{content:""}.o_icon_assessment_mode:before{content:"ï„"}.o_icon_assessment_tool:before{content:"ï‚‘"}.o_icon_attempt_limit:before{content:""}.o_icon_accept:before{content:"";color:#5cb85c}.o_icon_add:before{content:"ï•"}.o_icon_add_member:before{content:""}.o_icon_add_search:before{content:""}.o_icon_audio:before{content:""}.o_icon_back:before{content:"ï“"}.o_icon_back_history:before{content:""}.o_icon_banned:before{content:"";color:#d9534f}.o_icon_bold:before{content:""}.o_icon_booking:before{content:"ïº"}.o_icon_bookmark:before{content:"";color:#bc2d0c}.o_icon_bookmark_add:before{content:"ï‚—"}.o_icon_bookmark_header:before{content:""}.o_icon_browse:before{content:""}.o_icon_browsercheck:before{content:"ï…¤"}.o_icon_busy:before{content:"ï„"}.o_icon_calendar:before{content:"ï³"}.o_icon_calendar_enabled:before{content:"ï†"}.o_icon_calendar_disabled:before{content:"ï‚–"}.o_icon_calendar:before{content:"ï³"}.o_icon_calendar_sync:before{content:""}.o_icon_caret:before{content:""}.o_icon_caret_right:before{content:""}.o_icon_catalog:before{content:""}.o_icon_catalog_sub:before{content:"ï»"}.o_icon_certificate:before{content:"ï‚£"}.o_icon_chat:before{content:""}.o_icon_check:before{content:""}.o_icon_check_off:before{content:"ï‚–"}.o_icon_check_on:before{content:"ï†"}.o_icon_checkbox:before{content:"ï‚–"}.o_icon_checkbox_checked:before{content:"ï…Š"}.o_icon_cleanup:before{content:""}.o_icon_close:before{content:"ï€"}.o_icon_close_resource:before{content:""}.o_icon_close_tab:before{content:"ï€"}.o_icon_close_tool:before{content:"ï€"}.o_icon_close_tree:before{content:""}.o_icon_close_togglebox:before,.o_togglebox_wrapper .o_opener.o_in i:before{content:""}.o_icon_code:before{content:"ï„¡"}.o_icon_color_picker:before{content:"ïƒ"}.o_icon_copy:before{content:""}.o_icon_courseareas:before{content:""}.o_icon_coursedb:before{content:""}.o_icon_courseeditor:before{content:"ï„"}.o_icon_coursefolder:before{content:"ï„”"}.o_icon_courserun:before{content:""}.o_icon_comments:before{content:""}.o_icon_comments_none:before{content:""}.o_icon_content_popup:before{content:"ï‚Ž"}.o_icon_correct_answer:before{content:"";color:#5cb85c}.o_icon_customize:before{content:""}.o_icon_delete_item:before{content:""}.o_icon_delete:before{content:"ï–";color:#A87E7E}.o_icon_details:before{content:""}.o_icon_description:before{content:"ïš"}.o_icon_dev:before{content:""}.o_icon_disabled:before{content:"ï„Œ"}.o_icon_download:before{content:""}.o_icon_edit:before{content:"ï„"}.o_icon_edit_file:before{content:"ï„"}.o_icon_edit_metadata:before{content:""}.o_icon_enabled:before{content:"ï„‘"}.o_icon_enlarge:before{content:""}.o_icon_eportfolio_add:before{content:"ï„®"}.o_icon_eportfolio_link:before{content:"ï„®"}.o_icon_error:before{content:"ïª";color:#d9534f}.o_icon_expenditure:before{content:""}.o_icon_export:before{content:"ï…"}.o_icon_external_link:before{content:"ï‚Ž"}.o_icon_failed:before{content:"ï—"}.o_icon_filter:before{content:"ï‚°"}.o_icon_graduate:before{content:"ï†"}.o_icon_group:before,.o_BusinessGroup_icon:before{content:""}.o_icon_header:before{content:""}.o_icon_help:before{content:"ï™";cursor:help}.o_icon_home:before{content:""}.o_icon_impress:before{content:"ïš"}.o_icon_important:before{content:"ï±";color:#f0ad4e}.o_icon_import:before{content:"ï‚“"}.o_icon_info:before{content:"ïš";color:#5bc0de}.o_icon_info_msg:before{content:"ïª";color:#d9534f}.o_icon_info_resource:before{content:"ïš"}.o_icon_inline_editable:before{content:"ï„"}.o_icon_institution:before{content:""}.o_icon_italic:before{content:""}.o_icon_landingpage:before{content:"ï…€"}.o_icon_language:before{content:""}.o_icon_layout:before{content:""}.o_icon_link:before{content:"ïƒ"}.o_icon_link_extern:before{content:"ï‚Ž"}.o_icon_list:before{content:""}.o_icon_list_num :before{content:""}.o_icon_lifecycle:before{content:"ï³"}.o_icon_locked:before{content:""}.o_icon_login:before{content:"ï‚"}.o_icon_logout:before{content:"ï‚‹"}.o_icon_mandatory:before{content:"ï©";color:#f0ad4e}.o_icon_managed:before{content:"ï¹";color:#777}.o_icon_manual:before{content:"ï€";cursor:help}.o_icon_mail:before{content:""}.o_icon_math:before{content:""}.o_icon_membersmanagement:before{content:""}.o_icon_menuhandel:before{content:""}.o_icon_message:before{content:"ïƒ "}.o_icon_mobile:before{content:"ï„‹"}.o_icon_move:before{content:"ï‡"}.o_icon_move_down:before{content:""}.o_icon_move_left:before{content:"ï„€"}.o_icon_move_right:before{content:"ï„"}.o_icon_move_up:before{content:"ï„‚"}.o_icon_new:before{content:"ï©";color:#5cb85c}.o_icon_new_document:before{content:"ï…œ"}.o_icon_new_folder:before{content:"ï»"}.o_icon_news:before{content:"ïš"}.o_icon_next:before{content:""}.o_icon_next_page:before{content:"ï„"}.o_icon_next_toolbar:before{content:""}.o_icon_node_after:before{content:"ï…µ"}.o_icon_node_before:before{content:"ï…¶"}.o_icon_node_under:before{content:"ï„’"}.o_icon_notes:before{content:"ï€"}.o_icon_notification:before{content:"ï‚ž"}.o_icon_ok:before{content:"";color:#5cb85c}.o_icon_open_tree:before{content:""}.o_icon_open_togglebox:before,.o_togglebox_wrapper .o_opener i:before{content:""}.o_icon_openolat:before,.o_icon_provider_olat:before{content:"\E600";font-family:openolat;font-size:10px}.o_icon_options:before{content:""}.o_icon_pageing:before{content:"ï…"}.o_icon_passed:before{content:"ï˜"}.o_icon_password:before{content:""}.o_icon_pending:before{content:"ï„"}.o_icon_phone:before{content:"ï‚•"}.o_icon_post:before{content:""}.o_icon_preview:before{content:"ï®"}.o_icon_previous:before{content:"ï„·"}.o_icon_previous_page:before{content:"ï„€"}.o_icon_previous_toolbar:before{content:""}.o_icon_print:before{content:""}.o_icon_private:before{content:""}.o_icon_provider_adfs:before{content:"ï…º"}.o_icon_provider_facebook:before{content:"ï‚š"}.o_icon_provider_google:before{content:""}.o_icon_provider_guest:before{content:""}.o_icon_provider_ldap:before{content:""}.o_icon_provider_linkedin:before{content:""}.o_icon_provider_oauth:before{content:""}.o_icon_provider_performx:before{content:""}.o_icon_provider_shibboleth:before{content:""}.o_icon_provider_twitter:before{content:"ï‚™"}.o_icon_publish:before{content:"ï¤"}.o_icon_qrcode:before{content:""}.o_icon_quickview:before{content:"ï®"}.o_icon_radio_off:before{content:"ï„Œ"}.o_icon_radio_on:before{content:"ï"}.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:""}.o_icon_rating_off:before{content:""}.o_icon_read:before{content:"ï„Œ"}.o_icon_readonly:before{content:"ï„";color:red}.o_icon_readwrite:before{content:"ï„"}.o_icon_recycle:before{content:""}.o_icon_refresh:before{content:""}.o_icon_reject:before{content:"ï€";color:#d9534f}.o_icon_rejected:before{content:"ï…¥"}.o_icon_reminder:before{content:""}.o_icon_remove:before{content:"ï€"}.o_icon_replace:before{content:""}.o_icon_reply:before{content:"ï„’"}.o_icon_reply_with_quote:before{content:"ï„¢"}.o_icon_response_feedback:before{content:""}.o_icon_review:before{content:"ï®"}.o_icon_rss:before{content:"ï‚ž"}.o_icon_rss_unsubscribe:before{content:"ï‚ž";color:#996633}.o_icon_search:before{content:""}.o_icon_select:before{content:""}.o_icon_send:before{content:"ïƒ "}.o_icon_settings:before{content:"ï‚…"}.o_icon_share:before{content:"ï¤"}.o_icon_show_more:before{content:"ï…"}.o_icon_show_less:before{content:"ï…‘"}.o_icon_show_send:before{content:""}.o_icon_sign_out:before{content:"ï‚‹"}.o_icon_spacer:before{content:"ï¾"}.o_icon_split:before{content:""}.o_icon_sort:before{content:""}.o_icon_sort_asc:before{content:""}.o_icon_sort_desc:before{content:"ïƒ"}.o_icon_sort_menu:before{content:"ï… "}.o_icon_start:before{content:"ï”"}.o_icon_status_available:before{content:"ï„‘";color:#063}.o_icon_status_chat:before{content:"ïµ"}.o_icon_status_dnd:before{content:"";color:#cc3}.o_icon_status_unavailable:before{content:"ïœ";color:#963}.o_icon_statistics_tool:before{content:"ï‚€"}.o_icon_submit:before{content:""}.o_icon_table:before{content:""}.o_icon_table_large:before{content:""}.o_icon_tags:before{content:""}.o_icon_timelimit:before{content:""}.o_icon_toggle:before{content:"ï„‘"}.o_icon_to_read:before{content:"ï„‘"}.o_icon_tool:before{content:""}.o_icon_tools:before{content:"ï‚"}.o_icon_top:before{content:"ï·"}.o_icon_translation_item:before{content:""}.o_icon_translation_package:before{content:"ï„•"}.o_icon_user:before{content:""}.o_icon_user_vip:before{content:"ï†"}.o_icon_user_anonymous:before{content:""}.o_icon_upload:before{content:"ï‚“"}.o_icon_version:before{content:""}.o_icon_video:before{content:""}.o_icon_waiting:before{content:""}.o_icon_warn:before{content:"ï±";color:#f0ad4e}.o_icon_wizard:before{content:"ïƒ"}.o_CourseModule_icon:before,.o_course_icon:before{content:""}.o_EPStructuredMapTemplate_icon:before{content:"ï„®"}.o_FileResource-BLOG_icon:before{content:"ï‚¡"}.o_FileResource-IMSCP_icon:before{content:""}.o_FileResource-PODCAST_icon:before{content:""}.o_FileResource-SHAREDFOLDER:before{content:"ï‚Ž"}.o_FileResource-SCORMCP_icon:before{content:""}.o_FileResource-SURVEY_icon:before{content:"ï„š"}.o_FileResource-TEST_icon:before{content:"ï„"}.o_FileResource-WIKI_icon:before{content:""}.o_FileResource-SHAREDFOLDER_icon:before{content:"ï„•"}.o_FileResource-GLOSSARY_icon:before{content:"ï†"}.o_FileResource-PDF_icon:before{content:"ï‡"}.o_FileResource-XLS_icon:before{content:""}.o_FileResource-PPT_icon:before{content:""}.o_FileResource-DOC_icon:before{content:""}.o_FileResource-ANIM_icon:before{content:""}.o_FileResource-IMAGE_icon:before{content:""}.o_FileResource-SOUND_icon:before{content:""}.o_FileResource-MOVIE_icon:before{content:""}.o_FileResource-FILE_icon:before{content:""}.o_CourseModule_icon_closed:before{content:"ïž"}.o_sp_icon:before{content:""}.o_st_icon:before{content:""}.o_tu_icon:before{content:"ï‚Ž"}.o_bc_icon:before{content:"ï„•"}.o_lti_icon:before{content:"ï‚Ž"}.o_cp_icon:before{content:""}.o_cp_item:before{content:""}.o_scorm_icon:before{content:""}.o_en_icon:before{content:"ï‚"}.o_fo_icon:before{content:""}.o_co_icon:before{content:""}.o_infomsg_icon:before{content:"ïš"}.o_cal_icon:before{content:"ï³"}.o_wiki_icon:before{content:""}.o_podcast_icon:before{content:""}.o_blog_icon:before{content:"ï‚¡"}.o_ep_icon:before{content:"ï„®"}.o_iqtest_icon:before{content:"ï„"}.o_iqself_icon:before{content:"ï„"}.o_iqsurv_icon:before{content:"ï„š"}.o_ta_icon:before{content:"ï‚®"}.o_gta_icon:before{content:"ï‚®"}.o_ms_icon:before{content:""}.o_dialog_icon:before{content:""}.o_projectbroker_icon:before{content:"ï„Œ"}.o_ll_icon:before{content:"ïƒ"}.o_den_icon:before{content:""}.o_cmembers_icon:before{content:""}.o_cl_icon:before{content:"ï†"}.o_vc_icon:before{content:""}.o_vitero_icon:before{content:""}.o_openmeetings_icon:before{content:""}.o_portlet_infomsg_icon:before{content:"ïš"}.o_portlet_quickstart_icon:before{content:""}.o_portlet_bookmark_icon:before{content:""}.o_portlet_groups_icon:before{content:""}.o_portlet_notes_icon:before{content:""}.o_portlet_noti_icon:before{content:"ï‚ž"}.o_portlet_eff_icon:before{content:"ï‚£"}.o_portlet_repository_student_icon:before{content:""}.o_portlet_repository_teacher_icon:before{content:"ï†"}.o_portlet_iframe_icon:before{content:""}.o_portlet_sysinfo_icon:before{content:""}.o_portlet_dyk_icon:before{content:""}.o_portlet_infomessages_icon:before{content:""}.o_portlet_cal_icon:before{content:"ï³"}.o_portlet_institutions_icon:before{content:""}.o_portlet_links_icon:before{content:"ïƒ"}.o_portlet_shibboleth_icon:before{content:"ï‚"}.o_icon_qpool:before{content:""}.o_icon_pool_private:before{content:"ï‚–"}.o_icon_pool_public:before{content:"ï†"}.o_icon_pool_my_items:before{content:""}.o_icon_pool_favorits:before{content:""}.o_icon_pool_collection:before{content:""}.o_icon_pool_pool:before{content:""}.o_icon_pool_share:before{content:""}.o_forum_message_icon:before{content:""}.o_calendar_icon:before{content:"ï³"}.o_forum_status_thread_icon:before{content:""}.o_forum_status_sticky_closed_icon:before{content:"ïž"}.o_forum_status_sticky_icon:before{content:""}.o_forum_status_closed_icon:before{content:"ïž";color:#a94442}.o_forum_status_opened_icon:before{content:"ïž";color:#3c763d}.o_forum_status_hidden_icon:before{content:"ï°";color:#a94442}.o_forum_status_visible_icon:before{content:"ï®";color:#3c763d}.o_forum_all_icon:before{content:""}.o_forum_all_flat_icon:before{content:""}.o_forum_one_icon:before{content:"ï®"}.o_forum_marked_icon:before{content:""}.o_forum_new_icon:before{content:"ï©"}.o_mi_qpool_import:before{content:""}.o_mi_qtisection:before{content:""}.o_mi_qtisc:before{content:""}.o_mi_qtimc:before{content:"ï†"}.o_mi_qtikprim:before{content:"ï…Š"}.o_mi_qtifib:before{content:"ï…"}.o_mi_qtiessay:before{content:""}.o_as_mode_leadtime:before{content:""}.o_as_mode_assessment:before{content:"ï‹"}.o_as_mode_followup:before{content:"ïž"}.o_as_mode_closed:before{content:'-'}.o_black_led:before{content:"ï„‘";color:#337ab7}.o_green_led:before{content:"ï„‘";color:#5cb85c}.o_yellow_led:before{content:"ï„‘";color:#f0ad4e}.o_red_led:before{content:"ï„‘";color:#d9534f}.o_ac_token_icon:before{content:"ï‚„"}.o_ac_free_icon:before{content:"ï«"}.o_ac_group_icon:before{content:""}.o_ac_membersonly_icon:before{content:""}.o_ac_paypal_icon:before{content:""}.o_ac_status_canceled_icon:before{content:"ï¨";color:#f0ad4e}.o_ac_status_error_icon:before{content:"ï€";color:#d9534f}.o_ac_status_new_icon:before{content:"ï©";color:#337ab7}.o_ac_status_succes_icon:before{content:"";color:#5cb85c}.o_ac_status_waiting_icon:before{content:"";color:#337ab7}.o_ac_order_status_new_icon:before{content:"ï©";color:#337ab7}.o_ac_order_status_prepayment_icon:before{content:"";color:#5bc0de}.o_ac_order_status_payed_icon:before{content:"";color:#5cb85c}.o_ac_order_status_canceled_icon:before{content:"ï¨";color:#f0ad4e}.o_ac_order_status_error_icon:before{content:"ï€";color:#d9534f}.o_ac_order_status_warning_icon:before{content:"";color:#f0ad4e}.o_scorm_org:before{content:""}.o_scorm_item:before{content:""}.o_scorm_completed:before,.o_scorm_passed:before{content:"ï˜"}.o_scorm_failed:before{content:"ï±"}.o_scorm_incomplete:before{content:"ï±"}.o_scorm_not_attempted:before{background:none}.o_midpub:before{content:"ï˜"}.o_midwarn:before{content:"ï±"}.o_midlock:before{content:""}.o_miderr:before{content:"ïª"}.o_middel:before{content:"ï„"}.o_filetype_file:before,.o_filetype_ico:before{content:""}.o_filetype_folder:before{content:"ï„”"}.o_filetype_folder_open:before{content:"ï„•"}.o_filetype_zip:before,.o_filetype_gz:before,.o_filetype_tar:before,.o_filetype_tgz:before{content:""}.o_filetype_css:before,.o_filetype_js:before,.o_filetype_java:before,.o_filetype_numbers:before,.o_filetype_ods:before,.o_filetype_xml:before,.o_filetype_xsl:before{content:""}.o_filetype_bat_icon:before,.o_filetype_bat:before,.o_filetype_exe:before,.o_filetype_app:before,.o_filetype_sh:before{content:""}.o_filetype_xls:before,.o_filetype_xlsx:before{content:""}.o_filetype_png:before,.o_filetype_tiff:before,.o_filetype_webp:before,.o_filetype_gif:before,.o_filetype_ico:before,.o_filetype_jpeg:before,.o_filetype_bmp:before,.o_filetype_odg:before,.o_filetype_eps:before,.o_filetype_jpg:before{content:""}.o_filetype_psd:before,.o_filetype_avi:before,.o_filetype_dvi:before,.o_filetype_mp4:before,.o_filetype_m4v:before,.o_filetype_webm:before,.o_filetype_ogg:before,.o_filetype_video:before,.o_filetype_mov:before,.o_filetype_mpeg:before,.o_filetype_mpg:before,.o_filetype_qt:before,.o_filetype_ra:before,.o_filetype_ram:before,.o_filetype_swf:before,.o_filetype_flv:before{content:""}.o_filetype_midi:before,.o_filetype_audio:before,.o_filetype_mp3:before,.o_filetype_m3u:before,.o_filetype_wav:before{content:""}.o_filetype_ps:before,.o_filetype_pdf:before{content:"ï‡"}.o_filetype_key:before,.o_filetype_odp:before,.o_filetype_ppt:before,.o_filetype_pptx:before{content:""}.o_filetype_odf:before,.o_filetype_rtf:before,.o_filetype_readme:before,.o_filetype_README:before,.o_filetype_log:before,.o_filetype_txt:before,.o_filetype_htm:before,.o_filetype_html:before{content:""}.o_filetype_odt:before,.o_filetype_pages:before,.o_filetype_doc:before,.o_filetype_docx:before{content:""}.o_icon_share_social:before{content:"ï…"}.o_icon_apple:before{content:"ï…¹"}.o_icon_facebook:before{content:"ï‚‚"}.o_icon_twitter:before{content:"ï‚"}.o_icon_google:before{content:""}.o_icon_delicious:before{content:""}.o_icon_digg:before{content:""}.o_icon_mailto:before{content:""}.o_icon_link:before{content:"ïƒ"}.o_icon_yahoo:before{content:""}a.o_icon:hover,a.o_icon:focus{text-decoration:none}img.o_emoticons_angel{background:url(../light/images/emoticons/smiley-angel.png);width:16px;height:16px}img.o_emoticons_angry{background:url(../light/images/emoticons/smiley-mad.png);width:16px;height:16px}img.o_emoticons_blushing{background:url(../light/images/emoticons/smiley-red.png);width:16px;height:16px}img.o_emoticons_confused{background:url(../light/images/emoticons/smiley-confuse.png);width:16px;height:16px}img.o_emoticons_cool{background:url(../light/images/emoticons/smiley-cool.png);width:16px;height:16px}img.o_emoticons_cry{background:url(../light/images/emoticons/smiley-cry.png);width:16px;height:16px}img.o_emoticons_devil{background:url(../light/images/emoticons/smiley-evil.png);width:16px;height:16px}img.o_emoticons_grin{background:url(../light/images/emoticons/smiley-grin.png);width:16px;height:16px}img.o_emoticons_kiss{background:url(../light/images/emoticons/smiley-kiss.png);width:16px;height:16px}img.o_emoticons_ohoh{background:url(../light/images/emoticons/smiley-eek.png);width:16px;height:16px}img.o_emoticons_sad{background:url(../light/images/emoticons/smiley-sad.png);width:16px;height:16px}img.o_emoticons_sick{background:url(../light/images/emoticons/smiley-sad-blue.png);width:16px;height:16px}img.o_emoticons_smile{background:url(../light/images/emoticons/smiley.png);width:16px;height:16px}img.o_emoticons_tongue{background:url(../light/images/emoticons/smiley-razz.png);width:16px;height:16px}img.o_emoticons_ugly{background:url(../light/images/emoticons/smiley-money.png);width:16px;height:16px}img.o_emoticons_weird{background:url(../light/images/emoticons/smiley-nerd.png);width:16px;height:16px}img.o_emoticons_wink{background:url(../light/images/emoticons/smiley-wink.png);width:16px;height:16px}img.o_emoticons_worried{background:url(../light/images/emoticons/smiley-roll-blue.png);width:16px;height:16px}img.o_emoticons_up{background:url(../light/images/emoticons/thumb-up.png);width:16px;height:16px}img.o_emoticons_down{background:url(../light/images/emoticons/thumb.png);width:16px;height:16px}.o_block_bottom,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry,.o_header_with_buttons,.o_search_result{margin-bottom:1em}.o_block_top,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry{margin-top:1em}.o_block_large_bottom,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-bottom:2em}.o_block_large_top,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-top:2em}.o_block_inline,.o_block_inline_left,.o_block_inline_both,.o_block_inline_right{display:inline-block}.o_block_inline_left,.o_block_inline_both{margin-left:0.5em}.o_block_inline_right,.o_block_inline_both{margin-right:0.5em}.o_scrollblock,div.b_scrollblock{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_button_group{text-align:center}.o_button_group a,.o_button_group input,.o_button_group button,.o_button_group .btn-group{margin-right:5px;margin-bottom:0.5em}.o_button_group a:last-child,.o_button_group input:last-child,.o_button_group button:last-child,.o_button_group .btn-group:last-child{margin-right:0}.o_button_group .btn-group a,.o_button_group .btn-group input,.o_button_group .btn-group button{margin-right:0;margin-bottom:0}.o_button_group .dropdown-menu{text-align:left}.o_button_group_left{text-align:left}.o_button_group_right{text-align:right}.o_button_group_top{margin-top:0}.o_header_with_buttons:before,.o_header_with_buttons:after{content:" ";display:table}.o_header_with_buttons:after{clear:both}.o_header_with_buttons h1,.o_header_with_buttons h3,.o_header_with_buttons h4,.o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_header_with_buttons h2{display:inline-block}.o_header_with_buttons .o_button_group{margin-top:10px;margin-bottom:0;float:right}.panel-heading.o_header_with_buttons{margin-bottom:0}.o_xsmall,.b_xsmall,p.b_xsmall,div.b_xsmall{font-size:12px}.o_small,.b_small,p.b_small,div.b_small,.o_comments .o_comment_wrapper h5,.o_comments .o_comment_wrapper .o_comment,.o_bc_meta,.tooltip,.o_htmleditor .o_metadata .o_lastmodified,.o_noti,.o_block_with_datecomp .o_meta,.o_togglebox_wrapper div.o_togglebox_content .o_hide,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label,.o_course_run .o_toc .o_entry{font-size:12px}.o_large,.b_large,p.b_large,div.b_large{font-size:18px}.o_xlarge,.b_xlarge,p.b_xlarge,div.b_xlarge{font-size:18px}.o_disabled,.b_disabled,p.b_disabled,div.b_disabled{color:#777 !important;cursor:default}.o_disabled:hover,.b_disabled:hover{color:#777 !important}.o_dimmed,.b_dimmed,p.b_dimmed,div.b_dimmed{opacity:0.4;filter:alpha(opacity=40)}.o_selected,.b_selected,p.b_selected,div.b_selected{font-weight:bold}.o_deleted,.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.o_clickable{cursor:pointer}.o_ochre{color:#c8a959}.o_blue{color:#12223F}.o_undecorated:hover,.o_undecorated:focus,.o_disabled:hover,.b_disabled:hover,#o_main_wrapper #o_toplink:hover,#o_footer_powered a:hover,#o_share a:hover,#o_share_social_container a:hover,.o_toolbar .o_tools_container a:hover,.o_button_toggle:hover,.o_im_message_group .o_im_from:hover,.o_noti .o_label:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover,.o_catalog .o_level .o_meta .o_title a:hover,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover,.o_repo_details .o_social .o_comments:hover,.o_login .o_login_register:hover,.o_disabled:focus,.b_disabled:focus,#o_main_wrapper #o_toplink:focus,#o_footer_powered a:focus,#o_share a:focus,#o_share_social_container a:focus,.o_toolbar .o_tools_container a:focus,.o_button_toggle:focus,.o_im_message_group .o_im_from:focus,.o_noti .o_label:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:focus,.o_catalog .o_level .o_meta .o_title a:focus,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:focus,.o_repo_details .o_social .o_comments:focus,.o_login .o_login_register:focus{text-decoration:none}.o_copy_code,.b_copy_code,p.b_copy_code,div.b_copy_code,code,pre{overflow-x:auto;overflow-y:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}.o_nowrap,.b_copy_code,p.b_copy_code,div.b_copy_code,code{white-space:nowrap}.o_titled_wrapper .o_content{margin-top:20px}.o_video,.o_video video,.b_video,.o_video_wrapper{display:inline-block;max-width:100%;height:auto;max-width:100%}.o_image,.o_image img,img,.b_image{display:inline-block;max-width:100%;height:auto;max-width:100%}.o_with_hyphens{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}h1{color:#337ab7}h2{color:#337ab7}h3{color:#337ab7}h4,.o_cal .fc-header-title h2{color:#337ab7}h5{color:#337ab7}h5{color:#337ab7}fieldset legend{color:#333}.b_border_box,p.b_border_box,div.b_border_box{border:1px solid #777;padding:1em;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}table td{vertical-align:top}table.b_grid{width:99.5%;background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:1px 5px;border:1px solid #777}table.b_grid th{background:#eee}table.b_border{width:99.5%;background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:1px 5px;border:1px solid #777}table.b_border th{background:#eee}table.b_borderless{width:99.5%;background:transparent;border-collapse:separate}table.b_borderless td,table.b_borderless th{padding:1px 5px;border:0}table.b_full{width:99.5%}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.b_align_justified{text-align:justify}a.b_link_extern{color:#337ab7}a.b_link_extern:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"ï‚Ž"}a.b_link_mailto{color:#337ab7}a.b_link_mailto:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:""}a.b_link_forward{color:#337ab7}a.b_link_forward:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"ï¤"}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_left_clear{clear:both;margin:0 2em 2em 0;display:block}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_float_right_clear{clear:both;display:block;margin:0 0 2em auto}img.b_centered{clear:both;display:block;margin:0 auto 2em auto}img.b_circle{border-radius:50%}img.b_with_border{border:1px solid #ddd;padding:3px;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}span.olatFlashMovieViewer{max-width:100% !important;border:none !important}.mejs-container,.mejs-mediaelement video,.mejs-layers div,.me-cannotplay{max-width:100%}.b_clear_float,p.b_clear_float,div.b_clear_float{clear:both}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:80px}#o_main_wrapper{background:#fff;z-index:3}#o_main_wrapper #o_main_container{background:#fff}#o_main_wrapper #o_main_container #o_main_left{float:left;z-index:2;position:relative;background:#fff}#o_main_wrapper #o_main_container #o_main_left #o_main_left_content{padding:0 0 0 15px}#o_main_wrapper #o_main_container #o_main_left #o_main_left_toggle{position:absolute;display:none;right:0;top:70px;margin-right:-30px;font-size:25px;line-height:35px;text-align:center;width:30px;height:35px;z-index:3;border:1px solid #ddd;border-left:none;border-bottom-right-radius:4px;border-top-right-radius:4px;background-color:#fbfbfb;-webkit-box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);color:#337ab7}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas{background:#fbfbfb;-webkit-box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);min-width:250px}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas #o_main_left_content{padding:0 0 0 0}#o_main_wrapper #o_main_container #o_main_right{float:right;z-index:2;position:relative;background:inherit}#o_main_wrapper #o_main_container #o_main_right #o_main_right_content{padding:0 15px 0 0}#o_main_wrapper #o_main_container #o_main_center{position:relative;z-index:1;background:inherit}#o_main_wrapper #o_main_container #o_main_center h2:first-child{margin-top:0}@media screen and (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center{margin-left:0 !important}}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:0 15px}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content #o_main_center_content_inner{padding-bottom:15px}#o_main_wrapper #o_toplink{position:absolute;bottom:0;right:15px;text-align:center;z-index:3}@media (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:15px}}#o_back_wrapper,#o_preview_wrapper{margin-top:10px}#o_back_wrapper.o_toolbar .o_breadcrumb .breadcrumb,#o_preview_wrapper.o_toolbar .o_breadcrumb .breadcrumb{font-size:14px}#o_footer_wrapper{position:absolute;bottom:0;width:100%;height:70px;overflow:hidden;background-color:#f5f5f5;color:#999;line-height:16px;font-size:12px}#o_footer_wrapper a{color:#999}#o_footer_wrapper a:hover{color:#000}#o_footer_container{position:relative;padding-top:10px;min-height:70px;background:#f5f5f5;z-index:1}#o_footer_user{position:absolute;left:15px;top:10px;z-index:1}#o_footer_user #o_counter{white-space:nowrap}#o_footer_user #o_username{white-space:nowrap;margin-right:1em}#o_footer_version{position:absolute;right:15px;top:10px;text-align:right;z-index:1}@media (max-width: 767px){#o_footer_version{padding-top:10px;text-align:left}}#o_footer_powered{position:absolute;top:30px;right:15px;z-index:1}#o_footer_powered img{opacity:0.6;filter:alpha(opacity=60)}#o_footer_powered img:hover{opacity:1;filter:alpha(opacity=100)}#o_footer_impressum{position:absolute;top:10px;width:100%;text-align:center;z-index:-1}#o_footer_impressum i{display:none}#o_footer_textline{position:absolute;top:30px;width:100%;text-align:center;z-index:-1}#o_share{margin-top:10px}#o_share a{opacity:0.6;filter:alpha(opacity=60)}#o_share a:hover{opacity:1;filter:alpha(opacity=100)}#o_share a,#o_share_social_container a{color:#999;margin:0 0.25em 0 0}#o_share a:hover,#o_share_social_container a:hover{color:#000}@media (max-width: 767px){#o_counter,#o_footer_version,#o_share{display:none}#o_footer_impressum{top:30px;text-align:left}#o_footer_textline{top:50px;text-align:left}#o_footer_powered{top:10px}#o_footer_powered a:after{content:"\221E";font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;font-size:14px}#o_footer_powered img{display:none}}#o_navbar_wrapper{z-index:4;border-top:1px solid #e7e7e7;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1)}#o_navbar_wrapper #o_navbar_container{position:relative}a.o_disabled.navbar-text{margin:0}.o_navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid #e7e7e7;background-color:#f8f8f8}.o_navbar:before,.o_navbar:after{content:" ";display:table}.o_navbar:after{clear:both}.o_navbar .o_navbar_tabs li{max-width:150px}.o_navbar .o_navbar_tabs li a{padding-right:30px}.o_navbar .o_navbar_tabs li a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_navbar .o_navbar_tabs .o_icon-fw{position:absolute;top:15px;left:0.5em;padding-top:3px;width:1em;height:1em;display:none}.o_navbar .o_navbar_tabs .o_navbar_tab_close{position:absolute;top:15px;right:0.5em;padding:0;width:1em;height:1em}.o_navbar .o_navbar_tabs .o_navbar_tab_close i:before{color:#d9534f}.o_navbar .o_navbar_tabs .o_navbar_tab_close:hover i:before{color:#c9302c}.o_navbar .o_custom_navbar-brand{background-position:5px 0;background-repeat:no-repeat;height:50px;width:120px}.o_navbar #o_navbar_langchooser{color:#777;padding:7px 15px}.o_navbar #o_navbar_langchooser form span+div{display:inline}.o_navbar #o_navbar_tools_permanent #o_navbar_print a,.o_navbar #o_navbar_tools_permanent #o_navbar_impress a,.o_navbar #o_navbar_tools_permanent #o_navbar_help a{color:#777;padding-right:0}.o_navbar #o_navbar_tools_permanent #o_navbar_login a{color:#f0ad4e}.o_navbar .o_navbar_tools>#o_navbar_tools_permanent>li>a>span{display:none}@media (min-width: 768px){.o_navbar .o_navbar_tools li.o_portrait>a>span{display:inline}}.o_navbar #o_navbar_tools_personal .o_navbar_tool a,.o_navbar #o_navbar_tools_permanent .o_navbar_tool a{padding-right:5px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu a{padding-left:45px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .dropdown-menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .dropdown-menu a{padding-left:15px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .o_portrait,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .o_portrait{position:absolute;left:7px;top:10px}.o_navbar #o_navbar_tools_personal .o_logout,.o_navbar #o_navbar_tools_permanent .o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar_tab_close{top:10px;right:10px}.o_navbar.o_navbar-offcanvas .o_navbar-right a{padding:3px 20px;color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-right a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a:focus{color:#fff;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:focus{color:#c9302c}.o_navbar.o_navbar-offcanvas .o_navbar-right a .o_icon-lg{font-size:1.0em;vertical-align:baseline}.o_navbar.o_navbar-offcanvas .o_navbar-right .divider{height:1px;margin:9px 0;overflow:hidden;background-color:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-header{padding-left:15px}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-toggle{display:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu{box-shadow:none;position:relative;top:0;left:0;display:block;float:none;background-color:#222;color:#9d9d9d;font-size:14px;border:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu .divider{background:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a{color:#9d9d9d;text-shadow:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav a:focus{background-color:transparent;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:focus{background-color:#090909;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link{color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link:hover{color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a{color:#777}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}#o_navbar_impress a span,#o_navbar_search_opener a span{display:none}body.o_dmz #o_navbar_print a span,body.o_dmz #o_navbar_impress a span,body.o_dmz #o_navbar_help a span,body.o_dmz #o_navbar_search_opener a span{display:inline}.o_navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;-webkit-overflow-scrolling:touch}.o_navbar-collapse:before,.o_navbar-collapse:after{content:" ";display:table}.o_navbar-collapse:after{clear:both}.o_navbar-collapse.o_collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.o_navbar-offcanvas .o_navbar-collapse{width:auto;box-shadow:none;margin-top:10px;margin-right:-15px;margin-left:-15px}.o_navbar-brand{float:left;font-size:18px;line-height:20px;height:50px;color:#777}.o_navbar-brand:hover,.o_navbar-brand:focus{text-decoration:none;color:#5e5e5e;background-color:transparent}.o_navbar-toggle{position:relative;margin-right:15px;margin-left:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;border:1px solid #ddd;border-radius:4px;background-color:transparent;background-image:none}.o_navbar-toggle:hover,.o_navbar-toggle:focus{outline:none;background-color:#ddd}.o_navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#888}.o_navbar-toggle .icon-bar+.icon-bar{margin-top:4px}#o_navbar_left-toggle{float:left}#o_navbar_right-toggle{float:right}.o_navbar-link{color:#777}.o_navbar-link:hover{color:#333}.o_navbar-nav{margin:7.5px -15px}.o_navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px;color:#777}.o_navbar-nav>li>a:hover,.o_navbar-nav>li>a:focus{color:#333;background-color:transparent}.o_navbar-nav>.active>a,.o_navbar-nav>.active>a:hover,.o_navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar-nav>.disabled>a,.o_navbar-nav>.disabled>a:hover,.o_navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.o_navbar-nav>.open>a,.o_navbar-nav>.open>a:hover,.o_navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}.o_collapse .o_navbar-nav{float:left;margin:0}.o_collapse .o_navbar-nav>li{float:left}.o_collapse .o_navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.o_collapse .o_navbar-nav.o_navbar-right:last-child{margin-right:-15px}.o_collapse.o_navbar-collapse .o_navbar-left{float:left !important}.o_collapse.o_navbar-collapse .o_navbar-right{float:right !important}.o_navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (max-width: 767px){.o_navbar-form .form-group{margin-bottom:5px}}.o_collapse .o_navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.o_collapse .o_navbar-form.o_navbar-right:last-child{margin-right:-15px}.o_navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.o_navbar-fixed-bottom .o_navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.o_navbar-btn{margin-top:8px;margin-bottom:8px}.o_navbar-btn.btn-sm,.btn-group-sm>.o_navbar-btn.btn{margin-top:10px;margin-bottom:10px}.o_navbar-btn.btn-xs,.btn-group-xs>.o_navbar-btn.btn{margin-top:14px;margin-bottom:14px}.o_navbar-text{margin-top:15px;margin-bottom:15px;color:#777}.o_collapse .o_navbar-text{float:left;margin-left:15px;margin-right:15px}.o_collapse .o_navbar-text.o_navbar-right:last-child{margin-right:0}.o_dropdown_tab{position:relative}.o_dropdown_tab>a:first-child{padding-right:30px}.o_dropdown_tab>a:first-child .o_icon-fw{display:none;position:absolute;top:0;left:10px;padding-top:3px;line-height:20px}.o_dropdown_tab>a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_dropdown_tab .o_navbar_tab_close{position:absolute;top:0px;right:10px;padding-left:0px;padding-right:0px;color:#d9534f;background-color:inherit}.o_dropdown_tab .o_navbar_tab_close:focus,.o_dropdown_tab .o_navbar_tab_close:hover{color:#c9302c;background-color:inherit}#o_navbar_more .dropdown-menu .divider:last-child{display:none}@media (min-width: 768px){#o_navbar_more .dropdown-menu{max-width:300px}}@media (max-width: 767px){#o_navbar_more>li{position:inherit}#o_navbar_more .dropdown-menu{left:0px;right:0px}#o_navbar_more .dropdown-menu a,#o_navbar_more .dropdown-menu i{line-height:30px}#o_navbar_more .dropdown-menu .o_navbar_tab_close{line-height:inherit}}.o_body_popup #o_topnav_printview{display:inline-block}.o_body_popup #o_topnav_close{float:right}.o_body_popup #o_topnav_close span{display:block}.o_body_popup #o_navbar_tools_permanent li>a{background-color:transparent}.o_toolbar{position:relative;margin-bottom:20px;margin-top:-10px;border:1px solid #e7e7e7}.o_toolbar:before,.o_toolbar:after{content:" ";display:table}.o_toolbar:after{clear:both}@media (min-width: 768px){.o_toolbar{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}}.o_toolbar .o_breadcrumb:before,.o_toolbar .o_breadcrumb:after{content:" ";display:table}.o_toolbar .o_breadcrumb:after{clear:both}.o_toolbar .o_breadcrumb .breadcrumb{margin-bottom:0;padding:5px 9px;font-size:11px;line-height:15px;border-radius:0;background:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a span{display:none}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close:before{content:none}.o_toolbar .o_tools_container{text-align:center;min-height:37px;position:realtive;background-color:#f8f8f8;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:1px solid #e7e7e7}.o_toolbar .o_tools_container:before,.o_toolbar .o_tools_container:after{content:" ";display:table}.o_toolbar .o_tools_container:after{clear:both}@media (max-width: 991px){.o_toolbar .o_tools_container{min-height:35px}}@media (max-width: 767px){.o_toolbar .o_tools_container{min-height:22px;text-align:left}}.o_toolbar .o_tools_container a{color:#777;display:inline-block}.o_toolbar .o_tools_container a:hover{color:#333}.o_toolbar .o_tools_container a.o_disabled{color:#aaa !important}.o_toolbar .o_tools_container a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tools_container a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools_container .dropdown-menu a{display:block}.o_toolbar .o_tools_container .dropdown-menu a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools{margin-top:8px;margin-bottom:5px}.o_toolbar .o_tool,.o_toolbar .o_text{position:relative;margin:0 10px}.o_toolbar .o_tool:first-child,.o_toolbar .o_text:first-child{margin-left:0}.o_toolbar .o_tool:last-child,.o_toolbar .o_text:last-child{margin-right:0}.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:18px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:block;font-size:12px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{position:absolute;right:50%;top:-18px;margin-right:-12px;font-size:13px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:16px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{font-size:11px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{top:-16.5px;margin-right:-11px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:20px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:none}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{display:block;position:relative;top:0;left:0;margin-right:0}}.o_toolbar .o_tool .o_chelp,.o_toolbar .o_text .o_chelp{position:relative;top:-1em;vertical-align:top;color:#fff}.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{padding:0;margin-top:5px;border:1px solid #ccc;background-color:#eee}.o_toolbar .o_tool_next a,.o_toolbar .o_tool_previous a{color:#777}.o_toolbar .o_tool_next a:hover,.o_toolbar .o_tool_previous a:hover{color:#333}.o_toolbar .o_tool_next a.o_disabled,.o_toolbar .o_tool_previous a.o_disabled{color:#aaa !important}.o_toolbar .o_tool_next a.o_disabled:hover,.o_toolbar .o_tool_previous a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:21px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:4px}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:18px}}@media (max-width: 767px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:0}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:20px}}.o_toolbar .o_tool_previous{margin-left:10px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-right:0}.o_toolbar .o_tool_next{border-bottom-right-radius:4px;border-top-right-radius:4px}.o_toolbar .o_tool_dropdown{margin:0 10px}.o_toolbar .o_tool_dropdown:first-child{margin-left:0}.o_toolbar .o_tool_dropdown:last-child{margin-right:0}.o_toolbar .o_tool_dropdown a.dropdown-toggle{position:relative}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:18px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:block;font-size:12px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{position:absolute;right:50%;top:4px;margin-right:-20px;font-size:14px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:16px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span,.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{font-size:11px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{top:4px;margin-right:-18px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool_dropdown a.dropdown-toggle{padding:0 10px 0 5px}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:20px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:none}}.o_toolbar .o_tool_dropdown .dropdown-menu{text-align:left}.o_toolbar .o_tools_left{float:left}.o_toolbar .o_tools_right{float:right}.o_toolbar .o_tools_right_edge{float:right}@media (max-width: 991px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tool span{max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 5px}}@media (max-width: 767px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools .o_chelp{top:0;vertical-align:top}.o_toolbar .o_tools_center{float:left}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 0;position:static}.o_toolbar .o_tool_dropdown .dropdown-menu{left:0px;right:0px}.o_toolbar .o_tool_dropdown .dropdown-menu a,.o_toolbar .o_tool_dropdown .dropdown-menu i{line-height:30px}.o_toolbar .o_tool_dropdown .dropdown-menu .o_navbar_tab_close{line-height:inherit}}body{overflow-x:hidden}.o_container_offcanvas{position:relative;max-width:1324px;-webkit-transition:all .25s ease-in-out;-moz-transition:all .25s ease-in-out;-o-transition:all .25s ease-in-out;-m-transition:all .25s ease-in-out;transition:all .25s ease-in-out}#o_offcanvas_right{position:absolute;top:0;right:-250px;width:250px;padding:15px 15px;background-color:#222;color:#9d9d9d;border:1px solid #090909;-webkit-box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);box-shadow:0px 0px 4px 3px rgba(0,0,0,0.25);min-height:100%;z-index:10;display:none}#o_offcanvas_right:before,#o_offcanvas_right:after{content:" ";display:table}#o_offcanvas_right:after{clear:both}@media screen and (max-width: 767px){.row-offcanvas{position:relative;-webkit-transition:all .25s ease-out;-moz-transition:all .25s ease-out;transition:all .25s ease-out}.row-offcanvas-right{right:0}.row-offcanvas-right .sidebar-offcanvas{right:-50%}.row-offcanvas-right.active{right:50%}.row-offcanvas-left{left:0}.row-offcanvas-left .sidebar-offcanvas{left:-50%}.row-offcanvas-left.active{left:50%}.sidebar-offcanvas{position:absolute;top:0;width:50%}}.o_info,.b_info,p.b_info,div.b_info,.o_form .o_info,.o_togglebox_wrapper div.o_togglebox_content,div.o_qti_item_itemfeedback{margin:20px 0;padding:20px;border-left:3px solid #777;background-color:#eee}.o_info h2,.o_info h3,.o_info h4,.o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_info h2,.o_info h5,.b_info h2,.o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback h2,.b_info h3,.o_form .o_info h3,.o_togglebox_wrapper div.o_togglebox_content h3,div.o_qti_item_itemfeedback h3,.b_info h4,.o_form .o_info h4,.o_togglebox_wrapper div.o_togglebox_content h4,div.o_qti_item_itemfeedback h4,.b_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_info h2,.o_form .o_info .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_info h2,.o_togglebox_wrapper div.o_togglebox_content .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_togglebox_wrapper div.o_togglebox_content h2,div.o_qti_item_itemfeedback .o_cal .fc-header-title h2,.o_cal .fc-header-title div.o_qti_item_itemfeedback h2,.b_info h5,.o_form .o_info h5,.o_togglebox_wrapper div.o_togglebox_content h5,div.o_qti_item_itemfeedback h5{color:#777}.o_note,.b_note,p.b_note,div.b_note,.o_form .o_desc,.o_course_run .o_statusinfo,.o_course_stats .o_desc{margin:20px 0;padding:20px;border-left:3px solid #31708f;background-color:#d9edf7}.o_note h2,.o_note h3,.o_note h4,.o_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_note h2,.o_note h5,.b_note h2,.o_form .o_desc h2,.o_course_run .o_statusinfo h2,.o_course_stats .o_desc h2,.b_note h3,.o_form .o_desc h3,.o_course_run .o_statusinfo h3,.o_course_stats .o_desc h3,.b_note h4,.o_form .o_desc h4,.o_course_run .o_statusinfo h4,.o_course_stats .o_desc h4,.b_note .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_note h2,.o_form .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_desc h2,.o_course_run .o_statusinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_statusinfo h2,.o_course_stats .o_desc .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_stats .o_desc h2,.b_note h5,.o_form .o_desc h5,.o_course_run .o_statusinfo h5,.o_course_stats .o_desc h5{color:#31708f}.o_important,.b_important,p.b_important,div.b_important,.o_bc_empty,.o_course_run .o_no_scoreinfo{margin:20px 0;padding:20px;border-left:3px solid #F4D000;background-color:#FFF1A4}.o_important h2,.o_important h3,.o_important h4,.o_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_important h2,.o_important h5,.b_important h2,.o_bc_empty h2,.o_course_run .o_no_scoreinfo h2,.b_important h3,.o_bc_empty h3,.o_course_run .o_no_scoreinfo h3,.b_important h4,.o_bc_empty h4,.o_course_run .o_no_scoreinfo h4,.b_important .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_important h2,.o_bc_empty .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_bc_empty h2,.o_course_run .o_no_scoreinfo .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_course_run .o_no_scoreinfo h2,.b_important h5,.o_bc_empty h5,.o_course_run .o_no_scoreinfo h5{color:#F4D000}.o_success,.b_success,p.b_success,div.b_success{margin:20px 0;padding:20px;border-left:3px solid #3c763d;background-color:#dff0d8}.o_success h2,.o_success h3,.o_success h4,.o_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_success h2,.o_success h5,.b_success h2,.b_success h3,.b_success h4,.b_success .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_success h2,.b_success h5{color:#3c763d}.o_warning,.b_warning,p.b_warning,div.b_warning,.o_form .o_warning{margin:20px 0;padding:20px;border-left:3px solid #8a6d3b;background-color:#fcf8e3}.o_warning h2,.o_warning h3,.o_warning h4,.o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_warning h2,.o_warning h5,.b_warning h2,.o_form .o_warning h2,.b_warning h3,.o_form .o_warning h3,.b_warning h4,.o_form .o_warning h4,.b_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_warning h2,.o_form .o_warning .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_form .o_warning h2,.b_warning h5,.o_form .o_warning h5{color:#8a6d3b}.o_error,.b_error,p.b_error,div.b_error{margin:20px 0;padding:20px;border-left:3px solid #a94442;background-color:#f2dede}.o_error h2,.o_error h3,.o_error h4,.o_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_error h2,.o_error h5,.b_error h2,.b_error h3,.b_error h4,.b_error .o_cal .fc-header-title h2,.o_cal .fc-header-title .b_error h2,.b_error h5{color:#a94442}div.o_callout_overlay{position:fixed;top:0;left:0;width:100%;height:100%;zoom:1;background:#000;opacity:0;filter:alpha(opacity=0)}.o_alert_info{position:fixed;top:-100%;left:0;display:none;z-index:2000;width:100%;text-align:center}.o_alert_info .alert{position:relative;width:auto;margin:0 auto;text-align:left;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.o_alert_info .alert .o_icon_close{float:right;color:#777}.o_alert_info .alert .o_icon_close:hover{color:#555}@media (min-width: 768px){.o_alert_info .alert{width:600px}}#o_msg_sticky,#o_msg_sticky_preview{position:relative;color:#a94442;background-color:#f2dede;border:1px solid #ebccd1;padding:10px 16px 10px 60px;min-height:40px;margin:-20px 0 20px 0}#o_msg_sticky .o_icon_info_msg,#o_msg_sticky_preview .o_icon_info_msg{position:absolute;left:10px;top:5px;font-size:40px}#o_msg_sticky.o_msg_sticky_fullscreen,#o_msg_sticky_preview.o_msg_sticky_fullscreen{margin-top:0}@media (min-width: 768px){.modal .o_modal_fullwidth{width:90%}}@media (min-width: 992px){.modal .o_modal_fullwidth{width:80%}}.modal .modal-header h4,.modal .modal-header .o_cal .fc-header-title h2,.o_cal .fc-header-title .modal .modal-header h2{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.o_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_tree a{color:#777;background-color:none}.o_tree a:hover,.o_tree a:focus{color:#333}.o_tree .o_tree_link{background-color:none}.o_tree .o_tree_link:hover,.o_tree .o_tree_link:focus{background-color:#f8f8f8}.o_tree .o_tree_link:first-child{background-color:transparent}.o_tree .o_tree_link:last-child:hover,.o_tree .o_tree_link:last-child:focus{background-color:#f8f8f8}.o_tree .o_insertion_point>a>span{padding:5px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_insertion_source>a>span.o_tree_item,.o_tree .o_insertion_source>a>span.o_dnd_item{border-bottom:solid #f90 4px;background-color:#fefbf6}.o_tree ul{margin:0;padding:0;list-style-type:none}.o_tree ul li{margin:0;padding:0;white-space:nowrap}.o_tree ul li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_tree ul li div.popover{position:absolute;left:auto;right:0}.o_tree ul li div a.o_tree_oc_l0{position:absolute;top:10px;left:-4px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l0,.o_tree ul .o_tree_level_close.b_tree_oc_l0{z-index:10}.o_tree ul li div a.o_tree_oc_l1{position:absolute;top:10px;left:11px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l1,.o_tree ul .o_tree_level_close.b_tree_oc_l1{z-index:10}.o_tree ul li div a.o_tree_oc_l2{position:absolute;top:10px;left:26px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l2,.o_tree ul .o_tree_level_close.b_tree_oc_l2{z-index:10}.o_tree ul li div a.o_tree_oc_l3{position:absolute;top:10px;left:41px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l3,.o_tree ul .o_tree_level_close.b_tree_oc_l3{z-index:10}.o_tree ul li div a.o_tree_oc_l4{position:absolute;top:10px;left:56px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l4,.o_tree ul .o_tree_level_close.b_tree_oc_l4{z-index:10}.o_tree ul li div a.o_tree_oc_l5{position:absolute;top:10px;left:71px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l5,.o_tree ul .o_tree_level_close.b_tree_oc_l5{z-index:10}.o_tree ul li div a.o_tree_oc_l6{position:absolute;top:10px;left:86px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l6,.o_tree ul .o_tree_level_close.b_tree_oc_l6{z-index:10}.o_tree ul li div a.o_tree_oc_l7{position:absolute;top:10px;left:101px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l7,.o_tree ul .o_tree_level_close.b_tree_oc_l7{z-index:10}.o_tree ul li div a.o_tree_oc_l8{position:absolute;top:10px;left:116px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l8,.o_tree ul .o_tree_level_close.b_tree_oc_l8{z-index:10}.o_tree ul li div a.o_tree_oc_l9{position:absolute;top:10px;left:131px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l9,.o_tree ul .o_tree_level_close.b_tree_oc_l9{z-index:10}.o_tree ul li div a.o_tree_oc_l10{position:absolute;top:10px;left:146px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l10,.o_tree ul .o_tree_level_close.b_tree_oc_l10{z-index:10}.o_tree ul li div a.o_tree_oc_l11{position:absolute;top:10px;left:161px;z-index:9}.o_tree ul .o_tree_level_open.b_tree_oc_l11,.o_tree ul .o_tree_level_close.b_tree_oc_l11{z-index:10}.o_tree ul li div span.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_tree ul li div span.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_tree ul li div span.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_tree ul li div span.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_tree ul li div span.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_tree ul li div span.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_tree ul li div span.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_tree ul li div span.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_tree ul li div span.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_tree ul li div span.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_tree ul li div span.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_tree ul li div span.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_tree ul span.o_tree_leaf{display:none}.o_tree ul span.o_tree_link>input[type=checkbox]{margin-right:5px}.o_tree ul li .badge{position:absolute;font-size:70%}.o_tree ul li .badge:before{content:none}.o_tree ul li .badge.o_badge_1{top:3px;right:1px}.o_tree ul li .badge.o_badge_2{bottom:3px;right:1px}.o_tree ul li .badge.o_badge_3{top:3px;right:25px}.o_tree ul li .badge.o_badge_4{bottom:3px;right:25px}.o_tree ul li div.o_dnd_sibling{margin:0;padding:0;border-bottom:none}.o_tree ul li .active.o_tree_link{background-color:none;font-weight:bold}.o_tree ul li .active.o_tree_link a{color:#337ab7}.o_tree ul li .active.o_tree_link:hover,.o_tree ul li .active.o_tree_link:focus{background-color:#eee}.o_tree ul li .active.o_tree_link:hover a,.o_tree ul li .active.o_tree_link:focus a{color:#23527c}.o_tree ul li .active_parent.o_tree_link{font-weight:bold}.o_tree ul li .active_parent.o_tree_link a{color:#777}.o_tree ul li .active_parent.o_tree_link a:hover,.o_tree ul li .active_parent.o_tree_link a:focus{color:#333}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l0{left:6px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l1{left:21px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l2{left:36px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l3{left:51px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l4{left:66px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l5{left:81px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l6{left:96px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l7{left:111px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l8{left:126px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l9{left:141px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l10{left:156px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l11{left:171px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l0{padding:10px 2px 10px 20px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l1{padding:10px 2px 10px 35px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l2{padding:10px 2px 10px 50px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l3{padding:10px 2px 10px 65px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l4{padding:10px 2px 10px 80px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l5{padding:10px 2px 10px 95px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l6{padding:10px 2px 10px 110px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l7{padding:10px 2px 10px 125px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l8{padding:10px 2px 10px 140px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l9{padding:10px 2px 10px 155px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l10{padding:10px 2px 10px 170px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l11{padding:10px 2px 10px 185px}.o_tree .o_dnd_item{cursor:move;z-index:100}.o_tree .o_dnd_proxy{opacity:0.4;filter:alpha(opacity=40);background-color:#f0ad4e;padding:5px 10px 5px 10px;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree .o_dnd_item.o_dnd_over{background-color:#ffff60}.o_tree .o_dnd_sibling{height:7px;width:100%}.o_tree .o_dnd_sibling.o_dnd_over{background:transparent url(../light/images/arrow_dd.png) top left no-repeat}.o_tree .o_dnd_l1{margin-left:0 !important}.o_tree .o_dnd_l2{margin-left:1em !important}.o_tree .o_dnd_l3{margin-left:2em !important}.o_tree .o_dnd_l4{margin-left:3em !important}.o_tree .o_dnd_l5{margin-left:4em !important}.o_tree .o_dnd_l6{margin-left:5em !important}.o_tree .o_dnd_l7{margin-left:6em !important}.o_tree .o_dnd_l8{margin-left:7em !important}.o_tree .o_dnd_l9{margin-left:8em !important}.o_tree .o_dnd_l10{margin-left:9em !important}.o_tree .o_dnd_l11{margin-left:10em !important}.o_tree.o_tree_insert_tool span.o_tree_link a{display:block}.o_offcanvas .o_tree{border:0}.o_selection_tree{position:relative;display:block;background-color:none;border:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;overflow:hidden;font-size:14px}.o_selection_tree ul{margin:0;padding:0;list-style-type:none}.o_selection_tree li{margin:0;padding:0;white-space:nowrap}.o_selection_tree li div{position:relative;margin-bottom:-1px;border-bottom:1px solid #ddd}.o_selection_tree li>div>span.o_tree_l0,.o_selection_tree li>div>div.checkbox.o_tree_l0,.o_selection_tree li>div>div.radio.o_tree_l0{display:block;padding:10px 2px 10px 10px;z-index:9}.o_selection_tree li>div>span.o_tree_l1,.o_selection_tree li>div>div.checkbox.o_tree_l1,.o_selection_tree li>div>div.radio.o_tree_l1{display:block;padding:10px 2px 10px 25px;z-index:9}.o_selection_tree li>div>span.o_tree_l2,.o_selection_tree li>div>div.checkbox.o_tree_l2,.o_selection_tree li>div>div.radio.o_tree_l2{display:block;padding:10px 2px 10px 40px;z-index:9}.o_selection_tree li>div>span.o_tree_l3,.o_selection_tree li>div>div.checkbox.o_tree_l3,.o_selection_tree li>div>div.radio.o_tree_l3{display:block;padding:10px 2px 10px 55px;z-index:9}.o_selection_tree li>div>span.o_tree_l4,.o_selection_tree li>div>div.checkbox.o_tree_l4,.o_selection_tree li>div>div.radio.o_tree_l4{display:block;padding:10px 2px 10px 70px;z-index:9}.o_selection_tree li>div>span.o_tree_l5,.o_selection_tree li>div>div.checkbox.o_tree_l5,.o_selection_tree li>div>div.radio.o_tree_l5{display:block;padding:10px 2px 10px 85px;z-index:9}.o_selection_tree li>div>span.o_tree_l6,.o_selection_tree li>div>div.checkbox.o_tree_l6,.o_selection_tree li>div>div.radio.o_tree_l6{display:block;padding:10px 2px 10px 100px;z-index:9}.o_selection_tree li>div>span.o_tree_l7,.o_selection_tree li>div>div.checkbox.o_tree_l7,.o_selection_tree li>div>div.radio.o_tree_l7{display:block;padding:10px 2px 10px 115px;z-index:9}.o_selection_tree li>div>span.o_tree_l8,.o_selection_tree li>div>div.checkbox.o_tree_l8,.o_selection_tree li>div>div.radio.o_tree_l8{display:block;padding:10px 2px 10px 130px;z-index:9}.o_selection_tree li>div>span.o_tree_l9,.o_selection_tree li>div>div.checkbox.o_tree_l9,.o_selection_tree li>div>div.radio.o_tree_l9{display:block;padding:10px 2px 10px 145px;z-index:9}.o_selection_tree li>div>span.o_tree_l10,.o_selection_tree li>div>div.checkbox.o_tree_l10,.o_selection_tree li>div>div.radio.o_tree_l10{display:block;padding:10px 2px 10px 160px;z-index:9}.o_selection_tree li>div>span.o_tree_l11,.o_selection_tree li>div>div.checkbox.o_tree_l11,.o_selection_tree li>div>div.radio.o_tree_l11{display:block;padding:10px 2px 10px 175px;z-index:9}.o_breadcrumb{position:relative}.o_breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_breadcrumb .o_breadcrumb_close a span{display:none}.o_breadcrumb .o_breadcrumb_close:before{content:none}.o_form .o_icon_mandatory{margin-right:0.25em}.o_form .o_form_chelp{padding-left:0.25em;margin-right:-1.25em}.o_form .o_form_example{font-size:90%}.o_form .o_error{margin-top:1px;margin-bottom:0;padding:10px}.o_form hr.o_spacer_noline{border-top:1px solid transparent}.o_form hr.o_spacer.form,.o_form hr.o_spacer_noline.form{margin-top:0px;margin-bottom:0px}.o_form .form-group.o_omit_margin{margin-bottom:0}.o_form .o_date{position:relative;padding-right:34px}.o_form .o_date.form-inline .form-group,.o_form .o_date.o_navbar-form .form-group{margin-left:0}.o_form input.o_date_ms{width:3em}.o_form .o_date.form-inline .o_date_ms.form-group,.o_form .o_date.o_navbar-form .o_date_ms.form-group{margin-left:25px}.o_form .has-feedback .o_date.form-inline .form-control.o_date_ms,.o_form .has-feedback .o_date.o_navbar-form .form-control.o_date_ms{padding-right:0}.o_form .o_form_element.form-inline .o_form_element.form-group,.o_form .o_form_element.o_navbar-form .o_form_element.form-group{margin-left:25px}.o_form .input-group.o_date_picker{width:16em}.o_form .o_filepreview{margin-bottom:10px}.o_form .o_fileinput{cursor:pointer;position:relative}.o_form .o_fileinput .o_fakechooser{position:relative;z-index:1}.o_form .o_fileinput .o_realchooser{position:absolute;top:0;right:0;z-index:2;opacity:0;filter:alpha(opacity=0)}.o_form .o_fileinput .o_realchooser.o_chooser_with_delete{right:38px}.o_centered_form{text-align:center}.o_centered_form fieldset.o_form{display:inline-block;text-align:left}.o_choice_checkrow,.o_choice_textrow{vertical-align:text-top;padding-bottom:2px}.o_choice_textrow{padding-left:1em}.o_togglecheck a{white-space:nowrap}.o_catalog .o_catalog_delete_img{position:relative;top:-0.5em}.o_button_dirty{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_button_dirty:hover,.o_button_dirty:focus,.o_button_dirty.focus,.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_button_dirty:active,.o_button_dirty.active,.open>.o_button_dirty.dropdown-toggle{background-image:none}.o_button_dirty.disabled,.o_button_dirty.disabled:hover,.o_button_dirty.disabled:focus,.o_button_dirty.disabled.focus,.o_button_dirty.disabled:active,.o_button_dirty.disabled.active,.o_button_dirty[disabled],.o_button_dirty[disabled]:hover,.o_button_dirty[disabled]:focus,.o_button_dirty[disabled].focus,.o_button_dirty[disabled]:active,.o_button_dirty[disabled].active,fieldset[disabled] .o_button_dirty,fieldset[disabled] .o_button_dirty:hover,fieldset[disabled] .o_button_dirty:focus,fieldset[disabled] .o_button_dirty.focus,fieldset[disabled] .o_button_dirty:active,fieldset[disabled] .o_button_dirty.active{background-color:#f0ad4e;border-color:#eea236}.o_button_dirty .badge{color:#f0ad4e;background-color:#fff}.o_button_toggle{border:1px solid #777;border-top-right-radius:9px;border-top-left-radius:9px;border-bottom-right-radius:9px;border-bottom-left-radius:9px;background:#eee;display:inline-block;height:18px;line-height:16px;font-size:16px;text-align:left;padding:0 0.5em 0 0;margin:0}.o_button_toggle i{color:#777;text-shadow:1px 0 2px rgba(0,0,0,0.25)}.o_button_toggle span{line-height:16px;vertical-align:top;font-size:60%;color:#777;text-transform:uppercase}.o_button_toggle.o_on{text-align:right;padding:0 0 0 0.5em}.o_button_toggle.o_on i{color:#337ab7;text-shadow:-1px 0 2px rgba(0,0,0,0.25)}.o_table_wrapper{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_table_wrapper.o_table_flexi .o_table_body{margin-top:20px}.o_table_wrapper.o_table_flexi .table{margin-top:20px}.o_table_wrapper.o_table_flexi .table td ul{margin:0}.o_table_wrapper.o_table_edit table tbody{border-top:solid #f90 4px;background-color:#fefbf6}.o_table_wrapper .o_table_search{max-width:50em}.o_table_wrapper .o_table_footer .o_table_pagination{text-align:center}.o_table_wrapper .o_table_rows_infos{float:left;padding-left:0;padding-right:20px;margin:20px 0}.o_table_wrapper .o_row_selected td{background-color:#dff0d8 !important}.o_table_wrapper .o_table{margin-bottom:0}.o_table_wrapper .o_marked{font-weight:bold}.o_table_wrapper .table{margin-bottom:0}.o_table_wrapper th{color:#333}@media (max-width: 767px){.o_table_wrapper .o_table_rows_infos{clear:both}}a.o_orderby,a.o_orderby:hover{color:#333;text-decoration:none}a.o_orderby.o_orderby_asc,a.o_orderby.o_orderby_desc,a.o_orderby:hover.o_orderby_asc,a.o_orderby:hover.o_orderby_desc{border-bottom:1px solid #ddd}.o_table_row_count{padding-top:6px;padding-bottom:6px;vertical-align:middle}.o_table_row_details td{background-color:white !important}.o_table_config{font-size:12px}.o_table_buttons{text-align:center}.o_table_buttons input{margin-right:1em}.o_table_buttons input:last-child{margin-right:0}.o_table_tools{margin-left:6px}.o_table_tools_indications{margin-left:10px;padding-top:3px;font-size:66%}.o_table_count{max-width:20em;float:left;padding:0 15px}.o_info .table-bordered td,o_note .table-bordered td,o_important .table-bordered td,o_warning .table-bordered td,o_error .table-bordered td{border-color:#333}.panel .o_table_layout{border-top:1px solid #ddd;padding-top:6px}.panel .o_table_count{padding:0 15px}#o_navbar_imclient .o_im_messages{float:left}#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary{float:left;position:relative;padding:15px 3px}#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_message{padding-left:15px}#o_navbar_imclient #o_im_summary .badge{color:#fff;background-color:#777}#o_navbar_imclient #o_im_status li>a>span{display:inline}#o_navbar_imclient #o_im_status div.o_chelp_wrapper{right:0.5em}#o_navbar_imclient #o_im_message a:hover,#o_navbar_imclient #o_im_message a:focus{text-decoration:none}#o_navbar_imclient #o_im_message .o_icon_message{color:#d9534f}#o_navbar_imclient #o_im_message .o_icon_message:hover{color:#f4c37d}.o_im_load_history{margin-bottom:6px}.o_im_load_history .o_label{font-size:12px;padding-right:0.5em;line-height:1.5em;color:#777}.o_im_chat_history{height:170px;font-size:90%;border:1px solid #eee;margin:0 0 1em 0;overflow:scroll;overflow-x:auto}.o_im_message_group{padding:3px 3px 3px 40px;min-height:40px;position:relative;border-top:1px solid #eee;background:#fff}.o_im_message_group.o_odd{background:#F4F4F4}.o_im_message_group .o_portrait{position:absolute;top:3px;left:3px}.o_im_message_group .o_im_from{color:#777;font-size:12px;font-weight:bold}.o_im_message_group .o_im_from:hover{color:#5e5e5e}.o_im_message_group div.o_im_body{padding:3px 0 3px 0;font-size:12px}.o_im_message_group div.o_im_body .o_date{float:right;color:#777;font-size:9px}.o_groupchat_roster{font-size:12px}.o_groupchat_roster li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#333}.o_groupchat_roster li.o_vip{color:#3c763d}.o_groupchat_roster li.o_anonymous{color:#31708f}.o_im_buddieslist .o_im_buddieslist_toggler .btn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_im_buddieslist ul{font-size:12px}.o_im_buddieslist ul ul{padding-left:1em}.o_im_buddieslist ul a{color:#337ab7}.o_im_buddieslist ul a:hover{color:#23527c}.o_flag{position:relative;top:1px;display:inline-block;line-height:1;width:16px;height:16px;background-repeat:no-repeat;background-position:0 100%}option.o_with_flag{padding-left:23px;min-height:16px;background-repeat:no-repeat;background-position:2px 50%}.o_flag_en{background-image:url("../light/images/flags/gb.png")}.o_flag_de{background-image:url("../light/images/flags/de.png")}.o_flag_fr{background-image:url("../light/images/flags/fr.png")}.o_flag_it{background-image:url("../light/images/flags/it.png")}.o_flag_es{background-image:url("../light/images/flags/es.png")}.o_flag_da{background-image:url("../light/images/flags/dk.png")}.o_flag_cs{background-image:url("../light/images/flags/cz.png")}.o_flag_el{background-image:url("../light/images/flags/gr.png")}.o_flag_ee{background-image:url("../light/images/flags/ee.png")}.o_flag_ru{background-image:url("../light/images/flags/ru.png")}.o_flag_pl{background-image:url("../light/images/flags/pl.png")}.o_flag_zh_CN{background-image:url("../light/images/flags/cn.png")}.o_flag_zh_TW{background-image:url("../light/images/flags/tw.png")}.o_flag_lt{background-image:url("../light/images/flags/lt.png")}.o_flag_fa{background-image:url("../light/images/flags/ir.png")}.o_flag_pt_PT{background-image:url("../light/images/flags/pt.png")}.o_flag_pt_BR{background-image:url("../light/images/flags/br.png")}.o_flag_tr{background-image:url("../light/images/flags/tr.png")}.o_flag_hu{background-image:url("../light/images/flags/hu.png")}.o_flag_sq{background-image:url("../light/images/flags/al.png")}.o_flag_in{background-image:url("../light/images/flags/id.png")}.o_flag_ar{background-image:url("../light/images/flags/eg.png")}.o_flag_rm{background-image:url("../light/images/flags/rm.png")}.o_flag_af{background-image:url("../light/images/flags/za.png")}.o_flag_vi{background-image:url("../light/images/flags/vn.png")}.o_flag_mn{background-image:url("../light/images/flags/mn.png")}.o_flag_iw{background-image:url("../light/images/flags/il.png")}.o_flag_ko{background-image:url("../light/images/flags/kr.png")}.o_flag_nl_NL{background-image:url("../light/images/flags/nl.png")}.o_flag_jp{background-image:url("../light/images/flags/jp.png")}.o_flag_nb_NO{background-image:url("../light/images/flags/no.png")}.o_flag_et_EE{background-image:url("../light/images/flags/ee.png")}.o_flag_bg{background-image:url("../light/images/flags/bg.png")}.o_flag_hi_IN_ASIA{background-image:url("../light/images/flags/in.png")}.o_flag_ar_LB{background-image:url("../light/images/flags/lb.png")}.o_flag_gl_ES{background-image:url("../light/images/flags/galicia.png")}.o_flag_sk{background-image:url("../light/images/flags/sk.png")}.o_rating .o_rating_title{font-size:12px}.o_rating .o_rating_items{white-space:nowrap}.o_rating .o_rating_items .o_icon{color:#f0ad4e}.o_rating .o_rating_items .o_icon:hover{color:#337ab7}.o_rating .o_rating_items .o_legend{margin-left:1em;font-size:12px;line-height:normal}.o_rating .o_rating_explanation{font-size:12px;color:#777}@media (max-width: 991px){.o_rating .o_rating_title,.o_rating .o_rating_explanation{display:none}}.o_comments .o_comment_wrapper .o_avatar{float:left;margin:0 1em 0 0}.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{float:right}.o_comments .o_comment_wrapper .o_comment_wrapper{margin-left:16px}.o_ratings_and_comments .o_rating_wrapper{vertical-align:middle;display:inline-block}.o_ratings_and_comments a.o_comments{margin-left:10px;position:relative;top:0.1em}.d3chart .bar{shape-rendering:crispEdges}.d3chart .bar_default_light{fill:#64a0d3}.d3chart .bar_default{fill:#337ab7}.d3chart .bar_default_dark{fill:#23527c}.d3chart .axis{font:12px sans-serif}.d3chart .axis path,.d3chart .axis line{fill:none;stroke:#000;shape-rendering:crispEdges}.o_forum_peekview .o_quote_wrapper,.o_forum_peekview .b_quote_wrapper{display:none}.o_forum_thread_sticky{font-weight:bold}.o_forum_switch{font-size:12px}.o_forum_toolbar{margin-bottom:6px;float:left}.o_forum_fulltextsearch{float:right}@media (max-width: 767px){.o_forum_fulltextsearch{float:left}.o_forum_toolbar .o_forum_tool span{display:none}}.o_forum .o_mark,.o_forum .o_ep_collect{float:right;position:relative;width:2em;margin-left:12px}.o_forum .o_portrait{float:left;margin-right:16px}.o_forum .o_portrait_avatar{width:70px;height:70px}.o_forum .o_newindicator{font-size:10px;color:#5cb85c;text-transform:uppercase;padding-left:1em;vertical-align:text-top;white-space:nowrap}.o_forum .o_author,.o_forum .o_date{display:inline-block;color:#777}.o_forum .o_date{font-size:12px}.o_forum .o_modified{color:#8a6d3b;font-size:12px;font-style:italic}.o_forum .o_forum_message{margin-bottom:20px;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_forum .o_forum_message_new{-webkit-box-shadow:0 1px 10px rgba(92,184,92,0.3);box-shadow:0 1px 10px rgba(92,184,92,0.3)}.o_forum .o_forum_message_highlight{-webkit-box-shadow:0 1px 10px rgba(240,173,78,0.5);box-shadow:0 1px 10px rgba(240,173,78,0.5)}.o_forum .o_forum_message_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:3px;border-top-left-radius:3px}.o_forum .o_forum_message_title{margin-top:0}.o_forum .o_forum_message_body{padding:10px 15px}.o_forum .o_forum_message_attachments{border-top:1px solid #ddd;padding:10px 15px;font-size:12px;background-color:#f7f7f9}.o_forum .o_attachment{position:relative;max-width:250px;vertical-align:top;margin:6px 12px 10px 0}.o_forum .o_attachment img{margin-top:6px}.o_forum .o_filename{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_forum .o_icon_enlarge{position:absolute;left:1em;bottom:1em;text-shadow:1px 1px 2px #fff, -1px 1px 2px #fff, 1px -1px 2px #fff, -1px -1px 2px #fff}@media (min-width: 768px) and (max-width: 991px){.o_forum .o_attachments{font-size:10px}.o_forum .o_attachment{max-width:200px}.o_forum .o_attachment img{max-width:150px}.o_forum .o_filename{max-width:200px}}@media (max-width: 767px){.o_forum .o_attachments{font-size:9px}.o_forum .o_attachment{max-width:150px}.o_forum .o_attachment img{max-width:100px}.o_forum .o_filename{max-width:150px}}.o_quote_wrapper,.b_quote_wrapper{position:relative;margin:10px 0}.o_quote_author,.b_quote_author{color:#777;font-size:12px}.o_quote_author:before,.b_quote_author:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"ï„Ž";font-size:21px;padding-right:0.5em}blockquote.o_quote,blockquote.b_quote{color:#555;font-size:12px;margin-top:6px;padding:0 12px}a.o_chelp{display:inline-block;padding:1px 3px;text-align:center;vertical-align:middle;white-space:nowrap;font-size:10px;font-weight:normal;line-height:15px;color:#fff;background-color:#337ab7;border:1px solid #2e6da4;border-radius:2px;cursor:help;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}a.o_chelp:active,a.o_chelp:hover,a.o_chelp:focus{text-decoration:none;color:#fff;background-color:#2a6598;border-color:#204d74}a.o_chelp i{font-size:10px !important}.o_chelp_wrapper{position:relative;float:right;display:inline-block;line-height:normal;margin-bottom:10px;margin-left:10px}.o_form_chelp,.o_chelp_tooltip{color:#737373}.o_iframedisplay iframe{width:100%}.o_singlepage .o_edit{position:absolute;top:10px;right:37px}.o_content_popup{position:absolute;top:10px;right:12px}.o_module_cp_wrapper .o_tools{position:absolute;top:10px;right:12px;text-align:right;vertical-align:middle}.o_module_cp_wrapper .o_tools .o_search_wrapper{display:inline-block;position:relative;top:-2px}ul.o_dropdown{margin:-5px -14px}ul.o_dropdown .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}ul.o_dropdown>li>a{display:block;padding:5px 14px;clear:both;font-weight:normal;line-height:1.42857;color:#333;background:#fff;white-space:nowrap}ul.o_dropdown>li>a:hover,ul.o_dropdown>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.badge.o_scorm_completed{background-color:#3c763d}.badge.o_scorm_failed{background-color:#a94442}.badge.o_scorm_incomplete{background-color:#8a6d3b}.badge.o_scorm_not_attempted{background:none}.o_bc_meta h5,.o_bc_meta .o_author,.o_bc_meta .o_comment,.tooltip h5,.tooltip .o_author,.tooltip .o_comment{color:#fff;margin:5px 0}.o_bc_meta .o_thumbnail,.tooltip .o_thumbnail{width:200px;height:200px;background-color:#fff;margin:0 -5px}.o_htmleditor .o_metadata{border:1px solid #999;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom:0;background:#eee;position:relative;top:1px;padding:5px}.o_htmleditor .o_metadata #o_filename{float:left}.o_htmleditor .o_metadata .o_lastmodified{float:right;color:#777;line-height:1.42857}.o_htmleditor #o_save{margin-top:10px;text-align:center}.o_htmleditor #o_save input{margin-right:1em}.o_htmleditor #o_save input:last-child{margin-right:0}.o_notifications_news_wrapper .o_notifications_news_subscription{margin:10px 0}.o_notifications_news_wrapper .o_notifications_news_subscription h4 i,.o_notifications_news_wrapper .o_notifications_news_subscription .o_cal .fc-header-title h2 i,.o_cal .fc-header-title .o_notifications_news_wrapper .o_notifications_news_subscription h2 i{display:none}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_context{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content{margin-left:1.5em;position:relative}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_icon{position:absolute;left:-1.5em;line-height:1.5em;top:0}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_content .o_date{color:#777}.o_notifications_news_wrapper .o_notifications_news_subscription .o_notifications_news_url{margin-left:1.5em}.o_noti{margin:6px 0 6px 12px;float:right;color:#777}.o_noti .o_label{color:#777;cursor:help}@media (max-width: 767px){.o_noti .o_label span{display:none}}.panel-body .o_noti{margin:0}.o_portrait{display:inline-block}.o_portrait img{border-radius:50%;border:none;background-color:#eee;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.o_portrait_name{margin-top:6px}.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start,.o_repo_details .o_book{margin:2em 0}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0}.o_cmembers .o_cmember .o_portrait{margin-right:10px}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{line-height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:"ï„"}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.onyx_iframe{width:100%;height:100%;border:none;min-height:60em}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:"ï‚¡"}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_userbulk_changedcell{font-style:italic;font-weight:bold}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#010101;border-color:#000}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#1a1a1a;background-color:#fff}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_ratings_and_comments .o_rating_title,.o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_members_pagination{text-align:center}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"ï€" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"ï¡";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"ï ";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"ï™";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}body.o_dmz{background:white !important}.progress{-webkit-print-color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px} /*# sourceMappingURL=theme.css.map */ diff --git a/src/main/webapp/static/themes/light/theme.css.map b/src/main/webapp/static/themes/light/theme.css.map index 5d49e652be2..a6d5b543d02 100644 --- a/src/main/webapp/static/themes/light/theme.css.map +++ b/src/main/webapp/static/themes/light/theme.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "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", +"mappings": "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", "sources": ["../../bootstrap/stylesheets/bootstrap/_normalize.scss","../../bootstrap/stylesheets/bootstrap/_print.scss","../../bootstrap/stylesheets/bootstrap/_scaffolding.scss","../../bootstrap/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","_config.scss","../../bootstrap/stylesheets/bootstrap/_variables.scss","../../bootstrap/stylesheets/bootstrap/mixins/_tab-focus.scss","../../bootstrap/stylesheets/bootstrap/mixins/_image.scss","../../bootstrap/stylesheets/bootstrap/_type.scss","../../bootstrap/stylesheets/bootstrap/mixins/_text-emphasis.scss","../../bootstrap/stylesheets/bootstrap/mixins/_background-variant.scss","../../bootstrap/stylesheets/bootstrap/mixins/_clearfix.scss","../../bootstrap/stylesheets/bootstrap/mixins/_text-overflow.scss","../../bootstrap/stylesheets/bootstrap/_code.scss","../../bootstrap/stylesheets/bootstrap/_grid.scss","../../bootstrap/stylesheets/bootstrap/mixins/_grid.scss","../../bootstrap/stylesheets/bootstrap/mixins/_grid-framework.scss","../../bootstrap/stylesheets/bootstrap/_tables.scss","../../bootstrap/stylesheets/bootstrap/mixins/_table-row.scss","../../bootstrap/stylesheets/bootstrap/_forms.scss","../../bootstrap/stylesheets/bootstrap/mixins/_forms.scss","../../bootstrap/stylesheets/bootstrap/_buttons.scss","../../bootstrap/stylesheets/bootstrap/mixins/_buttons.scss","../../bootstrap/stylesheets/bootstrap/mixins/_opacity.scss","../../bootstrap/stylesheets/bootstrap/_component-animations.scss","../../bootstrap/stylesheets/bootstrap/_dropdowns.scss","../../bootstrap/stylesheets/bootstrap/mixins/_nav-divider.scss","../../bootstrap/stylesheets/bootstrap/mixins/_reset-filter.scss","../../bootstrap/stylesheets/bootstrap/_button-groups.scss","../../bootstrap/stylesheets/bootstrap/mixins/_border-radius.scss","../../bootstrap/stylesheets/bootstrap/_input-groups.scss","../../bootstrap/stylesheets/bootstrap/_navs.scss","../../bootstrap/stylesheets/bootstrap/_navbar.scss","../../bootstrap/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../../bootstrap/stylesheets/bootstrap/_breadcrumbs.scss","../../bootstrap/stylesheets/bootstrap/_pagination.scss","../../bootstrap/stylesheets/bootstrap/mixins/_pagination.scss","../../bootstrap/stylesheets/bootstrap/_pager.scss","../../bootstrap/stylesheets/bootstrap/_labels.scss","../../bootstrap/stylesheets/bootstrap/mixins/_labels.scss","../../bootstrap/stylesheets/bootstrap/_badges.scss","../../bootstrap/stylesheets/bootstrap/_jumbotron.scss","../../bootstrap/stylesheets/bootstrap/_thumbnails.scss","../../bootstrap/stylesheets/bootstrap/_alerts.scss","../../bootstrap/stylesheets/bootstrap/mixins/_alerts.scss","../../bootstrap/stylesheets/bootstrap/_progress-bars.scss","../../bootstrap/stylesheets/bootstrap/mixins/_gradients.scss","../../bootstrap/stylesheets/bootstrap/mixins/_progress-bar.scss","../../bootstrap/stylesheets/bootstrap/_media.scss","../../bootstrap/stylesheets/bootstrap/_list-group.scss","../../bootstrap/stylesheets/bootstrap/mixins/_list-group.scss","../../bootstrap/stylesheets/bootstrap/_panels.scss","../../bootstrap/stylesheets/bootstrap/mixins/_panels.scss","../../bootstrap/stylesheets/bootstrap/_responsive-embed.scss","../../bootstrap/stylesheets/bootstrap/_wells.scss","../../bootstrap/stylesheets/bootstrap/_close.scss","../../bootstrap/stylesheets/bootstrap/_modals.scss","../../bootstrap/stylesheets/bootstrap/_tooltip.scss","../../bootstrap/stylesheets/bootstrap/_popovers.scss","../../bootstrap/stylesheets/bootstrap/_utilities.scss","../../bootstrap/stylesheets/bootstrap/mixins/_center-block.scss","../../bootstrap/stylesheets/bootstrap/mixins/_hide-text.scss","../../bootstrap/stylesheets/bootstrap/_responsive-utilities.scss","../../bootstrap/stylesheets/bootstrap/mixins/_responsive-visibility.scss","modules/_bootstrap.scss","modules/_fonts.scss","../../font-awesome/scss/_path.scss","../../font-awesome/scss/_core.scss","../../font-awesome/scss/_larger.scss","../../font-awesome/scss/_fixed-width.scss","../../font-awesome/scss/_list.scss","../../font-awesome/scss/_variables.scss","../../font-awesome/scss/_bordered-pulled.scss","../../font-awesome/scss/_animated.scss","../../font-awesome/scss/_rotated-flipped.scss","../../font-awesome/scss/_mixins.scss","../../font-awesome/scss/_stacked.scss","modules/_icons.scss","modules/_emoticons.scss","modules/_helpers.scss","modules/_type.scss","modules/_content_embedded.scss","modules/_mixins.scss","modules/_layout.scss","modules/_main.scss","modules/_footer.scss","modules/_navbar.scss","modules/_toolbar.scss","modules/_offcanvas.scss","modules/_dialog.scss","modules/_tree.scss","modules/_breadcrumb.scss","modules/_form.scss","modules/_table.scss","modules/_im.scss","modules/_flags.scss","modules/_rating_and_comments.scss","modules/_chart.scss","modules/_forum.scss","modules/_various_modules.scss","modules/_autocomplete.scss","modules/_search.scss","modules/_wizard.scss","modules/_process.scss","modules/_cal.scss","modules/_coursesite.scss","modules/_repository.scss","modules/_course.scss","modules/_qti.scss","modules/_devel.scss","modules/_wiki.scss","modules/_portfolio.scss","modules/_portfoliomaps/_epmst_default.scss","modules/_portfoliomaps/_mixins.scss","modules/_portfoliomaps/_epmst_comic.scss","modules/_portfoliomaps/_epmst_leather.scss","modules/_portfoliomaps/_epmst_green.scss","modules/_portfoliomaps/_epmst_green2.scss","modules/_portfoliomaps/_epmst_green3.scss","modules/_portfoliomaps/_epmst_green4.scss","modules/_portfoliomaps/_epmst_red.scss","modules/_portfoliomaps/_epmst_red2.scss","modules/_portfoliomaps/_epmst_red3.scss","modules/_portfoliomaps/_epmst_red4.scss","modules/_portfoliomaps/_epmst_blue.scss","modules/_portfoliomaps/_epmst_blue2.scss","modules/_portfoliomaps/_epmst_blue3.scss","modules/_portfoliomaps/_epmst_blue4.scss","modules/_admin.scss","modules/_dmz.scss","modules/_portal.scss","modules/_library.scss","modules/_translationtool.scss","modules/_user.scss","modules/_members.scss","modules/_thirdparty.scss","modules/_print.scss","_patches.scss"], "names": [], "file": "theme.css" diff --git a/src/main/webapp/static/themes/light/theme_ie_completions.css b/src/main/webapp/static/themes/light/theme_ie_completions.css index 8dbcf8e97af..8724a631907 100644 --- a/src/main/webapp/static/themes/light/theme_ie_completions.css +++ b/src/main/webapp/static/themes/light/theme_ie_completions.css @@ -1 +1 @@ -.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start,.o_repo_details .o_book{margin:2em 0}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0}.o_cmembers .o_cmember .o_portrait{margin-right:10px}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{line-height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:"ï„"}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.onyx_iframe{width:100%;height:100%;border:none;min-height:60em}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:"ï‚¡"}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_userbulk_changedcell{font-style:italic;font-weight:bold}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#010101;border-color:#000}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#1a1a1a;background-color:#fff}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_ratings_and_comments .o_rating_title,.o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_members_pagination{text-align:center}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"ï€" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"ï¡";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"ï ";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"ï™";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}body.o_dmz{background:white !important}.progress{-webkit-print-color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px} \ No newline at end of file +@media (max-width: 767px){.o_noti .o_label span{display:none}}.panel-body .o_noti{margin:0}.o_portrait{display:inline-block}.o_portrait img{border-radius:50%;border:none;background-color:#eee;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.o_portrait_name{margin-top:6px}.o_block_inline .o_portait,.o_block_inline .o_portrait_name,.o_block_inline .o_portrait_image,.o_block_inline_right .o_portait,.o_block_inline_right .o_portrait_name,.o_block_inline_right .o_portrait_image,.o_block_inline_left .o_portait,.o_block_inline_left .o_portrait_name,.o_block_inline_left .o_portrait_image,.o_block_inline_both .o_portait,.o_block_inline_both .o_portrait_name,.o_block_inline_both .o_portrait_image{display:inline-block}.o_portrait_avatar,.o_portrait_dummy,.o_portrait_dummy_female_big,.o_portrait_dummy_male_big,.o_portrait_anonymous{width:100px;height:100px}.o_portrait_dummy{background-image:url("../light/images/portrait/dummy.png")}.o_portrait_dummy_female_big{background-image:url("../light/images/portrait/dummy_female_big.png")}.o_portrait_dummy_male_big{background-image:url("../light/images/portrait/dummy_male_big.png")}.o_portrait_anonymous{background-image:url("../light/images/portrait/anonymous.png")}.o_portrait_avatar_small,.o_portrait_dummy_small,.o_portrait_dummy_female_small,.o_portrait_dummy_male_small,.o_portrait_anonymous_small{width:30px;height:30px}.o_portrait_dummy_small{background-image:url("../light/images/portrait/dummy_small.png")}.o_portrait_dummy_female_small{background-image:url("../light/images/portrait/dummy_female_small.png")}.o_portrait_dummy_male_small{background-image:url("../light/images/portrait/dummy_male_small.png")}.o_portrait_anonymous_small{background-image:url("../light/images/portrait/anonymous_small.png")}.o_datecomp{position:relative;width:40px;height:52px;border:1px solid #555;margin-right:12px;text-align:center;vertical-align:middle}.o_datecomp div.o_year{position:absolute;left:0;width:100%;top:-20px;height:20px;line-height:20px;font-size:10px}.o_datecomp div.o_month{height:20px;line-height:20px;font-size:12px;background-color:#337ab7;color:#fff}.o_datecomp div.o_day{height:30px;line-height:30px;font-size:18px;border-top:1px solid #555;background-color:#fff;color:#333}.o_block_with_datecomp .o_head{position:relative;padding-left:52px}.o_block_with_datecomp .o_datecomp{position:absolute;top:0.2em;left:0}.o_block_with_datecomp .o_title{margin-top:0}.o_block_with_datecomp .o_meta{color:#777}.o_block_with_datecomp .o_content{border-left:5px solid #eee;padding:0 20px}.o_block_with_datecomp .o_block_footer{padding-left:25px}ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.vitero_iframe{width:100%;height:100%;border:none;min-height:60em}.o_reminder_rule{padding:5px 0}.o_segments.btn-group a span{overflow:hidden;display:block;text-overflow:ellipsis}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}}.wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);position:absolute;left:-24px}.o_process .o_title a:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0);content:"";width:1em}.o_process .o_title a.collapsed:before{content:""}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{content:"";color:#337ab7}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{content:"";color:#5cb85c}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5D5D5D !important}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#FFF !important}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#FFF !important}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5D5D5D !important}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#FFF !important}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#FFF !important}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#FFF !important}.o_sel_calendar_print_chooser{padding-right:4em}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_config_color{display:block;width:16px;height:16px;border-radius:8px}.o_cal_colorchooser_selected:before{content:""}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:normal;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;font-size:90%;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em;overflow:hidden}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels{border:1px solid transparent}.o_catalog .o_sublevels_list .o_sublevel.o_fill_sublevels .o_meta{border-left:1px solid transparent}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}}.o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead .o_media.o_desc_empty{float:none;margin-left:0;margin-bottom:0}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start,.o_repo_details .o_book{margin:2em 0}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}}.o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0}.o_cmembers .o_cmember .o_portrait{margin-right:10px}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{line-height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:"ï„"}.o_qti_menu_item_attempts_marked:after{content:"";color:#337ab7}.onyx_iframe{width:100%;height:100%;border:none;min-height:60em}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}.o_ep_icon_map:before{content:""}.o_ep_icon_collection:before{content:""}.o_ep_icon_page:before{content:""}.o_ep_icon_struct:before{content:""}.o_ep_icon_liveblog:before{content:"ï‚¡"}.o_artefact_closed:before{content:""}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ECF69A;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99E44D;background:#99E44D -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99E44D), to(#CBF1A5));background:#99E44D -moz-linear-gradient(43% 71% 101deg, #CBF1A5, #99E44D);background:#99E44D -o-linear-gradient(#99E44D, #CBF1A5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99E44D', EndColorStr='#CBF1A5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#DFF0C1;background:#DFF0C1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DFF0C1), to(#A0D346));background:#DFF0C1 -moz-linear-gradient(43% 71% 101deg, #A0D346, #DFF0C1);background:#DFF0C1 -o-linear-gradient(#DFF0C1, #A0D346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DFF0C1', EndColorStr='#A0D346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#D7DBB5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#FFBA71;background:#FFBA71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFBA71), to(#FFBA99));background:#FFBA71 -moz-linear-gradient(43% 71% 101deg, #FFBA99, #FFBA71);background:#FFBA71 -o-linear-gradient(#FFBA71, #FFBA99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFBA71', EndColorStr='#FFBA99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#FF9772;background:#FF9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FF9772), to(#FF9780));background:#FF9772 -moz-linear-gradient(43% 71% 101deg, #FF9780, #FF9772);background:#FF9772 -o-linear-gradient(#FF9772, #FF9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FF9772', EndColorStr='#FF9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#E8AFBB;background:#E8AFBB -webkit-gradient(linear, 37% 20%, 53% 100%, from(#E8AFBB), to(#E8AFA0));background:#E8AFBB -moz-linear-gradient(43% 71% 101deg, #E8AFA0, #E8AFBB);background:#E8AFBB -o-linear-gradient(#E8AFBB, #E8AFA0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#E8AFBB', EndColorStr='#E8AFA0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#FFA800;background:#FFA800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#FFA800), to(#FFAF00));background:#FFA800 -moz-linear-gradient(43% 71% 101deg, #FFAF00, #FFA800);background:#FFA800 -o-linear-gradient(#FFA800, #FFAF00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#FFA800', EndColorStr='#FFAF00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00D2F8;background:#00D2F8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00D2F8), to(#4A9EAD));background:#00D2F8 -moz-linear-gradient(43% 71% 101deg, #4A9EAD, #00D2F8);background:#00D2F8 -o-linear-gradient(#00D2F8, #4A9EAD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00D2F8', EndColorStr='#4A9EAD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#C4F6FF;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#B3E2F7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#DEE7F7;background:#DEE7F7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#DEE7F7), to(#C1E9FD));background:#DEE7F7 -moz-linear-gradient(43% 71% 101deg, #C1E9FD, #DEE7F7);background:#DEE7F7 -o-linear-gradient(#DEE7F7, #C1E9FD);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#DEE7F7', EndColorStr='#C1E9FD');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_userbulk_changedcell{font-style:italic;font-weight:bold}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background-size:cover;background-position:center center;background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=1 )}body.o_dmz #o_bg:after{content:" ";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%);background-size:cover;background-position:center center;background-repeat:no-repeat}body.o_dmz #o_toplink{display:none}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#010101;border-color:#000}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#1a1a1a;background-color:#fff}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:""}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_ratings_and_comments .o_rating_title,.o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_members_pagination{text-align:center}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"ï€" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"ï¡";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"ï ";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}i.mce-ico.mce-i-media,i.mce-ico.mce-i-movie,i.mce-ico.mce-i-help{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}i.mce-ico.mce-i-media:before{content:""}i.mce-ico.mce-i-movie:before{content:""}i.mce-ico.mce-i-help{width:9px;height:9px;padding-top:1px}i.mce-ico.mce-i-help:before{content:"ï™";color:white}.mce-tabs span.o_chelp_wrapper{float:right;margin:5px}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}body.o_dmz{background:white !important}.progress{-webkit-print-color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px} \ No newline at end of file diff --git a/src/test/java/org/olat/modules/fo/ForumManagerTest.java b/src/test/java/org/olat/modules/fo/ForumManagerTest.java index de98ba2a21d..fc2eaed4454 100644 --- a/src/test/java/org/olat/modules/fo/ForumManagerTest.java +++ b/src/test/java/org/olat/modules/fo/ForumManagerTest.java @@ -26,160 +26,210 @@ package org.olat.modules.fo; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - import java.util.Calendar; import java.util.Date; -import java.util.Iterator; import java.util.List; -import org.junit.Before; +import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; +import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; +import org.olat.modules.fo.manager.ForumManager; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; import org.olat.user.UserManager; +import org.springframework.beans.factory.annotation.Autowired; /** + * + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * @author Felix Jost + * */ - public class ForumManagerTest extends OlatTestCase { - private static OLog log = Tracing.createLoggerFor(ForumManagerTest.class); - - public Identity u1; - public Identity u2; - public Identity u3; - public UserManager um1; - - public ForumManager fm1; - public Forum fo; - - private Message message1, m3; - - - /** - * SetUp is called before each test - */ - @Before public void setup(){ - // create some users with user manager - try{ - log.info("setUp start ------------------------"); - - um1 = UserManager.getInstance(); - //um1.resetSession(sess); - u1 = JunitTestHelper.createAndPersistIdentityAsUser("felix"); - u2 = JunitTestHelper.createAndPersistIdentityAsUser("migros"); - u3 = JunitTestHelper.createAndPersistIdentityAsUser("salat"); - - fm1 = ForumManager.getInstance(); - fo = fm1.addAForum(); - - message1 = new MessageImpl(); - message1.setTitle("stufe 0: subject 0"); - message1.setBody("body/n dep 0"); - - Message m2 = new MessageImpl(); - m2.setTitle("stufe 0: subject 1"); - m2.setBody("body 2 /n dep 0"); - - m3 = new MessageImpl(); - m3.setTitle("stufe 1: subject 2"); - m3.setBody("body 21 /n dep 1"); - - Message m4 = new MessageImpl(); - m4.setTitle("stufe 1: subject 3"); - m4.setBody("body 211 /n dep 2"); - - fm1.addTopMessage(u1, fo, message1); - fm1.addTopMessage(u2, fo, m2); - - fm1.replyToMessage(m3, u3, m2); - fm1.replyToMessage(m4, u1, m3); - - for (int i=0; i<10;i++) { - Message m = new MessageImpl(); - m.setTitle("Title" + i); - m.setBody("Body" + i); - fm1.replyToMessage(m,u1,m4); - } - log.info("setUp done ------------------------"); - } - catch(Exception e){ - log.error("Exception in setUp(): "+e); - } - } + @Autowired + private DB dbInstance; + @Autowired + public UserManager userManager; + @Autowired + public ForumManager forumManager; @Test - public void testGetMessagesByForumID() throws Exception { - log.debug("Start testGetMessagesByForumID()"); + public void testGetThread() { + Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-4"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message message = forumManager.createMessage(fo, id, false); + message.setTitle("stufe 0: subject 0"); + message.setBody("body/n dep 0"); + forumManager.addTopMessage(message); + dbInstance.commit(); + + Long messageTopThread = message.getKey(); + List<Message> threadMessageList = forumManager.getThread(messageTopThread); + Assert.assertEquals("Not the right number of messages for this forum", 1, threadMessageList.size()); - ForumManager foma = ForumManager.getInstance(); - long start = System.currentTimeMillis(); - Forum forum = foma.loadForum(fo.getKey()); - List<Message> messageList = foma.getMessagesByForum(forum); - long stop = System.currentTimeMillis(); - assertNotNull(messageList); - log.debug("time:"+(stop-start)); - Iterator<Message> it = messageList.iterator(); - while (it.hasNext()) { - Object o = it.next(); - log.debug("object:"+o); - Message msg = (Message)o; - log.debug("msg:"+msg.getTitle()); + // lookup for a none existing thread + List<Message> noneThreadMessageList = forumManager.getThread(1234l); + Assert.assertEquals("Not the right number of messages for this forum", 0, noneThreadMessageList.size()); + } + + @Test + public void testCreateAndGetMessages_loadForumID() throws Exception { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("stufe 0: subject 0"); + topMessage.setBody("body/n dep 0"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("stufe 0: subject 0"); + reply.setBody("body/n dep 0"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commitAndCloseSession(); + + //load the forum + Forum forum = forumManager.loadForum(fo.getKey()); + List<Message> messageList = forumManager.getMessagesByForum(forum); + Assert.assertNotNull(messageList); + for(Message msg: messageList) { + Assert.assertNotNull(msg); } - assertEquals("Not the right number of messages for this forum",14,messageList.size()); + + Assert.assertEquals("Not the right number of messages for this forum", 2, messageList.size()); } - @Test public void testCountMessagesByForumID() { - log.debug("Start testCountMessagesByForumID()"); - ForumManager foma = ForumManager.getInstance(); - assertEquals("Not the right number of messages for this forum",14,foma.countMessagesByForumID(fo.getKey()).intValue()); - } + @Test + public void testCountMessagesByForumID() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-1"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-2"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); - @Test public void testGetThread() { - log.debug("Start testGetThread()"); - ForumManager foma = ForumManager.getInstance(); - Long msgidTopThread = message1.getKey(); - List<Message> threadMessageList = foma.getThread(msgidTopThread); - log.debug("threadMessageList.size()=" + threadMessageList.size()); - assertEquals("Not the right number of messages for this forum",1,threadMessageList.size()); - // lookup for - Long notExistingTopThread = new Long(1234); - threadMessageList = foma.getThread(notExistingTopThread); - log.debug("threadMessageList.size()=" + threadMessageList.size()); - assertEquals("Not the right number of messages for this forum",0,threadMessageList.size()); - + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("stufe 0: subject 0"); + topMessage.setBody("body/n dep 0"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("stufe 1: subject 0"); + reply.setBody("body/n dep 0"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commit(); + + Message reply2 = forumManager.createMessage(fo, id1, false); + reply2.setTitle("stufe 1: subject 0"); + reply2.setBody("body/n dep 0"); + forumManager.replyToMessage(reply2, reply); + dbInstance.commit(); + + int numOfMessages = forumManager.countMessagesByForumID(fo.getKey()); + Assert.assertEquals("Not the right number of messages for this forum", 3, numOfMessages); } - @Test public void testGetNewMessageInfo() { - log.debug("Start testGetNewMessageInfo()"); - ForumManager foma = ForumManager.getInstance(); - + @Test + public void testGetNewMessageInfo() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-5"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-6"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("New message 1"); + topMessage.setBody("The newest stuff"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("New message 2"); + reply.setBody("The more newest stuff"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commit(); + sleep(1500);//we must ensure a lap of 1 second + + //check the newest messages, limit now Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); - List<Message> msgList = foma.getNewMessageInfo(fo.getKey(), cal.getTime()); - assertEquals(0, msgList.size()); + List<Message> newestMessages = forumManager.getNewMessageInfo(fo.getKey(), cal.getTime()); + Assert.assertEquals(0, newestMessages.size()); + + //check the newest messages, limit one hour in past cal.add(Calendar.HOUR_OF_DAY, - 1); - msgList = foma.getNewMessageInfo(fo.getKey(), cal.getTime()); - assertEquals(14, msgList.size()); + List<Message> olderLastMessages = forumManager.getNewMessageInfo(fo.getKey(), cal.getTime()); + Assert.assertEquals(2, olderLastMessages.size()); } - @Test public void testDeleteMessageTree() { - log.debug("Start testDeleteMessageTree()"); - ForumManager foma = ForumManager.getInstance(); - foma.deleteMessageTree(fo.getKey(), m3); // throws Exception when failed + @Test + public void testDeleteMessageTree() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-5"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-6"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("Future deleted message 1"); + topMessage.setBody("Future deleted stuff"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("Future deleted 2"); + reply.setBody("Future deleted stuff"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commit(); + + Message reply2 = forumManager.createMessage(fo, id1, false); + reply2.setTitle("Future deleted 3"); + reply2.setBody("Future deleted stuff"); + forumManager.replyToMessage(reply2, reply); + dbInstance.commit(); + + //delete a message + forumManager.deleteMessageTree(fo.getKey(), reply2); + dbInstance.commitAndCloseSession(); + + //delete a top message + forumManager.deleteMessageTree(fo.getKey(), topMessage); + dbInstance.commitAndCloseSession(); } - @Test public void testDeleteForum() { - log.debug("Start testDeleteForum()"); - ForumManager foma = ForumManager.getInstance(); - foma.deleteForum(fo.getKey()); // throws Exception when failed + @Ignore @Test + public void testDeleteForum() { + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-7"); + Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("fo-8"); + Forum fo = forumManager.addAForum(); + dbInstance.commit(); + + Message topMessage = forumManager.createMessage(fo, id1, false); + topMessage.setTitle("Future deleted forum part. 1"); + topMessage.setBody("Future deleted stuff"); + forumManager.addTopMessage(topMessage); + dbInstance.commit(); + + Message reply = forumManager.createMessage(fo, id2, false); + reply.setTitle("Future deleted forum part. 2"); + reply.setBody("Future deleted stuff"); + forumManager.replyToMessage(reply, topMessage); + dbInstance.commit(); + + Message reply2 = forumManager.createMessage(fo, id1, false); + reply2.setTitle("Future deleted forum part. 3"); + reply2.setBody("Future deleted stuff"); + forumManager.replyToMessage(reply2, reply); + dbInstance.commitAndCloseSession(); + + //delete the forum + forumManager.deleteForum(fo.getKey()); + dbInstance.commit(); } - } diff --git a/src/test/java/org/olat/restapi/ForumTest.java b/src/test/java/org/olat/restapi/ForumTest.java index 43dd7fcfa7e..33b4f7894aa 100644 --- a/src/test/java/org/olat/restapi/ForumTest.java +++ b/src/test/java/org/olat/restapi/ForumTest.java @@ -64,8 +64,8 @@ import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.fo.restapi.MessageVO; import org.olat.modules.fo.restapi.MessageVOes; import org.olat.modules.fo.restapi.ReplyVO; @@ -92,32 +92,32 @@ public class ForumTest extends OlatJerseyTestCase { forum = forumManager.addAForum(); - m1 = forumManager.createMessage(); + m1 = forumManager.createMessage(forum, id1, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - forumManager.addTopMessage(id1, forum, m1); + forumManager.addTopMessage(m1); - m2 = forumManager.createMessage(); + m2 = forumManager.createMessage(forum, id1, false); m2.setTitle("Thread-2"); m2.setBody("Body of Thread-2"); - forumManager.addTopMessage(id1, forum, m2); + forumManager.addTopMessage(m2); DBFactory.getInstance().intermediateCommit(); - m3 = forumManager.createMessage(); + m3 = forumManager.createMessage(forum, id1, false); m3.setTitle("Message-1.1"); m3.setBody("Body of Message-1.1"); - forumManager.replyToMessage(m3, id1, m1); + forumManager.replyToMessage(m3, m1); - m4 = forumManager.createMessage(); + m4 = forumManager.createMessage(forum, id1, false); m4.setTitle("Message-1.1.1"); m4.setBody("Body of Message-1.1.1"); - forumManager.replyToMessage(m4, id1, m3); + forumManager.replyToMessage(m4, m3); - m5 = forumManager.createMessage(); + m5 = forumManager.createMessage(forum, id1, false); m5.setTitle("Message-1.2"); m5.setBody("Body of Message-1.2"); - forumManager.replyToMessage(m5, id1, m1); + forumManager.replyToMessage(m5, m1); DBFactory.getInstance().intermediateCommit(); } diff --git a/src/test/java/org/olat/restapi/GroupMgmtTest.java b/src/test/java/org/olat/restapi/GroupMgmtTest.java index 4b47671f48a..ce875fff383 100644 --- a/src/test/java/org/olat/restapi/GroupMgmtTest.java +++ b/src/test/java/org/olat/restapi/GroupMgmtTest.java @@ -68,8 +68,8 @@ import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.manager.BusinessGroupRelationDAO; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.fo.restapi.MessageVO; import org.olat.properties.NarrowedPropertyManager; import org.olat.properties.Property; @@ -192,32 +192,32 @@ public class GroupMgmtTest extends OlatJerseyTestCase { ForumManager fm = ForumManager.getInstance(); Forum forum = fm.loadForum(forumKeyProperty.getLongValue()); - m1 = fm.createMessage(); + m1 = fm.createMessage(forum, owner1, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - fm.addTopMessage(owner1, forum, m1); + fm.addTopMessage(m1); - m2 = fm.createMessage(); + m2 = fm.createMessage(forum, owner2, false); m2.setTitle("Thread-2"); m2.setBody("Body of Thread-2"); - fm.addTopMessage(owner2, forum, m2); + fm.addTopMessage(m2); DBFactory.getInstance().intermediateCommit(); - m3 = fm.createMessage(); + m3 = fm.createMessage(forum, owner3, false); m3.setTitle("Message-1.1"); m3.setBody("Body of Message-1.1"); - fm.replyToMessage(m3, owner3, m1); + fm.replyToMessage(m3, m1); - m4 = fm.createMessage(); + m4 = fm.createMessage(forum, part1, false); m4.setTitle("Message-1.1.1"); m4.setBody("Body of Message-1.1.1"); - fm.replyToMessage(m4, part1, m3); + fm.replyToMessage(m4, m3); - m5 = fm.createMessage(); + m5 = fm.createMessage(forum, part2, false); m5.setTitle("Message-1.2"); m5.setBody("Body of Message-1.2"); - fm.replyToMessage(m5, part2, m1); + fm.replyToMessage(m5, m1); DBFactory.getInstance().intermediateCommit(); } diff --git a/src/test/java/org/olat/restapi/NotificationsTest.java b/src/test/java/org/olat/restapi/NotificationsTest.java index dfb507cc753..f098a5cc150 100644 --- a/src/test/java/org/olat/restapi/NotificationsTest.java +++ b/src/test/java/org/olat/restapi/NotificationsTest.java @@ -76,8 +76,8 @@ import org.olat.course.nodes.FOCourseNode; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.restapi.repository.course.CoursesWebService; @@ -461,10 +461,10 @@ public class NotificationsTest extends OlatJerseyTestCase { private Message createMessage(Identity id, Forum fo) { ForumManager fm = ForumManager.getInstance(); - Message m1 = fm.createMessage(); + Message m1 = fm.createMessage(fo, id, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - fm.addTopMessage(id, fo, m1); + fm.addTopMessage(m1); return m1; } diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java index 367ceb0b347..2efa7c59c72 100644 --- a/src/test/java/org/olat/restapi/UserMgmtTest.java +++ b/src/test/java/org/olat/restapi/UserMgmtTest.java @@ -90,8 +90,8 @@ import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.manager.BusinessGroupRelationDAO; import org.olat.modules.fo.Forum; -import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.Message; +import org.olat.modules.fo.manager.ForumManager; import org.olat.modules.fo.restapi.ForumVO; import org.olat.modules.fo.restapi.ForumVOes; import org.olat.modules.fo.restapi.MessageVOes; @@ -219,10 +219,10 @@ public class UserMgmtTest extends OlatJerseyTestCase { CollaborationTools g1CTSMngr = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(g1); g1CTSMngr.setToolEnabled(CollaborationTools.TOOL_FORUM, true); Forum g1Forum = g1CTSMngr.getForum();//create the forum - Message m1 = ForumManager.getInstance().createMessage(); + Message m1 = ForumManager.getInstance().createMessage(g1Forum, id1, false); m1.setTitle("Thread-1"); m1.setBody("Body of Thread-1"); - ForumManager.getInstance().addTopMessage(id1, g1Forum, m1); + ForumManager.getInstance().addTopMessage(m1); dbInstance.commitAndCloseSession(); @@ -255,10 +255,10 @@ public class UserMgmtTest extends OlatJerseyTestCase { if(demoForumNode == null) { demoForumNode = (FOCourseNode)node; Forum courseForum = demoForumNode.loadOrCreateForum(demoCourse.getCourseEnvironment()); - Message message1 = ForumManager.getInstance().createMessage(); + Message message1 = ForumManager.getInstance().createMessage(courseForum, id1, false); message1.setTitle("Thread-1"); message1.setBody("Body of Thread-1"); - ForumManager.getInstance().addTopMessage(id1, courseForum, message1); + ForumManager.getInstance().addTopMessage(message1); } } else if (node instanceof BCCourseNode) { if(demoBCCourseNode == null) { -- GitLab