Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r42cd8d7da9fa6615dbd82d376984000024b4b0fe -rc33d82bf97152099b7a309a156ec2707239b622c Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java =================================================================== diff -u -rb3ac8b06b9377eac584d8aa906d615cb31a808b8 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision b3ac8b06b9377eac584d8aa906d615cb31a808b8) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -61,9 +61,6 @@ /** * @author jliew - * - * - * */ public class DisplayGroupAction extends Action { private static IUserManagementService service; Index: lams_central/src/java/org/lamsfoundation/lams/web/IndexAction.java =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/IndexAction.java (.../IndexAction.java) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/src/java/org/lamsfoundation/lams/web/IndexAction.java (.../IndexAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -23,30 +23,35 @@ package org.lamsfoundation.lams.web; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; -import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; -import org.lamsfoundation.lams.authoring.service.IAuthoringService; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.config.Registration; import org.lamsfoundation.lams.index.IndexLinkBean; -import org.lamsfoundation.lams.learningdesign.service.IExportToolContentService; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.action.LamsDispatchAction; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.web.context.WebApplicationContext; @@ -56,7 +61,7 @@ * * @author Fei Yang */ -public class IndexAction extends Action { +public class IndexAction extends LamsDispatchAction { private static final String PATH_PEDAGOGICAL_PLANNER = "pedagogical_planner"; private static final String PATH_LAMS_CENTRAL = "lams-central.war"; @@ -66,10 +71,10 @@ @Override @SuppressWarnings("unchecked") - public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, + public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { - IndexAction.setHeaderLinks(request); + setHeaderLinks(request); setAdminLinks(request); // check if this is user's first login; some action (like displaying a dialog for disabling tutorials) can be @@ -89,67 +94,48 @@ if (loggedInUser.getChangePassword() != null && loggedInUser.getChangePassword()) { return mapping.findForward("password"); } - + // check if user needs to get his shared two-factor authorization secret - if (loggedInUser.isTwoFactorAuthenticationEnabled() && loggedInUser.getTwoFactorAuthenticationSecret() == null) { + if (loggedInUser.isTwoFactorAuthenticationEnabled() + && loggedInUser.getTwoFactorAuthenticationSecret() == null) { return mapping.findForward("twoFactorAuthentication"); } User user = getUserManagementService().getUserByLogin(userDTO.getLogin()); request.setAttribute("portraitUuid", user.getPortraitUuid()); - String tab = WebUtil.readStrParam(request, "tab", true); - if (StringUtils.equals(tab, "profile")) { + String method = WebUtil.readStrParam(request, "method", true); + if (StringUtils.equals(method, "profile")) { return mapping.findForward("profile"); - } else if (StringUtils.equals(tab, "editprofile")) { + } else if (StringUtils.equals(method, "editprofile")) { return mapping.findForward("editprofile"); - } else if (StringUtils.equals(tab, "password")) { + } else if (StringUtils.equals(method, "password")) { return mapping.findForward("password"); - } else if (StringUtils.equals(tab, "passwordChanged")) { - request.setAttribute("tab", "profile"); + } else if (StringUtils.equals(method, "passwordChanged")) { return mapping.findForward("passwordChanged"); - } else if (StringUtils.equals(tab, "portrait")) { + } else if (StringUtils.equals(method, "portrait")) { return mapping.findForward("portrait"); - } else if (StringUtils.equals(tab, "lessons")) { + } else if (StringUtils.equals(method, "lessons")) { return mapping.findForward("lessons"); - } else if (StringUtils.equals(tab, "community")) { - - String comLoginUrl = Configuration.get(ConfigurationKeys.SERVER_URL) + "/lamsCommunityLogin.do"; - request.setAttribute("comLoginUrl", comLoginUrl); - request.setAttribute("tab", tab); - return mapping.findForward("community"); } Registration reg = Configuration.getRegistration(); if (reg != null) { request.setAttribute("lamsCommunityEnabled", reg.isEnableLamsCommunityIntegration()); } - List orgDTOs = getUserManagementService().getActiveCourseIdsByUser(loggedInUser.getUserId(), - request.isUserInRole(Role.SYSADMIN)); - request.setAttribute("orgDTOs", orgDTOs); return mapping.findForward("main"); } private static void setHeaderLinks(HttpServletRequest request) { List headerLinks = new ArrayList(); if (request.isUserInRole(Role.AUTHOR)) { - if (IndexAction.isPedagogicalPlannerAvailable()) { + if (isPedagogicalPlannerAvailable()) { headerLinks.add(new IndexLinkBean("index.planner", "javascript:openPedagogicalPlanner()")); } headerLinks.add(new IndexLinkBean("index.author", "javascript:showAuthoringDialog()")); } - headerLinks.add(new IndexLinkBean("index.myprofile", "index.do?tab=profile")); - Registration reg = Configuration.getRegistration(); - if (reg != null) { - if (request.isUserInRole(Role.SYSADMIN) || request.isUserInRole(Role.GROUP_ADMIN) - || request.isUserInRole(Role.GROUP_MANAGER) || request.isUserInRole(Role.AUTHOR) - || request.isUserInRole(Role.MONITOR)) { - headerLinks.add(new IndexLinkBean("index.community", "index.do?tab=community")); - } - } - String customTabText = Configuration.get(ConfigurationKeys.CUSTOM_TAB_TITLE); String customTabLink = Configuration.get(ConfigurationKeys.CUSTOM_TAB_LINK); if (customTabLink != null && customTabLink.trim().length() > 0) { @@ -172,19 +158,68 @@ request.setAttribute("adminLinks", adminLinks); } + /** + * Returns list of organisations for . + */ + public ActionForward getOrgs(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse res) throws IOException, ServletException, JSONException { + getUserManagementService(); + User loggedInUser = getUserManagementService().getUserByLogin(request.getRemoteUser()); + + Integer userId = loggedInUser.getUserId(); + boolean isSysadmin = request.isUserInRole(Role.SYSADMIN); + String searchString = WebUtil.readStrParam(request, "fcol[1]", true); + + // paging parameters of tablesorter + int size = WebUtil.readIntParam(request, "size"); + int page = WebUtil.readIntParam(request, "page"); +// Integer isSort1 = WebUtil.readIntParam(request, "column[0]", true); +// Integer isSort2 = WebUtil.readIntParam(request, "column[1]", true); +// Integer isSort3 = WebUtil.readIntParam(request, "column[2]", true); +// Integer isSort4 = WebUtil.readIntParam(request, "column[3]", true); +// +// String sortBy = ""; +// String sortOrder = ""; +// if (isSort2 != null) { +// sortBy = "name"; +// sortOrder = isSort2.equals(0) ? "ASC" : "DESC"; +// +// } + + List orgDtos = userManagementService.getActiveCoursesByUser(userId, isSysadmin, page, size, searchString); + + JSONObject responcedata = new JSONObject(); + responcedata.put("total_rows", userManagementService.getCountActiveCoursesByUser(userId, isSysadmin, searchString)); + + JSONArray rows = new JSONArray(); + for (OrganisationDTO orgDto : orgDtos) { + + JSONObject responseRow = new JSONObject(); + responseRow.put("id", orgDto.getOrganisationID()); + String orgName = orgDto.getName() == null ? "" : orgDto.getName(); + responseRow.put("name", StringEscapeUtils.escapeHtml(orgName)); + + rows.put(responseRow); + } + responcedata.put("rows", rows); + res.setContentType("application/json;charset=utf-8"); + res.getWriter().print(new String(responcedata.toString())); + return null; + } + private IUserManagementService getUserManagementService() { - if (IndexAction.userManagementService == null) { + if (userManagementService == null) { WebApplicationContext ctx = WebApplicationContextUtils .getRequiredWebApplicationContext(getServlet().getServletContext()); - IndexAction.userManagementService = (IUserManagementService) ctx.getBean("userManagementService"); + userManagementService = (IUserManagementService) ctx.getBean("userManagementService"); } - return IndexAction.userManagementService; + return userManagementService; } private static boolean isPedagogicalPlannerAvailable() { String lamsEarPath = Configuration.get(ConfigurationKeys.LAMS_EAR_DIR); - String plannerPath = lamsEarPath + File.separator + IndexAction.PATH_LAMS_CENTRAL + File.separator - + IndexAction.PATH_PEDAGOGICAL_PLANNER; + String plannerPath = lamsEarPath + File.separator + PATH_LAMS_CENTRAL + File.separator + + PATH_PEDAGOGICAL_PLANNER; File plannerDir = new File(plannerPath); return plannerDir.isDirectory(); } Index: lams_central/src/java/org/lamsfoundation/lams/web/PasswordAction.java =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/PasswordAction.java (.../PasswordAction.java) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/src/java/org/lamsfoundation/lams/web/PasswordAction.java (.../PasswordAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -42,7 +42,6 @@ PasswordChangeActionForm passwordChangeForm = (PasswordChangeActionForm) form; passwordChangeForm.setLogin(request.getRemoteUser()); - request.setAttribute("tab", "profile"); return mapping.findForward("passwordChange"); } } Index: lams_central/src/java/org/lamsfoundation/lams/web/PasswordChangeAction.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/PasswordChangeAction.java (.../PasswordChangeAction.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/web/PasswordChangeAction.java (.../PasswordChangeAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -44,13 +44,6 @@ /** * @author Fei Yang - * - * - * - * - * - * - * */ public class PasswordChangeAction extends Action { @@ -150,7 +143,6 @@ return (mapping.findForward("error.system")); } - request.setAttribute("tab", "password"); return mapping.findForward("okay"); } Index: lams_central/src/java/org/lamsfoundation/lams/web/PortraitAction.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/PortraitAction.java (.../PortraitAction.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/web/PortraitAction.java (.../PortraitAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.web; import javax.servlet.http.HttpServletRequest; @@ -38,13 +37,6 @@ /** * @author jliew - * - * - * - * - * - * - * */ public class PortraitAction extends Action { @@ -60,7 +52,6 @@ log.debug("using portraitUuid=" + portraitUuid); // if no portrait has been uploaded, set the uuid to 0 portraitForm.setPortraitUuid(portraitUuid == null ? 0 : portraitUuid); - request.setAttribute("tab", "profile"); return mapping.findForward("portrait"); } Index: lams_central/src/java/org/lamsfoundation/lams/web/PortraitActionForm.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/PortraitActionForm.java (.../PortraitActionForm.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/web/PortraitActionForm.java (.../PortraitActionForm.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -29,8 +29,6 @@ /** * @author jliew - * - * */ public class PortraitActionForm extends ActionForm { Index: lams_central/src/java/org/lamsfoundation/lams/web/PortraitSaveAction.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/PortraitSaveAction.java (.../PortraitSaveAction.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/web/PortraitSaveAction.java (.../PortraitSaveAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -55,11 +55,6 @@ /** * @author jliew * @author Andrey Balan - * - * - * - * - * */ public class PortraitSaveAction extends LamsDispatchAction { Index: lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java (.../ProfileAction.java) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java (.../ProfileAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -66,7 +66,6 @@ import org.springframework.web.context.support.WebApplicationContextUtils; /** - * * @author Fei Yang */ public class ProfileAction extends LamsDispatchAction { @@ -94,7 +93,6 @@ request.setAttribute("fullName", fullName); request.setAttribute("email", (email != null ? email : "")); request.setAttribute("portraitUuid", requestor.getPortraitUuid()); - request.setAttribute("tab", "profile"); return mapping.findForward("view"); } @@ -173,7 +171,6 @@ } request.setAttribute("beans", beans); - request.setAttribute("tab", "profile"); return mapping.findForward("lessons"); } @@ -217,7 +214,6 @@ if (requestor.isTwoFactorAuthenticationEnabled()) { request.setAttribute("sharedSecret", requestor.getTwoFactorAuthenticationSecret()); } - request.setAttribute("tab", "profile"); boolean hasLamsCommunityToken = requestor.getLamsCommunityToken() != null; request.setAttribute("hasLamsCommunityToken", hasLamsCommunityToken); Index: lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java (.../ProfileSaveAction.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/web/ProfileSaveAction.java (.../ProfileSaveAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -52,15 +52,7 @@ /** * @author jliew - * */ - -/** - * - * - * - * - */ public class ProfileSaveAction extends Action { private static Logger log = Logger.getLogger(ProfileSaveAction.class); Index: lams_central/src/java/org/lamsfoundation/lams/web/action/TwoFactorAuthenticationAction.java =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/src/java/org/lamsfoundation/lams/web/action/TwoFactorAuthenticationAction.java (.../TwoFactorAuthenticationAction.java) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/src/java/org/lamsfoundation/lams/web/action/TwoFactorAuthenticationAction.java (.../TwoFactorAuthenticationAction.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -68,7 +68,6 @@ request.setAttribute("QRCode", QRCode); } - request.setAttribute("tab", "profile"); return mapping.findForward("secret"); } } Index: lams_central/web/WEB-INF/struts-config.xml =================================================================== diff -u -rde884cf8c730a25d2f2296f7a768d3fd45508c99 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision de884cf8c730a25d2f2296f7a768d3fd45508c99) +++ lams_central/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -115,6 +115,7 @@ @@ -145,7 +146,7 @@ /> @@ -448,7 +449,7 @@ /> @@ -526,18 +527,18 @@ type="org.lamsfoundation.lams.web.ProfileSaveAction" name="UserForm" scope="request" - input=".editprofile" + input="/editprofile.jsp" unknown="false" validate="false" > @@ -552,17 +553,17 @@ > @@ -584,19 +585,19 @@ type="org.lamsfoundation.lams.web.PortraitSaveAction" name="PortraitActionForm" scope="request" - input=".portrait" + input="/portrait.jsp" parameter="method" unknown="false" validate="false" > @@ -669,23 +670,23 @@ type="org.lamsfoundation.lams.web.PasswordChangeAction" name="PasswordChangeActionForm" scope="request" - input=".passwordChange" + input="/passwordChangeContent.jsp" unknown="false" validate="false" > Index: lams_central/web/WEB-INF/tiles-defs.xml =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/web/WEB-INF/tiles-defs.xml (.../tiles-defs.xml) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -25,35 +25,11 @@ http://www.gnu.org/licenses/gpl.txt --> - - - - - - - - - - - - - - - - - - - - - - - - Index: lams_central/web/css/main.css =================================================================== diff -u --- lams_central/web/css/main.css (revision 0) +++ lams_central/web/css/main.css (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -0,0 +1,313 @@ +body { + width: 100%; + overflow-x: hidden; + font-size: 13px; + background: url('/lams/images/css/light-fabric.jpg'); +} +html { + height: 100%; +} +#offcanvas { + position: fixed; + width: 300px; + z-index: 10; + height: 100%; + background: #2f4050; + color: #E7E7E7; +} +.courses-title { + text-overflow: ellipsis; + overflow: hidden; + font-weight: 400; + font-size: 24px; + width: 100%; + color: #ECF0F1 !important; + margin-left: 0 !important; + line-height: 59px; + margin: 0; + padding-left: 25px; +} +#page-wrapper { + min-height: 1000px; + margin: 0 0 0 300px; + padding: 10px 20px 0px; +} +.offcanvas-hidden #offcanvas { + display: none; +} +.offcanvas-hidden #page-wrapper { + margin: 0 0 0 0; +} +@media (min-width: 768px) { + .icon-remove { + display: none !important; + } +} +@media (max-width: 768px) { + #offcanvas { + width: 100%; + } + .navbar-nav .open .dropdown-menu { + top:52px; /*hack to prevent disappearing*/ + } +} +@media (max-width: 870px) { + body.offcanvas-hidden .xs-hidden { + display: none !important; + } +} +@media (max-width: 1170px) { + body:not(.offcanvas-hidden) .xs-hidden { + display: none !important; + } +} + +/*FOOTER*/ +footer { + background: #fff; + padding: 15px 20px; +} +.text-muted { + color: #777; +} +.text-center { + text-align: center; +} +a { + color: #5A738E; + text-decoration: none; +} + +/*OFFCANVAS BAR*/ +#offcanvas-menu > li > a, .tablesorter a { + color: #a7b1c2; + font-weight: 400; + padding: 14px 20px 14px 25px; +} +#offcanvas-menu > li > a:hover, +#offcanvas-menu > li > a:focus, +.pagesize:hover, +.tablesorter a:hover, +.tablesorter a:focus { + background-color: #293846; + color: white; +} +.tablesorter a { + display:block; + text-decoration:none; + font-size: 13px; +} +#offcanvas .active > a, +#offcanvas .active > a:hover, +#offcanvas .active > a:focus { + background: #293846; +} +#offcanvas .active > a { + color: #ffffff; +} +#offcanvas td.active { + border-right: 10px solid #19aa8d; + background: #293846; +} +li.offcanvas-logo { + padding: 33px 25px; + background-color: #293846; +} +li.offcanvas-header { + padding: 10px 0px; + background-color: #293846; + border-bottom: 1px solid rgba(255, 255, 255, 0.16); +} +li.offcanvas-search { + padding: 20px 19px 10px; + margin-bottom: 0; + border-top: 1px solid rgba(255, 255, 255, 0.16); +} +.offcanvas-search .form-control { + box-shadow: inset 0 1px 0px rgba(208, 206, 206, 0.25); + border-radius: 25px; + padding-left: 20px; + border: 1px solid rgba(221, 226, 232, 0.49); + background: #2f4050; + color: #a7b1c2; +} +.offcanvas-search .form-control::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #a7b1c2; +} +.offcanvas-search .form-control:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #a7b1c2; +} +.offcanvas-search .form-control::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #a7b1c2; +} +.offcanvas-search .form-control:-ms-input-placeholder { /* Internet Explorer 10-11 */ + color: #a7b1c2; +} +.ts-pager { + text-align: center; + padding: 0 10px 10px; + color: #a7b1c2; +} +.ts-pager .btn{ + color: #2f4050; + background-color: #a7b1c2; +} +.tablesorter tfoot i { + font-size: 11px; +} +.tablesorter tfoot th { + background-color: #25323E !important; +} + +.pagesize { + border: 1px solid rgba(221, 226, 232, 0.49); + background: #2f4050; + cursor: pointer; +} + +/*ICON*/ +.icon-remove { + cursor: pointer; + position: absolute; + width: 40px; + top: 20px; + right: 5px; +} +.icon-remove:hover { + color: #ffffff; +} +.fa-chevron-circle-right.fa-lg { + line-height: 1em; +} +/*TOP HEADER*/ +.nav_menu { + float: left; + background: #EDEDED; + border-bottom: 1px solid #D9DEE4; + margin-bottom: 10px; + width: 100%; +} +.offcanvas-toggle-wrapper { + float: left; + margin: 0; + padding: 15px 0 10px 7px; + width: 70px; + cursor: pointer; +} +@media (min-width: 768px) { + .offcanvas-toggle-wrapper { + padding-top: 20px; + padding-bottom: 15px; + } +} +.offcanvas-toggle { + padding: 15px 15px 0; + margin: 0; +} +.offcanvas-toggle i { + font-size: 26px; +} +.top_nav .navbar-right { + margin: 0; + width: 70%; + float: right; +} +.top_nav .navbar-right li { + display: inline-block; + float: right; + position: static; +} +@media (min-width: 480px) { + .top_nav .navbar-right li { + position: relative; + } +} +.top_nav .dropdown-menu li { + width: 100%; +} +.top_nav li a i { + font-size: 15px; +} +ul.dropdown-usermenu li { + background: #EDEDED; + display: -ms-flexbox; + display: flex; + margin: 2px 2px 0; + width: 98% !important; +} +/*HEADER links*/ +.offcanvas-toggle-wrapper:hover, ul.dropdown-usermenu li a:focus, ul.dropdown-usermenu li a:hover, .top_nav .nav > li > a:hover, .top_nav .nav .open > a, .top_nav .nav .open > a:focus, .top_nav .nav .open > a:hover { + background: #D9DEE4; +} +.nav > li > a:hover, .nav > li > a:focus { + background-color: transparent; +} +.navbar-nav > li > a { + font-weight: 500; + color: #ECF0F1 !important; + margin-left: 0 !important; + line-height: 32px; +} +.top_nav .dropdown-menu li a { + width: 100%; + padding: 10px 20px; +} +.top_nav .dropdown-menu li a i { + padding-right: 15px; +} +.dropdown-menu a { + cursor: pointer; +} +.navbar-nav .open .dropdown-menu { + position: absolute; + background: #fff; + margin-top: 0; + padding: 0 0 3px; + border: 1px solid #D9DEE4; + -webkit-box-shadow: none; + right: 0; + left: auto; + width: 210px; +} +.nav.navbar-nav > li > a { + color: #515356 !important; +} +.user-profile img { + width: 29px; + height: 29px; + border-radius: 50%; + margin-right: 10px; +} +#notificationsPendingCount{ + font-size: 10px; + font-weight: normal; + line-height: 13px; + padding: 2px 5px; + position: absolute; + left: 25px; + top: 10px; + background: #1ABB9C !important; + border: 1px solid #1ABB9C !important; + display: inline-block; + min-width: 10px; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + border-radius: 10px; +} + +/*MAIN*/ +.content { + /*background: #fff;*/ + padding: 7px 10px; + background: #fff; +} +.container-turned-off-lams { + background: #fff; + padding: 7px 10px; +} +/*OLDER STUFF*/ +.orgTab { + padding: 10px 0 10px 15px; +} \ No newline at end of file Index: lams_central/web/editprofile.jsp =================================================================== diff -u -r171f124aefe163dee7e1d196a006ce11039631a6 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/editprofile.jsp (.../editprofile.jsp) (revision 171f124aefe163dee7e1d196a006ce11039631a6) +++ lams_central/web/editprofile.jsp (.../editprofile.jsp) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -1,20 +1,32 @@ -<%@ page contentType="text/html; charset=utf-8" language="java"%> + +<%@ page contentType="text/html; charset=utf-8" language="java"%> <%@ taglib uri="tags-html" prefix="html"%> <%@ taglib uri="tags-core" prefix="c"%> <%@ taglib uri="tags-bean" prefix="bean"%> <%@ taglib uri="tags-logic" prefix="logic"%> <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-lams" prefix="lams"%> -<%@ page - import="org.lamsfoundation.lams.usermanagement.AuthenticationMethod"%> -<%@ page import="org.lamsfoundation.lams.util.Configuration" +<%@ page import="org.lamsfoundation.lams.usermanagement.AuthenticationMethod" + import="org.lamsfoundation.lams.util.Configuration" import="org.lamsfoundation.lams.util.ConfigurationKeys"%> - - + + + + + + + + + + @@ -34,12 +46,7 @@
-
-
-
- -
-
+
@@ -412,5 +419,6 @@
+ + - Index: lams_central/web/images/css/john-doe-portrait.jpg =================================================================== diff -u Binary files differ Index: lams_central/web/includes/javascript/addLesson.js =================================================================== diff -u -r1b061852dd3595f0f73778f5562078a1864154eb -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/includes/javascript/addLesson.js (.../addLesson.js) (revision 1b061852dd3595f0f73778f5562078a1864154eb) +++ lams_central/web/includes/javascript/addLesson.js (.../addLesson.js) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -13,7 +13,7 @@ } /** - * Sets up widgets in the main tab. + * Sets up widgets on the main.jsp page */ function initLessonTab(){ $('#ldScreenshotAuthor').load(function(){ Index: lams_central/web/includes/javascript/groupDisplay.js =================================================================== diff -u -r8ae74d3f32483f40194b9c79aaa01ccc13098885 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/includes/javascript/groupDisplay.js (.../groupDisplay.js) (revision 8ae74d3f32483f40194b9c79aaa01ccc13098885) +++ lams_central/web/includes/javascript/groupDisplay.js (.../groupDisplay.js) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -1,45 +1,55 @@ function initMainPage() { initButtons(); - if ($('#orgTabs').length > 0) { - $('#orgTabs').tabs({ - 'activate' : function(event, ui){ - loadOrgTab(ui.newPanel); - } - }).addClass('ui-tabs-vertical ui-helper-clearfix') - .find('li').removeClass('ui-corner-top').addClass('ui-corner-left'); + //in case active course is not yet chosen by user, select the fist one from the list - loadOrgTab($('.orgTab').first()); + + if (activeOrgId > 0) { + //$('#orgTabs').tabs({ + // 'activate' : function(event, ui){ + // loadOrganisation(); + // } + //}).addClass('ui-tabs-vertical ui-helper-clearfix') + // .find('li').removeClass('ui-corner-top').addClass('ui-corner-left'); + + loadOrganisation(); } - $("#actionAccord").accordion({ - 'heightStyle' : 'content' - }); - refreshPrivateNotificationCount(); } -function loadOrgTab(orgTab, refresh) { - if (!orgTab) { - orgTab = $('div.orgTab[id^=orgTab-' + $('#orgTabs').tabs('option','active') + ']'); - } - if (orgTab && (refresh || !orgTab.text())) { - var orgTabId = orgTab.attr("id"); - var orgId = orgTabId.split('-')[3]; - - orgTab.load( - "displayGroup.do", - { - stateId : stateId, - orgId : orgId - }, - function() { - initButtons(orgTabId); - }); - } +function selectOrganisation(newOrgId) { + //remove active CSS class from the old org + if (activeOrgId > 0) { + $("#org-row-" + activeOrgId).removeClass("active"); + $("#org-row-" + activeOrgId + " a>i").remove(); + } + + //add active CSS class + $("#org-row-" + newOrgId).addClass("active"); + $("#org-row-" + newOrgId + " a").append( "" ) + + activeOrgId = newOrgId; + loadOrganisation(); + + //store last visited + // TODO } +function loadOrganisation() { + $("#org-container").load( + "displayGroup.do", + { + stateId : stateId, + orgId : activeOrgId + }, + function() { + initButtons("org-container"); + } + ); +} + function initButtons(containerId) { var container = containerId ? $('#' + containerId) : document; @@ -143,7 +153,7 @@ ids : ids.join(",") }, error : function() { - loadOrgTab(null, true); + loadOrganisation(); } }); } @@ -225,6 +235,49 @@ } +function showMyProfileDialog() { + showDialog("dialogMyProfile", { + 'title' : LABELS.MY_PROFILE, + 'modal' : true, + 'width' : 'auto', + 'height' : 430, + 'open' : function() { + var dialog = $(this); + // load contents after opening the dialog + $('iframe', dialog).attr('src', LAMS_URL + 'index.do?method=profile'); + $(this).css("maxWidth", "770px").css("margin", "auto"); + + // in case of mobile devices allow iframe scrolling + if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { + setTimeout(function() { + dialog.css({ + 'overflow-y' : 'scroll', + '-webkit-overflow-scrolling' : 'touch' + }); + },500); + } + } + }); +} + + +function updateMyProfileDialogSettings(title, height) { + var id = 'dialogMyProfile'; + var dialog = $("#" + id, window.parent.document); + + // update height + $('.modal-content', dialog).height(height); + if (height.match("%$")) { + $('.modal-dialog', dialog).height(height); + } else { + $('.modal-dialog', dialog).height(''); + } + + // update title + $('.modal-title', dialog).attr('id', id + 'Label').text(title); +} + + function showOrgGroupDialog(orgID) { showDialog("dialogOrgGroup", { 'data' : { @@ -433,7 +486,7 @@ 'method' : 'getPendingNotificationCount' }, success : function(count) { - $('#notificationsPendingCount').text(count == 0 ? '' : '(' + count + ')'); + $('#notificationsPendingCount').text(count == 0 ? '0' : count); } }); } @@ -611,7 +664,7 @@ // was the dialog just closed or a lesson removed // if latter, refresh the list if (refresh) { - loadOrgTab(null, true); + loadOrganisation(); } $("#" + id).modal('hide'); } @@ -663,7 +716,7 @@ type : "POST", success : function(json) { if (json.removeLesson == true) { - loadOrgTab(null, true); + loadOrganisation(); } else { alert(json.removeLesson); } Index: lams_central/web/includes/javascript/jquery.slimscroll.js =================================================================== diff -u --- lams_central/web/includes/javascript/jquery.slimscroll.js (revision 0) +++ lams_central/web/includes/javascript/jquery.slimscroll.js (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -0,0 +1,219 @@ +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.3.6 + * + */ +(function(e) { + e.fn.extend({ + slimScroll: function(g) { + var a = e.extend({ + width: "auto", + height: "250px", + size: "7px", + color: "#000", + position: "right", + distance: "1px", + start: "top", + opacity: .4, + alwaysVisible: !1, + disableFadeOut: !1, + railVisible: !1, + railColor: "#333", + railOpacity: .2, + railDraggable: !0, + railClass: "slimScrollRail", + barClass: "slimScrollBar", + wrapperClass: "slimScrollDiv", + allowPageScroll: !1, + wheelStep: 20, + touchScrollStep: 200, + borderRadius: "7px", + railBorderRadius: "7px" + }, g); + this.each(function() { + function v(d) { + if (r) { + d = d || window.event; + var c = 0; + d.wheelDelta && (c =- d.wheelDelta / 120); + d.detail && (c = d.detail / 3); + e(d.target || d.srcTarget || d.srcElement).closest("." + a.wrapperClass).is(b.parent()) && m(c, !0); + d.preventDefault&&!k && d.preventDefault(); + k || (d.returnValue=!1) + } + } + function m(d, e, g) { + k=!1; + var f = d, h = b.outerHeight() - c.outerHeight(); + e && (f = parseInt(c.css("top")) + d * parseInt(a.wheelStep) / 100 * c.outerHeight(), f = Math.min(Math.max(f, 0), h), f = 0 < d ? Math.ceil(f) : Math.floor(f), c.css({ + top: f + "px" + })); + l = parseInt(c.css("top")) / (b.outerHeight() - c.outerHeight()); + f = l * (b[0].scrollHeight - b.outerHeight()); + g && (f = d, d = f / b[0].scrollHeight * b.outerHeight(), d = Math.min(Math.max(d, 0), h), c.css({ + top: d + "px" + })); + b.scrollTop(f); + b.trigger("slimscrolling", ~~f); + w(); + p() + } + function x() { + u = Math.max(b.outerHeight() / b[0].scrollHeight * b.outerHeight(), 30); + c.css({ + height: u + "px" + }); + var a = u == b.outerHeight() ? "none": "block"; + c.css({ + display: a + }) + } + function w() { + x(); + clearTimeout(B); + l==~~l ? (k = a.allowPageScroll, C != l && b.trigger("slimscroll", 0==~~l ? "top" : "bottom")) : k=!1; + C = l; + u >= b.outerHeight() ? k=!0 : (c.stop(!0, + !0).fadeIn("fast"), a.railVisible && h.stop(!0, !0).fadeIn("fast")) + } + function p() { + a.alwaysVisible || (B = setTimeout(function() { + a.disableFadeOut && r || y || z || (c.fadeOut("slow"), h.fadeOut("slow")) + }, 1E3)) + } + var r, y, z, B, A, u, l, C, k=!1, b = e(this); + if (b.parent().hasClass(a.wrapperClass)) { + var n = b.scrollTop(), c = b.closest("." + a.barClass), h = b.closest("." + a.railClass); + x(); + if (e.isPlainObject(g)) { + if ("height"in g && "auto" == g.height) { + b.parent().css("height", "auto"); + b.css("height", "auto"); + var q = b.parent().parent().height(); + b.parent().css("height", + q); + b.css("height", q) + } + if ("scrollTo"in g) + n = parseInt(a.scrollTo); + else if ("scrollBy"in g) + n += parseInt(a.scrollBy); + else if ("destroy"in g) { + c.remove(); + h.remove(); + b.unwrap(); + return + } + m(n, !1, !0) + } + } else if (!(e.isPlainObject(g) && "destroy"in g)) { + a.height = "auto" == a.height ? b.parent().height() : a.height; + n = e("
").addClass(a.wrapperClass).css({ + position: "relative", + overflow: "hidden", + width: a.width, + height: a.height + }); + b.css({ + overflow: "hidden", + width: a.width, + height: a.height + }); + var h = e("
").addClass(a.railClass).css({ + width: a.size, + height: "100%", + position: "absolute", + top: 0, + display: a.alwaysVisible && a.railVisible ? "block": "none", + "border-radius": a.railBorderRadius, + background: a.railColor, + opacity: a.railOpacity, + zIndex: 90 + }), c = e("
").addClass(a.barClass).css({ + background: a.color, + width: a.size, + position: "absolute", + top: 0, + opacity: a.opacity, + display: a.alwaysVisible ? "block": "none", + "border-radius": a.borderRadius, + BorderRadius: a.borderRadius, + MozBorderRadius: a.borderRadius, + WebkitBorderRadius: a.borderRadius, + zIndex: 99 + }), q = "right" == a.position ? + { + right: a.distance + } + : { + left: a.distance + }; + h.css(q); + c.css(q); + b.wrap(n); + b.parent().append(c); + b.parent().append(h); + a.railDraggable && c.bind("mousedown", function(a) { + var b = e(document); + z=!0; + t = parseFloat(c.css("top")); + pageY = a.pageY; + b.bind("mousemove.slimscroll", function(a) { + currTop = t + a.pageY - pageY; + c.css("top", currTop); + m(0, c.position().top, !1) + }); + b.bind("mouseup.slimscroll", function(a) { + z=!1; + p(); + b.unbind(".slimscroll") + }); + return !1 + }).bind("selectstart.slimscroll", function(a) { + a.stopPropagation(); + a.preventDefault(); + return !1 + }); + h.hover(function() { + w() + }, function() { + p() + }); + c.hover(function() { + y=!0 + }, function() { + y=!1 + }); + b.hover(function() { + r=!0; + w(); + p() + }, function() { + r=!1; + p() + }); + b.bind("touchstart", function(a, b) { + a.originalEvent.touches.length && (A = a.originalEvent.touches[0].pageY) + }); + b.bind("touchmove", function(b) { + k || b.originalEvent.preventDefault(); + b.originalEvent.touches.length && (m((A - b.originalEvent.touches[0].pageY) / a.touchScrollStep, !0), A = b.originalEvent.touches[0].pageY) + }); + x(); + "bottom" === a.start ? (c.css({ + top: b.outerHeight() - c.outerHeight() + }), + m(0, !0)) : "top" !== a.start && (m(e(a.start).position().top, null, !0), a.alwaysVisible || c.hide()); + window.addEventListener ? (this.addEventListener("DOMMouseScroll", v, !1), this.addEventListener("mousewheel", v, !1)) : document.attachEvent("onmousewheel", v) + } + }); + return this + } + }); + e.fn.extend({ + slimscroll: e.fn.slimScroll + }) +})(jQuery); + Index: lams_central/web/includes/javascript/jquery.tablesorter.js =================================================================== diff -u -r1c42119baf51e12d0ef19919cb5a266a186d4b7d -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/includes/javascript/jquery.tablesorter.js (.../jquery.tablesorter.js) (revision 1c42119baf51e12d0ef19919cb5a266a186d4b7d) +++ lams_central/web/includes/javascript/jquery.tablesorter.js (.../jquery.tablesorter.js) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -1,3 +1,2 @@ -/* tablesorter (FORK) pager plugin updated 12/22/2014 (v2.18.4) */ -!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&"object"==typeof module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(a){"use strict";a.extend({tablesorter:new function(){function b(){var a=arguments[0],b=arguments.length>1?Array.prototype.slice.call(arguments):a;"undefined"!=typeof console&&"undefined"!=typeof console.log?console[/error/i.test(a)?"error":/warn/i.test(a)?"warn":"log"](b):alert(b)}function c(a,c){b(a+" ("+((new Date).getTime()-c.getTime())+"ms)")}function d(a){for(var b in a)return!1;return!0}function e(c,d,e,f){for(var g,h,i=c.config,j=v.parsers.length,k=!1,l="",m=!0;""===l&&m;)e++,d[e]?(k=d[e].cells[f],l=v.getElementText(i,k,f),h=a(k),c.config.debug&&b("Checking if value was empty on row "+e+", column: "+f+': "'+l+'"')):m=!1;for(;--j>=0;)if(g=v.parsers[j],g&&"text"!==g.id&&g.is&&g.is(l,c,k,h))return g;return v.getParserById("text")}function f(a,b,c,d){"undefined"==typeof d&&(d=v.getElementText(a,b,c));var e=""+d,f=a.parsers[c],g=a.extractors[c];return f&&(g&&"function"==typeof g.format&&(d=g.format(d,a.table,b,c)),e="no-parser"===f.id?"":f.format(""+d,a.table,b,c),a.ignoreCase&&"string"==typeof e&&(e=e.toLowerCase())),e}function g(a){var d,f,g,h,i,j,k,l,m,n,o=a.config,p=o.$tbodies=o.$table.children("tbody:not(."+o.cssInfoBlock+")"),q=0,r="",s=p.length;if(0===s)return o.debug?b("Warning: *Empty table!* Not building a parser cache"):"";for(o.debug&&(n=new Date,b("Detecting parsers for each column")),f={extractors:[],parsers:[]};s>q;){if(d=p[q].rows,d.length)for(g=o.columns,h=0;g>h;h++)i=o.$headerIndexed[h],j=v.getColumnData(a,o.headers,h),m=v.getParserById(v.getData(i,j,"extractor")),l=v.getParserById(v.getData(i,j,"sorter")),k="false"===v.getData(i,j,"parser"),o.empties[h]=(v.getData(i,j,"empty")||o.emptyTo||(o.emptyToBottom?"bottom":"top")).toLowerCase(),o.strings[h]=(v.getData(i,j,"string")||o.stringTo||"max").toLowerCase(),k&&(l=v.getParserById("no-parser")),m||(m=!1),l||(l=e(a,d,-1,h)),o.debug&&(r+="column:"+h+"; extractor:"+m.id+"; parser:"+l.id+"; string:"+o.strings[h]+"; empty: "+o.empties[h]+"\n"),f.parsers[h]=l,f.extractors[h]=m;q+=f.parsers.length?s:1}o.debug&&(b(r?r:"No parsers detected"),c("Completed detecting parsers",n)),o.parsers=f.parsers,o.extractors=f.extractors}function h(d){var e,g,h,i,j,k,l,m,n,o,p,q,r,s=d.config,t=s.$tbodies,u=s.parsers;if(s.cache={},s.totalRows=0,!u)return s.debug?b("Warning: *Empty table!* Not building a cache"):"";for(s.debug&&(n=new Date),s.showProcessing&&v.isProcessing(d,!0),k=0;ki;++i)if(p={child:[],raw:[]},l=a(t[k].rows[i]),m=[],l.hasClass(s.cssChildRow)&&0!==i)for(g=e.normalized.length-1,q=e.normalized[g][s.columns],q.$row=q.$row.add(l),l.prev().hasClass(s.cssChildRow)||l.prev().addClass(v.css.cssHasChild),h=l.children("th, td"),g=q.child.length,q.child[g]=[],j=0;ji;i++)o.push(e[i][l.columns].$row),l.appender&&(!l.pager||l.pager.removeRows&&m.pager_removeRows||l.pager.ajax)||h.append(e[i][l.columns].$row);v.processTbody(a,h,!1)}l.appender&&l.appender(a,o),l.debug&&c("Rebuilt table",k),b||l.appender||v.applyWidget(a),a.isUpdating&&l.$table.trigger("updateComplete",a)}function j(a){return/^d/i.test(a)||1===a}function k(d){var e,f,g,h,i,k,l,n,o=d.config;for(o.headerList=[],o.headerContent=[],o.debug&&(l=new Date),o.columns=v.computeColumnIndex(o.$table.children("thead, tfoot").children("tr")),h=o.cssIcon?'':"",o.$headers=a(a.map(a(d).find(o.selectorHeaders),function(b,c){return f=a(b),f.parent().hasClass(o.cssIgnoreRow)?void 0:(e=v.getColumnData(d,o.headers,c,!0),o.headerContent[c]=f.html(),""===o.headerTemplate||f.find("."+v.css.headerIn).length||(i=o.headerTemplate.replace(/\{content\}/g,f.html()).replace(/\{icon\}/g,f.find("."+v.css.icon).length?"":h),o.onRenderTemplate&&(g=o.onRenderTemplate.apply(f,[c,i]),g&&"string"==typeof g&&(i=g)),f.html('
'+i+"
")),o.onRenderHeader&&o.onRenderHeader.apply(f,[c,o,o.$table]),b.column=parseInt(f.attr("data-column"),10),b.order=j(v.getData(f,e,"sortInitialOrder")||o.sortInitialOrder)?[1,0,2]:[0,1,2],b.count=-1,b.lockedOrder=!1,k=v.getData(f,e,"lockedOrder")||!1,"undefined"!=typeof k&&k!==!1&&(b.order=b.lockedOrder=j(k)?[1,1,1]:[0,0,0]),f.addClass(v.css.header+" "+o.cssHeader),o.headerList[c]=b,f.parent().addClass(v.css.headerRow+" "+o.cssHeaderRow).attr("role","row"),o.tabIndex&&f.attr("tabindex",0),b)})),o.$headerIndexed=[],n=0;nb;b++)d=f.$headers.eq(b),e=v.getColumnData(a,f.headers,b,!0),c="false"===v.getData(d,e,"sorter")||"false"===v.getData(d,e,"parser"),d[0].sortDisabled=c,d[c?"addClass":"removeClass"]("sorter-false").attr("aria-disabled",""+c),a.id&&(c?d.removeAttr("aria-controls"):d.attr("aria-controls",a.id))}function n(b){var c,d,e,f,g,h,i,j,k=b.config,l=k.sortList,m=l.length,n=v.css.sortNone+" "+k.cssNone,o=[v.css.sortAsc+" "+k.cssAsc,v.css.sortDesc+" "+k.cssDesc],p=[k.cssIconAsc,k.cssIconDesc,k.cssIconNone],q=["ascending","descending"],r=a(b).find("tfoot tr").children().add(a(k.namespace+"_extra_headers")).removeClass(o.join(" "));for(k.$headers.removeClass(o.join(" ")).addClass(n).attr("aria-sort","none").find("."+v.css.icon).removeClass(p.join(" ")).addClass(p[2]),e=0;m>e;e++)if(2!==l[e][1]&&(c=k.$headers.not(".sorter-false").filter('[data-column="'+l[e][0]+'"]'+(1===m?":last":"")),c.length)){for(f=0;fe;e++)h=g.eq(e),h.length&&(d=g[e],i=d.order[(d.count+1)%(k.sortReset?3:2)],j=a.trim(h.text())+": "+v.language[h.hasClass(v.css.sortAsc)?"sortAsc":h.hasClass(v.css.sortDesc)?"sortDesc":"sortNone"]+v.language[0===i?"nextAsc":1===i?"nextDesc":"nextNone"],h.attr("aria-label",j))}function o(b,c){var d,e,f,g,h,i,j,k,l=b.config,m=c||l.sortList,n=m.length;for(l.sortList=[],h=0;n>h;h++)if(k=m[h],d=parseInt(k[0],10),d=0?e:f[1]%(l.sortReset?3:2)}}function p(a,b){return a&&a[b]?a[b].type||"":""}function q(b,c,d){if(b.isUpdating)return setTimeout(function(){q(b,c,d)},50);var e,f,g,h,j,k,l,m=b.config,o=!d[m.sortMultiSortKey],p=m.$table,s=m.$headers.length;if(p.trigger("sortStart",b),c.count=d[m.sortResetKey]?2:(c.count+1)%(m.sortReset?3:2),m.sortRestart)for(f=c,g=0;s>g;g++)l=m.$headers.eq(g),l[0]===f||!o&&l.is("."+v.css.sortDesc+",."+v.css.sortAsc)||(l[0].count=-1);if(f=parseInt(a(c).attr("data-column"),10),o){if(m.sortList=[],null!==m.sortForce)for(e=m.sortForce,h=0;hj&&(m.sortList.push([f,j]),c.colSpan>1))for(h=1;h1)for(h=0;h=0&&m.sortList.splice(k,1);if(v.isValueInArray(f,m.sortList)>=0)for(h=0;hj&&(m.sortList.push([f,j]),c.colSpan>1))for(h=1;he;e++)i=q.cache[e].colMax,j=q.cache[e].normalized,j.sort(function(c,d){for(b=0;t>b;b++){if(g=s[b][0],k=s[b][1],o=0===k,q.sortStable&&c[g]===d[g]&&1===t)return c[q.columns].order-d[q.columns].order;if(f=/n/i.test(p(q.parsers,g)),f&&q.strings[g]?(f="boolean"==typeof q.string[q.strings[g]]?(o?1:-1)*(q.string[q.strings[g]]?-1:1):q.strings[g]?q.string[q.strings[g]]||0:0,l=q.numberSorter?q.numberSorter(c[g],d[g],o,i[g],a):v["sortNumeric"+(o?"Asc":"Desc")](c[g],d[g],f,i[g],g,a)):(m=o?c:d,n=o?d:c,l="function"==typeof r?r(m[g],n[g],o,g,a):"object"==typeof r&&r.hasOwnProperty(g)?r[g](m[g],n[g],o,g,a):v["sortNatural"+(o?"Asc":"Desc")](c[g],d[g],g,a,q)),l)return l}return c[q.columns].order-d[q.columns].order});q.debug&&c("Sorting on "+s.toString()+" and dir "+k+" time",h)}}function s(b,c){b.table.isUpdating&&b.$table.trigger("updateComplete",b.table),a.isFunction(c)&&c(b.table)}function t(b,c,d){var e=a.isArray(c)?c:b.sortList,f="undefined"==typeof c?b.resort:c;f===!1||b.serverSideSorting||b.table.isProcessing?(s(b,d),v.applyWidget(b.table,!1)):e.length?b.$table.trigger("sorton",[e,function(){s(b,d)},!0]):b.$table.trigger("sortReset",[function(){s(b,d),v.applyWidget(b.table,!1)}])}function u(b){var c=b.config,e=c.$table,j="sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave ".split(" ").join(c.namespace+" ");e.unbind(j.replace(/\s+/g," ")).bind("sortReset"+c.namespace,function(d,e){d.stopPropagation(),c.sortList=[],n(b),r(b),i(b),a.isFunction(e)&&e(b)}).bind("updateAll"+c.namespace,function(a,d,e){a.stopPropagation(),b.isUpdating=!0,v.refreshWidgets(b,!0,!0),k(b),v.bindEvents(b,c.$headers,!0),u(b),l(b,d,e)}).bind("update"+c.namespace+" updateRows"+c.namespace,function(a,c,d){a.stopPropagation(),b.isUpdating=!0,m(b),l(b,c,d)}).bind("updateCell"+c.namespace,function(d,g,h,i){d.stopPropagation(),b.isUpdating=!0,e.find(c.selectorRemove).remove();var j,k,l,m,n=c.$tbodies,o=a(g),p=n.index(a.fn.closest?o.closest("tbody"):o.parents("tbody").filter(":first")),q=c.cache[p],r=a.fn.closest?o.closest("tr"):o.parents("tr").filter(":first");g=o[0],n.length&&p>=0&&(k=n.eq(p).find("tr").index(r),m=q.normalized[k],l=o.index(),j=f(c,g,l),m[l]=j,m[c.columns].$row=r,"numeric"===(c.parsers[l].type||"").toLowerCase()&&(q.colMax[l]=Math.max(Math.abs(j)||0,q.colMax[l]||0)),j="undefined"!==h?h:c.resort,j!==!1?t(c,j,i):(a.isFunction(i)&&i(b),c.$table.trigger("updateComplete",c.table)))}).bind("addRows"+c.namespace,function(e,h,i,j){if(e.stopPropagation(),b.isUpdating=!0,d(c.cache))m(b),l(b,i,j);else{h=a(h).attr("role","row");var k,n,o,p,q,r=h.filter("tr").length,s=c.$tbodies.index(h.parents("tbody").filter(":first"));for(c.parsers&&c.parsers.length||g(b),k=0;r>k;k++){for(o=h[k].cells.length,q=[],p={child:[],$row:h.eq(k),order:c.cache[s].normalized.length},n=0;o>n;n++)q[n]=f(c,h[k].cells[n],n),"numeric"===(c.parsers[n].type||"").toLowerCase()&&(c.cache[s].colMax[n]=Math.max(Math.abs(q[n])||0,c.cache[s].colMax[n]||0));q.push(p),c.cache[s].normalized.push(q)}t(c,i,j)}}).bind("updateComplete"+c.namespace,function(){b.isUpdating=!1}).bind("sorton"+c.namespace,function(c,f,g,j){var k=b.config;c.stopPropagation(),e.trigger("sortStart",this),o(b,f),n(b),k.delayInit&&d(k.cache)&&h(b),e.trigger("sortBegin",this),r(b),i(b,j),e.trigger("sortEnd",this),v.applyWidget(b),a.isFunction(g)&&g(b)}).bind("appendCache"+c.namespace,function(c,d,e){c.stopPropagation(),i(b,e),a.isFunction(d)&&d(b)}).bind("updateCache"+c.namespace,function(d,e){c.parsers&&c.parsers.length||g(b),h(b),a.isFunction(e)&&e(b)}).bind("applyWidgetId"+c.namespace,function(a,d){a.stopPropagation(),v.getWidgetById(d).format(b,c,c.widgetOptions)}).bind("applyWidgets"+c.namespace,function(a,c){a.stopPropagation(),v.applyWidget(b,c)}).bind("refreshWidgets"+c.namespace,function(a,c,d){a.stopPropagation(),v.refreshWidgets(b,c,d)}).bind("destroy"+c.namespace,function(a,c,d){a.stopPropagation(),v.destroy(b,c,d)}).bind("resetToLoadState"+c.namespace,function(){v.removeWidget(b,!0,!1),c=a.extend(!0,v.defaults,c.originalSettings),b.hasInitialized=!1,v.setup(b,c)})}var v=this;v.version="2.22.1",v.parsers=[],v.widgets=[],v.defaults={theme:"default",widthFixed:!1,showProcessing:!1,headerTemplate:"{content}",onRenderTemplate:null,onRenderHeader:null,cancelSelection:!0,tabIndex:!0,dateFormat:"mmddyyyy",sortMultiSortKey:"shiftKey",sortResetKey:"ctrlKey",usNumberFormat:!0,delayInit:!1,serverSideSorting:!1,resort:!0,headers:{},ignoreCase:!0,sortForce:null,sortList:[],sortAppend:null,sortStable:!1,sortInitialOrder:"asc",sortLocaleCompare:!1,sortReset:!1,sortRestart:!1,emptyTo:"bottom",stringTo:"max",textExtraction:"basic",textAttribute:"data-text",textSorter:null,numberSorter:null,widgets:[],widgetOptions:{zebra:["even","odd"]},initWidgets:!0,widgetClass:"widget-{name}",initialized:null,tableClass:"",cssAsc:"",cssDesc:"",cssNone:"",cssHeader:"",cssHeaderRow:"",cssProcessing:"",cssChildRow:"tablesorter-childRow",cssIcon:"tablesorter-icon",cssIconNone:"",cssIconAsc:"",cssIconDesc:"",cssInfoBlock:"tablesorter-infoOnly",cssNoSort:"tablesorter-noSort",cssIgnoreRow:"tablesorter-ignoreRow",pointerClick:"click",pointerDown:"mousedown",pointerUp:"mouseup",selectorHeaders:"> thead th, > thead td",selectorSort:"th, td",selectorRemove:".remove-me",debug:!1,headerList:[],empties:{},strings:{},parsers:[]},v.css={table:"tablesorter",cssHasChild:"tablesorter-hasChildRow",childRow:"tablesorter-childRow",colgroup:"tablesorter-colgroup",header:"tablesorter-header",headerRow:"tablesorter-headerRow",headerIn:"tablesorter-header-inner",icon:"tablesorter-icon",processing:"tablesorter-processing",sortAsc:"tablesorter-headerAsc",sortDesc:"tablesorter-headerDesc",sortNone:"tablesorter-headerUnSorted"},v.language={sortAsc:"Ascending sort applied, ",sortDesc:"Descending sort applied, ",sortNone:"No sort applied, ",nextAsc:"activate to apply an ascending sort",nextDesc:"activate to apply a descending sort",nextNone:"activate to remove the sort"},v.instanceMethods={},v.log=b,v.benchmark=c,v.getElementText=function(b,c,d){if(!c)return"";var e,f=b.textExtraction||"",g=c.jquery?c:a(c);return"string"==typeof f?a.trim(("basic"===f?g.attr(b.textAttribute)||c.textContent:c.textContent)||g.text()):"function"==typeof f?a.trim(f(g[0],b.table,d)):"function"==typeof(e=v.getColumnData(b.table,f,d))?a.trim(e(g[0],b.table,d)):a.trim(g[0].textContent||g.text())},v.construct=function(b){return this.each(function(){var c=this,d=a.extend(!0,{},v.defaults,b,v.instanceMethods);d.originalSettings=b,!c.hasInitialized&&v.buildTable&&"TABLE"!==this.nodeName?v.buildTable(c,d):v.setup(c,d)})},v.setup=function(c,d){if(!c||!c.tHead||0===c.tBodies.length||c.hasInitialized===!0)return d.debug?b("ERROR: stopping initialization! No table, thead, tbody or tablesorter has already been initialized"):"";var e="",f=a(c),i=a.metadata;c.hasInitialized=!1,c.isProcessing=!0,c.config=d,a.data(c,"tablesorter",d),d.debug&&a.data(c,"startoveralltimer",new Date),d.supportsDataObject=function(a){return a[0]=parseInt(a[0],10),a[0]>1||1===a[0]&&parseInt(a[1],10)>=4}(a.fn.jquery.split(".")),d.string={max:1,min:-1,emptymin:1,emptymax:-1,zero:0,none:0,"null":0,top:!0,bottom:!1},d.emptyTo=d.emptyTo.toLowerCase(),d.stringTo=d.stringTo.toLowerCase(),/tablesorter\-/.test(f.attr("class"))||(e=""!==d.theme?" tablesorter-"+d.theme:""),d.table=c,d.$table=f.addClass(v.css.table+" "+d.tableClass+e).attr("role","grid"),d.$headers=f.find(d.selectorHeaders),d.namespace?d.namespace="."+d.namespace.replace(/\W/g,""):d.namespace=".tablesorter"+Math.random().toString(16).slice(2),d.$table.children().children("tr").attr("role","row"),d.$tbodies=f.children("tbody:not(."+d.cssInfoBlock+")").attr({"aria-live":"polite","aria-relevant":"all"}),d.$table.children("caption").length&&(e=d.$table.children("caption")[0],e.id||(e.id=d.namespace.slice(1)+"caption"),d.$table.attr("aria-labelledby",e.id)),d.widgetInit={},d.textExtraction=d.$table.attr("data-text-extraction")||d.textExtraction||"basic",k(c),v.fixColumnWidth(c),v.applyWidgetOptions(c,d),g(c),d.totalRows=0,d.delayInit||h(c),v.bindEvents(c,d.$headers,!0),u(c),d.supportsDataObject&&"undefined"!=typeof f.data().sortlist?d.sortList=f.data().sortlist:i&&f.metadata()&&f.metadata().sortlist&&(d.sortList=f.metadata().sortlist),v.applyWidget(c,!0),d.sortList.length>0?f.trigger("sorton",[d.sortList,{},!d.initWidgets,!0]):(n(c),d.initWidgets&&v.applyWidget(c,!1)),d.showProcessing&&f.unbind("sortBegin"+d.namespace+" sortEnd"+d.namespace).bind("sortBegin"+d.namespace+" sortEnd"+d.namespace,function(a){clearTimeout(d.processTimer),v.isProcessing(c),"sortBegin"===a.type&&(d.processTimer=setTimeout(function(){v.isProcessing(c,!0)},500))}),c.hasInitialized=!0,c.isProcessing=!1,d.debug&&v.benchmark("Overall initialization time",a.data(c,"startoveralltimer")),f.trigger("tablesorter-initialized",c),"function"==typeof d.initialized&&d.initialized(c)},v.fixColumnWidth=function(b){b=a(b)[0];var c,d,e,f,g,h=b.config,i=h.$table.children("colgroup");if(i.length&&i.hasClass(v.css.colgroup)&&i.remove(),h.widthFixed&&0===h.$table.children("colgroup").length){for(i=a(''),c=h.$table.width(),e=h.$tbodies.find("tr:first").children(":visible"),f=e.length,g=0;f>g;g++)d=parseInt(e.eq(g).width()/c*1e3,10)/10+"%",i.append(a("").css("width",d));h.$table.prepend(i)}},v.getColumnData=function(b,c,d,e,f){if("undefined"!=typeof c&&null!==c){b=a(b)[0];var g,h,i=b.config,j=f||i.$headers,k=i.$headerIndexed&&i.$headerIndexed[d]||j.filter('[data-column="'+d+'"]:last');if(c[d])return e?c[d]:c[j.index(k)];for(h in c)if("string"==typeof h&&(g=k.filter(h).add(k.find(h)),g.length))return c[h]}},v.computeColumnIndex=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o=[],p=[],q={};for(c=0;ce;e++)for("undefined"==typeof o[e]&&(o[e]=[]),p=o[e],f=n;n+m>f;f++)p[f]="x"}return p.length},v.isProcessing=function(b,c,d){b=a(b);var e=b[0].config,f=d||b.find("."+v.css.header);c?("undefined"!=typeof d&&e.sortList.length>0&&(f=f.filter(function(){return this.sortDisabled?!1:v.isValueInArray(parseFloat(a(this).attr("data-column")),e.sortList)>=0})),b.add(f).addClass(v.css.processing+" "+e.cssProcessing)):b.add(f).removeClass(v.css.processing+" "+e.cssProcessing)},v.processTbody=function(b,c,d){b=a(b)[0];var e;return d?(b.isProcessing=!0,c.before(''),e=a.fn.detach?c.detach():c.remove()):(e=a(b).find("span.tablesorter-savemyplace"),c.insertAfter(e),e.remove(),void(b.isProcessing=!1))},v.clearTableBody=function(b){a(b)[0].config.$tbodies.children().detach()},v.bindEvents=function(b,c,e){b=a(b)[0];var f,g=null,i=b.config;e!==!0&&(c.addClass(i.namespace.slice(1)+"_extra_headers"),f=a.fn.closest?c.closest("table")[0]:c.parents("table")[0],f&&"TABLE"===f.nodeName&&f!==b&&a(f).addClass(i.namespace.slice(1)+"_extra_table")),f=(i.pointerDown+" "+i.pointerUp+" "+i.pointerClick+" sort keyup ").replace(/\s+/g," ").split(" ").join(i.namespace+" "),c.find(i.selectorSort).add(c.filter(i.selectorSort)).unbind(f).bind(f,function(e,f){var j,k,l=a(e.target),m=" "+e.type+" ";if(!(1!==(e.which||e.button)&&!m.match(" "+i.pointerClick+" | sort | keyup ")||" keyup "===m&&13!==e.which||m.match(" "+i.pointerClick+" ")&&"undefined"!=typeof e.which||m.match(" "+i.pointerUp+" ")&&g!==e.target&&f!==!0)){if(m.match(" "+i.pointerDown+" "))return g=e.target,k=l.jquery.split("."),void("1"===k[0]&&k[1]<4&&e.preventDefault());if(g=null,/(input|select|button|textarea)/i.test(e.target.nodeName)||l.hasClass(i.cssNoSort)||l.parents("."+i.cssNoSort).length>0||l.parents("button").length>0)return!i.cancelSelection;i.delayInit&&d(i.cache)&&h(b),j=a.fn.closest?a(this).closest("th, td")[0]:/TH|TD/.test(this.nodeName)?this:a(this).parents("th, td")[0],j=i.$headers[c.index(j)],j.sortDisabled||q(b,j,e)}}),i.cancelSelection&&c.attr("unselectable","on").bind("selectstart",!1).css({"user-select":"none",MozUserSelect:"none"})},v.restoreHeaders=function(b){var c,d,e=a(b)[0].config,f=e.$table.find(e.selectorHeaders),g=f.length;for(c=0;g>c;c++)d=f.eq(c),d.find("."+v.css.headerIn).length&&d.html(e.headerContent[c])},v.destroy=function(b,c,d){if(b=a(b)[0],b.hasInitialized){v.removeWidget(b,!0,!1);var e,f=a(b),g=b.config,h=f.find("thead:first"),i=h.find("tr."+v.css.headerRow).removeClass(v.css.headerRow+" "+g.cssHeaderRow),j=f.find("tfoot:first > tr").children("th, td");c===!1&&a.inArray("uitheme",g.widgets)>=0&&(f.trigger("applyWidgetId",["uitheme"]),f.trigger("applyWidgetId",["zebra"])),h.find("tr").not(i).remove(),e="sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache "+"applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd resetToLoadState ".split(" ").join(g.namespace+" "),f.removeData("tablesorter").unbind(e.replace(/\s+/g," ")),g.$headers.add(j).removeClass([v.css.header,g.cssHeader,g.cssAsc,g.cssDesc,v.css.sortAsc,v.css.sortDesc,v.css.sortNone].join(" ")).removeAttr("data-column").removeAttr("aria-label").attr("aria-disabled","true"),i.find(g.selectorSort).unbind("mousedown mouseup keypress ".split(" ").join(g.namespace+" ").replace(/\s+/g," ")),v.restoreHeaders(b),f.toggleClass(v.css.table+" "+g.tableClass+" tablesorter-"+g.theme,c===!1),b.hasInitialized=!1,delete b.config.cache,"function"==typeof d&&d(b)}},v.regex={chunk:/(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,chunks:/(^\\0|\\0$)/,hex:/^0x[0-9a-f]+$/i},v.sortNatural=function(a,b){if(a===b)return 0;var c,d,e,f,g,h,i,j,k=v.regex;if(k.hex.test(b)){if(d=parseInt(a.match(k.hex),16),f=parseInt(b.match(k.hex),16),f>d)return-1;if(d>f)return 1}for(c=a.replace(k.chunk,"\\0$1\\0").replace(k.chunks,"").split("\\0"),e=b.replace(k.chunk,"\\0$1\\0").replace(k.chunks,"").split("\\0"),j=Math.max(c.length,e.length),i=0;j>i;i++){if(g=isNaN(c[i])?c[i]||0:parseFloat(c[i])||0,h=isNaN(e[i])?e[i]||0:parseFloat(e[i])||0,isNaN(g)!==isNaN(h))return isNaN(g)?1:-1;if(typeof g!=typeof h&&(g+="",h+=""),h>g)return-1;if(g>h)return 1}return 0},v.sortNaturalAsc=function(a,b,c,d,e){if(a===b)return 0;var f=e.string[e.empties[c]||e.emptyTo];return""===a&&0!==f?"boolean"==typeof f?f?-1:1:-f||-1:""===b&&0!==f?"boolean"==typeof f?f?1:-1:f||1:v.sortNatural(a,b)},v.sortNaturalDesc=function(a,b,c,d,e){if(a===b)return 0;var f=e.string[e.empties[c]||e.emptyTo];return""===a&&0!==f?"boolean"==typeof f?f?-1:1:f||1:""===b&&0!==f?"boolean"==typeof f?f?1:-1:-f||-1:v.sortNatural(b,a)},v.sortText=function(a,b){return a>b?1:b>a?-1:0},v.getTextValue=function(a,b,c){if(c){var d,e=a?a.length:0,f=c+b;for(d=0;e>d;d++)f+=a.charCodeAt(d);return b*f}return 0},v.sortNumericAsc=function(a,b,c,d,e,f){if(a===b)return 0;var g=f.config,h=g.string[g.empties[e]||g.emptyTo];return""===a&&0!==h?"boolean"==typeof h?h?-1:1:-h||-1:""===b&&0!==h?"boolean"==typeof h?h?1:-1:h||1:(isNaN(a)&&(a=v.getTextValue(a,c,d)),isNaN(b)&&(b=v.getTextValue(b,c,d)),a-b)},v.sortNumericDesc=function(a,b,c,d,e,f){if(a===b)return 0;var g=f.config,h=g.string[g.empties[e]||g.emptyTo];return""===a&&0!==h?"boolean"==typeof h?h?-1:1:h||1:""===b&&0!==h?"boolean"==typeof h?h?1:-1:-h||-1:(isNaN(a)&&(a=v.getTextValue(a,c,d)),isNaN(b)&&(b=v.getTextValue(b,c,d)),b-a)},v.sortNumeric=function(a,b){return a-b},v.characterEquivalents={a:"áàâãäąå",A:"ÁÀÂÃÄĄÅ",c:"çćč",C:"ÇĆČ",e:"éèêëěę",E:"ÉÈÊËĚĘ",i:"íìİîïı",I:"ÍÌİÎÏ",o:"óòôõöō",O:"ÓÒÔÕÖŌ",ss:"ß",SS:"ẞ",u:"úùûüů",U:"ÚÙÛÜŮ"},v.replaceAccents=function(a){var b,c="[",d=v.characterEquivalents;if(!v.characterRegex){v.characterRegexArray={};for(b in d)"string"==typeof b&&(c+=d[b],v.characterRegexArray[b]=new RegExp("["+d[b]+"]","g"));v.characterRegex=new RegExp(c+"]")}if(v.characterRegex.test(a))for(b in d)"string"==typeof b&&(a=a.replace(v.characterRegexArray[b],b));return a},v.isValueInArray=function(a,b){var c,d=b.length;for(c=0;d>c;c++)if(b[c][0]===a)return c;return-1},v.addParser=function(a){var b,c=v.parsers.length,d=!0;for(b=0;c>b;b++)v.parsers[b].id.toLowerCase()===a.id.toLowerCase()&&(d=!1);d&&v.parsers.push(a)},v.addInstanceMethods=function(b){a.extend(v.instanceMethods,b)},v.getParserById=function(a){if("false"==a)return!1;var b,c=v.parsers.length;for(b=0;c>b;b++)if(v.parsers[b].id.toLowerCase()===a.toString().toLowerCase())return v.parsers[b];return!1},v.addWidget=function(a){v.widgets.push(a)},v.hasWidget=function(b,c){return b=a(b),b.length&&b[0].config&&b[0].config.widgetInit[c]||!1},v.getWidgetById=function(a){var b,c,d=v.widgets.length;for(b=0;d>b;b++)if(c=v.widgets[b],c&&c.hasOwnProperty("id")&&c.id.toLowerCase()===a.toLowerCase())return c},v.applyWidgetOptions=function(b,c){var d,e,f=c.widgets.length,g=c.widgetOptions;if(f)for(d=0;f>d;d++)e=v.getWidgetById(c.widgets[d]),e&&"options"in e&&(g=b.config.widgetOptions=a.extend(!0,{},e.options,g))},v.applyWidget=function(b,d,e){b=a(b)[0];var f,g,h,i,j,k,l,m=b.config,n=m.widgetOptions,o=" "+m.table.className+" ",p=[];if(d===!1||!b.hasInitialized||!b.isApplyingWidgets&&!b.isUpdating){if(m.debug&&(i=new Date),l=new RegExp("\\s"+m.widgetClass.replace(/\{name\}/i,"([\\w-]+)")+"\\s","g"),o.match(l)&&(k=o.match(l)))for(g=k.length,f=0;g>f;f++)m.widgets.push(k[f].replace(l,"$1"));if(m.widgets.length){for(b.isApplyingWidgets=!0,m.widgets=a.grep(m.widgets,function(b,c){return a.inArray(b,m.widgets)===c}),h=m.widgets||[],g=h.length,f=0;g>f;f++)l=v.getWidgetById(h[f]),l&&l.id&&(l.priority||(l.priority=10),p[f]=l);for(p.sort(function(a,b){return a.priorityf;f++)p[f]&&((d||!m.widgetInit[p[f].id])&&(m.widgetInit[p[f].id]=!0,b.hasInitialized&&v.applyWidgetOptions(b,m),"init"in p[f]&&(m.debug&&(j=new Date),p[f].init(b,p[f],m,n),m.debug&&v.benchmark("Initializing "+p[f].id+" widget",j))),!d&&"format"in p[f]&&(m.debug&&(j=new Date),p[f].format(b,m,n,!1),m.debug&&v.benchmark((d?"Initializing ":"Applying ")+p[f].id+" widget",j)));d||"function"!=typeof e||e(b)}setTimeout(function(){b.isApplyingWidgets=!1,a.data(b,"lastWidgetApplication",new Date)},0),m.debug&&(k=m.widgets.length,c("Completed "+(d===!0?"initializing ":"applying ")+k+" widget"+(1!==k?"s":""),i))}},v.removeWidget=function(c,d,e){c=a(c)[0];var f,g,h,i,j=c.config;if(d===!0)for(d=[],i=v.widgets.length,h=0;i>h;h++)g=v.widgets[h],g&&g.id&&d.push(g.id);else d=(a.isArray(d)?d.join(","):d||"").toLowerCase().split(/[\s,]+/);for(i=d.length,f=0;i>f;f++)g=v.getWidgetById(d[f]),h=a.inArray(d[f],j.widgets),g&&"remove"in g&&(j.debug&&h>=0&&b('Removing "'+d[f]+'" widget'),g.remove(c,j,j.widgetOptions,e),j.widgetInit[d[f]]=!1),h>=0&&e!==!0&&j.widgets.splice(h,1)},v.refreshWidgets=function(b,c,d){b=a(b)[0];var e,f=b.config,g=f.widgets,h=v.widgets,i=h.length,j=[],k=function(b){a(b).trigger("refreshComplete")};for(e=0;i>e;e++)h[e]&&h[e].id&&(c||a.inArray(h[e].id,g)<0)&&j.push(h[e].id);v.removeWidget(b,j.join(","),!0),d!==!0?(v.applyWidget(b,c||!1,k),c&&v.applyWidget(b,!1,k)):k(b)},v.getColumnText=function(b,c,e){b=a(b)[0];var f,g,h,i,j,k,l,m,n,o,p="function"==typeof e,q="all"===c,r={raw:[],parsed:[],$cell:[]},s=b.config;if(!d(s)){for(j=s.$tbodies.length,f=0;j>f;f++)for(h=s.cache[f].normalized,k=h.length,g=0;k>g;g++)o=!0,i=h[g],m=q?i.slice(0,s.columns):i[c],i=i[s.columns],l=q?i.raw:i.raw[c],n=q?i.$row.children():i.$row.children().eq(c),p&&(o=e({tbodyIndex:f,rowIndex:g,parsed:m,raw:l,$row:i.$row,$cell:n})),o!==!1&&(r.parsed.push(m),r.raw.push(l),r.$cell.push(n));return r}},v.getData=function(b,c,d){var e,f,g="",h=a(b);return h.length?(e=a.metadata?h.metadata():!1,f=" "+(h.attr("class")||""),"undefined"!=typeof h.data(d)||"undefined"!=typeof h.data(d.toLowerCase())?g+=h.data(d)||h.data(d.toLowerCase()):e&&"undefined"!=typeof e[d]?g+=e[d]:c&&"undefined"!=typeof c[d]?g+=c[d]:" "!==f&&f.match(" "+d+"-")&&(g=f.match(new RegExp("\\s"+d+"-([\\w-]+)"))[1]||""),a.trim(g)):""},v.formatFloat=function(b,c){if("string"!=typeof b||""===b)return b;var d,e=c&&c.config?c.config.usNumberFormat!==!1:"undefined"!=typeof c?c:!0;return b=e?b.replace(/,/g,""):b.replace(/[\s|\.]/g,"").replace(/,/g,"."),/^\s*\([.\d]+\)/.test(b)&&(b=b.replace(/^\s*\(([.\d]+)\)/,"-$1")),d=parseFloat(b),isNaN(d)?a.trim(b):d},v.isDigit=function(a){return isNaN(a)?/^[\-+(]?\d+[)]?$/.test(a.toString().replace(/[,.'"\s]/g,"")):""!==a}}});var b=a.tablesorter;a.fn.extend({tablesorter:b.construct}),b.addParser({id:"no-parser",is:function(){return!1},format:function(){return""},type:"text"}),b.addParser({id:"text",is:function(){return!0},format:function(c,d){var e=d.config;return c&&(c=a.trim(e.ignoreCase?c.toLocaleLowerCase():c),c=e.sortLocaleCompare?b.replaceAccents(c):c),c},type:"text"}),b.addParser({id:"digit",is:function(a){return b.isDigit(a)},format:function(c,d){var e=b.formatFloat((c||"").replace(/[^\w,. \-()]/g,""),d);return c&&"number"==typeof e?e:c?a.trim(c&&d.config.ignoreCase?c.toLocaleLowerCase():c):c},type:"numeric"}),b.addParser({id:"currency",is:function(a){return/^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/.test((a||"").replace(/[+\-,. ]/g,""))},format:function(c,d){var e=b.formatFloat((c||"").replace(/[^\w,. \-()]/g,""),d);return c&&"number"==typeof e?e:c?a.trim(c&&d.config.ignoreCase?c.toLocaleLowerCase():c):c},type:"numeric"}),b.addParser({id:"url",is:function(a){return/^(https?|ftp|file):\/\//.test(a)},format:function(b){return b?a.trim(b.replace(/(https?|ftp|file):\/\//,"")):b},parsed:!0,type:"text"}),b.addParser({id:"isoDate",is:function(a){return/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/.test(a)},format:function(a,b){var c=a?new Date(a.replace(/-/g,"/")):a;return c instanceof Date&&isFinite(c)?c.getTime():a},type:"numeric"}),b.addParser({id:"percent",is:function(a){return/(\d\s*?%|%\s*?\d)/.test(a)&&a.length<15},format:function(a,c){return a?b.formatFloat(a.replace(/%/g,""),c):a},type:"numeric"}),b.addParser({id:"image",is:function(a,b,c,d){return d.find("img").length>0},format:function(b,c,d){return a(d).find("img").attr(c.config.imgAttr||"alt")||b},parsed:!0,type:"text"}),b.addParser({id:"usLongDate",is:function(a){return/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i.test(a)||/^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i.test(a)},format:function(a,b){var c=a?new Date(a.replace(/(\S)([AP]M)$/i,"$1 $2")):a; -return c instanceof Date&&isFinite(c)?c.getTime():a},type:"numeric"}),b.addParser({id:"shortDate",is:function(a){return/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/.test((a||"").replace(/\s+/g," ").replace(/[\-.,]/g,"/"))},format:function(a,c,d,e){if(a){var f,g,h=c.config,i=h.$headerIndexed[e],j=i.length&&i[0].dateFormat||b.getData(i,b.getColumnData(c,h.headers,e),"dateFormat")||h.dateFormat;return g=a.replace(/\s+/g," ").replace(/[\-.,]/g,"/"),"mmddyyyy"===j?g=g.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,"$3/$1/$2"):"ddmmyyyy"===j?g=g.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,"$3/$2/$1"):"yyyymmdd"===j&&(g=g.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/,"$1/$2/$3")),f=new Date(g),f instanceof Date&&isFinite(f)?f.getTime():a}return a},type:"numeric"}),b.addParser({id:"time",is:function(a){return/^(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i.test(a)},format:function(a,b){var c=a?new Date("2000/01/01 "+a.replace(/(\S)([AP]M)$/i,"$1 $2")):a;return c instanceof Date&&isFinite(c)?c.getTime():a},type:"numeric"}),b.addParser({id:"metadata",is:function(){return!1},format:function(b,c,d){var e=c.config,f=e.parserMetadataName?e.parserMetadataName:"sortValue";return a(d).metadata()[f]},type:"numeric"}),b.addWidget({id:"zebra",priority:90,format:function(b,c,d){var e,f,g,h,i,j,k,l,m=new RegExp(c.cssChildRow,"i"),n=c.$tbodies.add(a(c.namespace+"_extra_table").children("tbody:not(."+c.cssInfoBlock+")"));for(c.debug&&(i=new Date),j=0;jk;k++)f=e.eq(k),m.test(f[0].className)||g++,h=g%2===0,f.removeClass(d.zebra[h?1:0]).addClass(d.zebra[h?0:1])},remove:function(a,c,d,e){if(!e){var f,g,h=c.$tbodies,i=(d.zebra||["even","odd"]).join(" ");for(f=0;f thead th, > thead td",selectorSort:"th, td",selectorRemove:".remove-me",debug:!1,headerList:[],empties:{},strings:{},parsers:[]},css:{table:"tablesorter",cssHasChild:"tablesorter-hasChildRow",childRow:"tablesorter-childRow",colgroup:"tablesorter-colgroup",header:"tablesorter-header",headerRow:"tablesorter-headerRow",headerIn:"tablesorter-header-inner",icon:"tablesorter-icon",processing:"tablesorter-processing",sortAsc:"tablesorter-headerAsc",sortDesc:"tablesorter-headerDesc",sortNone:"tablesorter-headerUnSorted"},language:{sortAsc:"Ascending sort applied, ",sortDesc:"Descending sort applied, ",sortNone:"No sort applied, ",sortDisabled:"sorting is disabled",nextAsc:"activate to apply an ascending sort",nextDesc:"activate to apply a descending sort",nextNone:"activate to remove the sort"},regex:{templateContent:/\{content\}/g,templateIcon:/\{icon\}/g,templateName:/\{name\}/i,spaces:/\s+/g,nonWord:/\W/g,formElements:/(input|select|button|textarea)/i,chunk:/(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,chunks:/(^\\0|\\0$)/,hex:/^0x[0-9a-f]+$/i,comma:/,/g,digitNonUS:/[\s|\.]/g,digitNegativeTest:/^\s*\([.\d]+\)/,digitNegativeReplace:/^\s*\(([.\d]+)\)/,digitTest:/^[\-+(]?\d+[)]?$/,digitReplace:/[,.'"\s]/g},string:{max:1,min:-1,emptymin:1,emptymax:-1,zero:0,none:0,null:0,top:!0,bottom:!1},keyCodes:{enter:13},dates:{},instanceMethods:{},setup:function(a,d){if(!a||!a.tHead||0===a.tBodies.length||a.hasInitialized===!0)return void(d.debug&&(a.hasInitialized?console.warn("Stopping initialization. Tablesorter has already been initialized"):console.error("Stopping initialization! No table, thead or tbody",a)));var e="",f=b(a),g=b.metadata;a.hasInitialized=!1,a.isProcessing=!0,a.config=d,b.data(a,"tablesorter",d),d.debug&&(console[console.group?"group":"log"]("Initializing tablesorter"),b.data(a,"startoveralltimer",new Date)),d.supportsDataObject=function(a){return a[0]=parseInt(a[0],10),a[0]>1||1===a[0]&&parseInt(a[1],10)>=4}(b.fn.jquery.split(".")),d.emptyTo=d.emptyTo.toLowerCase(),d.stringTo=d.stringTo.toLowerCase(),d.last={sortList:[],clickedIndex:-1},/tablesorter\-/.test(f.attr("class"))||(e=""!==d.theme?" tablesorter-"+d.theme:""),d.table=a,d.$table=f.addClass(c.css.table+" "+d.tableClass+e).attr("role","grid"),d.$headers=f.find(d.selectorHeaders),d.namespace?d.namespace="."+d.namespace.replace(c.regex.nonWord,""):d.namespace=".tablesorter"+Math.random().toString(16).slice(2),d.$table.children().children("tr").attr("role","row"),d.$tbodies=f.children("tbody:not(."+d.cssInfoBlock+")").attr({"aria-live":"polite","aria-relevant":"all"}),d.$table.children("caption").length&&(e=d.$table.children("caption")[0],e.id||(e.id=d.namespace.slice(1)+"caption"),d.$table.attr("aria-labelledby",e.id)),d.widgetInit={},d.textExtraction=d.$table.attr("data-text-extraction")||d.textExtraction||"basic",c.buildHeaders(d),c.fixColumnWidth(a),c.addWidgetFromClass(a),c.applyWidgetOptions(a),c.setupParsers(d),d.totalRows=0,d.delayInit||c.buildCache(d),c.bindEvents(a,d.$headers,!0),c.bindMethods(d),d.supportsDataObject&&"undefined"!=typeof f.data().sortlist?d.sortList=f.data().sortlist:g&&f.metadata()&&f.metadata().sortlist&&(d.sortList=f.metadata().sortlist),c.applyWidget(a,!0),d.sortList.length>0?c.sortOn(d,d.sortList,{},!d.initWidgets):(c.setHeadersCss(d),d.initWidgets&&c.applyWidget(a,!1)),d.showProcessing&&f.unbind("sortBegin"+d.namespace+" sortEnd"+d.namespace).bind("sortBegin"+d.namespace+" sortEnd"+d.namespace,function(b){clearTimeout(d.timerProcessing),c.isProcessing(a),"sortBegin"===b.type&&(d.timerProcessing=setTimeout(function(){c.isProcessing(a,!0)},500))}),a.hasInitialized=!0,a.isProcessing=!1,d.debug&&(console.log("Overall initialization time: "+c.benchmark(b.data(a,"startoveralltimer"))),d.debug&&console.groupEnd&&console.groupEnd()),f.triggerHandler("tablesorter-initialized",a),"function"==typeof d.initialized&&d.initialized(a)},bindMethods:function(a){var d=a.$table,e=a.namespace,f="sortReset update updateRows updateAll updateHeaders addRows updateCell updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave ".split(" ").join(e+" ");d.unbind(f.replace(c.regex.spaces," ")).bind("sortReset"+e,function(a,b){a.stopPropagation(),c.sortReset(this.config,b)}).bind("updateAll"+e,function(a,b,d){a.stopPropagation(),c.updateAll(this.config,b,d)}).bind("update"+e+" updateRows"+e,function(a,b,d){a.stopPropagation(),c.update(this.config,b,d)}).bind("updateHeaders"+e,function(a,b){a.stopPropagation(),c.updateHeaders(this.config,b)}).bind("updateCell"+e,function(a,b,d,e){a.stopPropagation(),c.updateCell(this.config,b,d,e)}).bind("addRows"+e,function(a,b,d,e){a.stopPropagation(),c.addRows(this.config,b,d,e)}).bind("updateComplete"+e,function(){this.isUpdating=!1}).bind("sorton"+e,function(a,b,d,e){a.stopPropagation(),c.sortOn(this.config,b,d,e)}).bind("appendCache"+e,function(a,d,e){a.stopPropagation(),c.appendCache(this.config,e),b.isFunction(d)&&d(this)}).bind("updateCache"+e,function(a,b,d){a.stopPropagation(),c.updateCache(this.config,b,d)}).bind("applyWidgetId"+e,function(a,b){a.stopPropagation(),c.applyWidgetId(this,b)}).bind("applyWidgets"+e,function(a,b){a.stopPropagation(),c.applyWidget(this,b)}).bind("refreshWidgets"+e,function(a,b,d){a.stopPropagation(),c.refreshWidgets(this,b,d)}).bind("removeWidget"+e,function(a,b,d){a.stopPropagation(),c.removeWidget(this,b,d)}).bind("destroy"+e,function(a,b,d){a.stopPropagation(),c.destroy(this,b,d)}).bind("resetToLoadState"+e,function(d){d.stopPropagation(),c.removeWidget(this,!0,!1),a=b.extend(!0,c.defaults,a.originalSettings),this.hasInitialized=!1,c.setup(this,a)})},bindEvents:function(a,d,e){a=b(a)[0];var f,g=a.config,h=g.namespace,i=null;e!==!0&&(d.addClass(h.slice(1)+"_extra_headers"),f=b.fn.closest?d.closest("table")[0]:d.parents("table")[0],f&&"TABLE"===f.nodeName&&f!==a&&b(f).addClass(h.slice(1)+"_extra_table")),f=(g.pointerDown+" "+g.pointerUp+" "+g.pointerClick+" sort keyup ").replace(c.regex.spaces," ").split(" ").join(h+" "),d.find(g.selectorSort).add(d.filter(g.selectorSort)).unbind(f).bind(f,function(a,e){var f,h,j,k=b(a.target),l=" "+a.type+" ";if(!(1!==(a.which||a.button)&&!l.match(" "+g.pointerClick+" | sort | keyup ")||" keyup "===l&&a.which!==c.keyCodes.enter||l.match(" "+g.pointerClick+" ")&&"undefined"!=typeof a.which||l.match(" "+g.pointerUp+" ")&&i!==a.target&&e!==!0)){if(l.match(" "+g.pointerDown+" "))return i=a.target,j=k.jquery.split("."),void("1"===j[0]&&j[1]<4&&a.preventDefault());if(i=null,c.regex.formElements.test(a.target.nodeName)||k.hasClass(g.cssNoSort)||k.parents("."+g.cssNoSort).length>0||k.parents("button").length>0)return!g.cancelSelection;g.delayInit&&c.isEmptyObject(g.cache)&&c.buildCache(g),f=b.fn.closest?b(this).closest("th, td"):/TH|TD/.test(this.nodeName)?b(this):b(this).parents("th, td"),j=d.index(f),g.last.clickedIndex=j<0?f.attr("data-column"):j,h=g.$headers[g.last.clickedIndex],h&&!h.sortDisabled&&c.initSort(g,h,a)}}),g.cancelSelection&&d.attr("unselectable","on").bind("selectstart",!1).css({"user-select":"none",MozUserSelect:"none"})},buildHeaders:function(a){var d,e,f,g;for(a.headerList=[],a.headerContent=[],a.sortVars=[],a.debug&&(f=new Date),a.columns=c.computeColumnIndex(a.$table.children("thead, tfoot").children("tr")),e=a.cssIcon?'':"",a.$headers=b(b.map(a.$table.find(a.selectorHeaders),function(d,f){var g,h,i,j,k,l=b(d);if(!l.parent().hasClass(a.cssIgnoreRow))return g=c.getColumnData(a.table,a.headers,f,!0),a.headerContent[f]=l.html(),""===a.headerTemplate||l.find("."+c.css.headerIn).length||(j=a.headerTemplate.replace(c.regex.templateContent,l.html()).replace(c.regex.templateIcon,l.find("."+c.css.icon).length?"":e),a.onRenderTemplate&&(h=a.onRenderTemplate.apply(l,[f,j]),h&&"string"==typeof h&&(j=h)),l.html('
'+j+"
")),a.onRenderHeader&&a.onRenderHeader.apply(l,[f,a,a.$table]),i=parseInt(l.attr("data-column"),10),d.column=i,k=c.getOrder(c.getData(l,g,"sortInitialOrder")||a.sortInitialOrder),a.sortVars[i]={count:-1,order:k?a.sortReset?[1,0,2]:[1,0]:a.sortReset?[0,1,2]:[0,1],lockedOrder:!1},k=c.getData(l,g,"lockedOrder")||!1,"undefined"!=typeof k&&k!==!1&&(a.sortVars[i].lockedOrder=!0,a.sortVars[i].order=c.getOrder(k)?[1,1]:[0,0]),a.headerList[f]=d,l.addClass(c.css.header+" "+a.cssHeader).parent().addClass(c.css.headerRow+" "+a.cssHeaderRow).attr("role","row"),a.tabIndex&&l.attr("tabindex",0),d})),a.$headerIndexed=[],g=0;g0))for(h+=f,g+=f;f+1>0;)e.parsers[h-f]=m,e.extractors[h-f]=n,f--;h++}s+=e.parsers.length?q:1}a.debug&&(c.isEmptyObject(t)?console.warn(" No parsers detected!"):console[console.table?"table":"log"](t),console.log("Completed detecting parsers"+c.benchmark(o)),console.groupEnd&&console.groupEnd()),a.parsers=e.parsers,a.extractors=e.extractors},addParser:function(a){var b,d=c.parsers.length,e=!0;for(b=0;b=0;)if(g=c.parsers[j],g&&"text"!==g.id&&g.is&&g.is(l,a.table,k,h))return g;return c.getParserById("text")},getElementText:function(a,d,e){if(!d)return"";var f,g=a.textExtraction||"",h=d.jquery?d:b(d);return"string"==typeof g?"basic"===g&&"undefined"!=typeof(f=h.attr(a.textAttribute))?b.trim(f):b.trim(d.textContent||h.text()):"function"==typeof g?b.trim(g(h[0],a.table,e)):"function"==typeof(f=c.getColumnData(a.table,g,e))?b.trim(f(h[0],a.table,e)):b.trim(h[0].textContent||h.text())},getParsedText:function(a,b,d,e){"undefined"==typeof e&&(e=c.getElementText(a,b,d));var f=""+e,g=a.parsers[d],h=a.extractors[d];return g&&(h&&"function"==typeof h.format&&(e=h.format(e,a.table,b,d)),f="no-parser"===g.id?"":g.format(""+e,a.table,b,d),a.ignoreCase&&"string"==typeof f&&(f=f.toLowerCase())),f},buildCache:function(a,d,e){var f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B=a.table,C=a.parsers;if(a.$tbodies=a.$table.children("tbody:not(."+a.cssInfoBlock+")"),l="undefined"==typeof e?a.$tbodies:e,a.cache={},a.totalRows=0,!C)return a.debug?console.warn("Warning: *Empty table!* Not building a cache"):"";for(a.debug&&(q=new Date),a.showProcessing&&c.isProcessing(B,!0),k=0;k0&&(w+=v,y+=v)),w++;else{for(s.$row=m,s.order=i,w=0,y=a.columns,j=0;j0)){for(A=0;A<=v;)h=a.duplicateSpan||0===A?g:"string"!=typeof a.textExtraction?c.getElementText(a,p,w+A)||"":"",s.raw[w+A]=h,n[w+A]=h,A++;w+=v,y+=v}w++}n[a.columns]=s,f.normalized[f.normalized.length]=n}f.colMax=u,a.totalRows+=f.normalized.length}if(a.showProcessing&&c.isProcessing(B),a.debug){for(z=Math.min(5,a.cache[0].normalized.length),console[console.group?"group":"log"]("Building cache for "+a.totalRows+" rows (showing "+z+" rows in log) and "+a.columns+" columns"+c.benchmark(q)),g={},j=0;j-1);return d}),d=d.not(".sorter-false").filter('[data-column="'+g[e][0]+'"]'+(1===h?":last":"")),d.length)){for(f=0;f=0?f:g[1]%l.length}},updateAll:function(a,b,d){var e=a.table;e.isUpdating=!0,c.refreshWidgets(e,!0,!0),c.buildHeaders(a),c.bindEvents(e,a.$headers,!0),c.bindMethods(a),c.commonUpdate(a,b,d)},update:function(a,b,d){var e=a.table;e.isUpdating=!0,c.updateHeader(a),c.commonUpdate(a,b,d)},updateHeaders:function(a,b){a.table.isUpdating=!0,c.buildHeaders(a),c.bindEvents(a.table,a.$headers,!0),c.resortComplete(a,b)},updateCell:function(a,d,e,f){if(c.isEmptyObject(a.cache))return c.updateHeader(a),void c.commonUpdate(a,e,f);a.table.isUpdating=!0,a.$table.find(a.selectorRemove).remove();var g,h,i,j,k,l,m=a.$tbodies,n=b(d),o=m.index(b.fn.closest?n.closest("tbody"):n.parents("tbody").filter(":first")),p=a.cache[o],q=b.fn.closest?n.closest("tr"):n.parents("tr").filter(":first");if(d=n[0],m.length&&o>=0){if(i=m.eq(o).find("tr").index(q),k=p.normalized[i],l=q[0].cells.length,l!==a.columns)for(j=0,g=!1,h=0;h0&&(p+=t),p++;r[d.columns]=q,d.cache[j].normalized[o]=r}c.checkResort(d,f,g)}},updateCache:function(a,b,d){a.parsers&&a.parsers.length||c.setupParsers(a,d),c.buildCache(a,b,d)},appendCache:function(a,b){var d,e,f,g,h,i,j,k=a.table,l=a.widgetOptions,m=a.$tbodies,n=[],o=a.cache;if(c.isEmptyObject(o))return a.appender?a.appender(k,n):k.isUpdating?a.$table.triggerHandler("updateComplete",k):"";for(a.debug&&(j=new Date),i=0;i1))for(g=1;g=0)for(g=0;g1))for(g=1;ge)return 1}for(d=(a||"").replace(j.chunk,"\\0$1\\0").replace(j.chunks,"").split("\\0"),e=(b||"").replace(j.chunk,"\\0$1\\0").replace(j.chunks,"").split("\\0"),i=Math.max(d.length,e.length),h=0;hg)return 1}return 0},sortNaturalAsc:function(a,b,d,e){if(a===b)return 0;var f=c.string[e.empties[d]||e.emptyTo];return""===a&&0!==f?"boolean"==typeof f?f?-1:1:-f||-1:""===b&&0!==f?"boolean"==typeof f?f?1:-1:f||1:c.sortNatural(a,b)},sortNaturalDesc:function(a,b,d,e){if(a===b)return 0;var f=c.string[e.empties[d]||e.emptyTo];return""===a&&0!==f?"boolean"==typeof f?f?-1:1:f||1:""===b&&0!==f?"boolean"==typeof f?f?1:-1:-f||-1:c.sortNatural(b,a)},sortText:function(a,b){return a>b?1:a=0&&e!==!0&&j.widgets.splice(h,1),g&&g.remove&&(j.debug&&console.log((e?"Refreshing":"Removing")+' "'+d[f]+'" widget'),g.remove(a,j,j.widgetOptions,e),j.widgetInit[d[f]]=!1)},refreshWidgets:function(a,d,e){a=b(a)[0];var f,g,h=a.config,i=h.widgets,j=c.widgets,k=j.length,l=[],m=function(a){b(a).triggerHandler("refreshComplete")};for(f=0;f'),d=i.$table.width(),f=i.$tbodies.find("tr:first").children(":visible"),g=f.length,h=0;h").css("width",e));i.$table.prepend(j)}},getData:function(a,c,d){var e,f,g="",h=b(a);return h.length?(e=!!b.metadata&&h.metadata(),f=" "+(h.attr("class")||""),"undefined"!=typeof h.data(d)||"undefined"!=typeof h.data(d.toLowerCase())?g+=h.data(d)||h.data(d.toLowerCase()):e&&"undefined"!=typeof e[d]?g+=e[d]:c&&"undefined"!=typeof c[d]?g+=c[d]:" "!==f&&f.match(" "+d+"-")&&(g=f.match(new RegExp("\\s"+d+"-([\\w-]+)"))[1]||""),b.trim(g)):""},getColumnData:function(a,c,d,e,f){if("undefined"!=typeof c&&null!==c){a=b(a)[0];var g,h,i=a.config,j=f||i.$headers,k=i.$headerIndexed&&i.$headerIndexed[d]||j.filter('[data-column="'+d+'"]:last');if("undefined"!=typeof c[d])return e?c[d]:c[j.index(k)];for(h in c)if("string"==typeof h&&(g=k.filter(h).add(k.find(h)),g.length))return c[h]}},isProcessing:function(a,d,e){a=b(a);var f=a[0].config,g=e||a.find("."+c.css.header);d?("undefined"!=typeof e&&f.sortList.length>0&&(g=g.filter(function(){return!this.sortDisabled&&c.isValueInArray(parseFloat(b(this).attr("data-column")),f.sortList)>=0})),a.add(g).addClass(c.css.processing+" "+f.cssProcessing)):a.add(g).removeClass(c.css.processing+" "+f.cssProcessing)},processTbody:function(a,c,d){if(a=b(a)[0],d)return a.isProcessing=!0,c.before(''),b.fn.detach?c.detach():c.remove();var e=b(a).find("colgroup.tablesorter-savemyplace");c.insertAfter(e),e.remove(),a.isProcessing=!1},clearTableBody:function(a){b(a)[0].config.$tbodies.children().detach()},characterEquivalents:{a:"áàâãäąå",A:"ÁÀÂÃÄĄÅ",c:"çćč",C:"ÇĆČ",e:"éèêëěę",E:"ÉÈÊËĚĘ",i:"íìİîïı",I:"ÍÌİÎÏ",o:"óòôõöō",O:"ÓÒÔÕÖŌ",ss:"ß",SS:"ẞ",u:"úùûüů",U:"ÚÙÛÜŮ"},replaceAccents:function(a){var b,d="[",e=c.characterEquivalents;if(!c.characterRegex){c.characterRegexArray={};for(b in e)"string"==typeof b&&(d+=e[b],c.characterRegexArray[b]=new RegExp("["+e[b]+"]","g"));c.characterRegex=new RegExp(d+"]")}if(c.characterRegex.test(a))for(b in e)"string"==typeof b&&(a=a.replace(c.characterRegexArray[b],b));return a},restoreHeaders:function(a){var d,e,f=b(a)[0].config,g=f.$table.find(f.selectorHeaders),h=g.length;for(d=0;d tr").children("th, td");d===!1&&b.inArray("uitheme",h.widgets)>=0&&(g.triggerHandler("applyWidgetId",["uitheme"]),g.triggerHandler("applyWidgetId",["zebra"])),j.find("tr").not(k).remove(),f="sortReset update updateRows updateAll updateHeaders updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets removeWidget destroy mouseup mouseleave "+"keypress sortBegin sortEnd resetToLoadState ".split(" ").join(h.namespace+" "),g.removeData("tablesorter").unbind(f.replace(c.regex.spaces," ")),h.$headers.add(l).removeClass([c.css.header,h.cssHeader,h.cssAsc,h.cssDesc,c.css.sortAsc,c.css.sortDesc,c.css.sortNone].join(" ")).removeAttr("data-column").removeAttr("aria-label").attr("aria-disabled","true"),k.find(h.selectorSort).unbind("mousedown mouseup keypress ".split(" ").join(h.namespace+" ").replace(c.regex.spaces," ")),c.restoreHeaders(a),g.toggleClass(c.css.table+" "+h.tableClass+" tablesorter-"+h.theme,d===!1),a.hasInitialized=!1,delete a.config.cache,"function"==typeof e&&e(a),i&&console.log("tablesorter has been removed")}}};b.fn.tablesorter=function(a){return this.each(function(){var d=this,e=b.extend(!0,{},c.defaults,a,c.instanceMethods);e.originalSettings=a,!d.hasInitialized&&c.buildTable&&"TABLE"!==this.nodeName?c.buildTable(d,e):c.setup(d,e)})},window.console&&window.console.log||(c.logs=[],console={},console.log=console.warn=console.error=console.table=function(){var a=arguments.length>1?arguments:arguments[0];c.logs[c.logs.length]={date:Date.now(),log:a}}),c.addParser({id:"no-parser",is:function(){return!1},format:function(){return""},type:"text"}),c.addParser({id:"text",is:function(){return!0},format:function(a,d){var e=d.config;return a&&(a=b.trim(e.ignoreCase?a.toLocaleLowerCase():a),a=e.sortLocaleCompare?c.replaceAccents(a):a),a},type:"text"}),c.regex.nondigit=/[^\w,. \-()]/g,c.addParser({id:"digit",is:function(a){return c.isDigit(a)},format:function(a,d){var e=c.formatFloat((a||"").replace(c.regex.nondigit,""),d);return a&&"number"==typeof e?e:a?b.trim(a&&d.config.ignoreCase?a.toLocaleLowerCase():a):a},type:"numeric"}),c.regex.currencyReplace=/[+\-,. ]/g,c.regex.currencyTest=/^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/,c.addParser({id:"currency",is:function(a){return a=(a||"").replace(c.regex.currencyReplace,""),c.regex.currencyTest.test(a)},format:function(a,d){var e=c.formatFloat((a||"").replace(c.regex.nondigit,""),d);return a&&"number"==typeof e?e:a?b.trim(a&&d.config.ignoreCase?a.toLocaleLowerCase():a):a},type:"numeric"}),c.regex.urlProtocolTest=/^(https?|ftp|file):\/\//,c.regex.urlProtocolReplace=/(https?|ftp|file):\/\/(www\.)?/,c.addParser({id:"url",is:function(a){return c.regex.urlProtocolTest.test(a)},format:function(a){return a?b.trim(a.replace(c.regex.urlProtocolReplace,"")):a},type:"text"}),c.regex.dash=/-/g,c.regex.isoDate=/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/,c.addParser({id:"isoDate",is:function(a){return c.regex.isoDate.test(a)},format:function(a,b){var d=a?new Date(a.replace(c.regex.dash,"/")):a;return d instanceof Date&&isFinite(d)?d.getTime():a},type:"numeric"}),c.regex.percent=/%/g,c.regex.percentTest=/(\d\s*?%|%\s*?\d)/,c.addParser({id:"percent",is:function(a){return c.regex.percentTest.test(a)&&a.length<15},format:function(a,b){return a?c.formatFloat(a.replace(c.regex.percent,""),b):a},type:"numeric"}),c.addParser({id:"image",is:function(a,b,c,d){return d.find("img").length>0},format:function(a,c,d){return b(d).find("img").attr(c.config.imgAttr||"alt")||a},parsed:!0,type:"text"}),c.regex.dateReplace=/(\S)([AP]M)$/i,c.regex.usLongDateTest1=/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i,c.regex.usLongDateTest2=/^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i,c.addParser({id:"usLongDate",is:function(a){return c.regex.usLongDateTest1.test(a)||c.regex.usLongDateTest2.test(a)},format:function(a,b){var d=a?new Date(a.replace(c.regex.dateReplace,"$1 $2")):a;return d instanceof Date&&isFinite(d)?d.getTime():a},type:"numeric"}),c.regex.shortDateTest=/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/,c.regex.shortDateReplace=/[\-.,]/g,c.regex.shortDateXXY=/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,c.regex.shortDateYMD=/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/,c.convertFormat=function(a,b){a=(a||"").replace(c.regex.spaces," ").replace(c.regex.shortDateReplace,"/"),"mmddyyyy"===b?a=a.replace(c.regex.shortDateXXY,"$3/$1/$2"):"ddmmyyyy"===b?a=a.replace(c.regex.shortDateXXY,"$3/$2/$1"):"yyyymmdd"===b&&(a=a.replace(c.regex.shortDateYMD,"$1/$2/$3"));var d=new Date(a);return d instanceof Date&&isFinite(d)?d.getTime():""},c.addParser({id:"shortDate",is:function(a){return a=(a||"").replace(c.regex.spaces," ").replace(c.regex.shortDateReplace,"/"),c.regex.shortDateTest.test(a)},format:function(a,b,d,e){if(a){var f=b.config,g=f.$headerIndexed[e],h=g.length&&g.data("dateFormat")||c.getData(g,c.getColumnData(b,f.headers,e),"dateFormat")||f.dateFormat;return g.length&&g.data("dateFormat",h),c.convertFormat(a,h)||a}return a},type:"numeric"}),c.regex.timeTest=/^(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i,c.regex.timeMatch=/(0?[1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i,c.addParser({id:"time",is:function(a){return c.regex.timeTest.test(a)},format:function(a,b){var d,e=(a||"").match(c.regex.timeMatch),f=new Date(a),g=a&&(null!==e?e[0]:"00:00 AM"),h=g?new Date("2000/01/01 "+g.replace(c.regex.dateReplace,"$1 $2")):g;return h instanceof Date&&isFinite(h)?(d=f instanceof Date&&isFinite(f)?f.getTime():0,d?parseFloat(h.getTime()+"."+f.getTime()):h.getTime()):a},type:"numeric"}),c.addParser({id:"metadata",is:function(){return!1},format:function(a,c,d){var e=c.config,f=e.parserMetadataName?e.parserMetadataName:"sortValue";return b(d).metadata()[f]},type:"numeric"}),c.addWidget({id:"zebra",priority:90,format:function(a,c,d){var e,f,g,h,i,j,k,l=new RegExp(c.cssChildRow,"i"),m=c.$tbodies.add(b(c.namespace+"_extra_table").children("tbody:not(."+c.cssInfoBlock+")"));for(i=0;i #wrapper").height() - 61; + $(".offcanvasd-panel").css("min-height", heightWithoutNavbar + "px"); + + var navbarHeigh = $('#offcanvas').height(); + var wrapperHeigh = $('#page-wrapper').height(); + + if (navbarHeigh > wrapperHeigh) { + $('#page-wrapper').css("min-height", navbarHeigh + "px"); + } + + if (navbarHeigh < wrapperHeigh) { + $('#page-wrapper').css("min-height", $(window).height() + "px"); + } + } + + $(window).bind("load resize scroll", function () { + adjustOffcanvasBarHeight(); + }); + adjustOffcanvasBarHeight(); + +}); Index: lams_central/web/lessons.jsp =================================================================== diff -u -r171f124aefe163dee7e1d196a006ce11039631a6 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/lessons.jsp (.../lessons.jsp) (revision 171f124aefe163dee7e1d196a006ce11039631a6) +++ lams_central/web/lessons.jsp (.../lessons.jsp) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -1,36 +1,53 @@ -<%@ page language="java" pageEncoding="UTF-8" - contentType="text/html;charset=utf-8"%> -<%@ taglib uri="tags-fmt" prefix="fmt"%> + + +<%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ taglib uri="tags-html" prefix="html"%> <%@ taglib uri="tags-core" prefix="c"%> - +<%@ taglib uri="tags-bean" prefix="bean"%> +<%@ taglib uri="tags-logic" prefix="logic"%> +<%@ taglib uri="tags-fmt" prefix="fmt"%> +<%@ taglib uri="tags-lams" prefix="lams"%> + + + + + + + + + + +
-
-
-
- -
-
+
+

