diff --git a/src/main/java/org/olat/_spring/extensionContext.xml b/src/main/java/org/olat/_spring/extensionContext.xml index 90c43d7bff59150569ea0f46eb9486357c37f349..3597db88e10ccc45172dc7709ac8bf52b02f8ba8 100644 --- a/src/main/java/org/olat/_spring/extensionContext.xml +++ b/src/main/java/org/olat/_spring/extensionContext.xml @@ -419,7 +419,7 @@ </list> </property> <property name="parentTreeNodeIdentifier" value="sysconfigParent" /> - </bean> + </bean> <!-- the spring-extensions ("Software Module") menu-entry --> <bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints"> <property name="order" value="7207" /> diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties index 2b20323652112197331a395a9d5d271bf678559d..d69dd5b9bc6f3732eec3e77bb2ad50fb2a0674ea 100644 --- a/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_de.properties @@ -58,6 +58,8 @@ menu.errors=Errors menu.errors.alt=Errors and log level menu.hibernate=Database ORM menu.hibernate.alt=Database ORM / Hibernate +menu.landingpages=Startseite +menu.landingpages.alt=Startseite menu.layout=Darstellung menu.layout.alt=Darstellung systemweit \u00E4ndern menu.lock=Locks diff --git a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties index 35086f1af7288ddd00808e8d00dc4726778ba905..e86751bf48735d3365eb322ea3c7debe914afaae 100644 --- a/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/_i18n/LocalStrings_en.properties @@ -58,6 +58,8 @@ menu.javavm=Java VM Infos menu.javavm.alt=Java Virtual Machine informations menu.jmx=JMX menu.jmx.alt=View JMX values +menu.landingpages=Landing pages +menu.landingpages.alt=Landing pages menu.layout=Layout menu.layout.alt=Modify layout within the entire system menu.lock=Locks diff --git a/src/main/java/org/olat/admin/_spring/adminContext.xml b/src/main/java/org/olat/admin/_spring/adminContext.xml index 75ec4a3b3a78a9f8aca4c0b43bdf228a683732c8..1607a13e598e1a7fa5957c76144664b38c18a125 100644 --- a/src/main/java/org/olat/admin/_spring/adminContext.xml +++ b/src/main/java/org/olat/admin/_spring/adminContext.xml @@ -9,6 +9,7 @@ <import resource="classpath:/org/olat/admin/registration/_spring/registrationContext.xml"/> <import resource="classpath:/org/olat/admin/sysinfo/_spring/sysinfoContext.xml"/> <import resource="classpath:/org/olat/admin/user/delete/service/_spring/deletionContext.xml"/> + <import resource="classpath:/org/olat/admin/landingpages/_spring/landingPagesContext.xml"/> <bean id="adminModule" class="org.olat.admin.AdminModule"> <constructor-arg index="0" ref="propertyManager" /> @@ -56,5 +57,8 @@ </list> </property> </bean> + + + </beans> \ No newline at end of file diff --git a/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java b/src/main/java/org/olat/admin/landingpages/LandingPagesModule.java new file mode 100644 index 0000000000000000000000000000000000000000..06e851df1dbc8122ba8da69c399ef21597c125ea --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/LandingPagesModule.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.admin.landingpages; + +import java.util.ArrayList; + +import org.olat.admin.landingpages.model.Rule; +import org.olat.admin.landingpages.model.Rules; +import org.olat.core.configuration.AbstractOLATModule; +import org.olat.core.configuration.PersistedProperties; +import org.olat.core.util.StringHelper; +import org.olat.core.util.xml.XStreamHelper; + +import com.thoughtworks.xstream.XStream; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LandingPagesModule extends AbstractOLATModule { + private static final String CONFIG_RULES = "rules"; + private static final XStream rulesXStream; + static { + rulesXStream = XStreamHelper.createXStreamInstance(); + rulesXStream.alias("rules", Rules.class); + rulesXStream.alias("rule", Rule.class); + } + + private Rules rules; + + @Override + public void init() { + String rulesObj = getStringPropertyValue(CONFIG_RULES, true); + if(StringHelper.containsNonWhitespace(rulesObj)) { + rules = (Rules)rulesXStream.fromXML(rulesObj); + } else { + rules = new Rules(); + rules.setRules(new ArrayList<Rule>(1)); + } + } + + @Override + protected void initDefaultProperties() { + // + } + + @Override + protected void initFromChangedProperties() { + init(); + } + + @Override + public void setPersistedProperties(PersistedProperties persistedProperties) { + this.moduleConfigProperties = persistedProperties; + } + + public Rules getRules() { + return rules; + } + + public void setRules(Rules rules) { + String value = rulesXStream.toXML(rules); + setStringProperty(CONFIG_RULES, value, true); + } +} diff --git a/src/main/java/org/olat/admin/landingpages/_spring/landingPagesContext.xml b/src/main/java/org/olat/admin/landingpages/_spring/landingPagesContext.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd23357dac3d1a9f14cedb3514e6ca91616647aa --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/_spring/landingPagesContext.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans.xsd"> + + <bean id="landingPagesModule" class="org.olat.admin.landingpages.LandingPagesModule" + init-method="init" depends-on="coordinatorManager"> + <property name="persistedProperties"> + <bean class="org.olat.core.configuration.PersistedProperties" scope="prototype" init-method="init" destroy-method="destroy"> + <constructor-arg index="0" ref="coordinatorManager"/> + <constructor-arg index="1" ref="landingPagesModule"/> + </bean> + </property> + </bean> + + <bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints"> + <property name="order" value="7206" /> + <property name="navigationKey" value="restapi" /> + <property name="actionController"> + <bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype"> + <property name="className" value="org.olat.admin.landingpages.ui.LandingPagesAdminController"/> + </bean> + </property> + <property name="i18nActionKey" value="menu.landingpages"/> + <property name="i18nDescriptionKey" value="menu.landingpages.alt"/> + <property name="translationPackage" value="org.olat.admin"/> + <property name="extensionPoints"> + <list> + <value>org.olat.admin.SystemAdminMainController</value> + </list> + </property> + <property name="parentTreeNodeIdentifier" value="sysconfigParent" /> + </bean> + +</beans> \ No newline at end of file diff --git a/src/main/java/org/olat/admin/landingpages/model/Rule.java b/src/main/java/org/olat/admin/landingpages/model/Rule.java new file mode 100644 index 0000000000000000000000000000000000000000..e12ccbe1c8c30bc4dba8060ecd7826f819d27889 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/model/Rule.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.admin.landingpages.model; + +import org.olat.core.gui.UserRequest; +import org.olat.core.id.Roles; +import org.olat.core.id.User; +import org.olat.core.util.StringHelper; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class Rule { + + public static final String AUTHOR = "author"; + public static final String USER_MGR = "userManager"; + public static final String GROUP_MGR = "groupManager"; + public static final String RSRC_MGR = "institutionalResourceManager"; + public static final String POOL_MGR = "poolAdmin"; + public static final String ADMIN = "olatAdmin"; + + private String role; + private String userAttributeKey; + private String userAttributeValue; + private String landingPath; + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getUserAttributeKey() { + return userAttributeKey; + } + + public void setUserAttributeKey(String userAttributeKey) { + this.userAttributeKey = userAttributeKey; + } + + public String getUserAttributeValue() { + return userAttributeValue; + } + + public void setUserAttributeValue(String userAttributeValue) { + this.userAttributeValue = userAttributeValue; + } + + public String getLandingPath() { + return landingPath; + } + + public void setLandingPath(String landingPath) { + this.landingPath = landingPath; + } + + public boolean match(UserRequest ureq) { + boolean match = true; + + //match the role? + if(!"none".equals(role) && StringHelper.containsNonWhitespace(role)) { + Roles roles = ureq.getUserSession().getRoles(); + switch(role) { + case AUTHOR: match &= roles.isAuthor(); break; + case USER_MGR: match &= roles.isUserManager(); break; + case GROUP_MGR: match &= roles.isGroupManager(); break; + case RSRC_MGR: match &= roles.isInstitutionalResourceManager(); break; + case POOL_MGR: match &= roles.isPoolAdmin(); break; + case ADMIN: match &= roles.isOLATAdmin(); break; + default: { + match &= false; + } + } + } + + if(StringHelper.containsNonWhitespace(userAttributeKey)) { + User user = ureq.getUserSession().getIdentity().getUser(); + String value = user.getProperty(userAttributeKey, null); + if(!StringHelper.containsNonWhitespace(value) && !StringHelper.containsNonWhitespace(userAttributeValue)) { + // ok, both are null or empty + } else if(StringHelper.containsNonWhitespace(value) && StringHelper.containsNonWhitespace(userAttributeValue)) { + match &= userAttributeValue.trim().equalsIgnoreCase(value.trim()); + } else { + match &= false; + } + } + return match; + } +} diff --git a/src/main/java/org/olat/admin/landingpages/model/Rules.java b/src/main/java/org/olat/admin/landingpages/model/Rules.java new file mode 100644 index 0000000000000000000000000000000000000000..4705798f03ed87bb06725a4e5ed51747822ce278 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/model/Rules.java @@ -0,0 +1,109 @@ +/** + * <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.admin.landingpages.model; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.id.Roles; +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.util.StringHelper; +import org.olat.core.util.WebappHelper; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class Rules { + + private List<Rule> rules; + + public List<Rule> getRules() { + return rules; + } + + public void setRules(List<Rule> rules) { + this.rules = rules; + } + + public Rule matchRule(UserRequest ureq) { + Roles roles = ureq.getUserSession().getRoles(); + if(roles.isGuestOnly() || roles.isInvitee() || rules == null || rules.isEmpty()) { + return null; + } + + for(Rule rule:rules) { + if(rule.match(ureq)) { + return rule; + } + } + return null; + } + + public BusinessControl match(UserRequest ureq) { + BusinessControl bc = null; + Rule rule = matchRule(ureq); + if(rule != null && StringHelper.containsNonWhitespace(rule.getLandingPath())) { + String path = cleanUpLandingPath(rule.getLandingPath()); + if(StringHelper.containsNonWhitespace(path)) { + String restPath = BusinessControlFactory.getInstance().formatFromURI(path); + List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromString(restPath); + if(entries.size() > 0) { + bc = BusinessControlFactory.getInstance().createFromContextEntries(entries); + } + } + } + return bc; + } + + public static String cleanUpLandingPath(String path) { + if(path == null) return null;//nothing to do + + if(path.startsWith("http")) { + //remove protocol, host, port... + try { + URL url = new URL(path); + path = url.getPath(); + } catch (MalformedURLException e) { + //silently ignore it + } + } + + //cut context path if any + if(path.startsWith(WebappHelper.getServletContextPath())) { + path = path.substring(WebappHelper.getServletContextPath().length()); + } + //cut dispatcher name + if(path.startsWith("/url/")) { + path = path.substring("/url/".length()); + } + //factory doesn't like path which starts with / + if(path.startsWith("/")) { + path = path.substring("/".length()); + } + return path; + } +} diff --git a/src/main/java/org/olat/admin/landingpages/ui/LandingPages.java b/src/main/java/org/olat/admin/landingpages/ui/LandingPages.java new file mode 100644 index 0000000000000000000000000000000000000000..3333e8cf0e864e558a2a23503c1436b2b62645e4 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/LandingPages.java @@ -0,0 +1,65 @@ +/** + * <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.admin.landingpages.ui; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public enum LandingPages { + + myCourses("page.myCourses", "/MyCoursesSite/0"), + myFavoritCourses("page.myFavoritCourses", "/MyCoursesSite/0/Favorits/0"), + catalog("page.catalog", "/CatalogEntry/0"), + myGroups("page.groups", "/GroupsSite/0/MyGroups/0"), + myFavoritGroups("page.myFavoritGroups", "/GroupsSite/0/MyGroups/0/Favorits/0"), + myNotifications("page.myNotifications", "/HomeSite/0/notifications/0"), + myPortfolios("page.myPortfolio", "/HomeSite/0/Portfolio/0"), + infoPage1("page.infoPage1", "/CourseSite/1"), + infoPage2("page.infoPage2", "/CourseSite/2"), + learnResources("page.learnResources", "/RepositorySite/0"); + + private String i18nKey; + private String businessPath; + + private LandingPages(String i18nKey, String businessPath) { + this.i18nKey = i18nKey; + this.businessPath = businessPath; + } + + public String i18nKey() { + return i18nKey; + } + + public String businessPath() { + return businessPath; + } + + public static final LandingPages landingPageFromCmd(String cmd) { + for(LandingPages lp:values()) { + if(cmd.equals(lp.name())) { + return lp; + } + } + return null; + } +} diff --git a/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java b/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java new file mode 100644 index 0000000000000000000000000000000000000000..5e749430b3ed65f549ad447cb815110cdcabf23a --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/LandingPagesAdminController.java @@ -0,0 +1,315 @@ +/** + * <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.admin.landingpages.ui; + +import static org.olat.admin.landingpages.model.Rule.ADMIN; +import static org.olat.admin.landingpages.model.Rule.AUTHOR; +import static org.olat.admin.landingpages.model.Rule.GROUP_MGR; +import static org.olat.admin.landingpages.model.Rule.POOL_MGR; +import static org.olat.admin.landingpages.model.Rule.RSRC_MGR; +import static org.olat.admin.landingpages.model.Rule.USER_MGR; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import org.olat.admin.landingpages.LandingPagesModule; +import org.olat.admin.landingpages.model.Rule; +import org.olat.admin.landingpages.model.Rules; +import org.olat.admin.landingpages.ui.RulesDataModel.RCols; +import org.olat.basesecurity.BaseSecurityModule; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.dropdown.DropdownItem; +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.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.elements.TextElement; +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.FlexiTableRendererType; +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.link.Link; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.util.Util; +import org.olat.user.UserManager; +import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LandingPagesAdminController extends FormBasicController { + + private static final String USER_PROPS_ID = LandingPagesModule.class.getName(); + + private RulesDataModel model; + private FlexiTableElement tableEl; + private static final String[] roleKeys = new String[]{ "none", + AUTHOR, USER_MGR, GROUP_MGR, RSRC_MGR, POOL_MGR, ADMIN + }; + private final String[] roleValues; + private final String[] attrKeys; + private final String[] attrValues; + + @Autowired + private UserManager userManager; + @Autowired + private LandingPagesModule lpModule; + @Autowired + private BaseSecurityModule securityModule; + + private AtomicInteger counter = new AtomicInteger(); + + public LandingPagesAdminController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl, "rules"); + setTranslator(Util.createPackageTranslator(UserPropertyHandler.class, getLocale(), getTranslator())); + + roleValues = new String[roleKeys.length]; + for(int i=0; i<roleKeys.length; i++) { + roleValues[i] = translate(roleKeys[i]); + } + + boolean isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); + List<UserPropertyHandler> userPropertyHandlers = userManager + .getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); + + int numOfProperties = userPropertyHandlers.size(); + attrKeys = new String[numOfProperties]; + attrValues = new String[numOfProperties]; + for(int i=0; i<numOfProperties; i++) { + UserPropertyHandler handler = userPropertyHandlers.get(i); + attrKeys[i] = handler.getName(); + attrValues[i] = translate(handler.i18nFormElementLabelKey()); + } + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + setFormTitle("landingpages.title"); + + //add the table + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.position.i18nKey(), RCols.position.ordinal())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.role.i18nKey(), RCols.role.ordinal())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.userAttributeKey.i18nKey(), RCols.userAttributeKey.ordinal())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.userAttributeValue.i18nKey(), RCols.userAttributeValue.ordinal())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.landingPage.i18nKey(), RCols.landingPage.ordinal())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(RCols.landingPageChooser.i18nKey(), RCols.landingPageChooser.ordinal())); + + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("up", -1, "up", + new StaticFlexiCellRenderer(" ", "up", "o_icon_move_up o_icon-lg"))); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("down", -1, "down", + new StaticFlexiCellRenderer(" ", "down", "o_icon_move_down o_icon-lg"))); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("add", translate("add"), "add")); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("delete", translate("delete"), "delete")); + + //pack the rules + Rules rules = lpModule.getRules(); + List<Rule> ruleList = new ArrayList<>(rules.getRules()); + if(ruleList.isEmpty()) { + ruleList.add(new Rule()); + } + + List<RuleWrapper> wrappers = new ArrayList<>(); + int i = 0; + for(Rule rule:ruleList) { + wrappers.add(initRuleWrapper(++i, rule, formLayout)); + } + if(formLayout instanceof FormLayoutContainer) { + FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; + layoutCont.contextPut("rules", wrappers); + } + model = new RulesDataModel(columnsModel, wrappers); + tableEl = uifactory.addTableElement(ureq, getWindowControl(), "rules", model, getTranslator(), formLayout); + tableEl.setCustomizeColumns(false); + tableEl.setRendererType(FlexiTableRendererType.classic); + + FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + formLayout.add("buttons", buttonLayout); + uifactory.addFormSubmitButton("save", buttonLayout); + } + + @Override + protected void doDispose() { + // + } + + private RuleWrapper initRuleWrapper(int pos, Rule rule, FormItemContainer formLayout) { + int i = counter.incrementAndGet(); + + RuleWrapper wrapper = new RuleWrapper(rule); + wrapper.setPosition(pos); + + SingleSelection roleEl = uifactory.addDropdownSingleselect("role-" + i, null, formLayout, roleKeys, roleValues, null); + String role = rule.getRole(); + for(int j=roleKeys.length; j-->0; ) { + if(roleKeys[j].equals(role)) { + roleEl.select(roleKeys[j], true); + } + } + wrapper.setRoleEl(roleEl); + + SingleSelection attrNameEl = uifactory.addDropdownSingleselect("attr-key-" + i, null, formLayout, attrKeys, attrValues, null); + String userAttributeKey = rule.getUserAttributeKey(); + for(int j=attrKeys.length; j-->0; ) { + if(attrKeys[j].equals(userAttributeKey)) { + attrNameEl.select(attrKeys[j], true); + } + } + wrapper.setAttrNameEl(attrNameEl); + + TextElement valEl = uifactory.addTextElement("attr-val-" + i, null, 256, "", formLayout); + valEl.setValue(rule.getUserAttributeValue()); + wrapper.setAttrValueEl(valEl); + + TextElement landingPageEl = uifactory.addTextElement("l-page-" + i, null, 256, "", formLayout); + landingPageEl.setValue(rule.getLandingPath()); + wrapper.setLandingPageEl(landingPageEl); + formLayout.add(landingPageEl); + + DropdownItem chooser = new DropdownItem("chooser-" + i, RCols.landingPageChooser.i18nKey(), getTranslator()); + chooser.setButton(true); + chooser.setEmbbeded(true); + fillChooser(wrapper, chooser, formLayout); + wrapper.setLandingPageChooser(chooser); + return wrapper; + } + + private void fillChooser(RuleWrapper rule, DropdownItem chooser, FormItemContainer formLayout) { + int i = counter.incrementAndGet(); + for(LandingPages lp:LandingPages.values()) { + FormLink link = uifactory.addFormLink(lp.name() + "-" + i, lp.name(), lp.i18nKey(), null, formLayout, Link.LINK); + link.setUserObject(rule); + chooser.addElement(link); + } + } + + @Override + protected void formOK(UserRequest ureq) { + int rowCount = model.getRowCount(); + List<Rule> ruleList = new ArrayList<Rule>(rowCount); + for(int i=0; i<rowCount; i++) { + ruleList.add(model.getObject(i).save()); + } + + Rules rules = new Rules(); + rules.setRules(ruleList); + lpModule.setRules(rules); + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == tableEl) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + RuleWrapper row = model.getObject(se.getIndex()); + if("up".equals(se.getCommand())) { + moveUp(row); + } else if("down".equals(se.getCommand())) { + moveDown(row); + } else if("add".equals(se.getCommand())) { + addRow(row); + } else if("delete".equals(se.getCommand())) { + deleteRow(row); + } + tableEl.reset(); + tableEl.getComponent().setDirty(true); + } + } else if(source instanceof FormLink && source.getUserObject() instanceof RuleWrapper) { + RuleWrapper rule = (RuleWrapper)source.getUserObject(); + String cmd = ((FormLink)source).getCmd(); + if("catalog".equals(cmd)) { + //do choose catalog + } else if("repo".equals(cmd)) { + + } else { + LandingPages lp = LandingPages.landingPageFromCmd(cmd); + if(lp != null) { + rule.getLandingPageEl().setValue(lp.businessPath()); + } + } + } + super.formInnerEvent(ureq, source, event); + } + + private void addRow(RuleWrapper row) { + List<RuleWrapper> rows = model.getObjects(); + int currentIndex = rows.indexOf(row); + RuleWrapper newRule = initRuleWrapper(1, new Rule(), flc); + if(currentIndex >= 0 && currentIndex < rows.size() - 1) { + rows.add(currentIndex + 1, newRule); + } else { + rows.add(newRule); + } + model.setObjects(reOrder(rows)); + } + + private void deleteRow(RuleWrapper row) { + List<RuleWrapper> rows = model.getObjects(); + rows.remove(row); + if(rows.isEmpty()) { + Rule rule = new Rule(); + rows.add(initRuleWrapper(1, rule, flc)); + } + model.setObjects(reOrder(rows)); + } + + private void moveUp(RuleWrapper row) { + List<RuleWrapper> rows = model.getObjects(); + int currentIndex = rows.indexOf(row); + if(currentIndex > 0) { + rows.remove(currentIndex); + rows.add(currentIndex - 1, row); + } + model.setObjects(reOrder(rows)); + } + + private void moveDown(RuleWrapper row) { + List<RuleWrapper> rows = model.getObjects(); + int currentIndex = rows.indexOf(row); + if(currentIndex >= 0 && currentIndex + 1 < rows.size()) { + rows.remove(currentIndex); + rows.add(currentIndex + 1, row); + } + model.setObjects(reOrder(rows)); + } + + private List<RuleWrapper> reOrder(List<RuleWrapper> rows) { + int i=0; + for(RuleWrapper row:rows) { + row.setPosition(++i); + } + return rows; + } +} diff --git a/src/main/java/org/olat/admin/landingpages/ui/RuleWrapper.java b/src/main/java/org/olat/admin/landingpages/ui/RuleWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..385d57981ebc19ab9c82318fed5062ca1c42dc39 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/RuleWrapper.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.admin.landingpages.ui; + +import org.olat.admin.landingpages.model.Rule; +import org.olat.core.gui.components.dropdown.DropdownItem; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.elements.TextElement; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class RuleWrapper { + + private final Rule rule; + private int position; + + private SingleSelection roleEl; + private SingleSelection attrNameEl; + private TextElement attrValueEl; + private TextElement landingPageEl; + private DropdownItem landingPageChooser; + + public RuleWrapper(Rule rule) { + this.rule = rule; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public Rule getRule() { + return rule; + } + + public SingleSelection getRoleEl() { + return roleEl; + } + + public void setRoleEl(SingleSelection roleEl) { + this.roleEl = roleEl; + } + + public SingleSelection getAttrNameEl() { + return attrNameEl; + } + + public void setAttrNameEl(SingleSelection attrNameEl) { + this.attrNameEl = attrNameEl; + } + + public TextElement getAttrValueEl() { + return attrValueEl; + } + + public void setAttrValueEl(TextElement attrValueEl) { + this.attrValueEl = attrValueEl; + } + + public TextElement getLandingPageEl() { + return landingPageEl; + } + + public void setLandingPageEl(TextElement landingPageEl) { + this.landingPageEl = landingPageEl; + } + + public DropdownItem getLandingPageChooser() { + return landingPageChooser; + } + + public void setLandingPageChooser(DropdownItem landingPageChooser) { + this.landingPageChooser = landingPageChooser; + } + + public Rule save() { + Rule sRule = new Rule(); + if(roleEl.isOneSelected()) { + sRule.setRole(roleEl.getSelectedKey()); + } + if(attrNameEl.isOneSelected()) { + sRule.setUserAttributeKey(attrNameEl.getSelectedKey()); + sRule.setUserAttributeValue(attrValueEl.getValue()); + } + sRule.setLandingPath(landingPageEl.getValue()); + return sRule; + } +} diff --git a/src/main/java/org/olat/admin/landingpages/ui/RulesDataModel.java b/src/main/java/org/olat/admin/landingpages/ui/RulesDataModel.java new file mode 100644 index 0000000000000000000000000000000000000000..10ccc98f320b1790f84efc85366996c18021376b --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/RulesDataModel.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.admin.landingpages.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel; +import org.olat.core.gui.components.table.TableDataModel; + +/** + * + * Initial date: 10.06.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class RulesDataModel implements FlexiTableDataModel<RuleWrapper>, TableDataModel<RuleWrapper> { + + private FlexiTableColumnModel columnModel; + private List<RuleWrapper> rules; + + public RulesDataModel(FlexiTableColumnModel columnModel, List<RuleWrapper> rules) { + this.columnModel = columnModel; + this.rules = rules; + } + + @Override + public FlexiTableColumnModel getTableColumnModel() { + return columnModel; + } + + @Override + public void setTableColumnModel(FlexiTableColumnModel tableColumnModel) { + this.columnModel = tableColumnModel; + } + + @Override + public int getColumnCount() { + return 4; + } + + public List<RuleWrapper> getObjects() { + return rules; + } + + @Override + public void setObjects(List<RuleWrapper> objects) { + rules = new ArrayList<RuleWrapper>(objects); + } + + @Override + public RulesDataModel createCopyWithEmptyList() { + return new RulesDataModel(columnModel, new ArrayList<RuleWrapper>()); + } + + @Override + public int getRowCount() { + return rules == null ? 0 : rules.size(); + } + + @Override + public boolean isRowLoaded(int row) { + return true; + } + + @Override + public RuleWrapper getObject(int row) { + return rules.get(row); + } + + @Override + public Object getValueAt(int row, int col) { + RuleWrapper rule = getObject(row); + switch(RCols.values()[col]) { + case position: return rule.getPosition(); + case role: return rule.getRoleEl(); + case userAttributeKey: return rule.getAttrNameEl(); + case userAttributeValue: return rule.getAttrValueEl(); + case landingPage: return rule.getLandingPageEl(); + case landingPageChooser: return rule.getLandingPageChooser(); + default: return "ERROR"; + } + } + + public enum RCols { + position("rules.position"), + role("rules.role"), + userAttributeKey("rules.user.attribute.key"), + userAttributeValue("rules.user.attribute.value"), + landingPage("rules.landing.page"), + landingPageChooser("rules.landing.page.chooser"); + + private final String i18nKey; + + private RCols(String i18nKey) { + this.i18nKey = i18nKey; + } + + public String i18nKey() { + return i18nKey; + } + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/admin/landingpages/ui/_content/rules.html b/src/main/java/org/olat/admin/landingpages/ui/_content/rules.html new file mode 100644 index 0000000000000000000000000000000000000000..ac0fad553d0c714ba92f7999a8f45c39e4ecf095 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/_content/rules.html @@ -0,0 +1,2 @@ +$r.render("rules") +$r.render("buttons") \ No newline at end of file diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties new file mode 100644 index 0000000000000000000000000000000000000000..fc7d652b16909e5d9325d8c78423257300bec5a6 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_de.properties @@ -0,0 +1,29 @@ +#Tue Jul 27 11:51:00 CEST 2010 +landingpages.title=Startseite +rules.position=Position +rules.role=Role +rules.user.attribute.key=Benutzerattribut +rules.user.attribute.value=Wert +rules.landing.page=Startseite +rules.landing.page.chooser=Auswahl +page.groups=Gruppen +page.myCourses=Meine Kurse +page.myFavoritCourses=Favoriten Kurse +page.catalog=Katalog +page.myFavoritGroups=Favoriten Gruppe +page.myNotifications=Abonnement +page.myPortfolio=e-Portfolio +page.infoPage1=Infokurs 1 +page.infoPage2=Infokurs 2 +page.learnResources=Lernressourcen +up=Hoch +down=Runter +add=Hinzufügen +delete=Löschen +none=- +author=$org.olat.admin.user\:rightsForm.isAuthor +userManager=$org.olat.admin.user\:rightsForm.isUsermanager +groupManager=$org.olat.admin.user\:rightsForm.isGroupmanager +institutionalResourceManager=$org.olat.admin.user\:rightsForm.isInstitutionalResourceManager +poolAdmin=$org.olat.admin.user\:rightsForm.isPoolmanager +olatAdmin=$org.olat.admin.user\:rightsForm.isAdmin diff --git a/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties new file mode 100644 index 0000000000000000000000000000000000000000..a47c736b025941bd548a9d3d0f8e578954de0cc1 --- /dev/null +++ b/src/main/java/org/olat/admin/landingpages/ui/_i18n/LocalStrings_en.properties @@ -0,0 +1,2 @@ +#Sat Jan 22 17:28:23 CET 2011 +landingpages.title=Landing pages \ No newline at end of file diff --git a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java index ad0a02af284a99062e4630f2df983e737b1c5b11..d1102e3231975db3925e0a049fd5e015937e4240 100644 --- a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java +++ b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java @@ -138,9 +138,9 @@ public class SitesConfigurationController extends FormBasicController { } columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, SiteCols.defaultOrder.i18nKey(), SiteCols.defaultOrder.ordinal(), false, null)); columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("up", SiteCols.up.ordinal(), "up", - new StaticFlexiCellRenderer(" ", "up", "b_small_table_icon b_move_up_icon"))); + new StaticFlexiCellRenderer(" ", "up", "o_icon_move_up o_icon-lg"))); columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("down", SiteCols.down.ordinal(), "down", - new StaticFlexiCellRenderer(" ", "down", "b_small_table_icon b_move_down_icon"))); + new StaticFlexiCellRenderer(" ", "down", "o_icon_move_down o_icon-lg"))); model = new SiteDefModel(columnsModel); @@ -157,7 +157,7 @@ public class SitesConfigurationController extends FormBasicController { @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(source == tableEl) { + if(source == tableEl) { if(event instanceof SelectionEvent) { SelectionEvent se = (SelectionEvent)event; if("up".equals(se.getCommand())) { diff --git a/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserController.java b/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserController.java index 838863d414045cfa816c540c8be02ab0228ec29b..37792bc9b0cb819327cfc7f18b4c1fa6c730a398 100644 --- a/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserController.java +++ b/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserController.java @@ -85,7 +85,7 @@ public class FileChooserController extends BasicController { * true: show a file chooser title and description; false: show * only the tree without a title */ - FileChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, VFSItemFilter customItemFilter, boolean onlyLeafsSelectable, boolean showTitle) { + FileChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, VFSItemFilter customItemFilter, boolean onlyLeafsSelectable) { super(ureq, wControl); this.rootContainer = rootContainer; this.onlyLeafsSelectable = onlyLeafsSelectable; diff --git a/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserUIFactory.java b/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserUIFactory.java index ff5197a09f15d1f6e5ff2a229c5a8b21896affef..a4f87cfcd74212a5fd5193379deda727e56f53d9 100644 --- a/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserUIFactory.java +++ b/src/main/java/org/olat/core/commons/controllers/filechooser/FileChooserUIFactory.java @@ -59,7 +59,7 @@ public class FileChooserUIFactory { * false: all items can be selected */ public static FileChooserController createFileChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, VFSItemFilter customItemFilter, boolean onlyLeafsSelectable) { - return new FileChooserController(ureq, wControl, rootContainer, customItemFilter, onlyLeafsSelectable, true); + return new FileChooserController(ureq, wControl, rootContainer, customItemFilter, onlyLeafsSelectable); } /** @@ -76,7 +76,7 @@ public class FileChooserUIFactory { * false: all items can be selected */ public static FileChooserController createFileChooserControllerWithoutTitle(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, VFSItemFilter customItemFilter, boolean onlyLeafsSelectable) { - return new FileChooserController(ureq, wControl, rootContainer, customItemFilter, onlyLeafsSelectable, false); + return new FileChooserController(ureq, wControl, rootContainer, customItemFilter, onlyLeafsSelectable); } /** @@ -95,7 +95,7 @@ public class FileChooserUIFactory { * can be selected */ public static FileChooserController createFileChooserController(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, boolean showLeafs, boolean onlyLeafsSelectable) { - return new FileChooserController(ureq, wControl, rootContainer, (showLeafs ? null : containerFilter), onlyLeafsSelectable, true); + return new FileChooserController(ureq, wControl, rootContainer, (showLeafs ? null : containerFilter), onlyLeafsSelectable); } /** @@ -114,7 +114,7 @@ public class FileChooserUIFactory { * can be selected */ public static FileChooserController createFileChooserControllerWithoutTitle(UserRequest ureq, WindowControl wControl, VFSContainer rootContainer, boolean showLeafs, boolean onlyLeafsSelectable) { - return new FileChooserController(ureq, wControl, rootContainer, (showLeafs ? null : containerFilter), onlyLeafsSelectable, false); + return new FileChooserController(ureq, wControl, rootContainer, (showLeafs ? null : containerFilter), onlyLeafsSelectable); } /** diff --git a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java index a9a40a3ccda2e1aebf57413c2758047e9683d352..a854f79bf64e8e5ad67b8454fa50f72e6b0beb1a 100644 --- a/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java +++ b/src/main/java/org/olat/core/commons/controllers/resume/ResumeController.java @@ -20,8 +20,11 @@ */ package org.olat.core.commons.controllers.resume; +import java.util.List; + import org.olat.NewControllerFactory; -import org.olat.core.CoreSpringFactory; +import org.olat.admin.landingpages.LandingPagesModule; +import org.olat.admin.landingpages.model.Rules; import org.olat.core.gui.UserRequest; import org.olat.core.gui.WindowManager; import org.olat.core.gui.components.form.flexible.FormItem; @@ -37,6 +40,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; 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.HistoryManager; import org.olat.core.id.context.HistoryModule; import org.olat.core.id.context.HistoryPoint; @@ -44,6 +48,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.UserSession; import org.olat.core.util.prefs.Preferences; import org.olat.login.SupportsAfterLoginInterceptor; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -58,12 +63,18 @@ import org.olat.login.SupportsAfterLoginInterceptor; */ public class ResumeController extends FormBasicController implements SupportsAfterLoginInterceptor { - //the cancel button ("Nein") - private FormLink bttNo; + private FormLink noButton, landingButton; private String[] askagain_keys = new String[]{"askagain_k"}; private MultipleSelectionElement askagainCheckbox; + @Autowired + private LandingPagesModule lpModule; + @Autowired + private HistoryModule historyModule; + @Autowired + private HistoryManager historyManager; + public ResumeController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); initForm(ureq); @@ -77,8 +88,8 @@ public class ResumeController extends FormBasicController implements SupportsAft FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("button_layout", getTranslator()); formLayout.add(buttonLayout); uifactory.addFormSubmitButton("submit", "resume.button", buttonLayout); - bttNo = uifactory.addFormLink("cancel","resume.button.cancel", "", buttonLayout, Link.BUTTON); -// FormCancel bttCancel = uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl()); + landingButton = uifactory.addFormLink("landing", "resume.button.landing", null, buttonLayout, Link.BUTTON); + noButton = uifactory.addFormLink("cancel", "resume.button.cancel", null, buttonLayout, Link.BUTTON); } @Override @@ -90,37 +101,39 @@ public class ResumeController extends FormBasicController implements SupportsAft Preferences prefs = usess.getGuiPreferences(); String resumePrefs = (String)prefs.get(WindowManager.class, "resume-prefs"); if(!StringHelper.containsNonWhitespace(resumePrefs)) { - HistoryModule historyModule = (HistoryModule)CoreSpringFactory.getBean("historyModule"); resumePrefs = historyModule.getResumeDefaultSetting(); } + + boolean interception = false; if("none".equals(resumePrefs)) { - return false; + BusinessControl bc = getLandingBC(ureq); + launch(ureq, bc); } else if ("auto".equals(resumePrefs)) { HistoryPoint historyEntry = HistoryManager.getInstance().readHistoryPoint(ureq.getIdentity()); if(historyEntry != null && StringHelper.containsNonWhitespace(historyEntry.getBusinessPath())) { BusinessControl bc = BusinessControlFactory.getInstance().createFromContextEntries(historyEntry.getEntries()); - WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); - try { - //make the resume secure. If something fail, don't generate a red screen - NewControllerFactory.getInstance().launch(ureq, bwControl); - } catch (Exception e) { - logError("Error while resuming", e); - } + launch(ureq, bc); } - return false; } else if ("ondemand".equals(resumePrefs)) { - HistoryPoint historyEntry = HistoryManager.getInstance().readHistoryPoint(ureq.getIdentity()); - return historyEntry != null && StringHelper.containsNonWhitespace(historyEntry.getBusinessPath()); + HistoryPoint historyEntry = historyManager.readHistoryPoint(ureq.getIdentity()); + interception = historyEntry != null && StringHelper.containsNonWhitespace(historyEntry.getBusinessPath()); } - return false; + return interception; } + + @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(source.equals(bttNo)){ - this.flc.setDirty(true); + if(source.equals(noButton)){ + flc.setDirty(true); formResetted(ureq); formCancelled(ureq); + } else if(source.equals(landingButton)){ + savePreferences(ureq, "none"); + fireEvent (ureq, Event.DONE_EVENT); + BusinessControl bc = getLandingBC(ureq); + launch(ureq, bc); } } @@ -131,7 +144,6 @@ public class ResumeController extends FormBasicController implements SupportsAft * @return */ private boolean isDisabled(UserRequest ureq) { - HistoryModule historyModule = (HistoryModule)CoreSpringFactory.getBean("historyModule"); if(!historyModule.isResumeEnabled()) return true; UserSession usess = ureq.getUserSession(); if(usess.getRoles().isGuestOnly()) return true; @@ -147,16 +159,10 @@ public class ResumeController extends FormBasicController implements SupportsAft @Override protected void formOK(UserRequest ureq) { - // check if checkbox (dont askagain) is checked - if(askagainCheckbox.isSelected(0)){ - Preferences prefs = ureq.getUserSession().getGuiPreferences(); - prefs.put(WindowManager.class, "resume-prefs","auto"); - prefs.save(); - } - + savePreferences(ureq, "auto"); fireEvent (ureq, Event.DONE_EVENT); - HistoryPoint historyEntry = HistoryManager.getInstance().readHistoryPoint(ureq.getIdentity()); + HistoryPoint historyEntry = historyManager.readHistoryPoint(ureq.getIdentity()); if(historyEntry != null && StringHelper.containsNonWhitespace(historyEntry.getBusinessPath())) { BusinessControl bc = BusinessControlFactory.getInstance().createFromContextEntries(historyEntry.getEntries()); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); @@ -171,12 +177,48 @@ public class ResumeController extends FormBasicController implements SupportsAft @Override protected void formCancelled(UserRequest ureq) { + savePreferences(ureq, "none"); + fireEvent (ureq, Event.CANCELLED_EVENT); + } + + /** + * Search first in the user preferences, after in rules + * @param ureq + * @return + */ + private BusinessControl getLandingBC(UserRequest ureq) { + Preferences prefs = ureq.getUserSession().getGuiPreferences(); + String landingPage = (String)prefs.get(WindowManager.class, "landing-page"); + if(StringHelper.containsNonWhitespace(landingPage)) { + String path = Rules.cleanUpLandingPath(landingPage); + if(StringHelper.containsNonWhitespace(path)) { + String restPath = BusinessControlFactory.getInstance().formatFromURI(path); + List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromString(restPath); + if(entries.size() > 0) { + return BusinessControlFactory.getInstance().createFromContextEntries(entries); + } + } + } + return lpModule.getRules().match(ureq); + } + + private void launch(UserRequest ureq, BusinessControl bc) { + if(bc == null) return; + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); + try { + //make the resume secure. If something fail, don't generate a red screen + NewControllerFactory.getInstance().launch(ureq, bwControl); + } catch (Exception e) { + logError("Error while resuming", e); + } + } + + private void savePreferences(UserRequest ureq, String val) { // check if checkbox (dont askagain) is checked if(askagainCheckbox.isSelected(0)){ Preferences prefs = ureq.getUserSession().getGuiPreferences(); - prefs.put(WindowManager.class, "resume-prefs","none"); + prefs.put(WindowManager.class, "resume-prefs", val); prefs.save(); } - fireEvent (ureq, Event.CANCELLED_EVENT); } } diff --git a/src/main/java/org/olat/core/commons/controllers/resume/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/controllers/resume/_i18n/LocalStrings_de.properties index 018fe740707b208b2aa422c11ee18dab8f691319..9d065663694150e67e3b743543888dad0bf956d6 100644 --- a/src/main/java/org/olat/core/commons/controllers/resume/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/controllers/resume/_i18n/LocalStrings_de.properties @@ -2,4 +2,5 @@ resume=Wollen Sie Ihre letzte Sitzung wiederherstellen? resume.button=Ja resume.button.cancel=Nein +resume.button.landing=Startseite askagain.label=Nicht mehr nachfragen \ No newline at end of file diff --git a/src/main/java/org/olat/core/commons/controllers/resume/_spring/resumeCorecontext.xml b/src/main/java/org/olat/core/commons/controllers/resume/_spring/resumeCorecontext.xml index fcf9db34366acad906703e8daea60b17287582ea..5319d9b8233ac091d515b246a196202bd9c13a84 100644 --- a/src/main/java/org/olat/core/commons/controllers/resume/_spring/resumeCorecontext.xml +++ b/src/main/java/org/olat/core/commons/controllers/resume/_spring/resumeCorecontext.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd"> - <bean id="resume.AfterLogin.Injection" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <bean id="resume.AfterLogin.Injection" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" ref="afterLoginInterceptionManager" /> <property name="targetMethod" value="addAfterLoginControllerConfig" /> <property name="arguments"> diff --git a/src/main/java/org/olat/core/gui/components/Window.java b/src/main/java/org/olat/core/gui/components/Window.java index f70a1929d929d6f305dfb5352b163f363e688792..7d10e52efd778452f1d8fd88ee4b0893d2e17d2b 100644 --- a/src/main/java/org/olat/core/gui/components/Window.java +++ b/src/main/java/org/olat/core/gui/components/Window.java @@ -218,7 +218,7 @@ public class Window extends AbstractComponent { * @see org.olat.core.gui.components.Container#getComponent(java.lang.String) */ public Component getComponent(String name) { - throw new AssertException("please use getContentPane()"); + throw new AssertException("please use getContentPane(): " + name); } /** @@ -809,7 +809,6 @@ public class Window extends AbstractComponent { this.customCSS = customCSS; } - //fxdiff FXOLAT-119: update business path public Command handleBusinessPath(UserRequest ureq) { HistoryPoint p = ureq.getUserSession().getLastHistoryPoint(); if(p != null && StringHelper.containsNonWhitespace(p.getBusinessPath())) { @@ -817,7 +816,7 @@ public class Window extends AbstractComponent { List<ContextEntry> ces = p.getEntries(); String url = BusinessControlFactory.getInstance().getAsURIString(ces, true); sb.append("try { o_info.businessPath='").append(url).append("';"); - sb.append("b_shareActiveSocialUrl(); } catch(e) { }"); + sb.append("o_shareActiveSocialUrl(); } catch(e) { }"); return new JSCommand(sb.toString()); } return null; diff --git a/src/main/java/org/olat/core/gui/components/dropdown/Dropdown.java b/src/main/java/org/olat/core/gui/components/dropdown/Dropdown.java index a9dc46cb51da1b0f7f33b811032d4b61431b80a6..cb4ccfc3858626ce1d2a253c7c4e0b2c3e3ff65d 100644 --- a/src/main/java/org/olat/core/gui/components/dropdown/Dropdown.java +++ b/src/main/java/org/olat/core/gui/components/dropdown/Dropdown.java @@ -44,6 +44,7 @@ public class Dropdown extends AbstractComponent implements ComponentCollection { private String i18nKey; private boolean button = false; + private boolean embbeded = false; private String iconCSS; private List<Component> components = new ArrayList<>(); @@ -69,6 +70,14 @@ public class Dropdown extends AbstractComponent implements ComponentCollection { this.button = button; } + public boolean isEmbbeded() { + return embbeded; + } + + public void setEmbbeded(boolean embbeded) { + this.embbeded = embbeded; + } + public String getIconCSS() { return iconCSS; } diff --git a/src/main/java/org/olat/core/gui/components/dropdown/DropdownItem.java b/src/main/java/org/olat/core/gui/components/dropdown/DropdownItem.java new file mode 100644 index 0000000000000000000000000000000000000000..fffcdc76b58511494092b86491c76bb68c36e778 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/dropdown/DropdownItem.java @@ -0,0 +1,101 @@ +/** + * 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) frentix GmbH<br> + * http://www.frentix.com<br> + * <p> + */ +package org.olat.core.gui.components.dropdown; + +import java.util.ArrayList; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemCollection; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.translator.Translator; + +/** + * + * Initial date: 15.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class DropdownItem extends FormItemImpl implements FormItemCollection { + + private final Dropdown dropdown; + private final List<FormItem> items = new ArrayList<>(); + + public DropdownItem(String name, String label, Translator translator) { + super(name); + dropdown = new Dropdown(name, label, false, translator); + } + + public void setButton(boolean button) { + dropdown.setButton(button); + } + + public void setEmbbeded(boolean embbeded) { + dropdown.setEmbbeded(embbeded); + } + + public void addElement(FormLink link) { + items.add(link); + + Link linkCmp = (Link)link.getComponent(); + linkCmp.setDomReplacementWrapperRequired(false); + dropdown.addComponent(linkCmp); + } + + @Override + protected Component getFormItemComponent() { + return dropdown; + } + + @Override + public Iterable<FormItem> getFormItems() { + return items; + } + + @Override + public FormItem getFormComponent(String name) { + for(FormItem item:items) { + if(item != null && item.getName().equals(name)) { + return item; + } + } + return null; + } + + @Override + protected void rootFormAvailable() { + // + } + + @Override + public void evalFormRequest(UserRequest ureq) { + // + } + + @Override + public void reset() { + // + } +} diff --git a/src/main/java/org/olat/core/gui/components/dropdown/DropdownRenderer.java b/src/main/java/org/olat/core/gui/components/dropdown/DropdownRenderer.java index 830cc839c42c564a76cf66ce2190ce2e29dcf866..480a92e42210c94f545e7a7e7ca6bf6865b9df31 100644 --- a/src/main/java/org/olat/core/gui/components/dropdown/DropdownRenderer.java +++ b/src/main/java/org/olat/core/gui/components/dropdown/DropdownRenderer.java @@ -41,8 +41,10 @@ public class DropdownRenderer extends DefaultComponentRenderer { public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) { - + Dropdown dropdown = (Dropdown)source; + sb.append("<div class='btn-group'>", dropdown.isEmbbeded()); + Iterable<Component> components = dropdown.getComponents(); if(dropdown.isButton()) { sb.append("<button class='btn btn-default dropdown-toggle'"); @@ -74,6 +76,6 @@ public class DropdownRenderer extends DefaultComponentRenderer { sb.append("</li>"); } } - sb.append("</ul>"); + sb.append("</ul>").append("</div>", dropdown.isEmbbeded()); } } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java index 6895360196a553c79e2ec4de2d7a35fb4a824a97..a2158aed3fe71fedd9c9dae5a8c59c947a2ec90e 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiTableRenderer.java @@ -417,6 +417,13 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere formItem.getComponent().getHTMLRendererSingleton().render(renderer, target, formItem.getComponent(), ubu, translator, renderResult, null); } + } else if(cellValue instanceof Component) { + Component cmp = (Component)cellValue; + cmp.setTranslator(translator); + if(cmp.isVisible()) { + cmp.getHTMLRendererSingleton().render(renderer, target, cmp, + ubu, translator, renderResult, null); + } } else { fcm.getCellRenderer().render(target, cellValue, row, ftC, ubu, translator); } diff --git a/src/main/java/org/olat/core/gui/render/Renderer.java b/src/main/java/org/olat/core/gui/render/Renderer.java index ab05ab9c5ec1bd4d76cd3e24d527ce7b3961f890..2c9c2f98bbf6f09306662f78da361d6562f0136a 100644 --- a/src/main/java/org/olat/core/gui/render/Renderer.java +++ b/src/main/java/org/olat/core/gui/render/Renderer.java @@ -219,7 +219,7 @@ public class Renderer { sb.append("<div id='o_c").append(source.getDispatchID()); } if(Settings.isDebuging()) { - sb.append("' title='").append(source.getComponentName()); + //sb.append("' title='").append(source.getComponentName()); } sb.append("'>"); } diff --git a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java index c25e329d9672a88ab7be131be04a0212f1b5ce15..afef88bfbf58fd772670a7cfc313fc151380ffee 100644 --- a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java +++ b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java @@ -501,12 +501,10 @@ public class BusinessControlFactory { return null; } - try { - BusinessControlFactory bCF = BusinessControlFactory.getInstance(); - List<ContextEntry> ceList = bCF.createCEListFromString(bPathString); + try { + List<ContextEntry> ceList = createCEListFromString(bPathString); String busPath = getBusinessPathAsURIFromCEList(ceList); - - return WebappHelper.getServletContextPath() +"/url/"+busPath; + return WebappHelper.getServletContextPath() + "/url/" + busPath; } catch(Exception e) { log.error("Error with business path: " + bPathString, e); return null; diff --git a/src/main/java/org/olat/course/site/CourseSiteContextEntryControllerCreator.java b/src/main/java/org/olat/course/site/CourseSiteContextEntryControllerCreator.java index 03374754561df07989aafa67e00d37c554735d51..c8ae693f45889da204a8a74230e80c5c9d073ca4 100644 --- a/src/main/java/org/olat/course/site/CourseSiteContextEntryControllerCreator.java +++ b/src/main/java/org/olat/course/site/CourseSiteContextEntryControllerCreator.java @@ -68,7 +68,7 @@ public class CourseSiteContextEntryControllerCreator extends DefaultContextEntry @Override public Controller createController(List<ContextEntry> ces, UserRequest ureq, WindowControl wControl) { Controller ctrl = null;; - RepositoryEntry re = getRepositoryEntry(ces.get(0)); + RepositoryEntry re = getRepositoryEntry(ureq, ces.get(0)); if(ces.size() > 1) { ContextEntry subcontext = ces.get(1); if("Editor".equals(subcontext.getOLATResourceable().getResourceableTypeName())) { @@ -93,7 +93,7 @@ public class CourseSiteContextEntryControllerCreator extends DefaultContextEntry */ @Override public String getTabName(ContextEntry ce, UserRequest ureq) { - RepositoryEntry re = getRepositoryEntry(ce); + RepositoryEntry re = getRepositoryEntry(ureq, ce); CourseSiteDef siteDef = getCourseSite(ureq, re); if(siteDef != null) { return "Hello"; @@ -106,7 +106,7 @@ public class CourseSiteContextEntryControllerCreator extends DefaultContextEntry */ @Override public String getSiteClassName(List<ContextEntry> ces, UserRequest ureq) { - RepositoryEntry re = getRepositoryEntry(ces.get(0)); + RepositoryEntry re = getRepositoryEntry(ureq, ces.get(0)); CourseSiteDef siteDef = getCourseSite(ureq, re); if(siteDef != null) { return siteDef.getClass().getName().replace("Def", ""); @@ -116,7 +116,7 @@ public class CourseSiteContextEntryControllerCreator extends DefaultContextEntry @Override public boolean validateContextEntryAndShowError(ContextEntry ce, UserRequest ureq, WindowControl wControl) { - return getRepositoryEntry(ce) != null; + return getRepositoryEntry(ureq, ce) != null; } private SiteDefinitions getSitesDefinitions() { @@ -146,14 +146,43 @@ public class CourseSiteContextEntryControllerCreator extends DefaultContextEntry return null; } - private RepositoryEntry getRepositoryEntry(ContextEntry ce) { + private RepositoryEntry getRepositoryEntry(UserRequest ureq, ContextEntry ce) { if(repoEntry == null) { if(ce.getOLATResourceable() instanceof RepositoryEntry) { repoEntry = (RepositoryEntry)ce.getOLATResourceable(); } else { OLATResourceable ores = ce.getOLATResourceable(); - RepositoryManager rm = RepositoryManager.getInstance(); - repoEntry = rm.lookupRepositoryEntry(ores.getResourceableId()); + if("CourseSite".equals(ores.getResourceableTypeName())) { + int id = ores.getResourceableId().intValue(); + CourseSiteDef courseSiteDef = null; + List<SiteDefinition> siteDefList = getSitesDefinitions().getSiteDefList(); + if(id == 2) { + for(SiteDefinition siteDef:siteDefList) { + if(siteDef instanceof CourseSiteDef2) { + courseSiteDef = (CourseSiteDef)siteDef; + } + } + } else if(id == 1) { + for(SiteDefinition siteDef:siteDefList) { + if(siteDef instanceof CourseSiteDef) { + courseSiteDef = (CourseSiteDef)siteDef; + } + } + } + + if(courseSiteDef != null) { + CourseSiteConfiguration config = courseSiteDef.getCourseSiteconfiguration(); + LanguageConfiguration langConfig = courseSiteDef.getLanguageConfiguration(ureq, config); + if(langConfig != null) { + String softKey = langConfig.getRepoSoftKey(); + RepositoryManager rm = RepositoryManager.getInstance(); + repoEntry = rm.lookupRepositoryEntryBySoftkey(softKey, false); + } + } + } else { + RepositoryManager rm = RepositoryManager.getInstance(); + repoEntry = rm.lookupRepositoryEntry(ores.getResourceableId()); + } } } return repoEntry; diff --git a/src/main/java/org/olat/repository/RepositoryModule.java b/src/main/java/org/olat/repository/RepositoryModule.java index 4f5a0f917b92703df3a56478e5d457220ed33a1d..3a118ab8892a830769403f0afa14b06cd6efa10c 100644 --- a/src/main/java/org/olat/repository/RepositoryModule.java +++ b/src/main/java/org/olat/repository/RepositoryModule.java @@ -26,6 +26,7 @@ import org.olat.core.configuration.PersistedProperties; import org.olat.core.id.Roles; import org.olat.core.id.context.SiteContextEntryControllerCreator; import org.olat.core.util.StringHelper; +import org.olat.course.site.CourseSite; import org.olat.course.site.CourseSiteContextEntryControllerCreator; import org.olat.group.BusinessGroupModule; import org.olat.repository.site.MyCoursesSite; @@ -67,6 +68,9 @@ public class RepositoryModule extends AbstractOLATModule { NewControllerFactory.getInstance().addContextEntryControllerCreator(RepositoryEntry.class.getSimpleName(), new CourseSiteContextEntryControllerCreator()); + NewControllerFactory.getInstance().addContextEntryControllerCreator(CourseSite.class.getSimpleName(), + new CourseSiteContextEntryControllerCreator()); + NewControllerFactory.getInstance().addContextEntryControllerCreator(CatalogEntry.class.getSimpleName(), new CatalogContextEntryControllerCreator(this)); diff --git a/src/main/java/org/olat/social/shareLink/_content/shareLink.html b/src/main/java/org/olat/social/shareLink/_content/shareLink.html index 6f16509fd59b60d7f73edd40c9e8d38f551d2eb8..27953ecd280f3a3c55f301551e1df162716600f6 100644 --- a/src/main/java/org/olat/social/shareLink/_content/shareLink.html +++ b/src/main/java/org/olat/social/shareLink/_content/shareLink.html @@ -10,7 +10,12 @@ if(o_info.businessPath && o_info.businessPath.length > 0) return o_info.businessPath; return '$baseURL'; } - function o_shareSocialTitle() { return document.title; } + function o_shareSocialTitle() { + return document.title; + } + function o_shareCallout() { + return '<p><span>$r.translate("share.link")</span>:<br/><input id="callout_share_link_in" type="text" name="cl_share_link" value="' + o_shareSocialUrl() + '" /></p>'; + } /* ]]> */ </script> @@ -42,40 +47,19 @@ <i class="o_icon o_icon_mail o_icon-lg"></i> </a> #elseif ($link == "link") - <a id="o_link" href="#" onclick="javascript:o_shareSocialLink();"> + <a id="o_link" href="#"> <i class="o_icon o_icon_link o_icon-lg"></i> </a> <script type="text/javascript"> /* <![CDATA[ */ - function o_shareSocialLink() { - var callout = ''; - callout += '<div id="o_callout_sharesociallink" class="o_callout_area b_clearfix" style="z-index:101;"><div class="b_floatscrollbox"><a name="b_modal"></a><div class="b_callout"><div class="o_callout_top_left_arrow"></div><div class="o_callout_top_left_arrow-border"></div>'; - callout += '<div id="callout_layer_sharesociallink" class="o_callout_content"><div id="callout_layer_content_sharesociallink">'; - callout += '<p><span>$r.translate("share.link")</span>:<br/><input id="callout_share_link_in" type="text" name="cl_share_link" size="64" value="' + o_shareSocialUrl() + '" /></p>'; - callout += '</div></div></div></div></div><div id="o_callout_overlay_sharesociallink" class="o_callout_overlay" style="z-index:100;"></div>'; - - jQuery('body').append(callout); - jQuery('#callout_layer_sharesociallink').each(function(index, el) { - jQuery(el).parents('div.o_callout_area').next('div.o_callout_overlay').each(function(index2, el2) { - jQuery(el2).click(function() { - jQuery('#o_callout_overlay_sharesociallink').remove(); - jQuery('#o_callout_sharesociallink').remove(); - }); - }); - }); - - jQuery('#o_callout_sharesociallink').each(function(index, el) { - var targetEl = jQuery('#b_link'); - var targetOffset = targetEl.offset(); - if(targetOffset) { - var callout = jQuery(el); - callout.offset({ - top: (targetOffset.top + targetEl.height() + 15) , - left: (targetOffset.left - 23) - }).css('zindex', 105); - } - }); - } + jQuery(function() { + jQuery("#o_link").popover({ + placement : 'top', + html: true, + trigger: 'click', + content: o_shareCallout + }); + }); /* ]]> */ </script> #end diff --git a/src/main/java/org/olat/user/ChangePrefsController.java b/src/main/java/org/olat/user/ChangePrefsController.java index 4e5489a05e468f6ec59db9e1f5318be29bd6641d..b4106370df419700775c2dc96d58293a08bb6112 100644 --- a/src/main/java/org/olat/user/ChangePrefsController.java +++ b/src/main/java/org/olat/user/ChangePrefsController.java @@ -31,10 +31,13 @@ import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.WindowManager; import org.olat.core.gui.components.Component; +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.elements.TextElement; 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.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; @@ -107,6 +110,7 @@ public class ChangePrefsController extends BasicController { * org.olat.core.gui.components.Component, * org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Component source, Event event) { if (source == myContent) { if (event.getCommand().equals("exeBack")) { @@ -114,7 +118,8 @@ public class ChangePrefsController extends BasicController { } } } - + + @Override public void event(UserRequest ureq, Controller source, Event event) { if (source == generalPrefsCtr) { if (event == Event.DONE_EVENT) { @@ -129,6 +134,7 @@ public class ChangePrefsController extends BasicController { /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) */ + @Override protected void doDispose() { // } @@ -152,9 +158,9 @@ class SpecialPrefsForm extends FormBasicController { private Identity tobeChangedIdentity; private Preferences prefs; private MultipleSelectionElement prefsElement; - //fxdiff BAKS-7 Resume function private SingleSelection resumeElement; private SingleSelection backElement; + private TextElement landingPageEl; private String[] keys, values; private boolean useAjaxCheckbox = false; private String[] resumeKeys, resumeValues; @@ -192,7 +198,7 @@ class SpecialPrefsForm extends FormBasicController { translate("accessibility.web2aMode.label") }; } - //fxdiff BAKS-7 Resume function + resumeKeys = new String[]{"none", "auto", "ondemand"}; resumeValues = new String[] { translate("resume.none"), @@ -221,13 +227,15 @@ class SpecialPrefsForm extends FormBasicController { } prefs.put(WindowManager.class, "web2a-beta-on", prefsElement.getSelectedKeys().contains("web2a")); - //fxdiff BAKS-7 Resume function if(resumeElement != null) { prefs.put(WindowManager.class, "resume-prefs", resumeElement.getSelectedKey()); } if(backElement != null) { prefs.put(WindowManager.class, "back-enabled", backElement.isSelected(0)); } + String landingPage = landingPageEl.isVisible() ? landingPageEl.getValue() : ""; + prefs.put(WindowManager.class, "landing-page", landingPage); + if (ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) { showInfo("preferences.successful"); } @@ -236,6 +244,16 @@ class SpecialPrefsForm extends FormBasicController { prefs.save(); } + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(resumeElement == source) { + if(resumeElement.isOneSelected()) { + landingPageEl.setVisible(!resumeElement.getSelectedKey().equals("auto")); + } + } + super.formInnerEvent(ureq, source, event); + } + @Override protected void formCancelled(UserRequest ureq) { update(); @@ -252,7 +270,11 @@ class SpecialPrefsForm extends FormBasicController { if(historyModule.isResumeEnabled()) { resumeElement = uifactory.addRadiosVertical("resume", "resume.label", formLayout, resumeKeys, resumeValues); resumeElement.setElementCssClass("o_sel_home_settings_resume"); + resumeElement.addActionListener(FormEvent.ONCHANGE); } + + landingPageEl = uifactory.addTextElement("landingpages", "landing.pages", 256, "", formLayout); + if(historyModule.isBackEnabled()) { backElement = uifactory.addRadiosVertical("back-enabling", "back.label", formLayout, yesNoKeys, yesNoValues); backElement.setElementCssClass("o_sel_home_settings_back_enabling"); @@ -273,7 +295,7 @@ class SpecialPrefsForm extends FormBasicController { prefsElement.select("ajax", ajax == null ? true: ajax.booleanValue()); } prefsElement.select("web2a", web2a == null ? false: web2a.booleanValue()); - //fxdiff BAKS-7 Resume function + boolean landingPageVisible = true; if(resumeElement != null) { String resumePrefs = (String)prefs.get(WindowManager.class, "resume-prefs"); if(StringHelper.containsNonWhitespace(resumePrefs)) { @@ -286,6 +308,10 @@ class SpecialPrefsForm extends FormBasicController { logError("Unavailable setting for resume function: " + defaultSetting, e); } } + + if(resumeElement.isOneSelected()) { + landingPageVisible = !resumeElement.getSelectedKey().equals("auto"); + } } if(backElement != null) { Boolean be = (Boolean)prefs.get(WindowManager.class, "back-enabled"); @@ -299,6 +325,10 @@ class SpecialPrefsForm extends FormBasicController { backElement.select(selected, true); } + + String landingPage = (String)prefs.get(WindowManager.class, "landing-page"); + landingPageEl.setValue(landingPage); + landingPageEl.setVisible(landingPageVisible); } @Override @@ -308,7 +338,6 @@ class SpecialPrefsForm extends FormBasicController { } -// fxdiff FXOLAT-149 /** * Controller to reset the users GUI prefs and other preferences */ diff --git a/src/main/java/org/olat/user/ProfileFormController.java b/src/main/java/org/olat/user/ProfileFormController.java index 75445f3aa1c079a98726804cb9309b42d95aae7e..9e188d4530b1110e1fbeaa4968ca917caf4f5cd7 100644 --- a/src/main/java/org/olat/user/ProfileFormController.java +++ b/src/main/java/org/olat/user/ProfileFormController.java @@ -147,7 +147,6 @@ public class ProfileFormController extends FormBasicController { formContext.put("username", identity.getName()); String currentGroup = null; - List<UserPropertyHandler> homepagePropertyHanders = UserManager.getInstance().getUserPropertyHandlersFor(HomePageConfig.class.getCanonicalName(), isAdministrativeUser); // show a form element for each property handler FormLayoutContainer groupContainer = null; for (UserPropertyHandler userPropertyHandler : this.userPropertyHandlers) { @@ -255,16 +254,17 @@ public class ProfileFormController extends FormBasicController { public void updateFromFormData(final HomePageConfig config, final Identity identity) { User user = identity.getUser(); // For each user property... - for (UserPropertyHandler userPropertyHandler : this.userPropertyHandlers) { + for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { // ...get the value from the form field and store it into the user // property... - FormItem formItem = this.formItems.get(userPropertyHandler.getName()); - - userPropertyHandler.updateUserFromFormItem(user, formItem); + FormItem formItem = formItems.get(userPropertyHandler.getName()); + if(formItem.isEnabled()) { + userPropertyHandler.updateUserFromFormItem(user, formItem); + } // ...and store the "publish" flag for each property. - MultipleSelectionElement checkbox = this.publishCheckboxes.get("checkbox_" + userPropertyHandler.getName()); + MultipleSelectionElement checkbox = publishCheckboxes.get("checkbox_" + userPropertyHandler.getName()); if (checkbox != null) { // null when not enabled for the org.olat.user.HomePageConfig usage // identifier key @@ -291,7 +291,9 @@ public class ProfileFormController extends FormBasicController { // update each user field for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { FormItem formItem = formItems.get(userPropertyHandler.getName()); - userPropertyHandler.updateUserFromFormItem(user, formItem); + if(formItem.isEnabled()) { + userPropertyHandler.updateUserFromFormItem(user, formItem); + } } return identity; } diff --git a/src/main/java/org/olat/user/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/_i18n/LocalStrings_de.properties index 437792d4150dcbce1a3d126c006c7faea1b64cdc..991bb09fb7fdbba13bd40b14709c777b89ac05e5 100644 --- a/src/main/java/org/olat/user/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/user/_i18n/LocalStrings_de.properties @@ -138,6 +138,7 @@ menu.homepage=Visitenkarte menu.homepage.alt=Visitenkarte des ausgew\u00E4hlten Benutzers menu.portfolio=Portfolio menu.portfolio.alt=Portfolio +landing.pages=Startseite notallowedtochangepwd=Sie d\u00FCrfen das Passwort nicht selbst setzen. Bei Fragen wenden Sie sich bitte an {0}. password.failed=Ihr neues Passwort wurde nicht gespeichert. Ein unerwarteter Fehler ist aufgetreten. password.successful=Ihr neues Passwort wurde erfolgreich gespeichert. Es ist ab sofort aktiv. diff --git a/src/main/java/org/olat/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/_i18n/LocalStrings_en.properties index 54b686b264b11144fabc87182e0f8d1b784494e8..0a91ccb82d95d6cfe16968d5ec0673e6ba274f81 100644 --- a/src/main/java/org/olat/user/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/user/_i18n/LocalStrings_en.properties @@ -145,6 +145,7 @@ interval.monthly=Monthly interval.never=Never interval.two-hourly=Every two hours interval.weekly=Weekly +landing.pages=Landing page mail.intern.only=Send e-mails to the OpenOLAT internal inbox mail.send.copy=Send e-mails to the OpenOLAT internal inbox and the address {0} mail.system=E-mail delivery 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 ca3ca49d46b09c7febaaa4562a9f514935af91ff..c27a158b97241963526ee2f7ecf4aaa571b87112 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertiesContext.xml @@ -4,9 +4,9 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> <!-- Configure the users properties, forms and tables @@ -948,7 +948,30 @@ </list> </property> </bean> - </entry> + </entry> + + <entry key="org.olat.admin.landingpages.LandingPagesModule"> + <bean class="org.olat.user.propertyhandlers.UserPropertyUsageContext"> + <property name="description" value="Properties used in the administration of landing pages. " /> + <property name="propertyHandlers"> + <list> + <ref bean="userPropertyGender" /> + <ref bean="userPropertyStreet" /> + <ref bean="userPropertyExtendedAddress" /> + <ref bean="userPropertyPoBox" /> + <ref bean="userPropertyZipCode" /> + <ref bean="userPropertyRegion" /> + <ref bean="userPropertyCity" /> + <ref bean="userPropertyCountry" /> + <ref bean="userPropertyInstitutionalName" /> + <ref bean="userPropertyInstitutionalUserIdentifier" /> + <ref bean="userPropertyInstitutionalEmail" /> + <ref bean="userPropertyOrgUnit" /> + <ref bean="userPropertyStudySubject" /> + </list> + </property> + </bean> + </entry> <!-- Default configuration in case nothing else matches. diff --git a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml index 7165e2326ab64329aa1e45f6c6d315690df3b355..f6c5476c9fceddeb781843455da4004abd557ff0 100644 --- a/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml +++ b/src/main/java/org/olat/user/propertyhandlers/_spring/userPropertriesHandlersContext.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> + http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- diff --git a/src/main/webapp/static/themes/light/modules/_icons.scss b/src/main/webapp/static/themes/light/modules/_icons.scss index 2f3554af6c7b7e94fd1110779a27c9ae519978ea..9c6731e156bcb6b86a193788d8e1bbcdb3c7a589 100644 --- a/src/main/webapp/static/themes/light/modules/_icons.scss +++ b/src/main/webapp/static/themes/light/modules/_icons.scss @@ -47,8 +47,10 @@ $fa-css-prefix: "o_icon" !default; .o_icon_membersmanagement { @extend .o_icon-users;} .o_icon_message { @extend .o_icon-envelope;} .o_icon_move{ @extend .o_icon-arrows;} +.o_icon_move_down { @extend .o_icon-angle-double-down;} .o_icon_move_left { @extend .o_icon-angle-double-left;} .o_icon_move_right { @extend .o_icon-angle-double-right;} +.o_icon_move_up { @extend .o_icon-angle-double-up;} .o_icon_new_document { @extend .o_icon-fighter-jet; color:pink;} .o_icon_new_folder { @extend .o_icon-fighter-jet; color:violet;} .o_icon_notes{@extend .o_icon-pencil; } diff --git a/src/main/webapp/static/themes/light/theme.css b/src/main/webapp/static/themes/light/theme.css index ddac0f8c629761bb379ef158bb8069232f730789..adcce27f647d324b38715e31aab9ba833f1c0ec6 100644 --- a/src/main/webapp/static/themes/light/theme.css +++ b/src/main/webapp/static/themes/light/theme.css @@ -42,7 +42,7 @@ small,.small,.o_comments .o_comment_wrapper h5,.o_comments .o_comment_wrapper .o .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all 0.2s ease-in-out;transition:all 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:#428bca}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{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{padding-right:35px}.alert-dismissable .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:#428bca;-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;transition:width 0.6s ease}.progress-striped .progress-bar{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: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{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left,#o_main_wrapper #o_main_container .media>#o_main_left,#o_navbar_imclient .media>#o_im_message,#o_navbar_imclient .media>#o_im_status,#o_navbar_imclient .media>#o_im_summary,.o_comments .o_comment_wrapper .media>.o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .media>.o_rating_wrapper,.o_catalog .o_sublevels .media>.o_sublevel,.o_repo_details .o_social .media>.o_rating_wrapper{margin-right:10px}.media>.pull-right,.media>div.o_chelp_wrapper,.o_withEllipsis .media>.o_ellipsis_links,#o_main_wrapper #o_main_container .media>#o_main_right,.o_comments .o_comment_wrapper .media>.o_reply,.o_comments .o_comment_wrapper .media>.o_delete,.o_repo_details .o_lead .media>.o_media{margin-left:10px}.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}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}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;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.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{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}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.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 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{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{border-top-right-radius:3px}.panel>.table:last-child,.panel>.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 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{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{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.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{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{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{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{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-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);transform:translate(0, 0)}.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:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;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:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;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,.modal-footer a.o_chelp+.btn,.modal-footer .btn+a.o_chelp,.modal-footer a.o_chelp+a.o_chelp{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn,.modal-footer .btn-group a.o_chelp+.btn,.modal-footer .btn-group .btn+a.o_chelp,.modal-footer .btn-group a.o_chelp+a.o_chelp{margin-left:-1px}.modal-footer .btn-block+.btn-block,.modal-footer .o_repo_details .o_start+.btn-block,.o_repo_details .modal-footer .o_start+.btn-block,.modal-footer .o_repo_details .o_book+.btn-block,.o_repo_details .modal-footer .o_book+.btn-block,.modal-footer .o_repo_details .btn-block+.o_start,.o_repo_details .modal-footer .btn-block+.o_start,.modal-footer .o_repo_details .o_start+.o_start,.o_repo_details .modal-footer .o_start+.o_start,.modal-footer .o_repo_details .o_book+.o_start,.o_repo_details .modal-footer .o_book+.o_start,.modal-footer .o_repo_details .btn-block+.o_book,.o_repo_details .modal-footer .btn-block+.o_book,.modal-footer .o_repo_details .o_start+.o_book,.o_repo_details .modal-footer .o_start+.o_book,.modal-footer .o_repo_details .o_book+.o_book,.o_repo_details .modal-footer .o_book+.o_book{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;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;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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;font-weight:normal;line-height:18px;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:fadein(rgba(0,0,0,0.2), 5%);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:fadein(rgba(0,0,0,0.2), 5%)}.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:fadein(rgba(0,0,0,0.2), 5%);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:fadein(rgba(0,0,0,0.2), 5%)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0%), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0%), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0%, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn,.carousel-caption a.o_chelp{text-shadow:none}@media screen and (min-width: 768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.o_catalog .o_sublevels:before,.o_repo_details .o_social:before,.clearfix:after,.o_catalog .o_sublevels:after,.o_repo_details .o_social:after{content:" ";display:table}.clearfix:after,.o_catalog .o_sublevels:after,.o_repo_details .o_social:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right,div.o_chelp_wrapper,.o_withEllipsis .o_ellipsis_links,#o_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete,.o_repo_details .o_lead .o_media{float:right !important}.pull-left,#o_main_wrapper #o_main_container #o_main_left,#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary,.o_comments .o_comment_wrapper .o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper,.o_catalog .o_sublevels .o_sublevel,.o_repo_details .o_social .o_rating_wrapper{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}@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 (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: 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: 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 (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}}@media print{.hidden-print{display:none !important}}body .modal{position:absolute;overflow:visible}/*! * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?v=4.1.0");src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../../../font-awesome/fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../../../font-awesome/fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_icon-lg,.o_icon_help{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,.o_icon-li.o_icon_help{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right,div.o_chelp_wrapper,.o_withEllipsis .o_ellipsis_links,#o_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete,.o_repo_details .o_lead .o_media{float:right}.pull-left,#o_main_wrapper #o_main_container #o_main_left,#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary,.o_comments .o_comment_wrapper .o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper,.o_catalog .o_sublevels .o_sublevel,.o_repo_details .o_social .o_rating_wrapper{float:left}.o_icon.pull-left,#o_main_wrapper #o_main_container .o_icon#o_main_left,#o_navbar_imclient .o_icon#o_im_message,#o_navbar_imclient .o_icon#o_im_status,#o_navbar_imclient .o_icon#o_im_summary,.o_comments .o_comment_wrapper .o_icon.o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_icon.o_rating_wrapper,.o_catalog .o_sublevels .o_icon.o_sublevel,.o_repo_details .o_social .o_icon.o_rating_wrapper{margin-right:.3em}.o_icon.pull-right,div.o_icon.o_chelp_wrapper,.o_withEllipsis .o_icon.o_ellipsis_links,#o_main_wrapper #o_main_container .o_icon#o_main_right,.o_comments .o_comment_wrapper .o_icon.o_reply,.o_comments .o_comment_wrapper .o_icon.o_delete,.o_repo_details .o_lead .o_icon.o_media{margin-left:.3em}.o_icon-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes 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);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.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-glass:before{content:"\f000"}.o_icon-music:before{content:"\f001"}.o_icon-search:before,.o_icon_search:before{content:"\f002"}.o_icon-envelope-o:before,.o_co_icon:before{content:"\f003"}.o_icon-heart:before{content:"\f004"}.o_icon-star:before,.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:"\f005"}.o_icon-star-o:before,.o_icon_rating_off:before{content:"\f006"}.o_icon-user:before{content:"\f007"}.o_icon-film:before{content:"\f008"}.o_icon-th-large:before{content:"\f009"}.o_icon-th:before{content:"\f00a"}.o_icon-th-list:before{content:"\f00b"}.o_icon-check:before,.o_icon_check:before{content:"\f00c"}.o_icon-times:before,.o_icon_close:before,.o_icon_close_tab:before,.o_icon_close_tool:before{content:"\f00d"}.o_icon-search-plus:before{content:"\f00e"}.o_icon-search-minus:before{content:"\f010"}.o_icon-power-off:before{content:"\f011"}.o_icon-signal:before{content:"\f012"}.o_icon-gear:before,.o_icon_customize:before,.o_icon_tool:before,.o_icon-cog:before{content:"\f013"}.o_icon-trash-o:before,.o_icon_delete_item:before{content:"\f014"}.o_icon-home:before{content:"\f015"}.o_icon-file-o:before{content:"\f016"}.o_icon-clock-o:before,.o_icon_expenditure:before{content:"\f017"}.o_icon-road:before{content:"\f018"}.o_icon-download:before,.o_icon_archive_tool:before,.o_icon_download:before{content:"\f019"}.o_icon-arrow-circle-o-down:before{content:"\f01a"}.o_icon-arrow-circle-o-up:before{content:"\f01b"}.o_icon-inbox:before{content:"\f01c"}.o_icon-play-circle-o:before{content:"\f01d"}.o_icon-rotate-right:before,.o_icon-repeat:before{content:"\f01e"}.o_icon-refresh:before,.o_icon_refresh:before{content:"\f021"}.o_icon-list-alt:before{content:"\f022"}.o_icon-lock:before,.o_ac_membersonly_icon:before,.o_midlock:before{content:"\f023"}.o_icon-flag:before{content:"\f024"}.o_icon-headphones:before{content:"\f025"}.o_icon-volume-off:before{content:"\f026"}.o_icon-volume-down:before{content:"\f027"}.o_icon-volume-up:before{content:"\f028"}.o_icon-qrcode:before{content:"\f029"}.o_icon-barcode:before{content:"\f02a"}.o_icon-tag:before{content:"\f02b"}.o_icon-tags:before{content:"\f02c"}.o_icon-book:before{content:"\f02d"}.o_icon-bookmark:before,.o_icon_bookmark:before{content:"\f02e"}.o_icon-print:before,.o_icon_print:before{content:"\f02f"}.o_icon-camera:before{content:"\f030"}.o_icon-font:before{content:"\f031"}.o_icon-bold:before{content:"\f032"}.o_icon-italic:before{content:"\f033"}.o_icon-text-height:before{content:"\f034"}.o_icon-text-width:before{content:"\f035"}.o_icon-align-left:before{content:"\f036"}.o_icon-align-center:before{content:"\f037"}.o_icon-align-right:before{content:"\f038"}.o_icon-align-justify:before{content:"\f039"}.o_icon-list:before,.o_icon_list:before{content:"\f03a"}.o_icon-dedent:before,.o_icon-outdent:before{content:"\f03b"}.o_icon-indent:before{content:"\f03c"}.o_icon-video-camera:before,.o_FileResource-PODCAST_icon:before,.o_podcast_icon:before{content:"\f03d"}.o_icon-photo:before,.o_icon-image:before,.o_icon-picture-o:before{content:"\f03e"}.o_icon-pencil:before,.o_icon_notes:before{content:"\f040"}.o_icon-map-marker:before{content:"\f041"}.o_icon-adjust:before{content:"\f042"}.o_icon-tint:before{content:"\f043"}.o_icon-edit:before,.o_icon_edit:before,.o_icon_edit_file:before,.o_icon_edit_metadata:before,.o_icon_readonly:before,.o_icon_readwrite:before,.o_icon-pencil-square-o:before,.o_FileResource-TEST_icon:before,.o_iqtest_icon:before,.o_iqself_icon:before{content:"\f044"}.o_icon-share-square-o:before{content:"\f045"}.o_icon-check-square-o:before,.o_cl_icon:before{content:"\f046"}.o_icon-arrows:before,.o_icon_move:before{content:"\f047"}.o_icon-step-backward:before{content:"\f048"}.o_icon-fast-backward:before{content:"\f049"}.o_icon-backward:before{content:"\f04a"}.o_icon-play:before{content:"\f04b"}.o_icon-pause:before{content:"\f04c"}.o_icon-stop:before{content:"\f04d"}.o_icon-forward:before{content:"\f04e"}.o_icon-fast-forward:before{content:"\f050"}.o_icon-step-forward:before{content:"\f051"}.o_icon-eject:before{content:"\f052"}.o_icon-chevron-left:before{content:"\f053"}.o_icon-chevron-right:before,.o_icon_start:before{content:"\f054"}.o_icon-plus-circle:before{content:"\f055"}.o_icon-minus-circle:before,.o_icon_delete:before{content:"\f056"}.o_icon-times-circle:before,.o_icon_failed:before{content:"\f057"}.o_icon-check-circle:before,.o_icon_passed:before,.o_midpub:before{content:"\f058"}.o_icon-question-circle:before,.o_icon_help:before{content:"\f059"}.o_icon-info-circle:before,.o_icon_impress:before,.o_infomsg_icon:before{content:"\f05a"}.o_icon-crosshairs:before{content:"\f05b"}.o_icon-times-circle-o:before,.o_icon_status_unavailable:before{content:"\f05c"}.o_icon-check-circle-o:before{content:"\f05d"}.o_icon-ban:before{content:"\f05e"}.o_icon-arrow-left:before{content:"\f060"}.o_icon-arrow-right:before{content:"\f061"}.o_icon-arrow-up:before{content:"\f062"}.o_icon-arrow-down:before{content:"\f063"}.o_icon-mail-forward:before,.o_icon-share:before,.o_icon_publish:before{content:"\f064"}.o_icon-expand:before{content:"\f065"}.o_icon-compress:before{content:"\f066"}.o_icon-plus:before{content:"\f067"}.o_icon-minus:before{content:"\f068"}.o_icon-asterisk:before,.o_icon_mandatory:before{content:"\f069"}.o_icon-exclamation-circle:before{content:"\f06a"}.o_icon-gift:before,.o_ac_free_icon:before{content:"\f06b"}.o_icon-leaf:before{content:"\f06c"}.o_icon-fire:before{content:"\f06d"}.o_icon-eye:before,.o_icon_details:before,.o_icon_preview:before{content:"\f06e"}.o_icon-eye-slash:before{content:"\f070"}.o_icon-warning:before,.o_midwarn:before,.o_miderr:before,.o_icon-exclamation-triangle:before{content:"\f071"}.o_icon-plane:before{content:"\f072"}.o_icon-calendar:before,.o_icon_calendar:before,.o_icon_lifecycle:before,.o_cal_icon:before{content:"\f073"}.o_icon-random:before{content:"\f074"}.o_icon-comment:before,.o_icon_status_chat:before{content:"\f075"}.o_icon-magnet:before{content:"\f076"}.o_icon-chevron-up:before,.o_icon_top:before{content:"\f077"}.o_icon-chevron-down:before{content:"\f078"}.o_icon-retweet:before,.o_icon_managed:before{content:"\f079"}.o_icon-shopping-cart:before{content:"\f07a"}.o_icon-folder:before{content:"\f07b"}.o_icon-folder-open:before{content:"\f07c"}.o_icon-arrows-v:before{content:"\f07d"}.o_icon-arrows-h:before{content:"\f07e"}.o_icon-bar-chart-o:before{content:"\f080"}.o_icon-twitter-square:before,.o_icon_twitter:before{content:"\f081"}.o_icon-facebook-square:before,.o_icon_facebook:before{content:"\f082"}.o_icon-camera-retro:before{content:"\f083"}.o_icon-key:before,.o_ac_token_icon:before{content:"\f084"}.o_icon-gears:before,.o_icon_settings:before,.o_icon-cogs:before{content:"\f085"}.o_icon-comments:before,.o_icon_comments:before{content:"\f086"}.o_icon-thumbs-o-up:before,.o_ms_icon:before{content:"\f087"}.o_icon-thumbs-o-down:before{content:"\f088"}.o_icon-star-half:before{content:"\f089"}.o_icon-heart-o:before{content:"\f08a"}.o_icon-sign-out:before,.o_icon_logout:before{content:"\f08b"}.o_icon-linkedin-square:before{content:"\f08c"}.o_icon-thumb-tack:before{content:"\f08d"}.o_icon-external-link:before,.o_icon_content_popup:before,.o_FileResource.SHAREDFOLDER:before,.o_tu_icon:before,.o_lti_icon:before{content:"\f08e"}.o_icon-sign-in:before,.o_icon_login:before,.o_en_icon:before{content:"\f090"}.o_icon-trophy:before,.o_icon_assessment_tool:before{content:"\f091"}.o_icon-github-square:before{content:"\f092"}.o_icon-upload:before,.o_icon_upload:before{content:"\f093"}.o_icon-lemon-o:before{content:"\f094"}.o_icon-phone:before{content:"\f095"}.o_icon-square-o:before{content:"\f096"}.o_icon-bookmark-o:before,.o_icon_bookmark_add:before{content:"\f097"}.o_icon-phone-square:before{content:"\f098"}.o_icon-twitter:before{content:"\f099"}.o_icon-facebook:before{content:"\f09a"}.o_icon-github:before{content:"\f09b"}.o_icon-unlock:before{content:"\f09c"}.o_icon-credit-card:before,.o_ac_paypal_icon:before{content:"\f09d"}.o_icon-rss:before{content:"\f09e"}.o_icon-hdd-o:before{content:"\f0a0"}.o_icon-bullhorn:before,.o_FileResource-BLOG_icon:before,.o_blog_icon:before{content:"\f0a1"}.o_icon-bell:before{content:"\f0f3"}.o_icon-certificate:before,.o_icon_certificate:before{content:"\f0a3"}.o_icon-hand-o-right:before{content:"\f0a4"}.o_icon-hand-o-left:before{content:"\f0a5"}.o_icon-hand-o-up:before{content:"\f0a6"}.o_icon-hand-o-down:before{content:"\f0a7"}.o_icon-arrow-circle-left:before{content:"\f0a8"}.o_icon-arrow-circle-right:before{content:"\f0a9"}.o_icon-arrow-circle-up:before{content:"\f0aa"}.o_icon-arrow-circle-down:before{content:"\f0ab"}.o_icon-globe:before,.o_icon_language:before,.o_FileResource-WIKI_icon:before,.o_wiki_icon:before{content:"\f0ac"}.o_icon-wrench:before{content:"\f0ad"}.o_icon-tasks:before,.o_ta_icon:before{content:"\f0ae"}.o_icon-filter:before,.o_icon_filter:before{content:"\f0b0"}.o_icon-briefcase:before{content:"\f0b1"}.o_icon-arrows-alt:before{content:"\f0b2"}.o_icon-group:before,.o_ac_group_icon:before,.o_icon-users:before,.o_icon_membersmanagement:before,.o_cmembers_icon:before{content:"\f0c0"}.o_icon-chain:before,.o_icon-link:before,.o_icon_link:before,.o_ll_icon:before{content:"\f0c1"}.o_icon-cloud:before{content:"\f0c2"}.o_icon-flask:before{content:"\f0c3"}.o_icon-cut:before,.o_icon-scissors:before{content:"\f0c4"}.o_icon-copy:before,.o_icon_copy:before,.o_icon-files-o:before,.o_dialog_icon:before{content:"\f0c5"}.o_icon-paperclip:before{content:"\f0c6"}.o_icon-save:before,.o_icon-floppy-o:before{content:"\f0c7"}.o_icon-square:before{content:"\f0c8"}.o_icon-navicon:before,.o_icon-reorder:before,.o_icon-bars:before{content:"\f0c9"}.o_icon-list-ul:before{content:"\f0ca"}.o_icon-list-ol:before{content:"\f0cb"}.o_icon-strikethrough:before{content:"\f0cc"}.o_icon-underline:before{content:"\f0cd"}.o_icon-table:before,.o_icon_table:before{content:"\f0ce"}.o_icon-magic:before,.o_icon_wizard:before{content:"\f0d0"}.o_icon-truck:before{content:"\f0d1"}.o_icon-pinterest:before{content:"\f0d2"}.o_icon-pinterest-square:before{content:"\f0d3"}.o_icon-google-plus-square:before,.o_icon_google:before{content:"\f0d4"}.o_icon-google-plus:before{content:"\f0d5"}.o_icon-money:before{content:"\f0d6"}.o_icon-caret-down:before,.o_icon_close_tree:before{content:"\f0d7"}.o_icon-caret-up:before{content:"\f0d8"}.o_icon-caret-left:before{content:"\f0d9"}.o_icon-caret-right:before,.o_icon_open_tree:before{content:"\f0da"}.o_icon-columns:before{content:"\f0db"}.o_icon-unsorted:before,.o_icon-sort:before,.o_icon_sort:before{content:"\f0dc"}.o_icon-sort-down:before,.o_icon-sort-desc:before,.o_icon_sort_desc:before{content:"\f0dd"}.o_icon-sort-up:before,.o_icon-sort-asc:before,.o_icon_sort_asc:before{content:"\f0de"}.o_icon-envelope:before,.o_icon_message:before{content:"\f0e0"}.o_icon-linkedin:before{content:"\f0e1"}.o_icon-rotate-left:before,.o_icon-undo:before{content:"\f0e2"}.o_icon-legal:before,.o_icon-gavel:before{content:"\f0e3"}.o_icon-dashboard:before,.o_icon-tachometer:before,.o_icon_statistics_tool:before{content:"\f0e4"}.o_icon-comment-o:before,.o_icon_chat:before,.o_icon_comments_none:before{content:"\f0e5"}.o_icon-comments-o:before,.o_fo_icon:before{content:"\f0e6"}.o_icon-flash:before,.o_icon-bolt:before{content:"\f0e7"}.o_icon-sitemap:before{content:"\f0e8"}.o_icon-umbrella:before{content:"\f0e9"}.o_icon-paste:before,.o_icon-clipboard:before{content:"\f0ea"}.o_icon-lightbulb-o:before{content:"\f0eb"}.o_icon-exchange:before{content:"\f0ec"}.o_icon-cloud-download:before{content:"\f0ed"}.o_icon-cloud-upload:before{content:"\f0ee"}.o_icon-user-md:before{content:"\f0f0"}.o_icon-stethoscope:before{content:"\f0f1"}.o_icon-suitcase:before{content:"\f0f2"}.o_icon-bell-o:before{content:"\f0a2"}.o_icon-coffee:before{content:"\f0f4"}.o_icon-cutlery:before{content:"\f0f5"}.o_icon-file-text-o:before,.o_sp_icon:before,.o_cp_item:before{content:"\f0f6"}.o_icon-building-o:before{content:"\f0f7"}.o_icon-hospital-o:before{content:"\f0f8"}.o_icon-ambulance:before{content:"\f0f9"}.o_icon-medkit:before{content:"\f0fa"}.o_icon-fighter-jet:before,.o_icon_new_document:before,.o_icon_new_folder:before,.o_icon_read:before,.o_icon_to_read:before{content:"\f0fb"}.o_icon-beer:before{content:"\f0fc"}.o_icon-h-square:before{content:"\f0fd"}.o_icon-plus-square:before{content:"\f0fe"}.o_icon-angle-double-left:before,.o_icon_move_left:before{content:"\f100"}.o_icon-angle-double-right:before,.o_icon_move_right:before{content:"\f101"}.o_icon-angle-double-up:before{content:"\f102"}.o_icon-angle-double-down:before{content:"\f103"}.o_icon-angle-left:before{content:"\f104"}.o_icon-angle-right:before{content:"\f105"}.o_icon-angle-up:before{content:"\f106"}.o_icon-angle-down:before{content:"\f107"}.o_icon-desktop:before,.o_vc_icon:before,.o_vitero_icon:before,.o_openmeetings_icon:before{content:"\f108"}.o_icon-laptop:before{content:"\f109"}.o_icon-tablet:before{content:"\f10a"}.o_icon-mobile-phone:before,.o_icon-mobile:before{content:"\f10b"}.o_icon-circle-o:before,.o_projectbroker_icon:before{content:"\f10c"}.o_icon-quote-left:before{content:"\f10d"}.o_icon-quote-right:before{content:"\f10e"}.o_icon-spinner:before{content:"\f110"}.o_icon-circle:before,.o_icon_status_available:before{content:"\f111"}.o_icon-mail-reply:before,.o_icon-reply:before{content:"\f112"}.o_icon-github-alt:before{content:"\f113"}.o_icon-folder-o:before,.o_icon_coursefolder:before{content:"\f114"}.o_icon-folder-open-o:before,.o_bc_icon:before{content:"\f115"}.o_icon-smile-o:before{content:"\f118"}.o_icon-frown-o:before{content:"\f119"}.o_icon-meh-o:before,.o_FileResource-SURVEY_icon:before,.o_iqsurv_icon:before{content:"\f11a"}.o_icon-gamepad:before{content:"\f11b"}.o_icon-keyboard-o:before{content:"\f11c"}.o_icon-flag-o:before{content:"\f11d"}.o_icon-flag-checkered:before{content:"\f11e"}.o_icon-terminal:before{content:"\f120"}.o_icon-code:before{content:"\f121"}.o_icon-mail-reply-all:before,.o_icon-reply-all:before{content:"\f122"}.o_icon-star-half-empty:before,.o_icon-star-half-full:before,.o_icon-star-half-o:before{content:"\f123"}.o_icon-location-arrow:before{content:"\f124"}.o_icon-crop:before{content:"\f125"}.o_icon-code-fork:before{content:"\f126"}.o_icon-unlink:before,.o_icon-chain-broken:before{content:"\f127"}.o_icon-question:before{content:"\f128"}.o_icon-info:before{content:"\f129"}.o_icon-exclamation:before,.o_icon_error:before{content:"\f12a"}.o_icon-superscript:before{content:"\f12b"}.o_icon-subscript:before{content:"\f12c"}.o_icon-eraser:before,.o_middel:before{content:"\f12d"}.o_icon-puzzle-piece:before,.o_EPStructuredMapTemplate_icon:before,.o_ep_icon:before{content:"\f12e"}.o_icon-microphone:before{content:"\f130"}.o_icon-microphone-slash:before{content:"\f131"}.o_icon-shield:before{content:"\f132"}.o_icon-calendar-o:before{content:"\f133"}.o_icon-fire-extinguisher:before{content:"\f134"}.o_icon-rocket:before{content:"\f135"}.o_icon-maxcdn:before{content:"\f136"}.o_icon-chevron-circle-left:before{content:"\f137"}.o_icon-chevron-circle-right:before{content:"\f138"}.o_icon-chevron-circle-up:before{content:"\f139"}.o_icon-chevron-circle-down:before{content:"\f13a"}.o_icon-html5:before{content:"\f13b"}.o_icon-css3:before{content:"\f13c"}.o_icon-anchor:before{content:"\f13d"}.o_icon-unlock-alt:before{content:"\f13e"}.o_icon-bullseye:before{content:"\f140"}.o_icon-ellipsis-h:before{content:"\f141"}.o_icon-ellipsis-v:before{content:"\f142"}.o_icon-rss-square:before{content:"\f143"}.o_icon-play-circle:before{content:"\f144"}.o_icon-ticket:before{content:"\f145"}.o_icon-minus-square:before{content:"\f146"}.o_icon-minus-square-o:before{content:"\f147"}.o_icon-level-up:before{content:"\f148"}.o_icon-level-down:before{content:"\f149"}.o_icon-check-square:before{content:"\f14a"}.o_icon-pencil-square:before{content:"\f14b"}.o_icon-external-link-square:before{content:"\f14c"}.o_icon-share-square:before{content:"\f14d"}.o_icon-compass:before{content:"\f14e"}.o_icon-toggle-down:before,.o_icon_show_more:before,.o_icon-caret-square-o-down:before{content:"\f150"}.o_icon-toggle-up:before,.o_icon_show_less:before,.o_icon-caret-square-o-up:before{content:"\f151"}.o_icon-toggle-right:before,.o_icon-caret-square-o-right:before{content:"\f152"}.o_icon-euro:before,.o_icon-eur:before{content:"\f153"}.o_icon-gbp:before{content:"\f154"}.o_icon-dollar:before,.o_icon-usd:before{content:"\f155"}.o_icon-rupee:before,.o_icon-inr:before{content:"\f156"}.o_icon-cny:before,.o_icon-rmb:before,.o_icon-yen:before,.o_icon-jpy:before{content:"\f157"}.o_icon-ruble:before,.o_icon-rouble:before,.o_icon-rub:before{content:"\f158"}.o_icon-won:before,.o_icon-krw:before{content:"\f159"}.o_icon-bitcoin:before,.o_icon-btc:before{content:"\f15a"}.o_icon-file:before{content:"\f15b"}.o_icon-file-text:before{content:"\f15c"}.o_icon-sort-alpha-asc:before{content:"\f15d"}.o_icon-sort-alpha-desc:before{content:"\f15e"}.o_icon-sort-amount-asc:before,.o_icon_sort_menu:before{content:"\f160"}.o_icon-sort-amount-desc:before{content:"\f161"}.o_icon-sort-numeric-asc:before{content:"\f162"}.o_icon-sort-numeric-desc:before{content:"\f163"}.o_icon-thumbs-up:before{content:"\f164"}.o_icon-thumbs-down:before{content:"\f165"}.o_icon-youtube-square:before{content:"\f166"}.o_icon-youtube:before{content:"\f167"}.o_icon-xing:before{content:"\f168"}.o_icon-xing-square:before{content:"\f169"}.o_icon-youtube-play:before{content:"\f16a"}.o_icon-dropbox:before{content:"\f16b"}.o_icon-stack-overflow:before{content:"\f16c"}.o_icon-instagram:before{content:"\f16d"}.o_icon-flickr:before{content:"\f16e"}.o_icon-adn:before{content:"\f170"}.o_icon-bitbucket:before{content:"\f171"}.o_icon-bitbucket-square:before{content:"\f172"}.o_icon-tumblr:before{content:"\f173"}.o_icon-tumblr-square:before{content:"\f174"}.o_icon-long-arrow-down:before{content:"\f175"}.o_icon-long-arrow-up:before{content:"\f176"}.o_icon-long-arrow-left:before{content:"\f177"}.o_icon-long-arrow-right:before{content:"\f178"}.o_icon-apple:before{content:"\f179"}.o_icon-windows:before{content:"\f17a"}.o_icon-android:before{content:"\f17b"}.o_icon-linux:before{content:"\f17c"}.o_icon-dribbble:before{content:"\f17d"}.o_icon-skype:before{content:"\f17e"}.o_icon-foursquare:before{content:"\f180"}.o_icon-trello:before{content:"\f181"}.o_icon-female:before{content:"\f182"}.o_icon-male:before{content:"\f183"}.o_icon-gittip:before{content:"\f184"}.o_icon-sun-o:before{content:"\f185"}.o_icon-moon-o:before{content:"\f186"}.o_icon-archive:before,.o_FileResource-IMSCP_icon:before,.o_FileResource-SCORMCP_icon:before,.o_cp_icon:before,.o_scorm_icon:before{content:"\f187"}.o_icon-bug:before,.o_icon_dev:before{content:"\f188"}.o_icon-vk:before{content:"\f189"}.o_icon-weibo:before{content:"\f18a"}.o_icon-renren:before{content:"\f18b"}.o_icon-pagelines:before{content:"\f18c"}.o_icon-stack-exchange:before{content:"\f18d"}.o_icon-arrow-circle-o-right:before{content:"\f18e"}.o_icon-arrow-circle-o-left:before{content:"\f190"}.o_icon-toggle-left:before,.o_icon-caret-square-o-left:before{content:"\f191"}.o_icon-dot-circle-o:before,.o_icon_status_dnd:before{content:"\f192"}.o_icon-wheelchair:before{content:"\f193"}.o_icon-vimeo-square:before{content:"\f194"}.o_icon-turkish-lira:before,.o_icon-try:before{content:"\f195"}.o_icon-plus-square-o:before{content:"\f196"}.o_icon-space-shuttle:before{content:"\f197"}.o_icon-slack:before{content:"\f198"}.o_icon-envelope-square:before,.o_icon_mail:before{content:"\f199"}.o_icon-wordpress:before{content:"\f19a"}.o_icon-openid:before{content:"\f19b"}.o_icon-institution:before,.o_icon-bank:before,.o_icon-university:before{content:"\f19c"}.o_icon-mortar-board:before,.o_icon-graduation-cap:before{content:"\f19d"}.o_icon-yahoo:before{content:"\f19e"}.o_icon-google:before{content:"\f1a0"}.o_icon-reddit:before{content:"\f1a1"}.o_icon-reddit-square:before{content:"\f1a2"}.o_icon-stumbleupon-circle:before{content:"\f1a3"}.o_icon-stumbleupon:before{content:"\f1a4"}.o_icon-delicious:before,.o_icon_delicious:before{content:"\f1a5"}.o_icon-digg:before,.o_icon_digg:before{content:"\f1a6"}.o_icon-pied-piper-square:before,.o_icon-pied-piper:before{content:"\f1a7"}.o_icon-pied-piper-alt:before{content:"\f1a8"}.o_icon-drupal:before{content:"\f1a9"}.o_icon-joomla:before{content:"\f1aa"}.o_icon-language:before{content:"\f1ab"}.o_icon-fax:before{content:"\f1ac"}.o_icon-building:before{content:"\f1ad"}.o_icon-child:before{content:"\f1ae"}.o_icon-paw:before{content:"\f1b0"}.o_icon-spoon:before{content:"\f1b1"}.o_icon-cube:before,.o_icon_courseeditor:before,.o_CourseModule_icon:before{content:"\f1b2"}.o_icon-cubes:before,.o_st_icon:before{content:"\f1b3"}.o_icon-behance:before{content:"\f1b4"}.o_icon-behance-square:before{content:"\f1b5"}.o_icon-steam:before{content:"\f1b6"}.o_icon-steam-square:before{content:"\f1b7"}.o_icon-recycle:before{content:"\f1b8"}.o_icon-automobile:before,.o_icon-car:before{content:"\f1b9"}.o_icon-cab:before,.o_icon-taxi:before{content:"\f1ba"}.o_icon-tree:before{content:"\f1bb"}.o_icon-spotify:before{content:"\f1bc"}.o_icon-deviantart:before{content:"\f1bd"}.o_icon-soundcloud:before{content:"\f1be"}.o_icon-database:before,.o_icon_coursedb:before{content:"\f1c0"}.o_icon-file-pdf-o:before{content:"\f1c1"}.o_icon-file-word-o:before{content:"\f1c2"}.o_icon-file-excel-o:before{content:"\f1c3"}.o_icon-file-powerpoint-o:before{content:"\f1c4"}.o_icon-file-photo-o:before,.o_icon-file-picture-o:before,.o_icon-file-image-o:before{content:"\f1c5"}.o_icon-file-zip-o:before,.o_icon-file-archive-o:before{content:"\f1c6"}.o_icon-file-sound-o:before,.o_icon-file-audio-o:before{content:"\f1c7"}.o_icon-file-movie-o:before,.o_icon-file-video-o:before{content:"\f1c8"}.o_icon-file-code-o:before{content:"\f1c9"}.o_icon-vine:before{content:"\f1ca"}.o_icon-codepen:before{content:"\f1cb"}.o_icon-jsfiddle:before{content:"\f1cc"}.o_icon-life-bouy:before,.o_icon-life-saver:before,.o_icon-support:before,.o_icon-life-ring:before{content:"\f1cd"}.o_icon-circle-o-notch:before{content:"\f1ce"}.o_icon-ra:before,.o_icon-rebel:before{content:"\f1d0"}.o_icon-ge:before,.o_icon-empire:before{content:"\f1d1"}.o_icon-git-square:before{content:"\f1d2"}.o_icon-git:before{content:"\f1d3"}.o_icon-hacker-news:before{content:"\f1d4"}.o_icon-tencent-weibo:before{content:"\f1d5"}.o_icon-qq:before{content:"\f1d6"}.o_icon-wechat:before,.o_icon-weixin:before{content:"\f1d7"}.o_icon-send:before,.o_icon-paper-plane:before{content:"\f1d8"}.o_icon-send-o:before,.o_icon-paper-plane-o:before{content:"\f1d9"}.o_icon-history:before{content:"\f1da"}.o_icon-circle-thin:before,.o_icon_courseareas:before{content:"\f1db"}.o_icon-header:before{content:"\f1dc"}.o_icon-paragraph:before{content:"\f1dd"}.o_icon-sliders:before{content:"\f1de"}.o_icon-share-alt:before{content:"\f1e0"}.o_icon-share-alt-square:before{content:"\f1e1"}.o_icon-bomb:before{content:"\f1e2"}.o_icon_bookmark{color:#996633}.o_icon_bookmark_add{color:#999999}.o_icon_delete{color:#A87E7E}.o_icon_edit_metadata{color:#996633}.o_icon_help{cursor:help}.o_icon_new_document{color:pink}.o_icon_new_folder{color:violet}.o_icon_mandatory{color:#f0ad4e}.o_icon_managed{color:#999}.o_icon_read{color:green}.o_icon_readonly{color:red}.o_icon_status_available{color:#006633}.o_icon_status_dnd{color:#CCCC33}.o_icon_status_unavailable{color:#996633}.o_icon_to_read{color:blue}.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/dummy.png")}.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/dummy_small.png")}a.o_chelp{padding:1px 3px;font-size:10px;line-height:1.5;border-radius:2px}div.o_chelp_wrapper{position:relative}.o_undecorated:hover,a.o_icon:hover,.o_withEllipsis .o_morelink:hover,.o_withEllipsis .o_lesslink:hover,#o_main_wrapper #o_toplink: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_undecorated:focus,a.o_icon:focus,.o_withEllipsis .o_morelink:focus,.o_withEllipsis .o_lesslink:focus,#o_main_wrapper #o_toplink: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{text-decoration:none}.o_block{margin:0.75em 0}.o_nowrap{white-space:nowrap}.o_video{display:inline-block}.o_image{display:inline-block;max-width:100%}.o_rotate_90,#o_main_wrapper #o_main_container #o_main_center #o_offcanvas_toggle{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.o_segments_content{margin-top:20px}.o_withEllipsis .o_morelink,.o_withEllipsis .o_lesslink{display:none}.o_withEllipsis.o_hasOverflow .o_morelink{display:block}.o_withEllipsis.o_hasOverflow .o_lesslink{display:none}.o_withEllipsis.o_hasOverflow.o_showOverflow{height:auto !important}.o_withEllipsis.o_hasOverflow.o_showOverflow .o_morelink{display:none}.o_withEllipsis.o_hasOverflow.o_showOverflow .o_lesslink{display:block}.o_info,.o_note,.o_form .o_desc,.o_important,.o_warning,.o_form .o_warning,.o_error,.o_form .o_info{margin:20px 0;padding:20px;background-color:#eee;border-left:3px solid #d4d4d4}.o_info h2,.o_note h2,.o_form .o_desc h2,.o_important h2,.o_warning h2,.o_form .o_warning h2,.o_error h2,.o_form .o_info h2,.o_info h3,.o_note h3,.o_form .o_desc h3,.o_important h3,.o_warning h3,.o_form .o_warning h3,.o_error h3,.o_form .o_info h3,.o_info h4,.o_note h4,.o_form .o_desc h4,.o_important h4,.o_warning h4,.o_form .o_warning h4,.o_error h4,.o_form .o_info h4,.o_info h5,.o_note h5,.o_form .o_desc h5,.o_important h5,.o_warning h5,.o_form .o_warning h5,.o_error h5,.o_form .o_info h5{color:#bbbbbb}p.o_info,p.o_note,.o_form p.o_desc,p.o_important,p.o_warning,.o_form p.o_warning,p.o_error,.o_form p.o_info,div.o_info,div.o_note,.o_form div.o_desc,div.o_important,div.o_warning,.o_form div.o_warning,div.o_error,.o_form div.o_info{margin:20px 0}.o_note,.o_form .o_desc{background-color:#f4f8fa;border-color:#5bc0de}.o_note h2,.o_form .o_desc h2,.o_note h3,.o_form .o_desc h3,.o_note h4,.o_form .o_desc h4,.o_note h5,.o_form .o_desc h5{color:#5bc0de}p.o_note,.o_form p.o_desc,div.o_note,.o_form div.o_desc{margin:20px 0}.o_important{background-color:#FFF1A4;border-color:#F4D000}.o_important h2,.o_important h3,.o_important h4,.o_important h5{color:#F4D000}p.o_important,div.o_important{margin:20px 0}.o_warning,.o_form .o_warning{background-color:#FFD5AA;border-color:#FF9E3E}.o_warning h2,.o_form .o_warning h2,.o_warning h3,.o_form .o_warning h3,.o_warning h4,.o_form .o_warning h4,.o_warning h5,.o_form .o_warning h5{color:#FF9E3E}o.b_warning,div.o_warning,.o_form div.o_warning{margin:20px 0}.o_error{background-color:#fdf7f7;border-color:#d9534f}.o_error h2,.o_error h3,.o_error h4,.o_error h5{color:#d9534f}o.b_error,div.o_error{margin:20px 0}.b_border_box{border:1px solid #999;padding:1em;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px}p.b_border_box,div.b_border_box{margin:1em 0}table.b_grid{background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:2px 5px;border:1px solid #888}table.b_grid thead th{background:#ccc}table.b_grid tbody th{background:#eee}table.b_border{background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:2px 5px;border:1px solid #888}table.b_full{width:99.5%}table td{vertical-align:top}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_selected,p.b_selected,div.b_selected{font-weight:bold}.b_dimmed,p.b_dimmed,div.b_dimmed{zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=40);-moz-opacity:0.4;-khtml-opacity:0.4;opacity:0.4}.b_disabled,p.b_disabled,div.b_disabled{color:#999}.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.b_xsmall,sup,sub,p.b_xsmall,div.b_xsmall{font-size:80%}.b_small,small,p.b_small,div.b_small{font-size:90%}.b_large,p.b_large,div.b_large{font-size:110%}.b_xlarge,big,p.b_xlarge,div.b_xlarge{font-size:120%}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.o_ochre{color:#c8a959}.o_blue{color:#12223F}a.b_link_extern{background:transparent url("../../openolat/images/external_link_trimmed.png") no-repeat right top;padding-right:13px}a.b_link_mailto{background:transparent url("../../openolat/images/mail_small.png") no-repeat left center;padding-left:18px}a.b_link_forward{background:transparent url("../../openolat/images/arrow_right.png") no-repeat right center;padding-right:18px}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_centered{display:block;margin:0 auto 2em auto}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}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:60px}#o_navbar_wrapper{z-index:4}#o_navbar_wrapper #o_navbar_container{position:relative}#o_navbar_wrapper #o_navbar_container a.o_navbar-brand{font-size:40px;vertical-align:top;font-weight:bold;color:#31729B}#o_navbar_wrapper #o_navbar_container a.o_navbar-brand:after{content:"\221E"}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs li a{padding-right:30px}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close{position:absolute;top:15px;right:0.5em;padding:0;width:1em;height:1em}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close i:before{color:#A87E7E}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close:hover i:before{color:#CC0000}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_langchooser{color:#777;padding:15px}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_langchooser form span+div{display:inline}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_help a i{margin-right:0.4em}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_my_menu .dropdown-toggle{padding-left:45px}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_my_menu img{position:absolute;left:7px;top:10px;height:30px;width:30px}.o_navbar{position:relative;min-height:50px;margin-bottom:0;border:1px solid transparent}.o_navbar:before,.o_navbar:after{content:" ";display:table}.o_navbar:after{clear:both}.o_navbar-collapse{max-height:100%;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}.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;border-top:0;box-shadow:none;margin-top:10px;margin-right:-15px;margin-left:-15px}.o_navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.o_navbar-brand:hover,.o_navbar-brand:focus{text-decoration:none}.o_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}.o_navbar-toggle:focus{outline:none}.o_navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.o_navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.o_navbar-nav{margin:7.5px -15px}.o_navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}.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 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 (max-width: 767px){.o_navbar-form .form-group{margin-bottom:5px}} + */@font-face{font-family:'FontAwesome';src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?v=4.1.0");src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../../../font-awesome/fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../../../font-awesome/fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_icon-lg,.o_icon_help{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,.o_icon-li.o_icon_help{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right,div.o_chelp_wrapper,.o_withEllipsis .o_ellipsis_links,#o_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete,.o_repo_details .o_lead .o_media{float:right}.pull-left,#o_main_wrapper #o_main_container #o_main_left,#o_navbar_imclient #o_im_message,#o_navbar_imclient #o_im_status,#o_navbar_imclient #o_im_summary,.o_comments .o_comment_wrapper .o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper,.o_catalog .o_sublevels .o_sublevel,.o_repo_details .o_social .o_rating_wrapper{float:left}.o_icon.pull-left,#o_main_wrapper #o_main_container .o_icon#o_main_left,#o_navbar_imclient .o_icon#o_im_message,#o_navbar_imclient .o_icon#o_im_status,#o_navbar_imclient .o_icon#o_im_summary,.o_comments .o_comment_wrapper .o_icon.o_avatar,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_icon.o_rating_wrapper,.o_catalog .o_sublevels .o_icon.o_sublevel,.o_repo_details .o_social .o_icon.o_rating_wrapper{margin-right:.3em}.o_icon.pull-right,div.o_icon.o_chelp_wrapper,.o_withEllipsis .o_icon.o_ellipsis_links,#o_main_wrapper #o_main_container .o_icon#o_main_right,.o_comments .o_comment_wrapper .o_icon.o_reply,.o_comments .o_comment_wrapper .o_icon.o_delete,.o_repo_details .o_lead .o_icon.o_media{margin-left:.3em}.o_icon-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes 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);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.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-glass:before{content:"\f000"}.o_icon-music:before{content:"\f001"}.o_icon-search:before,.o_icon_search:before{content:"\f002"}.o_icon-envelope-o:before,.o_co_icon:before{content:"\f003"}.o_icon-heart:before{content:"\f004"}.o_icon-star:before,.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:"\f005"}.o_icon-star-o:before,.o_icon_rating_off:before{content:"\f006"}.o_icon-user:before{content:"\f007"}.o_icon-film:before{content:"\f008"}.o_icon-th-large:before{content:"\f009"}.o_icon-th:before{content:"\f00a"}.o_icon-th-list:before{content:"\f00b"}.o_icon-check:before,.o_icon_check:before{content:"\f00c"}.o_icon-times:before,.o_icon_close:before,.o_icon_close_tab:before,.o_icon_close_tool:before{content:"\f00d"}.o_icon-search-plus:before{content:"\f00e"}.o_icon-search-minus:before{content:"\f010"}.o_icon-power-off:before{content:"\f011"}.o_icon-signal:before{content:"\f012"}.o_icon-gear:before,.o_icon_customize:before,.o_icon_tool:before,.o_icon-cog:before{content:"\f013"}.o_icon-trash-o:before,.o_icon_delete_item:before{content:"\f014"}.o_icon-home:before{content:"\f015"}.o_icon-file-o:before{content:"\f016"}.o_icon-clock-o:before,.o_icon_expenditure:before{content:"\f017"}.o_icon-road:before{content:"\f018"}.o_icon-download:before,.o_icon_archive_tool:before,.o_icon_download:before{content:"\f019"}.o_icon-arrow-circle-o-down:before{content:"\f01a"}.o_icon-arrow-circle-o-up:before{content:"\f01b"}.o_icon-inbox:before{content:"\f01c"}.o_icon-play-circle-o:before{content:"\f01d"}.o_icon-rotate-right:before,.o_icon-repeat:before{content:"\f01e"}.o_icon-refresh:before,.o_icon_refresh:before{content:"\f021"}.o_icon-list-alt:before{content:"\f022"}.o_icon-lock:before,.o_ac_membersonly_icon:before,.o_midlock:before{content:"\f023"}.o_icon-flag:before{content:"\f024"}.o_icon-headphones:before{content:"\f025"}.o_icon-volume-off:before{content:"\f026"}.o_icon-volume-down:before{content:"\f027"}.o_icon-volume-up:before{content:"\f028"}.o_icon-qrcode:before{content:"\f029"}.o_icon-barcode:before{content:"\f02a"}.o_icon-tag:before{content:"\f02b"}.o_icon-tags:before{content:"\f02c"}.o_icon-book:before{content:"\f02d"}.o_icon-bookmark:before,.o_icon_bookmark:before{content:"\f02e"}.o_icon-print:before,.o_icon_print:before{content:"\f02f"}.o_icon-camera:before{content:"\f030"}.o_icon-font:before{content:"\f031"}.o_icon-bold:before{content:"\f032"}.o_icon-italic:before{content:"\f033"}.o_icon-text-height:before{content:"\f034"}.o_icon-text-width:before{content:"\f035"}.o_icon-align-left:before{content:"\f036"}.o_icon-align-center:before{content:"\f037"}.o_icon-align-right:before{content:"\f038"}.o_icon-align-justify:before{content:"\f039"}.o_icon-list:before,.o_icon_list:before{content:"\f03a"}.o_icon-dedent:before,.o_icon-outdent:before{content:"\f03b"}.o_icon-indent:before{content:"\f03c"}.o_icon-video-camera:before,.o_FileResource-PODCAST_icon:before,.o_podcast_icon:before{content:"\f03d"}.o_icon-photo:before,.o_icon-image:before,.o_icon-picture-o:before{content:"\f03e"}.o_icon-pencil:before,.o_icon_notes:before{content:"\f040"}.o_icon-map-marker:before{content:"\f041"}.o_icon-adjust:before{content:"\f042"}.o_icon-tint:before{content:"\f043"}.o_icon-edit:before,.o_icon_edit:before,.o_icon_edit_file:before,.o_icon_edit_metadata:before,.o_icon_readonly:before,.o_icon_readwrite:before,.o_icon-pencil-square-o:before,.o_FileResource-TEST_icon:before,.o_iqtest_icon:before,.o_iqself_icon:before{content:"\f044"}.o_icon-share-square-o:before{content:"\f045"}.o_icon-check-square-o:before,.o_cl_icon:before{content:"\f046"}.o_icon-arrows:before,.o_icon_move:before{content:"\f047"}.o_icon-step-backward:before{content:"\f048"}.o_icon-fast-backward:before{content:"\f049"}.o_icon-backward:before{content:"\f04a"}.o_icon-play:before{content:"\f04b"}.o_icon-pause:before{content:"\f04c"}.o_icon-stop:before{content:"\f04d"}.o_icon-forward:before{content:"\f04e"}.o_icon-fast-forward:before{content:"\f050"}.o_icon-step-forward:before{content:"\f051"}.o_icon-eject:before{content:"\f052"}.o_icon-chevron-left:before{content:"\f053"}.o_icon-chevron-right:before,.o_icon_start:before{content:"\f054"}.o_icon-plus-circle:before{content:"\f055"}.o_icon-minus-circle:before,.o_icon_delete:before{content:"\f056"}.o_icon-times-circle:before,.o_icon_failed:before{content:"\f057"}.o_icon-check-circle:before,.o_icon_passed:before,.o_midpub:before{content:"\f058"}.o_icon-question-circle:before,.o_icon_help:before{content:"\f059"}.o_icon-info-circle:before,.o_icon_impress:before,.o_infomsg_icon:before{content:"\f05a"}.o_icon-crosshairs:before{content:"\f05b"}.o_icon-times-circle-o:before,.o_icon_status_unavailable:before{content:"\f05c"}.o_icon-check-circle-o:before{content:"\f05d"}.o_icon-ban:before{content:"\f05e"}.o_icon-arrow-left:before{content:"\f060"}.o_icon-arrow-right:before{content:"\f061"}.o_icon-arrow-up:before{content:"\f062"}.o_icon-arrow-down:before{content:"\f063"}.o_icon-mail-forward:before,.o_icon-share:before,.o_icon_publish:before{content:"\f064"}.o_icon-expand:before{content:"\f065"}.o_icon-compress:before{content:"\f066"}.o_icon-plus:before{content:"\f067"}.o_icon-minus:before{content:"\f068"}.o_icon-asterisk:before,.o_icon_mandatory:before{content:"\f069"}.o_icon-exclamation-circle:before{content:"\f06a"}.o_icon-gift:before,.o_ac_free_icon:before{content:"\f06b"}.o_icon-leaf:before{content:"\f06c"}.o_icon-fire:before{content:"\f06d"}.o_icon-eye:before,.o_icon_details:before,.o_icon_preview:before{content:"\f06e"}.o_icon-eye-slash:before{content:"\f070"}.o_icon-warning:before,.o_midwarn:before,.o_miderr:before,.o_icon-exclamation-triangle:before{content:"\f071"}.o_icon-plane:before{content:"\f072"}.o_icon-calendar:before,.o_icon_calendar:before,.o_icon_lifecycle:before,.o_cal_icon:before{content:"\f073"}.o_icon-random:before{content:"\f074"}.o_icon-comment:before,.o_icon_status_chat:before{content:"\f075"}.o_icon-magnet:before{content:"\f076"}.o_icon-chevron-up:before,.o_icon_top:before{content:"\f077"}.o_icon-chevron-down:before{content:"\f078"}.o_icon-retweet:before,.o_icon_managed:before{content:"\f079"}.o_icon-shopping-cart:before{content:"\f07a"}.o_icon-folder:before{content:"\f07b"}.o_icon-folder-open:before{content:"\f07c"}.o_icon-arrows-v:before{content:"\f07d"}.o_icon-arrows-h:before{content:"\f07e"}.o_icon-bar-chart-o:before{content:"\f080"}.o_icon-twitter-square:before,.o_icon_twitter:before{content:"\f081"}.o_icon-facebook-square:before,.o_icon_facebook:before{content:"\f082"}.o_icon-camera-retro:before{content:"\f083"}.o_icon-key:before,.o_ac_token_icon:before{content:"\f084"}.o_icon-gears:before,.o_icon_settings:before,.o_icon-cogs:before{content:"\f085"}.o_icon-comments:before,.o_icon_comments:before{content:"\f086"}.o_icon-thumbs-o-up:before,.o_ms_icon:before{content:"\f087"}.o_icon-thumbs-o-down:before{content:"\f088"}.o_icon-star-half:before{content:"\f089"}.o_icon-heart-o:before{content:"\f08a"}.o_icon-sign-out:before,.o_icon_logout:before{content:"\f08b"}.o_icon-linkedin-square:before{content:"\f08c"}.o_icon-thumb-tack:before{content:"\f08d"}.o_icon-external-link:before,.o_icon_content_popup:before,.o_FileResource.SHAREDFOLDER:before,.o_tu_icon:before,.o_lti_icon:before{content:"\f08e"}.o_icon-sign-in:before,.o_icon_login:before,.o_en_icon:before{content:"\f090"}.o_icon-trophy:before,.o_icon_assessment_tool:before{content:"\f091"}.o_icon-github-square:before{content:"\f092"}.o_icon-upload:before,.o_icon_upload:before{content:"\f093"}.o_icon-lemon-o:before{content:"\f094"}.o_icon-phone:before{content:"\f095"}.o_icon-square-o:before{content:"\f096"}.o_icon-bookmark-o:before,.o_icon_bookmark_add:before{content:"\f097"}.o_icon-phone-square:before{content:"\f098"}.o_icon-twitter:before{content:"\f099"}.o_icon-facebook:before{content:"\f09a"}.o_icon-github:before{content:"\f09b"}.o_icon-unlock:before{content:"\f09c"}.o_icon-credit-card:before,.o_ac_paypal_icon:before{content:"\f09d"}.o_icon-rss:before{content:"\f09e"}.o_icon-hdd-o:before{content:"\f0a0"}.o_icon-bullhorn:before,.o_FileResource-BLOG_icon:before,.o_blog_icon:before{content:"\f0a1"}.o_icon-bell:before{content:"\f0f3"}.o_icon-certificate:before,.o_icon_certificate:before{content:"\f0a3"}.o_icon-hand-o-right:before{content:"\f0a4"}.o_icon-hand-o-left:before{content:"\f0a5"}.o_icon-hand-o-up:before{content:"\f0a6"}.o_icon-hand-o-down:before{content:"\f0a7"}.o_icon-arrow-circle-left:before{content:"\f0a8"}.o_icon-arrow-circle-right:before{content:"\f0a9"}.o_icon-arrow-circle-up:before{content:"\f0aa"}.o_icon-arrow-circle-down:before{content:"\f0ab"}.o_icon-globe:before,.o_icon_language:before,.o_FileResource-WIKI_icon:before,.o_wiki_icon:before{content:"\f0ac"}.o_icon-wrench:before{content:"\f0ad"}.o_icon-tasks:before,.o_ta_icon:before{content:"\f0ae"}.o_icon-filter:before,.o_icon_filter:before{content:"\f0b0"}.o_icon-briefcase:before{content:"\f0b1"}.o_icon-arrows-alt:before{content:"\f0b2"}.o_icon-group:before,.o_ac_group_icon:before,.o_icon-users:before,.o_icon_membersmanagement:before,.o_cmembers_icon:before{content:"\f0c0"}.o_icon-chain:before,.o_icon-link:before,.o_icon_link:before,.o_ll_icon:before{content:"\f0c1"}.o_icon-cloud:before{content:"\f0c2"}.o_icon-flask:before{content:"\f0c3"}.o_icon-cut:before,.o_icon-scissors:before{content:"\f0c4"}.o_icon-copy:before,.o_icon_copy:before,.o_icon-files-o:before,.o_dialog_icon:before{content:"\f0c5"}.o_icon-paperclip:before{content:"\f0c6"}.o_icon-save:before,.o_icon-floppy-o:before{content:"\f0c7"}.o_icon-square:before{content:"\f0c8"}.o_icon-navicon:before,.o_icon-reorder:before,.o_icon-bars:before{content:"\f0c9"}.o_icon-list-ul:before{content:"\f0ca"}.o_icon-list-ol:before{content:"\f0cb"}.o_icon-strikethrough:before{content:"\f0cc"}.o_icon-underline:before{content:"\f0cd"}.o_icon-table:before,.o_icon_table:before{content:"\f0ce"}.o_icon-magic:before,.o_icon_wizard:before{content:"\f0d0"}.o_icon-truck:before{content:"\f0d1"}.o_icon-pinterest:before{content:"\f0d2"}.o_icon-pinterest-square:before{content:"\f0d3"}.o_icon-google-plus-square:before,.o_icon_google:before{content:"\f0d4"}.o_icon-google-plus:before{content:"\f0d5"}.o_icon-money:before{content:"\f0d6"}.o_icon-caret-down:before,.o_icon_close_tree:before{content:"\f0d7"}.o_icon-caret-up:before{content:"\f0d8"}.o_icon-caret-left:before{content:"\f0d9"}.o_icon-caret-right:before,.o_icon_open_tree:before{content:"\f0da"}.o_icon-columns:before{content:"\f0db"}.o_icon-unsorted:before,.o_icon-sort:before,.o_icon_sort:before{content:"\f0dc"}.o_icon-sort-down:before,.o_icon-sort-desc:before,.o_icon_sort_desc:before{content:"\f0dd"}.o_icon-sort-up:before,.o_icon-sort-asc:before,.o_icon_sort_asc:before{content:"\f0de"}.o_icon-envelope:before,.o_icon_message:before{content:"\f0e0"}.o_icon-linkedin:before{content:"\f0e1"}.o_icon-rotate-left:before,.o_icon-undo:before{content:"\f0e2"}.o_icon-legal:before,.o_icon-gavel:before{content:"\f0e3"}.o_icon-dashboard:before,.o_icon-tachometer:before,.o_icon_statistics_tool:before{content:"\f0e4"}.o_icon-comment-o:before,.o_icon_chat:before,.o_icon_comments_none:before{content:"\f0e5"}.o_icon-comments-o:before,.o_fo_icon:before{content:"\f0e6"}.o_icon-flash:before,.o_icon-bolt:before{content:"\f0e7"}.o_icon-sitemap:before{content:"\f0e8"}.o_icon-umbrella:before{content:"\f0e9"}.o_icon-paste:before,.o_icon-clipboard:before{content:"\f0ea"}.o_icon-lightbulb-o:before{content:"\f0eb"}.o_icon-exchange:before{content:"\f0ec"}.o_icon-cloud-download:before{content:"\f0ed"}.o_icon-cloud-upload:before{content:"\f0ee"}.o_icon-user-md:before{content:"\f0f0"}.o_icon-stethoscope:before{content:"\f0f1"}.o_icon-suitcase:before{content:"\f0f2"}.o_icon-bell-o:before{content:"\f0a2"}.o_icon-coffee:before{content:"\f0f4"}.o_icon-cutlery:before{content:"\f0f5"}.o_icon-file-text-o:before,.o_sp_icon:before,.o_cp_item:before{content:"\f0f6"}.o_icon-building-o:before{content:"\f0f7"}.o_icon-hospital-o:before{content:"\f0f8"}.o_icon-ambulance:before{content:"\f0f9"}.o_icon-medkit:before{content:"\f0fa"}.o_icon-fighter-jet:before,.o_icon_new_document:before,.o_icon_new_folder:before,.o_icon_read:before,.o_icon_to_read:before{content:"\f0fb"}.o_icon-beer:before{content:"\f0fc"}.o_icon-h-square:before{content:"\f0fd"}.o_icon-plus-square:before{content:"\f0fe"}.o_icon-angle-double-left:before,.o_icon_move_left:before{content:"\f100"}.o_icon-angle-double-right:before,.o_icon_move_right:before{content:"\f101"}.o_icon-angle-double-up:before,.o_icon_move_up:before{content:"\f102"}.o_icon-angle-double-down:before,.o_icon_move_down:before{content:"\f103"}.o_icon-angle-left:before{content:"\f104"}.o_icon-angle-right:before{content:"\f105"}.o_icon-angle-up:before{content:"\f106"}.o_icon-angle-down:before{content:"\f107"}.o_icon-desktop:before,.o_vc_icon:before,.o_vitero_icon:before,.o_openmeetings_icon:before{content:"\f108"}.o_icon-laptop:before{content:"\f109"}.o_icon-tablet:before{content:"\f10a"}.o_icon-mobile-phone:before,.o_icon-mobile:before{content:"\f10b"}.o_icon-circle-o:before,.o_projectbroker_icon:before{content:"\f10c"}.o_icon-quote-left:before{content:"\f10d"}.o_icon-quote-right:before{content:"\f10e"}.o_icon-spinner:before{content:"\f110"}.o_icon-circle:before,.o_icon_status_available:before{content:"\f111"}.o_icon-mail-reply:before,.o_icon-reply:before{content:"\f112"}.o_icon-github-alt:before{content:"\f113"}.o_icon-folder-o:before,.o_icon_coursefolder:before{content:"\f114"}.o_icon-folder-open-o:before,.o_bc_icon:before{content:"\f115"}.o_icon-smile-o:before{content:"\f118"}.o_icon-frown-o:before{content:"\f119"}.o_icon-meh-o:before,.o_FileResource-SURVEY_icon:before,.o_iqsurv_icon:before{content:"\f11a"}.o_icon-gamepad:before{content:"\f11b"}.o_icon-keyboard-o:before{content:"\f11c"}.o_icon-flag-o:before{content:"\f11d"}.o_icon-flag-checkered:before{content:"\f11e"}.o_icon-terminal:before{content:"\f120"}.o_icon-code:before{content:"\f121"}.o_icon-mail-reply-all:before,.o_icon-reply-all:before{content:"\f122"}.o_icon-star-half-empty:before,.o_icon-star-half-full:before,.o_icon-star-half-o:before{content:"\f123"}.o_icon-location-arrow:before{content:"\f124"}.o_icon-crop:before{content:"\f125"}.o_icon-code-fork:before{content:"\f126"}.o_icon-unlink:before,.o_icon-chain-broken:before{content:"\f127"}.o_icon-question:before{content:"\f128"}.o_icon-info:before{content:"\f129"}.o_icon-exclamation:before,.o_icon_error:before{content:"\f12a"}.o_icon-superscript:before{content:"\f12b"}.o_icon-subscript:before{content:"\f12c"}.o_icon-eraser:before,.o_middel:before{content:"\f12d"}.o_icon-puzzle-piece:before,.o_EPStructuredMapTemplate_icon:before,.o_ep_icon:before{content:"\f12e"}.o_icon-microphone:before{content:"\f130"}.o_icon-microphone-slash:before{content:"\f131"}.o_icon-shield:before{content:"\f132"}.o_icon-calendar-o:before{content:"\f133"}.o_icon-fire-extinguisher:before{content:"\f134"}.o_icon-rocket:before{content:"\f135"}.o_icon-maxcdn:before{content:"\f136"}.o_icon-chevron-circle-left:before{content:"\f137"}.o_icon-chevron-circle-right:before{content:"\f138"}.o_icon-chevron-circle-up:before{content:"\f139"}.o_icon-chevron-circle-down:before{content:"\f13a"}.o_icon-html5:before{content:"\f13b"}.o_icon-css3:before{content:"\f13c"}.o_icon-anchor:before{content:"\f13d"}.o_icon-unlock-alt:before{content:"\f13e"}.o_icon-bullseye:before{content:"\f140"}.o_icon-ellipsis-h:before{content:"\f141"}.o_icon-ellipsis-v:before{content:"\f142"}.o_icon-rss-square:before{content:"\f143"}.o_icon-play-circle:before{content:"\f144"}.o_icon-ticket:before{content:"\f145"}.o_icon-minus-square:before{content:"\f146"}.o_icon-minus-square-o:before{content:"\f147"}.o_icon-level-up:before{content:"\f148"}.o_icon-level-down:before{content:"\f149"}.o_icon-check-square:before{content:"\f14a"}.o_icon-pencil-square:before{content:"\f14b"}.o_icon-external-link-square:before{content:"\f14c"}.o_icon-share-square:before{content:"\f14d"}.o_icon-compass:before{content:"\f14e"}.o_icon-toggle-down:before,.o_icon_show_more:before,.o_icon-caret-square-o-down:before{content:"\f150"}.o_icon-toggle-up:before,.o_icon_show_less:before,.o_icon-caret-square-o-up:before{content:"\f151"}.o_icon-toggle-right:before,.o_icon-caret-square-o-right:before{content:"\f152"}.o_icon-euro:before,.o_icon-eur:before{content:"\f153"}.o_icon-gbp:before{content:"\f154"}.o_icon-dollar:before,.o_icon-usd:before{content:"\f155"}.o_icon-rupee:before,.o_icon-inr:before{content:"\f156"}.o_icon-cny:before,.o_icon-rmb:before,.o_icon-yen:before,.o_icon-jpy:before{content:"\f157"}.o_icon-ruble:before,.o_icon-rouble:before,.o_icon-rub:before{content:"\f158"}.o_icon-won:before,.o_icon-krw:before{content:"\f159"}.o_icon-bitcoin:before,.o_icon-btc:before{content:"\f15a"}.o_icon-file:before{content:"\f15b"}.o_icon-file-text:before{content:"\f15c"}.o_icon-sort-alpha-asc:before{content:"\f15d"}.o_icon-sort-alpha-desc:before{content:"\f15e"}.o_icon-sort-amount-asc:before,.o_icon_sort_menu:before{content:"\f160"}.o_icon-sort-amount-desc:before{content:"\f161"}.o_icon-sort-numeric-asc:before{content:"\f162"}.o_icon-sort-numeric-desc:before{content:"\f163"}.o_icon-thumbs-up:before{content:"\f164"}.o_icon-thumbs-down:before{content:"\f165"}.o_icon-youtube-square:before{content:"\f166"}.o_icon-youtube:before{content:"\f167"}.o_icon-xing:before{content:"\f168"}.o_icon-xing-square:before{content:"\f169"}.o_icon-youtube-play:before{content:"\f16a"}.o_icon-dropbox:before{content:"\f16b"}.o_icon-stack-overflow:before{content:"\f16c"}.o_icon-instagram:before{content:"\f16d"}.o_icon-flickr:before{content:"\f16e"}.o_icon-adn:before{content:"\f170"}.o_icon-bitbucket:before{content:"\f171"}.o_icon-bitbucket-square:before{content:"\f172"}.o_icon-tumblr:before{content:"\f173"}.o_icon-tumblr-square:before{content:"\f174"}.o_icon-long-arrow-down:before{content:"\f175"}.o_icon-long-arrow-up:before{content:"\f176"}.o_icon-long-arrow-left:before{content:"\f177"}.o_icon-long-arrow-right:before{content:"\f178"}.o_icon-apple:before{content:"\f179"}.o_icon-windows:before{content:"\f17a"}.o_icon-android:before{content:"\f17b"}.o_icon-linux:before{content:"\f17c"}.o_icon-dribbble:before{content:"\f17d"}.o_icon-skype:before{content:"\f17e"}.o_icon-foursquare:before{content:"\f180"}.o_icon-trello:before{content:"\f181"}.o_icon-female:before{content:"\f182"}.o_icon-male:before{content:"\f183"}.o_icon-gittip:before{content:"\f184"}.o_icon-sun-o:before{content:"\f185"}.o_icon-moon-o:before{content:"\f186"}.o_icon-archive:before,.o_FileResource-IMSCP_icon:before,.o_FileResource-SCORMCP_icon:before,.o_cp_icon:before,.o_scorm_icon:before{content:"\f187"}.o_icon-bug:before,.o_icon_dev:before{content:"\f188"}.o_icon-vk:before{content:"\f189"}.o_icon-weibo:before{content:"\f18a"}.o_icon-renren:before{content:"\f18b"}.o_icon-pagelines:before{content:"\f18c"}.o_icon-stack-exchange:before{content:"\f18d"}.o_icon-arrow-circle-o-right:before{content:"\f18e"}.o_icon-arrow-circle-o-left:before{content:"\f190"}.o_icon-toggle-left:before,.o_icon-caret-square-o-left:before{content:"\f191"}.o_icon-dot-circle-o:before,.o_icon_status_dnd:before{content:"\f192"}.o_icon-wheelchair:before{content:"\f193"}.o_icon-vimeo-square:before{content:"\f194"}.o_icon-turkish-lira:before,.o_icon-try:before{content:"\f195"}.o_icon-plus-square-o:before{content:"\f196"}.o_icon-space-shuttle:before{content:"\f197"}.o_icon-slack:before{content:"\f198"}.o_icon-envelope-square:before,.o_icon_mail:before{content:"\f199"}.o_icon-wordpress:before{content:"\f19a"}.o_icon-openid:before{content:"\f19b"}.o_icon-institution:before,.o_icon-bank:before,.o_icon-university:before{content:"\f19c"}.o_icon-mortar-board:before,.o_icon-graduation-cap:before{content:"\f19d"}.o_icon-yahoo:before{content:"\f19e"}.o_icon-google:before{content:"\f1a0"}.o_icon-reddit:before{content:"\f1a1"}.o_icon-reddit-square:before{content:"\f1a2"}.o_icon-stumbleupon-circle:before{content:"\f1a3"}.o_icon-stumbleupon:before{content:"\f1a4"}.o_icon-delicious:before,.o_icon_delicious:before{content:"\f1a5"}.o_icon-digg:before,.o_icon_digg:before{content:"\f1a6"}.o_icon-pied-piper-square:before,.o_icon-pied-piper:before{content:"\f1a7"}.o_icon-pied-piper-alt:before{content:"\f1a8"}.o_icon-drupal:before{content:"\f1a9"}.o_icon-joomla:before{content:"\f1aa"}.o_icon-language:before{content:"\f1ab"}.o_icon-fax:before{content:"\f1ac"}.o_icon-building:before{content:"\f1ad"}.o_icon-child:before{content:"\f1ae"}.o_icon-paw:before{content:"\f1b0"}.o_icon-spoon:before{content:"\f1b1"}.o_icon-cube:before,.o_icon_courseeditor:before,.o_CourseModule_icon:before{content:"\f1b2"}.o_icon-cubes:before,.o_st_icon:before{content:"\f1b3"}.o_icon-behance:before{content:"\f1b4"}.o_icon-behance-square:before{content:"\f1b5"}.o_icon-steam:before{content:"\f1b6"}.o_icon-steam-square:before{content:"\f1b7"}.o_icon-recycle:before{content:"\f1b8"}.o_icon-automobile:before,.o_icon-car:before{content:"\f1b9"}.o_icon-cab:before,.o_icon-taxi:before{content:"\f1ba"}.o_icon-tree:before{content:"\f1bb"}.o_icon-spotify:before{content:"\f1bc"}.o_icon-deviantart:before{content:"\f1bd"}.o_icon-soundcloud:before{content:"\f1be"}.o_icon-database:before,.o_icon_coursedb:before{content:"\f1c0"}.o_icon-file-pdf-o:before{content:"\f1c1"}.o_icon-file-word-o:before{content:"\f1c2"}.o_icon-file-excel-o:before{content:"\f1c3"}.o_icon-file-powerpoint-o:before{content:"\f1c4"}.o_icon-file-photo-o:before,.o_icon-file-picture-o:before,.o_icon-file-image-o:before{content:"\f1c5"}.o_icon-file-zip-o:before,.o_icon-file-archive-o:before{content:"\f1c6"}.o_icon-file-sound-o:before,.o_icon-file-audio-o:before{content:"\f1c7"}.o_icon-file-movie-o:before,.o_icon-file-video-o:before{content:"\f1c8"}.o_icon-file-code-o:before{content:"\f1c9"}.o_icon-vine:before{content:"\f1ca"}.o_icon-codepen:before{content:"\f1cb"}.o_icon-jsfiddle:before{content:"\f1cc"}.o_icon-life-bouy:before,.o_icon-life-saver:before,.o_icon-support:before,.o_icon-life-ring:before{content:"\f1cd"}.o_icon-circle-o-notch:before{content:"\f1ce"}.o_icon-ra:before,.o_icon-rebel:before{content:"\f1d0"}.o_icon-ge:before,.o_icon-empire:before{content:"\f1d1"}.o_icon-git-square:before{content:"\f1d2"}.o_icon-git:before{content:"\f1d3"}.o_icon-hacker-news:before{content:"\f1d4"}.o_icon-tencent-weibo:before{content:"\f1d5"}.o_icon-qq:before{content:"\f1d6"}.o_icon-wechat:before,.o_icon-weixin:before{content:"\f1d7"}.o_icon-send:before,.o_icon-paper-plane:before{content:"\f1d8"}.o_icon-send-o:before,.o_icon-paper-plane-o:before{content:"\f1d9"}.o_icon-history:before{content:"\f1da"}.o_icon-circle-thin:before,.o_icon_courseareas:before{content:"\f1db"}.o_icon-header:before{content:"\f1dc"}.o_icon-paragraph:before{content:"\f1dd"}.o_icon-sliders:before{content:"\f1de"}.o_icon-share-alt:before{content:"\f1e0"}.o_icon-share-alt-square:before{content:"\f1e1"}.o_icon-bomb:before{content:"\f1e2"}.o_icon_bookmark{color:#996633}.o_icon_bookmark_add{color:#999999}.o_icon_delete{color:#A87E7E}.o_icon_edit_metadata{color:#996633}.o_icon_help{cursor:help}.o_icon_new_document{color:pink}.o_icon_new_folder{color:violet}.o_icon_mandatory{color:#f0ad4e}.o_icon_managed{color:#999}.o_icon_read{color:green}.o_icon_readonly{color:red}.o_icon_status_available{color:#006633}.o_icon_status_dnd{color:#CCCC33}.o_icon_status_unavailable{color:#996633}.o_icon_to_read{color:blue}.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/dummy.png")}.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/dummy_small.png")}a.o_chelp{padding:1px 3px;font-size:10px;line-height:1.5;border-radius:2px}div.o_chelp_wrapper{position:relative}.o_undecorated:hover,a.o_icon:hover,.o_withEllipsis .o_morelink:hover,.o_withEllipsis .o_lesslink:hover,#o_main_wrapper #o_toplink: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_undecorated:focus,a.o_icon:focus,.o_withEllipsis .o_morelink:focus,.o_withEllipsis .o_lesslink:focus,#o_main_wrapper #o_toplink: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{text-decoration:none}.o_block{margin:0.75em 0}.o_nowrap{white-space:nowrap}.o_video{display:inline-block}.o_image{display:inline-block;max-width:100%}.o_rotate_90,#o_main_wrapper #o_main_container #o_main_center #o_offcanvas_toggle{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.o_segments_content{margin-top:20px}.o_withEllipsis .o_morelink,.o_withEllipsis .o_lesslink{display:none}.o_withEllipsis.o_hasOverflow .o_morelink{display:block}.o_withEllipsis.o_hasOverflow .o_lesslink{display:none}.o_withEllipsis.o_hasOverflow.o_showOverflow{height:auto !important}.o_withEllipsis.o_hasOverflow.o_showOverflow .o_morelink{display:none}.o_withEllipsis.o_hasOverflow.o_showOverflow .o_lesslink{display:block}.o_info,.o_note,.o_form .o_desc,.o_important,.o_warning,.o_form .o_warning,.o_error,.o_form .o_info{margin:20px 0;padding:20px;background-color:#eee;border-left:3px solid #d4d4d4}.o_info h2,.o_note h2,.o_form .o_desc h2,.o_important h2,.o_warning h2,.o_form .o_warning h2,.o_error h2,.o_form .o_info h2,.o_info h3,.o_note h3,.o_form .o_desc h3,.o_important h3,.o_warning h3,.o_form .o_warning h3,.o_error h3,.o_form .o_info h3,.o_info h4,.o_note h4,.o_form .o_desc h4,.o_important h4,.o_warning h4,.o_form .o_warning h4,.o_error h4,.o_form .o_info h4,.o_info h5,.o_note h5,.o_form .o_desc h5,.o_important h5,.o_warning h5,.o_form .o_warning h5,.o_error h5,.o_form .o_info h5{color:#bbbbbb}p.o_info,p.o_note,.o_form p.o_desc,p.o_important,p.o_warning,.o_form p.o_warning,p.o_error,.o_form p.o_info,div.o_info,div.o_note,.o_form div.o_desc,div.o_important,div.o_warning,.o_form div.o_warning,div.o_error,.o_form div.o_info{margin:20px 0}.o_note,.o_form .o_desc{background-color:#f4f8fa;border-color:#5bc0de}.o_note h2,.o_form .o_desc h2,.o_note h3,.o_form .o_desc h3,.o_note h4,.o_form .o_desc h4,.o_note h5,.o_form .o_desc h5{color:#5bc0de}p.o_note,.o_form p.o_desc,div.o_note,.o_form div.o_desc{margin:20px 0}.o_important{background-color:#FFF1A4;border-color:#F4D000}.o_important h2,.o_important h3,.o_important h4,.o_important h5{color:#F4D000}p.o_important,div.o_important{margin:20px 0}.o_warning,.o_form .o_warning{background-color:#FFD5AA;border-color:#FF9E3E}.o_warning h2,.o_form .o_warning h2,.o_warning h3,.o_form .o_warning h3,.o_warning h4,.o_form .o_warning h4,.o_warning h5,.o_form .o_warning h5{color:#FF9E3E}o.b_warning,div.o_warning,.o_form div.o_warning{margin:20px 0}.o_error{background-color:#fdf7f7;border-color:#d9534f}.o_error h2,.o_error h3,.o_error h4,.o_error h5{color:#d9534f}o.b_error,div.o_error{margin:20px 0}.b_border_box{border:1px solid #999;padding:1em;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px;-o-border-radius:2px}p.b_border_box,div.b_border_box{margin:1em 0}table.b_grid{background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:2px 5px;border:1px solid #888}table.b_grid thead th{background:#ccc}table.b_grid tbody th{background:#eee}table.b_border{background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:2px 5px;border:1px solid #888}table.b_full{width:99.5%}table td{vertical-align:top}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_selected,p.b_selected,div.b_selected{font-weight:bold}.b_dimmed,p.b_dimmed,div.b_dimmed{zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=40);-moz-opacity:0.4;-khtml-opacity:0.4;opacity:0.4}.b_disabled,p.b_disabled,div.b_disabled{color:#999}.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.b_xsmall,sup,sub,p.b_xsmall,div.b_xsmall{font-size:80%}.b_small,small,p.b_small,div.b_small{font-size:90%}.b_large,p.b_large,div.b_large{font-size:110%}.b_xlarge,big,p.b_xlarge,div.b_xlarge{font-size:120%}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.o_ochre{color:#c8a959}.o_blue{color:#12223F}a.b_link_extern{background:transparent url("../../openolat/images/external_link_trimmed.png") no-repeat right top;padding-right:13px}a.b_link_mailto{background:transparent url("../../openolat/images/mail_small.png") no-repeat left center;padding-left:18px}a.b_link_forward{background:transparent url("../../openolat/images/arrow_right.png") no-repeat right center;padding-right:18px}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_centered{display:block;margin:0 auto 2em auto}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}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:60px}#o_navbar_wrapper{z-index:4}#o_navbar_wrapper #o_navbar_container{position:relative}#o_navbar_wrapper #o_navbar_container a.o_navbar-brand{font-size:40px;vertical-align:top;font-weight:bold;color:#31729B}#o_navbar_wrapper #o_navbar_container a.o_navbar-brand:after{content:"\221E"}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs li a{padding-right:30px}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close{position:absolute;top:15px;right:0.5em;padding:0;width:1em;height:1em}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close i:before{color:#A87E7E}#o_navbar_wrapper #o_navbar_container .o_navbar_tabs .o_navbar_tab_close:hover i:before{color:#CC0000}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_langchooser{color:#777;padding:15px}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_langchooser form span+div{display:inline}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_help a i{margin-right:0.4em}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_my_menu .dropdown-toggle{padding-left:45px}#o_navbar_wrapper #o_navbar_container #o_navbar_tools #o_navbar_my_menu img{position:absolute;left:7px;top:10px;height:30px;width:30px}.o_navbar{position:relative;min-height:50px;margin-bottom:0;border:1px solid transparent}.o_navbar:before,.o_navbar:after{content:" ";display:table}.o_navbar:after{clear:both}.o_navbar-collapse{max-height:100%;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}.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;border-top:0;box-shadow:none;margin-top:10px;margin-right:-15px;margin-left:-15px}.o_navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.o_navbar-brand:hover,.o_navbar-brand:focus{text-decoration:none}.o_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}.o_navbar-toggle:focus{outline:none}.o_navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.o_navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.o_navbar-nav{margin:7.5px -15px}.o_navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}.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 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 (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,.btn-group-sm>a.o_navbar-btn.o_chelp{margin-top:10px;margin-bottom:10px}.o_navbar-btn.btn-xs,.btn-group-xs>.o_navbar-btn.btn,.btn-group-xs>a.o_navbar-btn.o_chelp{margin-top:14px;margin-bottom:14px}.o_navbar-text{margin-top:15px;margin-bottom:15px}.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_navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.o_navbar-default .o_navbar-brand{color:#777}.o_navbar-default .o_navbar-brand:hover,.o_navbar-default .o_navbar-brand:focus{color:#5e5e5e;background-color:transparent}.o_navbar-default .o_navbar-text{color:#777}.o_navbar-default .o_navbar-nav>li>a{color:#777}.o_navbar-default .o_navbar-nav>li>a:hover,.o_navbar-default .o_navbar-nav>li>a:focus{color:#333;background-color:transparent}.o_navbar-default .o_navbar-nav>.active>a,.o_navbar-default .o_navbar-nav>.active>a:hover,.o_navbar-default .o_navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar-default .o_navbar-nav>.disabled>a,.o_navbar-default .o_navbar-nav>.disabled>a:hover,.o_navbar-default .o_navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.o_navbar-default .o_navbar-toggle{border-color:#ddd}.o_navbar-default .o_navbar-toggle:hover,.o_navbar-default .o_navbar-toggle:focus{background-color:#ddd}.o_navbar-default .o_navbar-toggle .icon-bar{background-color:#888}.o_navbar-default .o_navbar-collapse,.o_navbar-default .o_navbar-form{border-color:#e7e7e7}.o_navbar-default .o_navbar-nav>.open>a,.o_navbar-default .o_navbar-nav>.open>a:hover,.o_navbar-default .o_navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}.o_navbar-default .o_navbar-link{color:#777}.o_navbar-default .o_navbar-link:hover{color:#333}.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>li>a{color:#777}.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>li>a:hover,.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.active>a,.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.active>a:hover,.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.disabled>a,.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.disabled>a:hover,.o_navbar-offcanvas.o_navbar-default .o_navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}.o_navbar-inverse{background-color:#222;border-color:#090909}.o_navbar-inverse .o_navbar-brand{color:#999}.o_navbar-inverse .o_navbar-brand:hover,.o_navbar-inverse .o_navbar-brand:focus{color:#fff;background-color:transparent}.o_navbar-inverse .o_navbar-text{color:#999}.o_navbar-inverse .o_navbar-nav>li>a{color:#999}.o_navbar-inverse .o_navbar-nav>li>a:hover,.o_navbar-inverse .o_navbar-nav>li>a:focus{color:#fff;background-color:transparent}.o_navbar-inverse .o_navbar-nav>.active>a,.o_navbar-inverse .o_navbar-nav>.active>a:hover,.o_navbar-inverse .o_navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.o_navbar-inverse .o_navbar-nav>.disabled>a,.o_navbar-inverse .o_navbar-nav>.disabled>a:hover,.o_navbar-inverse .o_navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.o_navbar-inverse .o_navbar-toggle{border-color:#333}.o_navbar-inverse .o_navbar-toggle:hover,.o_navbar-inverse .o_navbar-toggle:focus{background-color:#333}.o_navbar-inverse .o_navbar-toggle .icon-bar{background-color:#fff}.o_navbar-inverse .o_navbar-collapse,.o_navbar-inverse .o_navbar-form{border-color:#101010}.o_navbar-inverse .o_navbar-nav>.open>a,.o_navbar-inverse .o_navbar-nav>.open>a:hover,.o_navbar-inverse .o_navbar-nav>.open>a:focus{background-color:#090909;color:#fff}.o_navbar-inverse .o_navbar-nav .o_navbar-link{color:#999}.o_navbar-inverse .o_navbar-nav .o_navbar-link:hover{color:#fff}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu .divider{background-color:#090909}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>li>a{color:#999}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>li>a:hover,.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.active>a,.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.active>a:hover,.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.disabled>a,.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.disabled>a:hover,.o_navbar-inverse .o_navbar-offcanvas.o_navbar-inverse .o_navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}#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{position:absolute}#o_main_wrapper #o_main_container #o_main_left #o_main_left_content{padding:30px}#o_main_wrapper #o_main_container #o_main_right{position:relative;background:#999}#o_main_wrapper #o_main_container #o_main_right #o_main_right_content{padding:30px}#o_main_wrapper #o_main_container #o_main_center{position:relative}@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_offcanvas_toggle{position:absolute;left:-4em;top:0;left:-2em;top:1.7em;z-index:2}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:30px 15px}#o_main_wrapper #o_toplink{position:absolute;bottom:0;right:10px;text-align:center}@media (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:15px}} #o_footer_wrapper{position:absolute;bottom:0;width:100%;z-index:2;min-height:60px;background-color:#f5f5f5;color:#999;line-height:16px}#o_footer_wrapper a{color:#999}#o_footer_wrapper a:hover{color:#000}#o_footer_wrapper #o_footer_container{position:relative;padding-top:10px;min-height:60px;background:#f5f5f5}#o_footer_wrapper #o_footer_container #o_footer_user #o_counter{white-space:nowrap}#o_footer_wrapper #o_footer_container #o_footer_user #o_username{white-space:nowrap;margin-right:1em}#o_footer_wrapper #o_footer_container #o_footer_version{text-align:right}@media (max-width: 767px){#o_footer_wrapper #o_footer_container #o_footer_version{padding-top:10px;text-align:left}}#o_footer_wrapper #o_footer_container #o_footer_powered{text-align:center}#o_footer_wrapper #o_footer_container #o_footer_powered img{zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=60);-moz-opacity:0.6;-khtml-opacity:0.6;opacity:0.6}#o_footer_wrapper #o_footer_container #o_footer_powered img:hover{zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}@media (max-width: 767px){#o_footer_wrapper #o_footer_container #o_footer_powered{display:none}} #o_share{margin-top:10px;width:250px}#o_share a{margin:0 5px 0 0;float:left;zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=60);-moz-opacity:0.6;-khtml-opacity:0.6;opacity:0.6}#o_share a:hover{zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=100);-moz-opacity:1;-khtml-opacity:1;opacity:1}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:#999;border:1px solid #090909;min-height:100%;z-index:10;-webkit-transition:all .25s ease-out;-moz-transition:all .25s ease-out;-o-transition:all .25s ease-out;-m-transition:all .25s ease-out;transition:all .25s ease-out}#o_offcanvas_right:before,#o_offcanvas_right:after{content:" ";display:table}#o_offcanvas_right:after{clear:both}@media screen and (min-width: 1324px) and (max-width: 1574px){body.o_offcanvas_right_visible .o_container_offcanvas{left:-125px;max-width:1074px}}@media screen and (min-width: 1574px) and (max-width: 1824px){body.o_offcanvas_right_visible .o_container_offcanvas{left:-125px}}body.o_offcanvas_right_visible #o_offcanvas_right{right:0;-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)}@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%}}div.o_callout_overlay{position:fixed;top:0;left:0;width:100%;height:100%;zoom:1;background:#000;zoom:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=$percent)";filter:alpha(opacity=1);-moz-opacity:0.01;-khtml-opacity:0.01;opacity:0.01}.alert-fixed-top,.alert-fixed-bottom{position:fixed;width:100%;z-index:1035;border-radius:0;margin:0;left:0}@media (min-width: 992px){.alert-fixed-top,.alert-fixed-bottom{width:992px;left:50%;margin-left:-496px}}