diff --git a/src/main/java/org/olat/catalog/ui/CatalogAdminSiteMainController.java b/src/main/java/org/olat/catalog/ui/CatalogAdminSiteMainController.java new file mode 100644 index 0000000000000000000000000000000000000000..d3deb67fa5e2f43e88f8dc89700fa92683a0f581 --- /dev/null +++ b/src/main/java/org/olat/catalog/ui/CatalogAdminSiteMainController.java @@ -0,0 +1,99 @@ +/** + * <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.catalog.ui; + +import java.util.List; + +import org.olat.catalog.CatalogEntry; +import org.olat.catalog.CatalogManager; +import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.panel.Panel; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.gui.control.generic.dtabs.Activateable2; +import org.olat.core.gui.control.generic.tool.ToolController; +import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.StateEntry; + +/** + * + * Initial date: 12.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class CatalogAdminSiteMainController extends BasicController implements Activateable2 { + + private CatalogController catalogCtrl; + private LayoutMain3ColsController columnsLayoutCtr; + + public CatalogAdminSiteMainController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl); + + CatalogManager catalogManager = CoreSpringFactory.getImpl(CatalogManager.class); + List<CatalogEntry> rootNodes = catalogManager.getRootCatalogEntries(); + if(rootNodes.size() == 1) { + catalogCtrl = new CatalogController(ureq, getWindowControl()); + listenTo(catalogCtrl); + } + + if(catalogCtrl != null) { + Component mainPanel = catalogCtrl.getInitialComponent(); + ToolController toolCtrl = catalogCtrl.createCatalogToolController(); + columnsLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), null, toolCtrl.getInitialComponent(), mainPanel, "repomain"); + columnsLayoutCtr.addCssClassToMain("o_repository"); + listenTo(columnsLayoutCtr); + putInitialPanel(columnsLayoutCtr.getInitialComponent()); + } else { + putInitialPanel(new Panel("empty")); + } + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + // + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == catalogCtrl) { + if (event == Event.CHANGED_EVENT) { + ToolController toolC = catalogCtrl.createCatalogToolController(); + Component toolComp = (toolC == null ? null : toolC.getInitialComponent()); + columnsLayoutCtr.setCol2(toolComp); + } + } + super.event(ureq, source, event); + } + + @Override + public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { + // + } +} diff --git a/src/main/java/org/olat/catalog/ui/CatalogController.java b/src/main/java/org/olat/catalog/ui/CatalogController.java index 18837d732b7f939cfb8b8c3c00e370cbae7db20e..e83709de85e3d1a9f69aa2a95e324723fac05147 100644 --- a/src/main/java/org/olat/catalog/ui/CatalogController.java +++ b/src/main/java/org/olat/catalog/ui/CatalogController.java @@ -676,7 +676,7 @@ public class CatalogController extends BasicController implements Activateable2 } else if (source == addEntryForm) { cmc.deactivate(); - currentCatalogEntry = addEntryForm.getEditedCatalogEntry(); + //currentCatalogEntry = addEntryForm.getEditedCatalogEntry(); updateContent(ureq, currentCatalogEntry, currentCatalogEntryLevel); updateToolAccessRights(ureq, currentCatalogEntry, currentCatalogEntryLevel); cleanUp(); @@ -925,6 +925,7 @@ public class CatalogController extends BasicController implements Activateable2 } else myContent.contextPut("hasOwnedLinks", Boolean.FALSE); updateHistory(ureq); + myContent.setDirty(true); } public void updateHistory(UserRequest ureq) { diff --git a/src/main/java/org/olat/catalog/ui/_content/catalog.html b/src/main/java/org/olat/catalog/ui/_content/catalog.html index aa14687242b6df385bab3f79e693cf11ce796eb9..01a996a0ef92d6add986c1dbd0e605d023aeec65 100644 --- a/src/main/java/org/olat/catalog/ui/_content/catalog.html +++ b/src/main/java/org/olat/catalog/ui/_content/catalog.html @@ -66,7 +66,7 @@ <div class="o_catalog_link_title"> $r.translate("title.leaves") </div> - <table class="b_table b_full"> + <table class="table b_full"> #foreach($child in $children) #if ($child.getType()==$leaf) diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties index 4ca1c131f47bbd54b1250e151f6b52b1b1d7a642..35135b732cc4ce633e7496c8b2f1aff42c840d8c 100644 --- a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties @@ -15,6 +15,7 @@ error.header=Fehler error.jpbwrapper.renderfailed=Die Komponente kann nicht mehr dargestellt werden. Bitte rufen Sie die Komponente erneut auf. error.noformpostdata=Achtung\! Durch ein Problem Ihres Browsers wurden nicht alle Daten hochgeladen. Dr\u00FCcken Sie bitte den Zur\u00FCck-Knopf und versuchen Sie es nochmals. error.post.method.mandatory=Benutzt ein Browser +export=Export expand=Vergr\u00F6ssern finish=Fertigstellen form.checkall=Alle ausw\u00E4hlen diff --git a/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_de.properties index a622b5c092dd5dfbf4430d25defea92168d12e5e..1abb10e54fc043b1d532bb6a3527481a4942a6b0 100644 --- a/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_de.properties @@ -56,6 +56,8 @@ topnav.buddygroups=Gruppen topnav.buddygroups.alt=Arbeiten Sie mit Lern- und Arbeitsgruppen topnav.catalog=Katalog topnav.catalog.alt=Katalog +topnav.catalog.admin=Katalog Admin. +topnav.catalog.admin.alt=Katalog Admin. topnav.close=Fenster schliessen topnav.close.alt=Schliessen Sie dieses Fenster topnav.closeRecent=Schliessen diff --git a/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_en.properties index cb3de2f72349d97ae17d95fedc4648925a754c6e..996ac1e5c92a3c2cbd11b1d718f9bb6785580488 100644 --- a/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/core/commons/chiefcontrollers/_i18n/LocalStrings_en.properties @@ -56,6 +56,8 @@ topnav.buddygroups=Groups topnav.buddygroups.alt=Work with your personal learning and project groups. topnav.catalog=Catalog topnav.catalog.alt=Catalog +topnav.catalog.admin=Catalog admin. +topnav.catalog.admin.alt=Catalog admin. topnav.close=Close window topnav.close.alt=Close this window topnav.closeRecent=Close diff --git a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java index d044d27f71a5803f092cc3ef44fdfce2273887a1..26e72a36af4bcea11af0795cd4d7bdeabedadcfb 100644 --- a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java +++ b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java @@ -28,12 +28,11 @@ package org.olat.core.gui.components.choice; import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.ComponentRenderer; +import org.olat.core.gui.components.DefaultComponentRenderer; import org.olat.core.gui.components.table.TableDataModel; import org.olat.core.gui.control.winmgr.AJAXFlags; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; -import org.olat.core.gui.render.RenderingState; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; @@ -43,15 +42,7 @@ import org.olat.core.gui.translator.Translator; * * @author Felix Jost */ -public class ChoiceRenderer implements ComponentRenderer { - - /** - * This is a singleton. There must be an empty contructor for the - * Class.forName() call. - */ - public ChoiceRenderer() { - super(); - } +public class ChoiceRenderer extends DefaultComponentRenderer { /** * @see org.olat.core.gui.render.ui.ComponentRenderer#render(org.olat.core.gui.render.Renderer, @@ -59,6 +50,7 @@ public class ChoiceRenderer implements ComponentRenderer { * org.olat.core.gui.render.URLBuilder, org.olat.core.gui.translator.Translator, * org.olat.core.gui.render.RenderResult, java.lang.String[]) */ + @Override public void render(Renderer renderer, StringOutput target, Component source, URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) { @@ -102,53 +94,28 @@ public class ChoiceRenderer implements ComponentRenderer { target.append("</tr>"); } // Toggle all on/off - target.append("<tr><td colspan=\"").append(cols).append("\" class=\"b_togglecheck\">"); - target.append("<div class=\"b_togglecheck\">"); - target.append("<a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', true)\">"); - target.append("<input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\" />"); - target.append(translator.translate("checkall")); - target.append("</a> <a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', false)\">"); - target.append("<input type=\"checkbox\" disabled=\"disabled\" />"); - target.append(translator.translate("uncheckall")); - target.append("</a></div>"); - target.append("</td></tr>"); + target.append("<tr><td colspan=\"").append(cols).append("\" class=\"b_togglecheck\">") + .append("<div class=\"b_togglecheck\">") + .append("<a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', true)\">") + .append("<input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\" />") + .append(translator.translate("checkall")) + .append("</a> <a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', false)\">") + .append("<input type=\"checkbox\" disabled=\"disabled\" />") + .append(translator.translate("uncheckall")) + .append("</a></div>") + .append("</td></tr>"); // Submit button target.append("<tr><td colspan=\"").append(cols).append("\"><div class=\"b_button_group\">"); target.append("<input type=\"submit\" name=\"olat_fosm\" value=\"" + StringEscapeUtils.escapeHtml(translator.translate(choice.getSubmitKey())) - + "\" class=\"b_button\" />"); + + "\" class=\"btn btn-default\" />"); // Cancel button String cancelKey = choice.getCancelKey(); if (cancelKey != null) { target.append("<input type=\"submit\" name=\"" + Choice.CANCEL_IDENTIFICATION + "\" value=\"" - + StringEscapeUtils.escapeHtml(translator.translate(cancelKey)) + "\" class=\"b_button\" />"); + + StringEscapeUtils.escapeHtml(translator.translate(cancelKey)) + "\" class=\"btn btn-default\" />"); } target.append("</div></td></tr></table></form>"); - - - - } - - /** - * @param renderer - * @param sb - * @param source - */ - public void renderBodyOnLoadJSFunctionCall(Renderer renderer, StringOutput sb, Component source, RenderingState rstate) { - // } - - /** - * @param renderer - * @param target - * @param source - * @param url - * @param translator - */ - public void renderHeaderIncludes(Renderer renderer, StringOutput target, Component source, URLBuilder url, Translator translator, - RenderingState rstate) { - // - } - } \ No newline at end of file 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 30ec83c263dc6f3cb39e0787127b3fdb5c2c9cf2..9ac31138fc83018b33b53d6973f93c94ecaeabe4 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 @@ -29,6 +29,7 @@ import org.olat.core.gui.components.AbstractComponent; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.ComponentCollection; import org.olat.core.gui.components.ComponentRenderer; +import org.olat.core.gui.components.link.Link; import org.olat.core.gui.translator.Translator; /** @@ -76,10 +77,14 @@ public class Dropdown extends AbstractComponent implements ComponentCollection { this.iconCSS = iconCSS; } - public void addComponent(Component component) { + public void addComponent(Link component) { components.add(component); } + public void addComponent(Spacer spacer) { + components.add(spacer); + } + public int size() { return components.size(); } @@ -113,4 +118,22 @@ public class Dropdown extends AbstractComponent implements ComponentCollection { public ComponentRenderer getHTMLRendererSingleton() { return RENDERER; } + + public static class Spacer extends AbstractComponent { + + public Spacer(String name) { + super(name); + } + + @Override + protected void doDispatchRequest(UserRequest ureq) { + // + } + + @Override + public ComponentRenderer getHTMLRendererSingleton() { + return null; + } + + } } 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 0b9ba99edb948ed576a41d08025945c07f104f00..830cc839c42c564a76cf66ce2190ce2e29dcf866 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 @@ -21,6 +21,7 @@ package org.olat.core.gui.components.dropdown; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.DefaultComponentRenderer; +import org.olat.core.gui.components.dropdown.Dropdown.Spacer; import org.olat.core.gui.render.RenderResult; import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; @@ -52,7 +53,12 @@ public class DropdownRenderer extends DefaultComponentRenderer { if(StringHelper.containsNonWhitespace(dropdown.getIconCSS())) { sb.append("<i class='").append(dropdown.getIconCSS()).append("'> </i>"); } - sb.append(dropdown.getTranslator().translate(dropdown.getI18nKey())).append(" <b class='caret'></b>"); + String i18nKey = dropdown.getI18nKey(); + if(StringHelper.containsNonWhitespace(i18nKey)) { + sb.append(dropdown.getTranslator().translate(dropdown.getI18nKey())); + } + sb.append(" <b class='caret'></b>"); + if(dropdown.isButton()) { sb.append("</button>"); } else { @@ -60,9 +66,13 @@ public class DropdownRenderer extends DefaultComponentRenderer { } sb.append("<ul class='dropdown-menu' role='menu'>"); for(Component component:components) { - sb.append("<li>"); - renderer.render(component, sb, args); - sb.append("</li>"); + if(component instanceof Spacer) { + sb.append("<li class='divider'></li>"); + } else { + sb.append("<li>"); + renderer.render(component, sb, args); + sb.append("</li>"); + } } sb.append("</ul>"); } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java index 2d0fe8854b469a5885418e27714a6f03c5ade6ca..6a01109440ef04371cc921ad51b9a29b94037be5 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java @@ -25,6 +25,7 @@ */ package org.olat.core.gui.components.form.flexible.elements; +import java.util.List; import java.util.Set; import org.olat.core.gui.components.form.flexible.FormItem; @@ -56,6 +57,12 @@ public interface FlexiTableElement extends FormItem { */ public void setRendererType(FlexiTableRendererType rendererType); + /** + * Set the renderer available + * @param rendererType + */ + public void setAvailableRendererTypes(FlexiTableRendererType... rendererType); + /** * Set the row renderer used by the custom renderer type. * @param renderer @@ -169,11 +176,18 @@ public interface FlexiTableElement extends FormItem { public String getSelectedFilterValue(); /** - * Set the values for the filter and will enable it. + * Set the values for the filter and it will enable it. * @param keys * @param values */ - public void setFilterKeysAndValues(String labelI18nKey, String[] keys, String[] values); + public void setFilters(String label, List<FlexiTableFilter> filters); + + /** + * + * @param label + * @param sorts + */ + public void setSorts(String label, List<FlexiTableSort> sorts); /** * Enable export @@ -221,5 +235,4 @@ public interface FlexiTableElement extends FormItem { public void setPage(int page); public void reloadData(); - } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableFilter.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..d437e7e3989adb5d0de9acc5713979e26e374aa0 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableFilter.java @@ -0,0 +1,73 @@ +/** + * <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.core.gui.components.form.flexible.elements; + +/** + * + * Initial date: 12.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class FlexiTableFilter { + + public static final FlexiTableFilter SPACER = new FlexiTableFilter("oo-spacer-xx", "oo-spacer-xx"); + + private final String label; + private final String filter; + private boolean selected; + + public FlexiTableFilter(String label, String filter) { + this.label = label; + this.filter = filter; + } + + public String getLabel() { + return label; + } + + public String getFilter() { + return filter; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + @Override + public int hashCode() { + return filter == null ? 864587 : filter.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if(obj instanceof FlexiTableFilter) { + FlexiTableFilter other = (FlexiTableFilter) obj; + return filter != null && filter.equals(other.filter); + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableSort.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableSort.java new file mode 100644 index 0000000000000000000000000000000000000000..6b9f300a403c72716ca8889bd83dcbb0276efb22 --- /dev/null +++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableSort.java @@ -0,0 +1,80 @@ +/** + * <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.core.gui.components.form.flexible.elements; + +import org.olat.core.commons.persistence.SortKey; + +/** + * + * Initial date: 12.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class FlexiTableSort { + + public static final FlexiTableSort SPACER = new FlexiTableSort("oo-spacer-xx", new SortKey("oo-spacer-xx", false)); + + private final String label; + private final SortKey sortKey; + private boolean selected; + + public FlexiTableSort(String label, SortKey sortKey) { + this.label = label; + this.sortKey = sortKey; + } + + public FlexiTableSort(String label, String sortKey) { + this.label = label; + this.sortKey = new SortKey(sortKey, false); + } + + public String getLabel() { + return label; + } + + public SortKey getSortKey() { + return sortKey; + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + @Override + public int hashCode() { + return sortKey == null ? 864587 : sortKey.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if(obj instanceof FlexiTableSort) { + FlexiTableSort other = (FlexiTableSort) obj; + return sortKey != null && sortKey.equals(other.sortKey); + } + return false; + } +} \ No newline at end of file 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 80c460d9693472aae2ddcf044e4e8a6b9af1023d..f3fc79abe456d4a22b4e562fc90b51c00fba943a 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 @@ -19,10 +19,13 @@ */ package org.olat.core.gui.components.form.flexible.impl.elements.table; +import java.util.List; + import org.olat.core.gui.components.Component; import org.olat.core.gui.components.DefaultComponentRenderer; import org.olat.core.gui.components.form.flexible.FormItem; -import org.olat.core.gui.components.form.flexible.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormJSHelper; import org.olat.core.gui.components.form.flexible.impl.NameValuePair; @@ -48,16 +51,21 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere FlexiTableComponent ftC = (FlexiTableComponent) source; FlexiTableElementImpl ftE = ftC.getFlexiTableElement(); - String id = ftC.getFormDispatchId(); - + renderHeaderButtons(renderer, sb, ftE, ubu, translator, renderResult, args); + sb.append("<div class=\"o_table_wrapper o_table_flexi") .append(" o_table_edit", ftE.isEditMode()); String css = ftE.getElementCssClass(); if (css != null) { sb.append(" ").append(css); } + switch(ftE.getRendererType()) { + case custom: sb.append("o_rendertype_custom"); break; + case classic: sb.append("o_rendertype_classic"); break; + case dataTables: sb.append("o_rendertype_dataTables"); break; + } sb.append(" table-responsive\">"); - renderHeaderButtons(renderer, sb, ftE, ubu, translator, renderResult, args); + String id = ftC.getFormDispatchId(); sb.append("<table id=\"").append(id).append("\" class=\"table table-bordered table-hover table-responsive\">"); //render headers @@ -80,16 +88,23 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere protected void renderHeaderButtons(Renderer renderer, StringOutput sb, FlexiTableElementImpl ftE, URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) { - if(ftE.isFilterEnabled()) { - sb.append("<div class='o_table_filter'>"); - SingleSelection filterEl = ftE.getFilterSelection(); - String text = filterEl.getLabelText(); - if(text != null && text.length() < 128) { - sb.append("<label>").append(text).append("</label>"); - } - renderFormItem(renderer, sb, filterEl, ubu, translator, renderResult, args); - sb.append("</div>"); - } + + sb.append("<div class='row clearfix'><div class='col-lg-6'>"); + + renderHeaderSearch(renderer, sb, ftE, ubu, translator, renderResult, args); + + sb.append("</div><div class='col-lg-2'></div><div class='col-lg-4'>"); + + renderHeaderTools(renderer, sb, ftE, ubu, translator, renderResult, args); + + sb.append("</div></div>"); + } + + protected void renderHeaderSearch(Renderer renderer, StringOutput sb, FlexiTableElementImpl ftE, URLBuilder ubu, Translator translator, + RenderResult renderResult, String[] args) { + + + if(ftE.isSearchEnabled()) { sb.append("<div class='o_table_search input-group'>"); renderFormItem(renderer, sb, ftE.getSearchElement(), ubu, translator, renderResult, args); @@ -100,12 +115,121 @@ public abstract class AbstractFlexiTableRenderer extends DefaultComponentRendere if(ftE.getExtendedSearchButton() != null) { renderFormItem(renderer, sb, ftE.getExtendedSearchButton(), ubu, translator, renderResult, args); } + } + + /** + * The method rendered the tools: filter, sort, customize, export, switch type of renderer. + * @param renderer + * @param sb + * @param ftE + * @param ubu + * @param translator + * @param renderResult + * @param args + */ + protected void renderHeaderTools(Renderer renderer, StringOutput sb, FlexiTableElementImpl ftE, URLBuilder ubu, Translator translator, + RenderResult renderResult, String[] args) { + + sb.append("<div class='pull-right o_table_tools'>"); + + //filter + if(ftE.isFilterEnabled()) { + List<FlexiTableFilter> filters = ftE.getFilters(); + if(filters != null && filters.size() > 0) { + renderFilterDropdown(sb, ftE, filters); + } + } + + //sort + if(ftE.isSortEnabled()) { + List<FlexiTableSort> sorts = ftE.getSorts(); + if(sorts != null && sorts.size() > 0) { + renderSortDropdown(sb, ftE, sorts); + } + } if(ftE.getExportButton() != null && ftE.isExportEnabled()) { + sb.append("<div class='btn-group'>"); renderFormItem(renderer, sb, ftE.getExportButton(), ubu, translator, renderResult, args); + sb.append("</div> "); } if(ftE.getCustomButton() != null && ftE.isCustomizeColumns()) { + sb.append("<div class='btn-group'>"); renderFormItem(renderer, sb, ftE.getCustomButton(), ubu, translator, renderResult, args); + sb.append("</div> "); + } + + //switch type of tables + FlexiTableRendererType[] types = ftE.getAvailableRendererTypes(); + if(types.length > 1) { + sb.append("<div class='btn-group'>"); + for(FlexiTableRendererType type:types) { + renderHeaderSwitchType(type, renderer, sb, ftE, ubu, translator, renderResult, args); + } + sb.append("</div> "); + } + sb.append("</div>"); + } + + protected void renderFilterDropdown(StringOutput sb, FlexiTableElementImpl ftE, List<FlexiTableFilter> filters) { + Form theForm = ftE.getRootForm(); + String dispatchId = ftE.getFormDispatchId(); + + sb.append("<div class='btn-group'>") + .append("<button class='btn btn-default dropdown-toggle' data-toggle='dropdown'>") + .append("<i class='o_icon o_icon_filter o_icon-lg'> </i> <b class='caret'></b></button>") + .append("<ul class='dropdown-menu' role='menu'>"); + + for(FlexiTableFilter filter:filters) { + if(FlexiTableFilter.SPACER.equals(filter)) { + sb.append("<li class='divider'></li>"); + } else { + sb.append("<li><a href=\"javascript:") + .append(FormJSHelper.getXHRFnCallFor(theForm, dispatchId, 1, new NameValuePair("filter", filter.getFilter()))) + .append("\">").append(filter.getLabel()).append("</a></li>"); + } + } + sb.append("</ul></div> "); + } + + protected void renderSortDropdown(StringOutput sb, FlexiTableElementImpl ftE, List<FlexiTableSort> sorts) { + Form theForm = ftE.getRootForm(); + String dispatchId = ftE.getFormDispatchId(); + + sb.append("<div class='btn-group'>") + .append("<button class='btn btn-default dropdown-toggle' data-toggle='dropdown'>") + .append("<i class='o_icon o_icon_sort_menu o_icon-lg'> </i> <b class='caret'></b></button>") + .append("<ul class='dropdown-menu' role='menu'>"); + + for(FlexiTableSort sort:sorts) { + if(FlexiTableSort.SPACER.equals(sort)) { + sb.append("<li class='divider'></li>"); + } else { + sb.append("<li><a href=\"javascript:") + .append(FormJSHelper.getXHRFnCallFor(theForm, dispatchId, 1, new NameValuePair("sort", sort.getSortKey().getKey()))) + .append("\">").append(sort.getLabel()).append("</a></li>"); + } + } + sb.append("</ul></div> "); + } + + protected void renderHeaderSwitchType(FlexiTableRendererType type, Renderer renderer, StringOutput sb, FlexiTableElementImpl ftE, URLBuilder ubu, Translator translator, + RenderResult renderResult, String[] args) { + if(type != null) { + switch(type) { + case custom: { + renderFormItem(renderer, sb, ftE.getCustomTypeButton(), ubu, translator, renderResult, args); + break; + } + case classic: { + renderFormItem(renderer, sb, ftE.getClassicTypeButton(), ubu, translator, renderResult, args); + break; + } + case dataTables: { + renderFormItem(renderer, sb, ftE.getDataTablesTypeButton(), ubu, translator, renderResult, args); + break; + } + } } } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FilterableFlexiTableModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FilterableFlexiTableModel.java index a974a86000cfd2c04842484855e271081d84c81a..503b9b14c3a5edeab75604735c502ad01c3e9dd0 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FilterableFlexiTableModel.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FilterableFlexiTableModel.java @@ -28,6 +28,10 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table; */ public interface FilterableFlexiTableModel { + /** + * @param key + * @return True if a reload is needed + */ public void filter(String key); } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java index e203d22104c333bc8a442ced055b3444d049b5f4..85f32e06a055835f44e6ab4af9e34c43a9f5b6c3 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java @@ -45,6 +45,8 @@ class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements Com FlexiTableComponent ftC = (FlexiTableComponent)source; FlexiTableElementImpl ftE = ftC.getFlexiTableElement(); + + renderHeaderButtons(renderer, sb, ftE, ubu, translator, renderResult, args); String id = ftC.getFormDispatchId(); sb.append("<div class=\"o_table_wrapper o_table_flexi") @@ -54,8 +56,7 @@ class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements Com sb.append(" ").append(css); } sb.append("\">"); - renderHeaderButtons(renderer, sb, ftE, ubu, translator, renderResult, args); - + //render body sb.append("<div class='o_table_body container-fluid'>"); renderBody(renderer, sb, ftC, ubu, translator, renderResult); diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index cebddccd207c98515d1457d891e8ebbaca1e44e7..874f2d6abeb07fc730f606cc652d7a7b6a5c519a 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -45,14 +45,14 @@ import org.olat.core.gui.components.choice.Choice; 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.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort; 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.Form; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; import org.olat.core.gui.components.form.flexible.impl.elements.FormLinkImpl; -import org.olat.core.gui.components.form.flexible.impl.elements.SingleSelectionImpl; import org.olat.core.gui.components.form.flexible.impl.elements.TextElementImpl; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.velocity.VelocityContainer; @@ -78,6 +78,10 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle //settings private boolean multiSelect; private FlexiTableRendererType rendererType = FlexiTableRendererType.classic; + private FlexiTableRendererType[] availableRendererType = new FlexiTableRendererType[] { + FlexiTableRendererType.classic + }; + private boolean customizeColumns = true; private int rowCount = -1; @@ -95,7 +99,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private FormLink customButton, exportButton; private FormLink searchButton, extendedSearchButton; - private SingleSelection filterEl; + private FormLink classicTypeButton, customTypeButton, dataTablesTypeButton; private TextElement searchFieldEl; private ExtendedFlexiTableSearchController extendedSearchCtrl; @@ -110,6 +114,8 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle private String wrapperSelector; private SortKey[] orderBy; + private List<FlexiTableSort> sorts; + private List<FlexiTableFilter> filters; private Object selectedObj; private boolean allSelectedIndex; private Set<Integer> multiSelectedIndex; @@ -184,6 +190,51 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } } + public FlexiTableRendererType[] getAvailableRendererTypes() { + return availableRendererType; + } + + @Override + public void setAvailableRendererTypes(FlexiTableRendererType... rendererType) { + this.availableRendererType = rendererType; + if(rendererType != null && rendererType.length > 1) { + String dispatchId = component.getDispatchID(); + //custom + customTypeButton = new FormLinkImpl(dispatchId + "_customRTypeButton", "rCustomRTypeButton", "", Link.BUTTON + Link.NONTRANSLATED); + customTypeButton.setTranslator(translator); + customTypeButton.setIconLeftCSS("o_icon o_icon_list o_icon-lg"); + components.put("rTypeCustom", customTypeButton); + //classic tables + classicTypeButton = new FormLinkImpl(dispatchId + "_classicRTypeButton", "rClassicRTypeButton", "", Link.BUTTON + Link.NONTRANSLATED); + classicTypeButton.setTranslator(translator); + classicTypeButton.setIconLeftCSS("o_icon o_icon_table o_icon-lg"); + components.put("rTypeClassic", classicTypeButton); + //jquery tables + dataTablesTypeButton = new FormLinkImpl(dispatchId + "_dataTablesRTypeButton", "rDataTablesRTypeButton", "", Link.BUTTON + Link.NONTRANSLATED); + dataTablesTypeButton.setTranslator(translator); + dataTablesTypeButton.setIconLeftCSS("o_icon o_icon_table o_icon-lg"); + components.put("rTypeDataTables", dataTablesTypeButton); + + if(getRootForm() != null) { + rootFormAvailable(customTypeButton); + rootFormAvailable(classicTypeButton); + rootFormAvailable(dataTablesTypeButton); + } + } + } + + public FormLink getClassicTypeButton() { + return classicTypeButton; + } + + public FormLink getCustomTypeButton() { + return customTypeButton; + } + + public FormLink getDataTablesTypeButton() { + return dataTablesTypeButton; + } + @Override public boolean isMultiSelect() { return multiSelect; @@ -209,8 +260,6 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle public void setWrapperSelector(String wrapperSelector) { this.wrapperSelector = wrapperSelector; } - - @Override public FlexiTableComponent getComponent() { @@ -233,46 +282,55 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle @Override public boolean isFilterEnabled() { - return filterEl != null; + return filters != null && filters.size() > 0; } - + + @Override public String getSelectedFilterKey() { - if(filterEl != null && filterEl.isOneSelected()) { - return filterEl.getSelectedKey(); + String key = null; + if(filters != null) { + for(FlexiTableFilter filter:filters) { + if(filter.isSelected()) { + key = filter.getFilter(); + } + } } - return null; + return key; } - + + @Override public String getSelectedFilterValue() { - if(filterEl != null && filterEl.isOneSelected()) { - return filterEl.getSelectedValue(); + String value = null; + if(filters != null) { + for(FlexiTableFilter filter:filters) { + if(filter.isSelected()) { + value = filter.getLabel(); + } + } } - return null; + return value; + } + + public List<FlexiTableFilter> getFilters() { + return filters; } @Override - public void setFilterKeysAndValues(String labelI18nKey, String[] keys, String[] values) { - if(keys == null || keys.length == 0) { - components.remove("rFilter"); - filterEl = null; - } else { - String dispatchId = component.getDispatchID(); - String name = dispatchId + "_filter"; - filterEl = new SingleSelectionImpl(name, name, SingleSelectionImpl.createSelectboxLayouter(name, name)); - filterEl.setTranslator(getTranslator()); - if(StringHelper.containsNonWhitespace(labelI18nKey)) { - filterEl.setLabel(labelI18nKey, null); - filterEl.showLabel(true); - } - filterEl.addActionListener(FormEvent.ONCHANGE); - filterEl.setKeysAndValues(keys, values, null); - components.put("rFilter", filterEl); - rootFormAvailable(filterEl); - } + public void setFilters(String name, List<FlexiTableFilter> filters) { + this.filters = new ArrayList<>(filters); + } + + public boolean isSortEnabled() { + return sorts != null && sorts.size() > 0; } - public SingleSelection getFilterSelection() { - return filterEl; + public List<FlexiTableSort> getSorts() { + return sorts; + } + + @Override + public void setSorts(String label, List<FlexiTableSort> sorts) { + this.sorts = sorts; } @Override @@ -287,9 +345,9 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle exportButton = null; String dispatchId = component.getDispatchID(); - exportButton = new FormLinkImpl(dispatchId + "_exportButton", "rExportButton", "export", Link.BUTTON); + exportButton = new FormLinkImpl(dispatchId + "_exportButton", "rExportButton", "", Link.BUTTON | Link.NONTRANSLATED); exportButton.setTranslator(translator); - exportButton.setCustomEnabledLinkCSS("b_with_small_icon_only b_table_download"); + exportButton.setIconLeftCSS("o_icon o_icon_download"); components.put("rExport", exportButton); rootFormAvailable(exportButton); } else { @@ -483,6 +541,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle String select = form.getRequestParameter("select"); String page = form.getRequestParameter("page"); String sort = form.getRequestParameter("sort"); + String filter = form.getRequestParameter("filter"); if("undefined".equals(dispatchuri)) { evalSearchRequest(ureq); } else if(StringHelper.containsNonWhitespace(page)) { @@ -505,10 +564,8 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } else if(extendedSearchButton != null && extendedSearchButton.getFormDispatchId().equals(dispatchuri)) { openExtendedSearch(ureq); - } else if(filterEl != null - && filterEl.getFormDispatchId().equals(dispatchuri)) { - filterEl.evalFormRequest(ureq); - filter(); + } else if(dispatchuri != null && StringHelper.containsNonWhitespace(filter)) { + filter(filter); } else if(exportButton != null && exportButton.getFormDispatchId().equals(dispatchuri)) { export(ureq); @@ -520,6 +577,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle && customButton.getFormDispatchId().equals(dispatchuri)) { //snap the request customizeCallout(ureq); + } else if(customTypeButton != null + && customTypeButton.getFormDispatchId().equals(dispatchuri)) { + setRendererType(FlexiTableRendererType.custom); + } else if(classicTypeButton != null + && classicTypeButton.getFormDispatchId().equals(dispatchuri)) { + setRendererType(FlexiTableRendererType.classic); + } else if(dataTablesTypeButton != null + && dataTablesTypeButton.getFormDispatchId().equals(dispatchuri)) { + setRendererType(FlexiTableRendererType.dataTables); } else { FlexiTableColumnModel colModel = dataModel.getTableColumnModel(); for(int i=colModel.getColumnCount(); i-->0; ) { @@ -567,16 +633,25 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } } - protected void filter() { - if(filterEl.isOneSelected()) { - String filter = filterEl.getSelectedKey(); - if(dataModel instanceof FilterableFlexiTableModel) { - ((FilterableFlexiTableModel)dataModel).filter(filter); - } else if(dataSource != null) { - List<String> conditionalQueries = Collections.singletonList(filter); - dataSource.load(null, conditionalQueries, 0, getPageSize(), orderBy); + protected void filter(String filterKey) { + if(filterKey == null) { + for(FlexiTableFilter filter:filters) { + filter.setSelected(false); + } + } else { + for(FlexiTableFilter filter:filters) { + filter.setSelected(filter.getFilter().equals(filterKey)); } } + + if(dataModel instanceof FilterableFlexiTableModel) { + ((FilterableFlexiTableModel)dataModel).filter(filterKey); + } else if(dataSource != null) { + List<String> conditionalQueries = Collections.singletonList(filterKey); + dataSource.clear(); + dataSource.load(null, conditionalQueries, 0, getPageSize(), orderBy); + } + component.setDirty(true); } protected void export(UserRequest ureq) { @@ -832,8 +907,8 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle dataSource.load(getSearchText(), getConditionalQueries(), 0, getPageSize());//reload needed rows } else { if(dataModel instanceof FilterableFlexiTableModel) { - if(filterEl != null && filterEl.isOneSelected()) { - String filter = filterEl.getSelectedKey(); + if(isFilterEnabled()) { + String filter = getSelectedFilterKey(); ((FilterableFlexiTableModel)dataModel).filter(filter); } } @@ -858,12 +933,14 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle @Override protected void rootFormAvailable() { - rootFormAvailable(filterEl); rootFormAvailable(searchButton); rootFormAvailable(customButton); rootFormAvailable(exportButton); rootFormAvailable(searchFieldEl); rootFormAvailable(extendedSearchButton); + rootFormAvailable(customTypeButton); + rootFormAvailable(classicTypeButton); + rootFormAvailable(dataTablesTypeButton); } private final void rootFormAvailable(FormItem item) { diff --git a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml index 802dd22823af92933140805f47eb4416feaa0d6a..1c3379ab8f69a62c409955df3bd4e05297f34b81 100644 --- a/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml +++ b/src/main/java/org/olat/core/gui/control/_spring/sitedefContext.xml @@ -59,14 +59,18 @@ <bean id="olatsites_admin" class="org.olat.admin.site.AdminSiteDef"> <property name="order" value="10" /> </bean> - <bean id="olatsites_guidemo" class="org.olat.gui.demo.site.GUIDemoSiteDef"> - <property name="order" value="11" /> - <property name="enabled" value="${guidemo.enabled}"/> - </bean> <bean id="olatsites_portfolio" class="org.olat.portfolio.site.EPSiteDef"> <property name="order" value="11" /> <property name="enabled" value="${site.portfolio.enable}"/> </bean> + <bean id="olatsites_catalogadmin" class="org.olat.repository.site.CatalogAdminSiteDef"> + <property name="order" value="12" /> + <property name="enabled" value="${site.catalog.enable}"/> + </bean> + <bean id="olatsites_guidemo" class="org.olat.gui.demo.site.GUIDemoSiteDef"> + <property name="order" value="14" /> + <property name="enabled" value="${guidemo.enabled}"/> + </bean> <bean id="olatsites_home" class="org.olat.home.HomeSiteDef"> <property name="order" value="25" /> diff --git a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java index 74cc6c46365718a3abd27b81d3d0d2de690c5a4d..e5d4ca8342a1b8dbc4f638d952c34f508646eaab 100644 --- a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java +++ b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java @@ -34,8 +34,9 @@ import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; +import org.olat.basesecurity.Group; import org.olat.basesecurity.IdentityImpl; -import org.olat.basesecurity.SecurityGroupMembershipImpl; +import org.olat.basesecurity.model.GroupMembershipImpl; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.commons.persistence.DB; @@ -53,6 +54,7 @@ import org.olat.course.nodes.cl.model.DBCheck; import org.olat.course.nodes.cl.model.DBCheckbox; import org.olat.course.run.environment.CourseEnvironment; import org.olat.group.BusinessGroup; +import org.olat.modules.vitero.model.GroupRole; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -439,7 +441,7 @@ public class CheckboxManagerImpl implements CheckboxManager { } @Override - public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> groups) { + public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> businessGroups) { StringBuilder sb = new StringBuilder(); sb.append("select check from clcheck check") .append(" inner join fetch check.checkbox box") @@ -448,9 +450,9 @@ public class CheckboxManagerImpl implements CheckboxManager { if(StringHelper.containsNonWhitespace(resSubPath)) { sb.append(" and box.resSubPath=:resSubPath"); } - if(groups != null && groups.size() > 0) { - sb.append(" and check.identity.key in ( select secMembership.identity.key from ").append(SecurityGroupMembershipImpl.class.getName()).append(" secMembership ") - .append(" where secMembership.securityGroup in (:secGroups)") + if(businessGroups != null && businessGroups.size() > 0) { + sb.append(" and check.identity.key in ( select membership.identity.key from ").append(GroupMembershipImpl.class.getName()).append(" membership ") + .append(" where membership.group in (:baseGroups) and membership.role='").append(GroupRole.participant).append("'") .append(" )"); } @@ -461,8 +463,12 @@ public class CheckboxManagerImpl implements CheckboxManager { if(StringHelper.containsNonWhitespace(resSubPath)) { query.setParameter("resSubPath", resSubPath); } - if(groups != null && groups.size() > 0) { - query.setParameter("secGroups", groups); + if(businessGroups != null && businessGroups.size() > 0) { + List<Group> groups = new ArrayList<>(businessGroups.size()); + for(BusinessGroup businessGroup:businessGroups) { + groups.add(businessGroup.getBaseGroup()); + } + query.setParameter("baseGroups", groups); } //TODO group exists student where i'm coach? diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java index 2a7a6c66fe0e5a63a9e999fbdaf515bf490eed70..1f645e98d9388d654cf8450e83e733f9918e3c7d 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java @@ -43,6 +43,7 @@ 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.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; @@ -237,28 +238,21 @@ public class CheckListAssessmentController extends FormBasicController implement columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, Cols.totalPoints.i18nKey(), Cols.totalPoints.ordinal(), true, "points")); } columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("table.header.edit.checkbox", translate("table.header.edit.checkbox"), "edit")); - - String[] keys = null; - String[] values = null; + + List<CheckListAssessmentRow> datas = loadDatas(); + model = new CheckListAssessmentDataModel(checkboxList, datas, columnsModel); + table = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), formLayout); if(userCourseEnv instanceof UserCourseEnvironmentImpl) { UserCourseEnvironmentImpl env = (UserCourseEnvironmentImpl)userCourseEnv; List<BusinessGroup> coachedGroups = env.getCoachedGroups(); - keys = new String[coachedGroups.size() + 1]; - values = new String[coachedGroups.size() + 1]; - - keys[0] = "all"; - values[0] = translate("filter.all"); + List<FlexiTableFilter> filters = new ArrayList<>(coachedGroups.size() + 1); + filters.add(new FlexiTableFilter(translate("filter.all"), "all")); for(int k=0; k<coachedGroups.size(); k++) { BusinessGroup group = coachedGroups.get(k); - keys[k+1] = group.getKey().toString(); - values[k+1] = group.getName(); + filters.add(new FlexiTableFilter(group.getName(), group.getKey().toString())); } + table.setFilters("participants", filters); } - - List<CheckListAssessmentRow> datas = loadDatas(); - model = new CheckListAssessmentDataModel(checkboxList, datas, columnsModel); - table = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), formLayout); - table.setFilterKeysAndValues("participants", keys, values); table.setExportEnabled(true); pdfExport = uifactory.addFormLink("pdf.export", formLayout, Link.BUTTON); diff --git a/src/main/java/org/olat/repository/site/CatalogAdminSite.java b/src/main/java/org/olat/repository/site/CatalogAdminSite.java new file mode 100644 index 0000000000000000000000000000000000000000..a999052937ecd6a5a08c1dde05830a0a87326119 --- /dev/null +++ b/src/main/java/org/olat/repository/site/CatalogAdminSite.java @@ -0,0 +1,90 @@ +/** + * <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.repository.site; + +import java.util.Locale; + +import org.olat.catalog.ui.CatalogAdminSiteMainController; +import org.olat.core.commons.chiefcontrollers.BaseChiefController; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.navigation.AbstractSiteInstance; +import org.olat.core.gui.control.navigation.DefaultNavElement; +import org.olat.core.gui.control.navigation.NavElement; +import org.olat.core.gui.control.navigation.SiteConfiguration; +import org.olat.core.gui.control.navigation.SiteDefinition; +import org.olat.core.gui.translator.Translator; +import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.BusinessControlFactory; +import org.olat.core.id.context.StateSite; +import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.Util; +import org.olat.core.util.resource.OresHelper; +import org.olat.util.logging.activity.LoggingResourceable; + +/** + * + * Initial date: 12.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class CatalogAdminSite extends AbstractSiteInstance { + private NavElement origNavElem; + private NavElement curNavElem; + + public CatalogAdminSite(SiteDefinition siteDef, Locale loc) { + super(siteDef); + Translator trans = Util.createPackageTranslator(BaseChiefController.class, loc); + origNavElem = new DefaultNavElement(trans.translate("topnav.catalog.admin"), trans.translate("topnav.catalog.admin.alt"), "o_site_catalog"); + origNavElem.setAccessKey("c".charAt(0)); + curNavElem = new DefaultNavElement(origNavElem); + } + + /** + * @see org.olat.navigation.SiteInstance#getNavElement() + */ + @Override + public NavElement getNavElement() { + return curNavElem; + } + + @Override + protected Controller createController(UserRequest ureq, WindowControl wControl, SiteConfiguration config) { + // for existing controller which are part of the main olat -> use the controllerfactory + OLATResourceable ores = OresHelper.createOLATResourceableInstance("CatalogAdmin", 0l); + ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ureq, ores, new StateSite(this), wControl, true); + return new CatalogAdminSiteMainController(ureq, bwControl); + } + + /** + * @see org.olat.navigation.SiteInstance#isKeepState() + */ + @Override + public boolean isKeepState() { + return true; + } + + @Override + public void reset() { + curNavElem = new DefaultNavElement(origNavElem); + } +} diff --git a/src/main/java/org/olat/repository/site/CatalogAdminSiteDef.java b/src/main/java/org/olat/repository/site/CatalogAdminSiteDef.java new file mode 100644 index 0000000000000000000000000000000000000000..1d305e1bbdac7184f744f90741fe1553d250a415 --- /dev/null +++ b/src/main/java/org/olat/repository/site/CatalogAdminSiteDef.java @@ -0,0 +1,53 @@ +/** + * <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.repository.site; + +import org.olat.core.CoreSpringFactory; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.navigation.AbstractSiteDefinition; +import org.olat.core.gui.control.navigation.SiteConfiguration; +import org.olat.core.gui.control.navigation.SiteDefinition; +import org.olat.core.gui.control.navigation.SiteInstance; +import org.olat.repository.RepositoryModule; + +/** + * + * Initial date: 12.05.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class CatalogAdminSiteDef extends AbstractSiteDefinition implements SiteDefinition { + + @Override + public SiteInstance createSite(UserRequest ureq, WindowControl wControl, SiteConfiguration config) { + RepositoryModule repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class); + if(repositoryModule.isCatalogEnabled() && repositoryModule.isCatalogSiteEnabled()) { + return new CatalogAdminSite(this, ureq.getLocale()); + } + return null; + } + + @Override + public boolean isEnabled() { + RepositoryModule repositoryModule = CoreSpringFactory.getImpl(RepositoryModule.class); + return repositoryModule.isCatalogEnabled() && repositoryModule.isCatalogSiteEnabled() && super.isEnabled(); + } +} diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java index 2d8c7942cf55d17473413be882dbb36198014b7e..e49ac3670545365eb4abbd218808f215adb8e0c9 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java @@ -19,6 +19,7 @@ */ package org.olat.repository.ui.author; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; @@ -32,6 +33,7 @@ import org.olat.core.gui.components.dropdown.Dropdown; 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.FlexiTableFilter; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -182,8 +184,19 @@ public class AuthorListController extends FormBasicController implements Activat model = new AuthoringEntryDataModel(dataSource, columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "table", model, 20, getTranslator(), formLayout); tableEl.setSearchEnabled(true); + tableEl.setExportEnabled(true); tableEl.setCustomizeColumns(true); - tableEl.setElementCssClass("o_coursetable o_rendertype_custom"); + tableEl.setElementCssClass("o_coursetable"); + tableEl.setFilters(null, getFilters()); + } + + private List<FlexiTableFilter> getFilters() { + Set<String> supportedTypes = repositoryHandlerFactory.getSupportedTypes(); + List<FlexiTableFilter> resources = new ArrayList<>(supportedTypes.size() + 1); + for(String type:supportedTypes) { + resources.add(new FlexiTableFilter(translate(type), type)); + } + return resources; } public TooledStackedPanel getStackPanel() { diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java index b98cfa7b44b6fe4f45e244573bbea898cb11b8c3..dec3e275337da9ba9dd228a5b94329630b56f390 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java +++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataSource.java @@ -97,6 +97,15 @@ public class AuthoringEntryDataSource implements FlexiTableDataSourceDelegate<Au public final ResultInfos<AuthoringEntryRow> getRows(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) { + if(condQueries != null && condQueries.size() > 0) { + String filter = condQueries.get(0); + if(StringHelper.containsNonWhitespace(filter)) { + searchParams.addResourceTypes(filter); + } else { + searchParams.setResourceTypes(null); + } + } + if(StringHelper.containsNonWhitespace(query)) { try { List<Long> fullTextResults = searchClient.doSearch(query, null, searchParams.getIdentity(), searchParams.getRoles(), 0, 100); diff --git a/src/main/java/org/olat/repository/ui/list/DefaultRepositoryEntryDataSource.java b/src/main/java/org/olat/repository/ui/list/DefaultRepositoryEntryDataSource.java index fbe75f1e31b89f4ae04f370987ac5631798d8a9a..3bf6d144492fb7aeeaae1adc9c01827ee8a31657 100644 --- a/src/main/java/org/olat/repository/ui/list/DefaultRepositoryEntryDataSource.java +++ b/src/main/java/org/olat/repository/ui/list/DefaultRepositoryEntryDataSource.java @@ -107,6 +107,15 @@ public class DefaultRepositoryEntryDataSource implements FlexiTableDataSourceDel @Override public final ResultInfos<RepositoryEntryRow> getRows(String query, List<String> condQueries, int firstResult, int maxResults, SortKey... orderBy) { + + if(condQueries != null && condQueries.size() > 0) { + String filter = condQueries.get(0); + if(StringHelper.containsNonWhitespace(filter)) { + searchParams.setFilters(Collections.singletonList(Filter.valueOf(filter))); + } else { + searchParams.setFilters(null); + } + } if(StringHelper.containsNonWhitespace(query)) { try { @@ -121,7 +130,7 @@ public class DefaultRepositoryEntryDataSource implements FlexiTableDataSourceDel List<RepositoryEntryRow> rows = processViewModel(views); ResultInfos<RepositoryEntryRow> results = new DefaultResultInfos<RepositoryEntryRow>(firstResult + rows.size(), -1, rows); if(firstResult == 0 && views.size() < maxResults) { - count = new Integer(views.size() ); + count = new Integer(views.size()); } return results; } diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryDataModel.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryDataModel.java index d7651f0b0f45b7acbbdcb24e9b9203387f48630a..f448aa2e5f58f30a02ce0ddcab936f1828da5de7 100644 --- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryDataModel.java +++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryDataModel.java @@ -21,7 +21,6 @@ package org.olat.repository.ui.list; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataSourceModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; -import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataSourceDelegate; /** * @@ -31,7 +30,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable */ class RepositoryEntryDataModel extends DefaultFlexiTableDataSourceModel<RepositoryEntryRow> { - public RepositoryEntryDataModel(FlexiTableDataSourceDelegate<RepositoryEntryRow> source, FlexiTableColumnModel columnModel) { + public RepositoryEntryDataModel(DefaultRepositoryEntryDataSource source, FlexiTableColumnModel columnModel) { super(source, columnModel); } @@ -40,6 +39,11 @@ class RepositoryEntryDataModel extends DefaultFlexiTableDataSourceModel<Reposito return new RepositoryEntryDataModel(getSourceDelegate(), getTableColumnModel()); } + @Override + public DefaultRepositoryEntryDataSource getSourceDelegate() { + return (DefaultRepositoryEntryDataSource)super.getSourceDelegate(); + } + @Override public Object getValueAt(int row, int col) { RepositoryEntryRow item = getObject(row); diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java index 01aeffeaefb86534730696a6624a26ab0f6d1a13..5948d4b1a532fc2b598ad7db6a16f8e0c49b962b 100644 --- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java +++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java @@ -35,6 +35,8 @@ 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.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort; import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -44,7 +46,6 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable 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.link.Link; -import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.rating.RatingFormEvent; import org.olat.core.gui.components.rating.RatingWithAverageFormItem; import org.olat.core.gui.components.stack.BreadcrumbPanel; @@ -77,8 +78,7 @@ public class RepositoryEntryListController extends FormBasicController private final List<Link> filters = new ArrayList<>(); private final List<Link> orderBy = new ArrayList<>(); - - private FormLink listLink, tableLink; + private FlexiTableElement tableEl; private RepositoryEntryDataModel model; private DefaultRepositoryEntryDataSource dataSource; @@ -112,68 +112,41 @@ public class RepositoryEntryListController extends FormBasicController } private void initFilters() { - VelocityContainer filterVc = createVelocityContainer("filters"); - filterVc.setDomReplacementWrapperRequired(false); - flc.put("filters", filterVc); - //lifecycle - initFilter("current.courses", "filter.current.courses", Filter.currentCourses, filterVc); - initFilter("upcoming.courses", "filter.upcoming.courses", Filter.upcomingCourses, filterVc); - initFilter("old.courses", "filter.old.courses", Filter.oldCourses, filterVc); - //membership - initFilter("as.participant", "filter.booked.participant", Filter.asParticipant, filterVc); - initFilter("as.coach", "filter.booked.coach", Filter.asCoach, filterVc); - initFilter("as.author", "filter.booked.author", Filter.asAuthor, filterVc); - initFilter("not.booked", "filter.not.booked", Filter.notBooked, filterVc); - - //efficiency statment - initFilter("passed", "filter.passed", Filter.passed, filterVc); - initFilter("not.passed", "filter.not.passed", Filter.notPassed, filterVc); - initFilter("without", "filter.without.passed.infos", Filter.withoutPassedInfos, filterVc); - } - - private void initFilter(String name, String i18nKey, Filter filter, VelocityContainer filterVc) { - Link notPassedLink = LinkFactory.createCustomLink(name, name, i18nKey, Link.LINK, filterVc, this); - notPassedLink.setUserObject(filter); - filters.add(notPassedLink); + List<FlexiTableFilter> filters = new ArrayList<>(14); + filters.add(new FlexiTableFilter(translate("filter.current.courses"), Filter.currentCourses.name())); + filters.add(new FlexiTableFilter(translate("filter.upcoming.courses"), Filter.upcomingCourses.name())); + filters.add(new FlexiTableFilter(translate("filter.old.courses"), Filter.oldCourses.name())); + filters.add(FlexiTableFilter.SPACER); + filters.add(new FlexiTableFilter(translate("filter.booked.participant"), Filter.asParticipant.name())); + filters.add(new FlexiTableFilter(translate("filter.booked.coach"), Filter.asCoach.name())); + filters.add(new FlexiTableFilter(translate("filter.booked.author"), Filter.asAuthor.name())); + filters.add(new FlexiTableFilter(translate("filter.not.booked"), Filter.notBooked.name())); + filters.add(FlexiTableFilter.SPACER); + filters.add(new FlexiTableFilter(translate("filter.passed"), Filter.passed.name())); + filters.add(new FlexiTableFilter(translate("filter.not.passed"), Filter.notPassed.name())); + filters.add(new FlexiTableFilter(translate("filter.without.passed.infos"), Filter.withoutPassedInfos.name())); + tableEl.setFilters(null, filters); } private void initSorters() { - VelocityContainer orderByVc = createVelocityContainer("orderby"); - orderByVc.setDomReplacementWrapperRequired(false); - flc.put("orderBys", orderByVc); - - initOrderBy("orderby.automatic", OrderBy.automatic, orderByVc); - initOrderBy("orderby.favorit", OrderBy.favorit, orderByVc); - initOrderBy("orderby.lastVisited", OrderBy.lastVisited, orderByVc); - initOrderBy("orderby.score", OrderBy.score, orderByVc); - initOrderBy("orderby.passed", OrderBy.passed, orderByVc); - - initOrderBy("orderby.title", OrderBy.title, orderByVc); - initOrderBy("orderby.lifecycle", OrderBy.lifecycle, orderByVc); - initOrderBy("orderby.author", OrderBy.author, orderByVc); - initOrderBy("orderby.creationDate", OrderBy.creationDate, orderByVc); - initOrderBy("orderby.lastModified", OrderBy.lastModified, orderByVc); - initOrderBy("orderby.rating", OrderBy.rating, orderByVc); - } - - private void initOrderBy(String name, OrderBy order, VelocityContainer filterVc) { - Link notPassedLink = LinkFactory.createCustomLink(name, name, name, Link.LINK, filterVc, this); - notPassedLink.setUserObject(order); - orderBy.add(notPassedLink); + List<FlexiTableSort> sorters = new ArrayList<>(); + sorters.add(new FlexiTableSort(translate("orderby.automatic"), OrderBy.automatic.name())); + sorters.add(new FlexiTableSort(translate("orderby.favorit"), OrderBy.favorit.name())); + sorters.add(new FlexiTableSort(translate("orderby.lastVisited"), OrderBy.lastVisited.name())); + sorters.add(new FlexiTableSort(translate("orderby.score"), OrderBy.score.name())); + sorters.add(new FlexiTableSort(translate("orderby.passed"), OrderBy.passed.name())); + sorters.add(FlexiTableSort.SPACER); + sorters.add(new FlexiTableSort(translate("orderby.title"), OrderBy.title.name())); + sorters.add(new FlexiTableSort(translate("orderby.lifecycle"), OrderBy.lifecycle.name())); + sorters.add(new FlexiTableSort(translate("orderby.author"), OrderBy.author.name())); + sorters.add(new FlexiTableSort(translate("orderby.creationDate"), OrderBy.creationDate.name())); + sorters.add(new FlexiTableSort(translate("orderby.lastModified"), OrderBy.lastModified.name())); + sorters.add(new FlexiTableSort(translate("orderby.rating"), OrderBy.rating.name())); + tableEl.setSorts("", sorters); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - listLink = uifactory.addFormLink("switchLayoutList", "list", "", null, formLayout, Link.BUTTON + Link.NONTRANSLATED); - listLink.setIconLeftCSS("o_icon o_icon_list o_icon-lg"); - listLink.setLinkTitle(translate("table.switch.list")); - listLink.setActive(true); - tableLink = uifactory.addFormLink("switchLayoutTable", "table", "", null, formLayout, Link.BUTTON + Link.NONTRANSLATED); - tableLink.setIconLeftCSS("o_icon o_icon_table o_icon-lg"); - tableLink.setLinkTitle(translate("table.switch.table")); - tableLink.setActive(false); - - //add the table FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.key.i18nKey(), Cols.key.ordinal(), false, null)); columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.mark.i18nKey(), Cols.mark.ordinal())); @@ -191,6 +164,7 @@ public class RepositoryEntryListController extends FormBasicController model = new RepositoryEntryDataModel(dataSource, columnsModel); tableEl = uifactory.addTableElement(ureq, getWindowControl(), "table", model, 20, getTranslator(), formLayout); tableEl.setRendererType(FlexiTableRendererType.custom); + tableEl.setAvailableRendererTypes(FlexiTableRendererType.custom, FlexiTableRendererType.classic); tableEl.setSearchEnabled(true); tableEl.setCustomizeColumns(false); tableEl.setElementCssClass("o_coursetable o_rendertype_custom"); @@ -220,20 +194,8 @@ public class RepositoryEntryListController extends FormBasicController } @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(listLink == source) { - tableEl.setRendererType(FlexiTableRendererType.custom); - tableEl.setElementCssClass("o_coursetable o_rendertype_custom"); - tableEl.setCustomizeColumns(false); - listLink.setActive(true); - tableLink.setActive(false); - } else if(tableLink == source) { - tableEl.setRendererType(FlexiTableRendererType.classic); - tableEl.setElementCssClass("o_coursetable o_rendertype_classic"); - tableEl.setCustomizeColumns(true); - listLink.setActive(false); - tableLink.setActive(true); - } else if(source instanceof RatingWithAverageFormItem && event instanceof RatingFormEvent) { + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source instanceof RatingWithAverageFormItem && event instanceof RatingFormEvent) { RatingFormEvent ratingEvent = (RatingFormEvent)event; RatingWithAverageFormItem ratingItem = (RatingWithAverageFormItem)source; RepositoryEntryRow row = (RepositoryEntryRow)ratingItem.getUserObject(); diff --git a/src/main/java/org/olat/repository/ui/list/_content/filters.html b/src/main/java/org/olat/repository/ui/list/_content/filters.html deleted file mode 100644 index c8d8f4bc4706bac5411250c9c0a4afd7fed0e27d..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/repository/ui/list/_content/filters.html +++ /dev/null @@ -1,14 +0,0 @@ -<ul id="$r.getCId()" class="dropdown-menu"> - <li>$r.render("current.courses")</li> - <li>$r.render("upcoming.courses")</li> - <li>$r.render("old.courses")</li> - <li role="presentation" class="divider"></li> - <li>$r.render("as.participant")</li> - <li>$r.render("as.coach")</li> - <li>$r.render("as.author")</li> - <li>$r.render("not.booked")</li> - <li role="presentation" class="divider"></li> - <li>$r.render("passed")</li> - <li>$r.render("not.passed")</li> - <li>$r.render("without")</li> -</ul> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/ui/list/_content/orderby.html b/src/main/java/org/olat/repository/ui/list/_content/orderby.html deleted file mode 100644 index d4e419d0932b5efc2fbbc9532b9280061e377706..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/repository/ui/list/_content/orderby.html +++ /dev/null @@ -1,14 +0,0 @@ -<ul id="$r.getCId()" class="dropdown-menu"> - <li>$r.render("orderby.automatic")</li> - <li>$r.render("orderby.favorit")</li> - <li>$r.render("orderby.lastVisited")</li> - <li>$r.render("orderby.passed")</li> - <li>$r.render("orderby.score")</li> - <li role="presentation" class="divider"></li> - <li>$r.render("orderby.title")</li> - <li>$r.render("orderby.lifecycle")</li> - <li>$r.render("orderby.author")</li> - <li>$r.render("orderby.creationDate")</li> - <li>$r.render("orderby.lastModified")</li> - <li>$r.render("orderby.rating")</li> -</ul> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/ui/list/_content/repoentry_table.html b/src/main/java/org/olat/repository/ui/list/_content/repoentry_table.html index cfd2b21c34f3d769cbdaea8256357fb21e7bf04c..bade9402acda206e8171adcb2d85adb1b884ea54 100644 --- a/src/main/java/org/olat/repository/ui/list/_content/repoentry_table.html +++ b/src/main/java/org/olat/repository/ui/list/_content/repoentry_table.html @@ -1,15 +1 @@ -<div class="pull-right o_table_tools"> - <div class="btn-group"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="$r.translate("table.filter")"><i class="o_icon o_icon_filter o_icon-lg"></i> <span class="caret"></span></button> - $r.render("filters") - </div> - <div class="btn-group"> - <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" title="$r.translate("table.sort")"><i class="o_icon o_icon_sort_menu o_icon-lg"></i> <span class="caret"></span></button> - $r.render("orderBys") - </div> - <div class="btn-group"> - $r.render("switchLayoutList") - $r.render("switchLayoutTable") - </div> -</div> $r.render("table") \ No newline at end of file diff --git a/src/main/webapp/static/themes/light/modules/_icons.scss b/src/main/webapp/static/themes/light/modules/_icons.scss index f148b1da11d6945aaebe7a76c9fe00a28f32d266..674a6b3c2825343a3d77912ec2f17b21356043a1 100644 --- a/src/main/webapp/static/themes/light/modules/_icons.scss +++ b/src/main/webapp/static/themes/light/modules/_icons.scss @@ -23,6 +23,7 @@ $fa-css-prefix: "o_icon" !default; .o_icon_delete { @extend .o_icon-minus-circle; color: #A87E7E;} .o_icon_details { @extend .o_icon-eye; } .o_icon_dev { @extend .o_icon-wrench;} +.o_icon_download { @extend .o_icon-download;} .o_icon_edit { @extend .o_icon-edit;} .o_icon_edit_file { @extend .o_icon-edit;} .o_icon_edit_metadata { @extend .o_icon-edit; color: #996633;} diff --git a/src/main/webapp/static/themes/light/theme.css b/src/main/webapp/static/themes/light/theme.css index 501e26ff269ca13868234efc65295144db602ea5..c2170d6661d4d7ccb94ea8d21470b4acb851fb78 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{margin-right:10px}.media>.pull-right,.media>div.o_chelp_wrapper,#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{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{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,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right,div.o_chelp_wrapper,#o_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{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{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.0.3 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.0.3");src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../../../font-awesome/fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../../../font-awesome/fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon,.o_sp_icon,.o_st_icon,.o_tu_icon,.o_midpub,.o_midwarn,.o_midlock,.o_miderr,.o_middel{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_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{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{float:left}.o_icon.pull-left,#o_main_wrapper #o_main_container .o_icon#o_main_left,#o_main_wrapper #o_main_container #o_main_left.o_sp_icon,#o_main_wrapper #o_main_container #o_main_left.o_st_icon,#o_main_wrapper #o_main_container #o_main_left.o_tu_icon,#o_main_wrapper #o_main_container #o_main_left.o_midpub,#o_main_wrapper #o_main_container #o_main_left.o_midwarn,#o_main_wrapper #o_main_container #o_main_left.o_midlock,#o_main_wrapper #o_main_container #o_main_left.o_miderr,#o_main_wrapper #o_main_container #o_main_left.o_middel,#o_navbar_imclient .o_icon#o_im_message,#o_navbar_imclient #o_im_message.o_sp_icon,#o_navbar_imclient #o_im_message.o_st_icon,#o_navbar_imclient #o_im_message.o_tu_icon,#o_navbar_imclient #o_im_message.o_midpub,#o_navbar_imclient #o_im_message.o_midwarn,#o_navbar_imclient #o_im_message.o_midlock,#o_navbar_imclient #o_im_message.o_miderr,#o_navbar_imclient #o_im_message.o_middel,#o_navbar_imclient .o_icon#o_im_status,#o_navbar_imclient #o_im_status.o_sp_icon,#o_navbar_imclient #o_im_status.o_st_icon,#o_navbar_imclient #o_im_status.o_tu_icon,#o_navbar_imclient #o_im_status.o_midpub,#o_navbar_imclient #o_im_status.o_midwarn,#o_navbar_imclient #o_im_status.o_midlock,#o_navbar_imclient #o_im_status.o_miderr,#o_navbar_imclient #o_im_status.o_middel,#o_navbar_imclient .o_icon#o_im_summary,#o_navbar_imclient #o_im_summary.o_sp_icon,#o_navbar_imclient #o_im_summary.o_st_icon,#o_navbar_imclient #o_im_summary.o_tu_icon,#o_navbar_imclient #o_im_summary.o_midpub,#o_navbar_imclient #o_im_summary.o_midwarn,#o_navbar_imclient #o_im_summary.o_midlock,#o_navbar_imclient #o_im_summary.o_miderr,#o_navbar_imclient #o_im_summary.o_middel,.o_comments .o_comment_wrapper .o_icon.o_avatar,.o_comments .o_comment_wrapper .o_avatar.o_sp_icon,.o_comments .o_comment_wrapper .o_avatar.o_st_icon,.o_comments .o_comment_wrapper .o_avatar.o_tu_icon,.o_comments .o_comment_wrapper .o_avatar.o_midpub,.o_comments .o_comment_wrapper .o_avatar.o_midwarn,.o_comments .o_comment_wrapper .o_avatar.o_midlock,.o_comments .o_comment_wrapper .o_avatar.o_miderr,.o_comments .o_comment_wrapper .o_avatar.o_middel,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_icon.o_rating_wrapper,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_sp_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_st_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_tu_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midpub,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midwarn,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midlock,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_miderr,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_middel,.pull-left.o_sp_icon,.pull-left.o_st_icon,.pull-left.o_tu_icon,.pull-left.o_midpub,.pull-left.o_midwarn,.pull-left.o_midlock,.pull-left.o_miderr,.pull-left.o_middel{margin-right:.3em}.o_icon.pull-right,div.o_icon.o_chelp_wrapper,div.o_chelp_wrapper.o_sp_icon,div.o_chelp_wrapper.o_st_icon,div.o_chelp_wrapper.o_tu_icon,div.o_chelp_wrapper.o_midpub,div.o_chelp_wrapper.o_midwarn,div.o_chelp_wrapper.o_midlock,div.o_chelp_wrapper.o_miderr,div.o_chelp_wrapper.o_middel,#o_main_wrapper #o_main_container .o_icon#o_main_right,#o_main_wrapper #o_main_container #o_main_right.o_sp_icon,#o_main_wrapper #o_main_container #o_main_right.o_st_icon,#o_main_wrapper #o_main_container #o_main_right.o_tu_icon,#o_main_wrapper #o_main_container #o_main_right.o_midpub,#o_main_wrapper #o_main_container #o_main_right.o_midwarn,#o_main_wrapper #o_main_container #o_main_right.o_midlock,#o_main_wrapper #o_main_container #o_main_right.o_miderr,#o_main_wrapper #o_main_container #o_main_right.o_middel,.o_comments .o_comment_wrapper .o_icon.o_reply,.o_comments .o_comment_wrapper .o_reply.o_sp_icon,.o_comments .o_comment_wrapper .o_reply.o_st_icon,.o_comments .o_comment_wrapper .o_reply.o_tu_icon,.o_comments .o_comment_wrapper .o_reply.o_midpub,.o_comments .o_comment_wrapper .o_reply.o_midwarn,.o_comments .o_comment_wrapper .o_reply.o_midlock,.o_comments .o_comment_wrapper .o_reply.o_miderr,.o_comments .o_comment_wrapper .o_reply.o_middel,.o_comments .o_comment_wrapper .o_icon.o_delete,.o_comments .o_comment_wrapper .o_delete.o_sp_icon,.o_comments .o_comment_wrapper .o_delete.o_st_icon,.o_comments .o_comment_wrapper .o_delete.o_tu_icon,.o_comments .o_comment_wrapper .o_delete.o_midpub,.o_comments .o_comment_wrapper .o_delete.o_midwarn,.o_comments .o_comment_wrapper .o_delete.o_midlock,.o_comments .o_comment_wrapper .o_delete.o_miderr,.o_comments .o_comment_wrapper .o_delete.o_middel,.pull-right.o_sp_icon,.pull-right.o_st_icon,.pull-right.o_tu_icon,.pull-right.o_midpub,.pull-right.o_midwarn,.pull-right.o_midlock,.pull-right.o_miderr,.pull-right.o_middel{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)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-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=$rotation);-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=$rotation);-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=$rotation);-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=$rotation);-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{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,.o_rating .o_rating_items.o_enabled .o_sp_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_st_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_tu_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_midpub:hover:before,.o_rating .o_rating_items.o_enabled .o_midwarn:hover:before,.o_rating .o_rating_items.o_enabled .o_midlock:hover:before,.o_rating .o_rating_items.o_enabled .o_miderr:hover:before,.o_rating .o_rating_items.o_enabled .o_middel: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_tab:before,.o_icon_close: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{content:"\f014"}.o_icon-home:before{content:"\f015"}.o_icon-file-o:before,.o_tu_icon:before{content:"\f016"}.o_icon-clock-o:before,.o_icon_lifecycle:before{content:"\f017"}.o_icon-road:before{content:"\f018"}.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{content:"\f03d"}.o_icon-picture-o:before{content:"\f03e"}.o_icon-pencil: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{content:"\f044"}.o_icon-share-square-o:before{content:"\f045"}.o_icon-check-square-o:before{content:"\f046"}.o_icon-arrows: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{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{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{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{content:"\f077"}.o_icon-chevron-down:before{content:"\f078"}.o_icon-retweet: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{content:"\f081"}.o_icon-facebook-square: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-cogs:before{content:"\f085"}.o_icon-comments:before,.o_icon_comments:before{content:"\f086"}.o_icon-thumbs-o-up: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{content:"\f08e"}.o_icon-sign-in:before,.o_icon_login:before{content:"\f090"}.o_icon-trophy: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{content:"\f0a1"}.o_icon-bell:before{content:"\f0f3"}.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{content:"\f0ac"}.o_icon-wrench:before,.o_icon_dev:before{content:"\f0ad"}.o_icon-tasks: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{content:"\f0c0"}.o_icon-chain:before,.o_icon-link: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-files-o: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-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{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{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-asc:before,.o_icon_sort_asc:before{content:"\f0dd"}.o_icon-sort-up:before,.o_icon-sort-desc:before,.o_icon_sort_desc: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{content:"\f0e4"}.o_icon-comment-o:before,.o_icon_comments_none:before{content:"\f0e5"}.o_icon-comments-o: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{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{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{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{content:"\f114"}.o_icon-folder-open-o:before{content:"\f115"}.o_icon-smile-o:before{content:"\f118"}.o_icon-frown-o:before{content:"\f119"}.o_icon-meh-o: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-reply-all:before{content:"\f122"}.o_icon-mail-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{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-caret-square-o-down:before{content:"\f150"}.o_icon-toggle-up: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_st_icon:before{content:"\f187"}.o_icon-bug: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_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_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,a.o_sp_icon:hover,a.o_st_icon:hover,a.o_tu_icon:hover,a.o_midpub:hover,a.o_midwarn:hover,a.o_midlock:hover,a.o_miderr:hover,a.o_middel: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_details:hover,.o_undecorated:focus,a.o_icon:focus,a.o_sp_icon:focus,a.o_st_icon:focus,a.o_tu_icon:focus,a.o_midpub:focus,a.o_midwarn:focus,a.o_midlock:focus,a.o_miderr:focus,a.o_middel: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_details:focus{text-decoration:none}.o_nowrap{white-space:nowrap}.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_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.0.3");src:url("../../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../../../font-awesome/fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../../../font-awesome/fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon,.o_sp_icon,.o_st_icon,.o_tu_icon,.o_midpub,.o_midwarn,.o_midlock,.o_miderr,.o_middel{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_main_wrapper #o_main_container #o_main_right,.o_comments .o_comment_wrapper .o_reply,.o_comments .o_comment_wrapper .o_delete{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{float:left}.o_icon.pull-left,#o_main_wrapper #o_main_container .o_icon#o_main_left,#o_main_wrapper #o_main_container #o_main_left.o_sp_icon,#o_main_wrapper #o_main_container #o_main_left.o_st_icon,#o_main_wrapper #o_main_container #o_main_left.o_tu_icon,#o_main_wrapper #o_main_container #o_main_left.o_midpub,#o_main_wrapper #o_main_container #o_main_left.o_midwarn,#o_main_wrapper #o_main_container #o_main_left.o_midlock,#o_main_wrapper #o_main_container #o_main_left.o_miderr,#o_main_wrapper #o_main_container #o_main_left.o_middel,#o_navbar_imclient .o_icon#o_im_message,#o_navbar_imclient #o_im_message.o_sp_icon,#o_navbar_imclient #o_im_message.o_st_icon,#o_navbar_imclient #o_im_message.o_tu_icon,#o_navbar_imclient #o_im_message.o_midpub,#o_navbar_imclient #o_im_message.o_midwarn,#o_navbar_imclient #o_im_message.o_midlock,#o_navbar_imclient #o_im_message.o_miderr,#o_navbar_imclient #o_im_message.o_middel,#o_navbar_imclient .o_icon#o_im_status,#o_navbar_imclient #o_im_status.o_sp_icon,#o_navbar_imclient #o_im_status.o_st_icon,#o_navbar_imclient #o_im_status.o_tu_icon,#o_navbar_imclient #o_im_status.o_midpub,#o_navbar_imclient #o_im_status.o_midwarn,#o_navbar_imclient #o_im_status.o_midlock,#o_navbar_imclient #o_im_status.o_miderr,#o_navbar_imclient #o_im_status.o_middel,#o_navbar_imclient .o_icon#o_im_summary,#o_navbar_imclient #o_im_summary.o_sp_icon,#o_navbar_imclient #o_im_summary.o_st_icon,#o_navbar_imclient #o_im_summary.o_tu_icon,#o_navbar_imclient #o_im_summary.o_midpub,#o_navbar_imclient #o_im_summary.o_midwarn,#o_navbar_imclient #o_im_summary.o_midlock,#o_navbar_imclient #o_im_summary.o_miderr,#o_navbar_imclient #o_im_summary.o_middel,.o_comments .o_comment_wrapper .o_icon.o_avatar,.o_comments .o_comment_wrapper .o_avatar.o_sp_icon,.o_comments .o_comment_wrapper .o_avatar.o_st_icon,.o_comments .o_comment_wrapper .o_avatar.o_tu_icon,.o_comments .o_comment_wrapper .o_avatar.o_midpub,.o_comments .o_comment_wrapper .o_avatar.o_midwarn,.o_comments .o_comment_wrapper .o_avatar.o_midlock,.o_comments .o_comment_wrapper .o_avatar.o_miderr,.o_comments .o_comment_wrapper .o_avatar.o_middel,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_icon.o_rating_wrapper,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_sp_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_st_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_tu_icon,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midpub,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midwarn,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_midlock,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_miderr,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating_wrapper.o_middel,.pull-left.o_sp_icon,.pull-left.o_st_icon,.pull-left.o_tu_icon,.pull-left.o_midpub,.pull-left.o_midwarn,.pull-left.o_midlock,.pull-left.o_miderr,.pull-left.o_middel{margin-right:.3em}.o_icon.pull-right,div.o_icon.o_chelp_wrapper,div.o_chelp_wrapper.o_sp_icon,div.o_chelp_wrapper.o_st_icon,div.o_chelp_wrapper.o_tu_icon,div.o_chelp_wrapper.o_midpub,div.o_chelp_wrapper.o_midwarn,div.o_chelp_wrapper.o_midlock,div.o_chelp_wrapper.o_miderr,div.o_chelp_wrapper.o_middel,#o_main_wrapper #o_main_container .o_icon#o_main_right,#o_main_wrapper #o_main_container #o_main_right.o_sp_icon,#o_main_wrapper #o_main_container #o_main_right.o_st_icon,#o_main_wrapper #o_main_container #o_main_right.o_tu_icon,#o_main_wrapper #o_main_container #o_main_right.o_midpub,#o_main_wrapper #o_main_container #o_main_right.o_midwarn,#o_main_wrapper #o_main_container #o_main_right.o_midlock,#o_main_wrapper #o_main_container #o_main_right.o_miderr,#o_main_wrapper #o_main_container #o_main_right.o_middel,.o_comments .o_comment_wrapper .o_icon.o_reply,.o_comments .o_comment_wrapper .o_reply.o_sp_icon,.o_comments .o_comment_wrapper .o_reply.o_st_icon,.o_comments .o_comment_wrapper .o_reply.o_tu_icon,.o_comments .o_comment_wrapper .o_reply.o_midpub,.o_comments .o_comment_wrapper .o_reply.o_midwarn,.o_comments .o_comment_wrapper .o_reply.o_midlock,.o_comments .o_comment_wrapper .o_reply.o_miderr,.o_comments .o_comment_wrapper .o_reply.o_middel,.o_comments .o_comment_wrapper .o_icon.o_delete,.o_comments .o_comment_wrapper .o_delete.o_sp_icon,.o_comments .o_comment_wrapper .o_delete.o_st_icon,.o_comments .o_comment_wrapper .o_delete.o_tu_icon,.o_comments .o_comment_wrapper .o_delete.o_midpub,.o_comments .o_comment_wrapper .o_delete.o_midwarn,.o_comments .o_comment_wrapper .o_delete.o_midlock,.o_comments .o_comment_wrapper .o_delete.o_miderr,.o_comments .o_comment_wrapper .o_delete.o_middel,.pull-right.o_sp_icon,.pull-right.o_st_icon,.pull-right.o_tu_icon,.pull-right.o_midpub,.pull-right.o_midwarn,.pull-right.o_midlock,.pull-right.o_miderr,.pull-right.o_middel{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)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-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=$rotation);-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=$rotation);-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=$rotation);-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=$rotation);-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{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,.o_rating .o_rating_items.o_enabled .o_sp_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_st_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_tu_icon:hover:before,.o_rating .o_rating_items.o_enabled .o_midpub:hover:before,.o_rating .o_rating_items.o_enabled .o_midwarn:hover:before,.o_rating .o_rating_items.o_enabled .o_midlock:hover:before,.o_rating .o_rating_items.o_enabled .o_miderr:hover:before,.o_rating .o_rating_items.o_enabled .o_middel: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_tab:before,.o_icon_close: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{content:"\f014"}.o_icon-home:before{content:"\f015"}.o_icon-file-o:before,.o_tu_icon:before{content:"\f016"}.o_icon-clock-o:before,.o_icon_lifecycle:before{content:"\f017"}.o_icon-road:before{content:"\f018"}.o_icon-download: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{content:"\f03d"}.o_icon-picture-o:before{content:"\f03e"}.o_icon-pencil: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{content:"\f044"}.o_icon-share-square-o:before{content:"\f045"}.o_icon-check-square-o:before{content:"\f046"}.o_icon-arrows: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{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{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{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{content:"\f077"}.o_icon-chevron-down:before{content:"\f078"}.o_icon-retweet: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{content:"\f081"}.o_icon-facebook-square: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-cogs:before{content:"\f085"}.o_icon-comments:before,.o_icon_comments:before{content:"\f086"}.o_icon-thumbs-o-up: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{content:"\f08e"}.o_icon-sign-in:before,.o_icon_login:before{content:"\f090"}.o_icon-trophy: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{content:"\f0a1"}.o_icon-bell:before{content:"\f0f3"}.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{content:"\f0ac"}.o_icon-wrench:before,.o_icon_dev:before{content:"\f0ad"}.o_icon-tasks: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{content:"\f0c0"}.o_icon-chain:before,.o_icon-link: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-files-o: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-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{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{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-asc:before,.o_icon_sort_asc:before{content:"\f0dd"}.o_icon-sort-up:before,.o_icon-sort-desc:before,.o_icon_sort_desc: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{content:"\f0e4"}.o_icon-comment-o:before,.o_icon_comments_none:before{content:"\f0e5"}.o_icon-comments-o: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{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{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{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{content:"\f114"}.o_icon-folder-open-o:before{content:"\f115"}.o_icon-smile-o:before{content:"\f118"}.o_icon-frown-o:before{content:"\f119"}.o_icon-meh-o: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-reply-all:before{content:"\f122"}.o_icon-mail-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{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-caret-square-o-down:before{content:"\f150"}.o_icon-toggle-up: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_st_icon:before{content:"\f187"}.o_icon-bug: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_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_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,a.o_sp_icon:hover,a.o_st_icon:hover,a.o_tu_icon:hover,a.o_midpub:hover,a.o_midwarn:hover,a.o_midlock:hover,a.o_miderr:hover,a.o_middel: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_details:hover,.o_undecorated:focus,a.o_icon:focus,a.o_sp_icon:focus,a.o_st_icon:focus,a.o_tu_icon:focus,a.o_midpub:focus,a.o_midwarn:focus,a.o_midlock:focus,a.o_miderr:focus,a.o_middel: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_details:focus{text-decoration:none}.o_nowrap{white-space:nowrap}.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_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}#o_main_wrapper #o_toplink{position:absolute;bottom:10px;right:10px}#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:5px;width:250px}#o_share a{margin:0 3px 0 0;background-repeat:no-repeat;width:16px;height:16px;float:left;display:inline;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}#o_share #o_facebook{background-image:url("../light/images/social/facebook_16.png")}#o_share #o_twitter{background-image:url("../light/images/social/twitter_16.png")}#o_share #o_google{background-image:url("../light/images/social/google_16.png")}#o_share #o_delicious{background-image:url("../light/images/social/delicious_16.png")}#o_share #o_digg{background-image:url("../light/images/social/digg_16.png")}#o_share #o_mail{background-image:url("../light/images/social/email_16.png")}#o_share #o_link{background-image:url("../light/images/social/link_16.png")}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}} .alert-fixed-top{top:0;border-width:0 0 1px 0}@media (min-width: 992px){.alert-fixed-top{border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-width:0 1px 1px 1px}}