+ +
    @@ -45,21 +62,26 @@
+
+

+
" - onclick="javascript:document.location='index.do?state=active&tab=profile'" /> + onclick="javascript:document.location='index.do?state=active&method=profile'" />
+ + Index: lams_central/web/main.jsp =================================================================== diff -u -r481d8af8e0dfa898a103943c6088b753f36e6e36 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/main.jsp (.../main.jsp) (revision 481d8af8e0dfa898a103943c6088b753f36e6e36) +++ lams_central/web/main.jsp (.../main.jsp) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -11,267 +11,384 @@ - - <fmt:message key="index.welcome" /> :: <fmt:message key="title.lams"/> - - - <fmt:message key="title.lams"/> :: <fmt:message key="index.welcome" /> - + + <fmt:message key="index.welcome" /> :: <fmt:message key="title.lams"/> + + + <fmt:message key="title.lams"/> :: <fmt:message key="index.welcome" /> + - - - - - - - + + + + + + + + + + - - - + + + + - + -
-
-
- \ No newline at end of file + + + \ No newline at end of file Index: lams_central/web/profile.jsp =================================================================== diff -u -r171f124aefe163dee7e1d196a006ce11039631a6 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/profile.jsp (.../profile.jsp) (revision 171f124aefe163dee7e1d196a006ce11039631a6) +++ lams_central/web/profile.jsp (.../profile.jsp) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -1,33 +1,37 @@ -<%@ page language="java" pageEncoding="UTF-8" - contentType="text/html;charset=utf-8"%> + + +<%@ page contentType="text/html; charset=utf-8" language="java"%> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-bean" prefix="bean"%> <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-logic" prefix="logic"%> <%@ taglib uri="tags-core" prefix="c"%> -<%@ page - import="org.lamsfoundation.lams.usermanagement.AuthenticationMethod" +<%@ page import="org.lamsfoundation.lams.usermanagement.AuthenticationMethod" import="org.lamsfoundation.lams.util.Configuration" import="org.lamsfoundation.lams.util.ConfigurationKeys"%> - - - - - <%=Configuration.get(ConfigurationKeys.SHOW_ALL_MY_LESSON_LINK)%> + + + + + + + + + +
-
-
-
- -
-
+
@@ -59,7 +63,7 @@
   @@ -69,18 +73,18 @@    @@ -91,19 +95,7 @@
-
-
-
-
+ + -
-
-
- - - - - - - Index: lams_central/web/twoFactorAuthSecret.jsp =================================================================== diff -u -r9eaeb8328024c0c652dd7d17372dc4caf3a5852c -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_central/web/twoFactorAuthSecret.jsp (.../twoFactorAuthSecret.jsp) (revision 9eaeb8328024c0c652dd7d17372dc4caf3a5852c) +++ lams_central/web/twoFactorAuthSecret.jsp (.../twoFactorAuthSecret.jsp) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -10,5 +10,5 @@

+ onClick="javascript:document.location='index.do?state=active&method=profile';" />

Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java (.../IOrganisationDAO.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/IOrganisationDAO.java (.../IOrganisationDAO.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -27,6 +27,7 @@ import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; /** * @author jliew @@ -38,10 +39,17 @@ * * @param userId * @param isSysadmin + * @param page + * @param size + * @param searchString + * filters results by course name. It can be null and then doesn't affect results * @return list of orgIds */ - List getActiveCourseIdsByUser(Integer userId, boolean isSysadmin); + List getActiveCoursesByUser(Integer userId, boolean isSysadmin, int page, int size, + String searchString); + int getCountActiveCoursesByUser(Integer userId, boolean isSysadmin, String searchString); + /** * Returns courses with specified type, state and parent course. * Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java (.../OrganisationDAO.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dao/hibernate/OrganisationDAO.java (.../OrganisationDAO.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -23,6 +23,7 @@ package org.lamsfoundation.lams.usermanagement.dao.hibernate; +import java.util.ArrayList; import java.util.List; import org.hibernate.Query; @@ -31,6 +32,7 @@ import org.lamsfoundation.lams.usermanagement.OrganisationState; import org.lamsfoundation.lams.usermanagement.OrganisationType; import org.lamsfoundation.lams.usermanagement.dao.IOrganisationDAO; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.springframework.stereotype.Repository; /** @@ -39,16 +41,7 @@ @Repository public class OrganisationDAO extends LAMSBaseDAO implements IOrganisationDAO { - private static final String GET_ALL_ACTIVE_COURSE_IDS = "select o.organisationId from Organisation o" - + " where o.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE - + " and o.organisationState.organisationStateId = " + OrganisationState.ACTIVE + " order by name"; - private static final String GET_ACTIVE_COURSE_IDS_BY_USER = "select uo.organisation.organisationId, uoc.collapsed" - + " from UserOrganisation uo left join uo.userOrganisationCollapsed uoc" - + " where uo.organisation.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE - + " and uo.organisation.organisationState.organisationStateId = " + OrganisationState.ACTIVE - + " and uo.user.userId = :userId order by name"; - private static final String GET_PAGED_COURSES = "SELECT o FROM Organisation o WHERE o.organisationType.organisationTypeId =:typeId " + "AND o.organisationState.organisationStateId =:stateId AND o.parentOrganisation.organisationId =:parentOrgId " + "AND (o.name LIKE CONCAT('%', :searchString, '%')) ORDER BY "; @@ -61,12 +54,75 @@ @SuppressWarnings("unchecked") @Override - public List getActiveCourseIdsByUser(Integer userId, boolean isSysadmin) { - return isSysadmin ? getSession().createQuery(OrganisationDAO.GET_ALL_ACTIVE_COURSE_IDS).list() - : getSession().createQuery(OrganisationDAO.GET_ACTIVE_COURSE_IDS_BY_USER).setInteger("userId", userId) - .list(); + public List getActiveCoursesByUser(Integer userId, boolean isSysadmin, int page, int size, + String searchString) { + + final String GET_ALL_ACTIVE_COURSE_IDS = "SELECT o.organisationId, o.name FROM Organisation o" + + " WHERE o.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE + + " AND o.organisationState.organisationStateId = " + OrganisationState.ACTIVE + + " AND (o.name LIKE CONCAT('%', :searchString, '%')) ORDER BY o.name"; + + final String GET_ACTIVE_COURSE_IDS_BY_USER = "SELECT uo.organisation.organisationId, uo.organisation.name" + + " FROM UserOrganisation uo " + + " WHERE uo.organisation.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE + + " AND uo.organisation.organisationState.organisationStateId = " + OrganisationState.ACTIVE + + " AND uo.user.userId = :userId " + + " AND (uo.organisation.name LIKE CONCAT('%', :searchString, '%')) ORDER BY uo.organisation.name"; + + String queryStr = isSysadmin ? GET_ALL_ACTIVE_COURSE_IDS : GET_ACTIVE_COURSE_IDS_BY_USER; + Query query = getSession().createQuery(queryStr); + // support for custom search from a toolbar + searchString = searchString == null ? "" : searchString; + query.setString("searchString", searchString); + if (!isSysadmin) { + query.setInteger("userId", userId); + } + query.setFirstResult(page * size); + query.setMaxResults(size); + List list = query.list(); + + List orgDtos = new ArrayList(); + if (list != null && list.size() > 0) { + for (Object[] element : list) { + + Integer orgId = ((Number) element[0]).intValue(); + String name = (String) element[1]; + + OrganisationDTO orgDto = new OrganisationDTO(orgId, name); + orgDtos.add(orgDto); + } + + } + + return orgDtos; } + + @SuppressWarnings("unchecked") + @Override + public int getCountActiveCoursesByUser(Integer userId, boolean isSysadmin, String searchString) { + final String GET_ALL_ACTIVE_COURSE_IDS = "SELECT COUNT(o) FROM Organisation o" + + " WHERE o.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE + + " AND o.organisationState.organisationStateId = " + OrganisationState.ACTIVE + + " AND (o.name LIKE CONCAT('%', :searchString, '%'))"; + + final String GET_ACTIVE_COURSE_IDS_BY_USER = "SELECT COUNT(uo)" + " FROM UserOrganisation uo " + + " WHERE uo.organisation.organisationType.organisationTypeId = " + OrganisationType.COURSE_TYPE + + " AND uo.organisation.organisationState.organisationStateId = " + OrganisationState.ACTIVE + + " AND uo.user.userId = :userId " + " AND (uo.organisation.name LIKE CONCAT('%', :searchString, '%'))"; + + String queryStr = isSysadmin ? GET_ALL_ACTIVE_COURSE_IDS : GET_ACTIVE_COURSE_IDS_BY_USER; + Query query = getSession().createQuery(queryStr); + // support for custom search from a toolbar + searchString = searchString == null ? "" : searchString; + query.setString("searchString", searchString); + if (!isSysadmin) { + query.setInteger("userId", userId); + } + + return ((Number) query.uniqueResult()).intValue(); + } + @SuppressWarnings("unchecked") @Override public List getPagedCourses(Integer parentOrgId, Integer typeId, Integer stateId, int page, int size, Fisheye: Tag c33d82bf97152099b7a309a156ec2707239b622c refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/usermanagement/dto/CollapsedOrgDTO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/dto/OrganisationDTO.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/dto/OrganisationDTO.java (.../OrganisationDTO.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/dto/OrganisationDTO.java (.../OrganisationDTO.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -45,6 +45,14 @@ public OrganisationDTO() { } + + public OrganisationDTO(Integer organisationID, String name) { + super(); + this.organisationID = organisationID; + this.name = name; + this.roleNames = new Vector(); + this.nodes = new Vector(); + } public OrganisationDTO(Integer organisationID, Integer parentID, String name, String description, Integer organisationTypeId) { Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/IUserManagementService.java (.../IUserManagementService.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -38,6 +38,7 @@ import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.UserOrganisation; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.dto.UserManageBean; @@ -367,8 +368,11 @@ */ int getCountUsers(String searchString); - List getActiveCourseIdsByUser(Integer userId, boolean isSysadmin); + List getActiveCoursesByUser(Integer userId, boolean isSysadmin, int page, int size, + String searchString); + int getCountActiveCoursesByUser(Integer userId, boolean isSysadmin, String searchString); + /** * Search users across login, first name, last name and email fields using the search term. Filters out disabled * users. Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java =================================================================== diff -u -rde884cf8c730a25d2f2296f7a768d3fd45508c99 -rc33d82bf97152099b7a309a156ec2707239b622c --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision de884cf8c730a25d2f2296f7a768d3fd45508c99) +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java (.../UserManagementService.java) (revision c33d82bf97152099b7a309a156ec2707239b622c) @@ -26,7 +26,6 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -56,10 +55,9 @@ import org.lamsfoundation.lams.usermanagement.dao.IOrganisationDAO; import org.lamsfoundation.lams.usermanagement.dao.IRoleDAO; import org.lamsfoundation.lams.usermanagement.dao.IUserOrganisationDAO; -import org.lamsfoundation.lams.usermanagement.dto.CollapsedOrgDTO; +import org.lamsfoundation.lams.usermanagement.dto.OrganisationDTO; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.dto.UserManageBean; -import org.lamsfoundation.lams.usermanagement.util.CollapsedOrgDTOComparator; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.HashUtil; @@ -879,35 +877,14 @@ } @Override - public List getActiveCourseIdsByUser(Integer userId, boolean isSysadmin) { - List list = organisationDAO.getActiveCourseIdsByUser(userId, isSysadmin); - return populateCollapsedOrgDTOs(list, isSysadmin); + public List getActiveCoursesByUser(Integer userId, boolean isSysadmin, int page, int size, + String searchString) { + return organisationDAO.getActiveCoursesByUser(userId, isSysadmin, page, size, searchString); } - - private List populateCollapsedOrgDTOs(List list, boolean isSysadmin) { - ArrayList dtoList = new ArrayList(); - for (Object obj : list) { - // sysadmins get all orgs collapsed; saves storing boolean for every - // org, - // and saves loading time for the sysadmin - if (isSysadmin) { - Organisation org = (Organisation) findById(Organisation.class, (Integer) obj); - dtoList.add(new CollapsedOrgDTO((Integer) obj, org.getName(), Boolean.TRUE)); - - } else { - Object[] array = (Object[]) obj; - if (array.length > 1) { - Organisation org = (Organisation) findById(Organisation.class, (Integer) array[0]); - if (array[1] != null) { - dtoList.add(new CollapsedOrgDTO((Integer) array[0], org.getName(), (Boolean) array[1])); - } else { - dtoList.add(new CollapsedOrgDTO((Integer) array[0], org.getName(), Boolean.FALSE)); - } - } - } - } - Collections.sort(dtoList, new CollapsedOrgDTOComparator()); - return dtoList; + + @Override + public int getCountActiveCoursesByUser(Integer userId, boolean isSysadmin, String searchString) { + return organisationDAO.getCountActiveCoursesByUser(userId, isSysadmin, searchString); } @Override Fisheye: Tag c33d82bf97152099b7a309a156ec2707239b622c refers to a dead (removed) revision in file `lams_common/src/java/org/lamsfoundation/lams/usermanagement/util/CollapsedOrgDTOComparator.java'. Fisheye: No comparison available. Pass `N' to diff?