Index: lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java =================================================================== diff -u -rb1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision b1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e) +++ lams_central/src/java/org/lamsfoundation/lams/web/DisplayGroupAction.java (.../DisplayGroupAction.java) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -23,19 +23,30 @@ /* $Id$ */ package org.lamsfoundation.lams.web; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import javax.naming.InitialContext; +import javax.naming.NamingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.sql.DataSource; 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.learningdesign.LearningDesign; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.OrganisationState; @@ -60,6 +71,7 @@ private static IUserManagementService service; private Integer stateId = OrganisationState.ACTIVE; + @SuppressWarnings({"unchecked"}) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, @@ -85,11 +97,13 @@ return mapping.findForward("group"); } - //@SuppressWarnings({"unchecked","static-access"}) - private IndexOrgBean createOrgBean(Organisation org, List roles, String username, boolean isSysAdmin) { + @SuppressWarnings({"unchecked"}) + private IndexOrgBean createOrgBean(Organisation org, List roles, String username, boolean isSysAdmin) + throws SQLException, NamingException { User user = (User)getService().findByProperty(User.class, "login", username).get(0); - IndexOrgBean orgBean = new IndexOrgBean(org.getName(), org.getOrganisationType().getOrganisationTypeId()); + IndexOrgBean orgBean = new IndexOrgBean(org.getOrganisationId(), org.getName(), org.getOrganisationType().getOrganisationTypeId()); + // set org links List links = new ArrayList(); if(isSysAdmin && stateId.equals(OrganisationState.ACTIVE)){ if (orgBean.getType().equals(OrganisationType.COURSE_TYPE)) { @@ -111,56 +125,21 @@ } orgBean.setLinks(links); + // set archived date if archived if (stateId.equals(OrganisationState.ARCHIVED) && org.getOrganisationState().getOrganisationStateId().equals(OrganisationState.ARCHIVED)) { orgBean.setArchivedDate(org.getArchivedDate()); } - - List lessonBeans = new ArrayList(); - Set lessons = org.getLessons(); - for(Lesson lesson:lessons) { - if(isInLesson(user,lesson)){ - if(!lesson.isPreviewLesson()){ - List lessonLinks = new ArrayList(); - String url = null; - if(stateId.equals(OrganisationState.ACTIVE)){ - if(contains(roles,Role.ROLE_GROUP_MANAGER)||contains(roles,Role.ROLE_MONITOR)){ - if(!lesson.getLessonStateId().equals(lesson.REMOVED_STATE)){ - lessonLinks.add(new IndexLinkBean("index.monitor", "javascript:openMonitorLesson(" + lesson.getLessonId()+")")); - } - } - if(contains(roles,Role.ROLE_LEARNER)){ - log.debug("Lesson State:"+lesson.getLessonStateId()); - if(lesson.getLessonStateId().equals(lesson.STARTED_STATE)||lesson.getLessonStateId().equals(lesson.FINISHED_STATE)){ - url = "javascript:openLearner("+lesson.getLessonId()+")"; - } - } - }else if(stateId.equals(OrganisationState.ARCHIVED)){ - if(contains(roles,Role.ROLE_GROUP_MANAGER)){ - if(!lesson.getLessonStateId().equals(lesson.REMOVED_STATE)){ - lessonLinks.add(new IndexLinkBean("index.monitor", "javascript:openMonitorLesson(" + lesson.getLessonId()+")")); - } - } - if(contains(roles,Role.ROLE_LEARNER)){ - log.debug("Lesson State:"+lesson.getLessonStateId()); - if(lesson.getLessonStateId().equals(lesson.STARTED_STATE)||lesson.getLessonStateId().equals(lesson.FINISHED_STATE)){ - lessonLinks.add(new IndexLinkBean("label.export.portfolio","javascript:openExportPortfolio("+lesson.getLessonId()+")")); - } - } - } - if(lessonLinks.size()>0 || url!=null){ - IndexLessonBean lessonBean = new IndexLessonBean(lesson.getLessonName(), - lesson.getLessonDescription(), - url, - lesson.getLessonStateId(), - lessonLinks); - lessonBeans.add(lessonBean); - } - } - } + + // set lesson beans + List lessonBeans = null; + try { + lessonBeans = getLessonBeans(user.getUserId(), org.getOrganisationId(), roles, org.getOrderedLessonIds()); + } catch (Exception e) { + log.error("Failed retrieving user's lessons from database: " + e, e); } - Collections.sort(lessonBeans); orgBean.setLessons(lessonBeans); + // create subgroup beans if(orgBean.getType().equals(OrganisationType.COURSE_TYPE)){ Set children = org.getChildOrganisations(); @@ -189,10 +168,92 @@ } return orgBean; } - - private boolean isInLesson(User user, Lesson lesson) { - return lesson.getLessonClass().isStaffMember(user)||lesson.getLessonClass().getLearners().contains(user); + + // get lesson beans and sort them + private List getLessonBeans(Integer userId, Integer orgId, List roles, String orderedLessonIds) + throws SQLException, NamingException { + Map map = populateLessonBeans(userId, orgId, roles); + ArrayList orderedList = new ArrayList(); + + if (orderedLessonIds != null) { + List idList = Arrays.asList(orderedLessonIds.split(",")); + + // sort mapped lesson beans according to orderedLessonIds + for (String idString : idList) { + try { + Long id = new Long(Long.parseLong(idString)); + if (map.containsKey(id)) { + orderedList.add(map.get(id)); + map.remove(id); + } + } catch (NumberFormatException e) { + continue; + } + } + } + + // append lesson beans not mentioned in orderedLessonIds + if (!map.values().isEmpty()) { + orderedList.addAll(map.values()); + } + + return orderedList; } + + // create lesson beans + private Map populateLessonBeans(Integer userId, Integer orgId, List roles) + throws SQLException, NamingException { + + // iterate through user's lessons where they are learner + Map map = getLessonsByOrgAndUser(userId, orgId, false); + for (IndexLessonBean bean : map.values()) { + List lessonLinks = new ArrayList(); + String url = null; + Integer lessonStateId = bean.getState(); + if (stateId.equals(OrganisationState.ACTIVE)) { + if (contains(roles, Role.ROLE_LEARNER)) { + if (lessonStateId.equals(Lesson.STARTED_STATE) || lessonStateId.equals(Lesson.FINISHED_STATE)) { + url = "javascript:openLearner("+bean.getId()+")"; + } + } + } else if (stateId.equals(OrganisationState.ARCHIVED)) { + if (contains(roles, Role.ROLE_LEARNER)) { + if (lessonStateId.equals(Lesson.STARTED_STATE) || lessonStateId.equals(Lesson.FINISHED_STATE)) { + lessonLinks.add(new IndexLinkBean("label.export.portfolio","javascript:openExportPortfolio("+bean.getId()+")")); + } + } + } + if (lessonLinks.size()>0 || url!=null) { + bean.setUrl(url); + bean.setLinks(lessonLinks); + } + } + + // iterate through user's lessons where they are staff, and add staff links to the beans in the map. + Map staffMap = getLessonsByOrgAndUser(userId, orgId, true); + for (IndexLessonBean bean : staffMap.values()) { + if (map.containsKey(bean.getId())) { + bean = map.get(bean.getId()); + } + List lessonLinks = bean.getLinks(); + if (lessonLinks == null) lessonLinks = new ArrayList(); + if (stateId.equals(OrganisationState.ACTIVE)) { + if (contains(roles, Role.ROLE_GROUP_MANAGER) || contains(roles, Role.ROLE_MONITOR)){ + lessonLinks.add(new IndexLinkBean("index.monitor", "javascript:openMonitorLesson(" + bean.getId()+")")); + } + } else if (stateId.equals(OrganisationState.ARCHIVED)) { + if (contains(roles, Role.ROLE_GROUP_MANAGER)) { + lessonLinks.add(new IndexLinkBean("index.monitor", "javascript:openMonitorLesson(" + bean.getId()+")")); + } + } + if (lessonLinks.size() > 0) { + bean.setLinks(lessonLinks); + } + map.put(bean.getId(), bean); + } + + return map; + } private boolean contains(List roles, Integer roleId) { for (int i = 0; i < roles.size(); i++) { @@ -209,5 +270,55 @@ } return service; } + + // get lesson beans where user is learner (if isStaff=true, gets lessons where user is staff) + private Map getLessonsByOrgAndUser(Integer userId, Integer orgId, boolean isStaff) + throws SQLException, NamingException { + String learnerQuery = "select l.lesson_id, l.name, l.description, l.lesson_state_id " + + " from lams_lesson l, lams_learning_design ld, lams_group g, lams_user_group ug, lams_grouping gi" + + " where l.learning_design_id=ld.learning_design_id" + + " and ld.copy_type_id!=" + LearningDesign.COPY_TYPE_PREVIEW + + " and l.organisation_id=?" + + " and l.class_grouping_id=g.grouping_id" + + " and l.lesson_state_id!=" + Lesson.REMOVED_STATE + + " and ug.group_id=g.group_id" + + " and ug.user_id=?" + + " and gi.grouping_id=g.grouping_id" + + " and g.group_id" + (isStaff ? "" : "!") + "=gi.staff_group_id"; + + InitialContext ctx = new InitialContext(); + DataSource ds = (DataSource) ctx.lookup("java:/jdbc/lams-ds"); + Connection conn = null; + + HashMap map = new HashMap(); + + try { + conn = ds.getConnection(); + PreparedStatement ps = conn.prepareStatement(learnerQuery); + ps.setInt(1, orgId.intValue()); + ps.setInt(2, userId.intValue()); + ResultSet rs = ps.executeQuery(); + + // check if there is any result + while (rs.next() != false) { + long id = rs.getLong(1); + String name = rs.getString(2); + String description = rs.getString(3); + int state = rs.getInt(4); + IndexLessonBean bean = new IndexLessonBean( + new Long(id), name, description, new Integer(state) + ); + map.put(new Long(id), bean); + } + + rs.close(); + } finally { + if (conn != null && !conn.isClosed()) { + conn.close(); + } + } + + return map; + } } \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/web/IndexLessonBean.java =================================================================== diff -u -rb1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/src/java/org/lamsfoundation/lams/web/IndexLessonBean.java (.../IndexLessonBean.java) (revision b1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e) +++ lams_central/src/java/org/lamsfoundation/lams/web/IndexLessonBean.java (.../IndexLessonBean.java) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -36,6 +36,7 @@ * Created at 10:13:43 on 14/06/2006 */ public class IndexLessonBean implements Comparable{ + private Long id; private String name; private String description; private String url; @@ -47,9 +48,17 @@ this.url = url; } - public IndexLessonBean(String name, String description, String url, Integer state, List links) { + public IndexLessonBean(Long id, String name, String description, Integer state) { + this.id = id; this.name = name; this.description = description; + this.state = state; + } + + public IndexLessonBean(Long id, String name, String description, String url, Integer state, List links) { + this.id = id; + this.name = name; + this.description = description; this.url = url; this.state = state; this.links = links; @@ -66,6 +75,12 @@ public void setLinks(List links) { this.links = links; } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } /** * @return Returns the name. */ Index: lams_central/src/java/org/lamsfoundation/lams/web/IndexOrgBean.java =================================================================== diff -u -rbcdeef3baa9554197ce15b4b7f0563cd34858e56 -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/src/java/org/lamsfoundation/lams/web/IndexOrgBean.java (.../IndexOrgBean.java) (revision bcdeef3baa9554197ce15b4b7f0563cd34858e56) +++ lams_central/src/java/org/lamsfoundation/lams/web/IndexOrgBean.java (.../IndexOrgBean.java) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -39,6 +39,7 @@ */ public class IndexOrgBean implements Comparable { + private Integer id; private String name; private Date archivedDate; private Integer type; @@ -47,7 +48,8 @@ private List childIndexOrgBeans; - public IndexOrgBean(String name, Integer type) { + public IndexOrgBean(Integer id, String name, Integer type) { + this.id = id; this.name = name; this.type = type; this.links = new ArrayList(); @@ -91,6 +93,18 @@ this.links = links; } /** + * @return Returns the id. + */ + public Integer getId() { + return id; + } + /** + * @param id The id to set. + */ + public void setId(Integer id) { + this.id = id; + } + /** * @return Returns the name. */ public String getName() { Index: lams_central/src/java/org/lamsfoundation/lams/web/LessonOrderServlet.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/LessonOrderServlet.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/LessonOrderServlet.java (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -0,0 +1,154 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.web; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.service.UserManagementService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.util.HttpSessionManager; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Used by main.jsp to persist the ordering of lessonIds when lessons are + * ordered by a staff member for a group. Currently stores lessonIds as a + * single comma separated string in lams_organisation. + * + * @author jliew + * + * @web:servlet name="saveLessonOrder" + * @web:servlet-mapping url-pattern="/servlet/saveLessonOrder" + */ +public class LessonOrderServlet extends HttpServlet { + + private static Logger log = Logger.getLogger(LessonOrderServlet.class); + + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + Integer orgId = WebUtil.readIntParam(request, "orgId", false); + String ids = request.getParameter("ids"); + + WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(HttpSessionManager.getInstance().getServletContext()); + UserManagementService service = (UserManagementService) ctx.getBean("userManagementService"); + + if (orgId != null && ids != null) { + Organisation org = (Organisation)service.findById(Organisation.class, orgId); + + if (org != null) { + // verify the ids are lessons that belong to orgId; + // necessary since javascript on index page doesn't restrict + // where user drops a lesson when sorting. + // TODO: remove this validation when the javascript sortable's + // containment parameter is working. + List idList = Arrays.asList(ids.split(",")); + Set lessons = org.getLessons(); + for (String id : idList) { + try { + Long l = new Long(Long.parseLong(id)); + if (!contains(lessons, l)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN); + } + } catch(NumberFormatException e) { + continue; + } + } + + String oldIds = org.getOrderedLessonIds(); + String updatedIds = mergeLessonIds((oldIds!=null ? oldIds : ""), ids); + org.setOrderedLessonIds(updatedIds); + service.save(org); + } + } + + } + + private boolean contains(Set lessons, Long id) { + Iterator it = lessons.iterator(); + while (it.hasNext()) { + Lesson lesson = (Lesson)it.next(); + if (lesson.getLessonId().equals(id)) return true; + } + return false; + } + + // take the updated list and insert elements of the old list that don't exist in it; + private String mergeLessonIds(String old, String updated) { + List oldIds = Arrays.asList(old.split(",")); + List updatedIds = Arrays.asList(updated.split(",")); + ArrayList mergedIds = new ArrayList(updatedIds); + + for (int i=0; i oldIds, List updatedIds) { + for (int j=i; j -1) { + return index; + } + } + return -1; + } + + // implode strings in list separated by commas + private String joinString(List list) { + String s = ""; + if (list != null) { + for (String i : list) { + s += i + ","; + } + s = s.substring(0, s.length()-1); + } + return s; + } +} + \ No newline at end of file Index: lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java =================================================================== diff -u -rbcdeef3baa9554197ce15b4b7f0563cd34858e56 -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java (.../ProfileAction.java) (revision bcdeef3baa9554197ce15b4b7f0563cd34858e56) +++ lams_central/src/java/org/lamsfoundation/lams/web/ProfileAction.java (.../ProfileAction.java) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -119,7 +119,7 @@ // insert or update bean if it is a course if (orgTypeId.equals(OrganisationType.COURSE_TYPE)) { IndexOrgBean orgBean = (!orgBeansMap.containsKey(orgId)) - ? new IndexOrgBean(org.getName(), orgTypeId) + ? new IndexOrgBean(org.getOrganisationId(), org.getName(), orgTypeId) : orgBeansMap.get(orgId); orgBean.addLesson(lessonBean); orgBeansMap.put(orgId, orgBean); @@ -129,10 +129,10 @@ Organisation parentOrg = org.getParentOrganisation(); Integer parentOrgId = parentOrg.getOrganisationId(); IndexOrgBean parentOrgBean = (!orgBeansMap.containsKey(parentOrgId)) - ? new IndexOrgBean(parentOrg.getName(), OrganisationType.COURSE_TYPE) + ? new IndexOrgBean(parentOrg.getOrganisationId(), parentOrg.getName(), OrganisationType.COURSE_TYPE) : orgBeansMap.get(parentOrgId); // create new bean for class, or use existing bean - IndexOrgBean orgBean = new IndexOrgBean(org.getName(), orgTypeId); + IndexOrgBean orgBean = new IndexOrgBean(org.getOrganisationId(), org.getName(), orgTypeId); List childOrgBeans = parentOrgBean.getChildIndexOrgBeans(); if (childOrgBeans.contains(orgBean)) { orgBean = getOrgBean(org.getName(), childOrgBeans); Index: lams_central/web/group.jsp =================================================================== diff -u -rb1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/web/group.jsp (.../group.jsp) (revision b1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e) +++ lams_central/web/group.jsp (.../group.jsp) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -8,7 +8,7 @@
-

+

( )

@@ -21,11 +21,11 @@
-
+
- -

+

    " class="j-lessons"> +

    " class="j-single-lesson">  () @@ -42,7 +42,7 @@

    -
    +
Index: lams_central/web/includes/javascript/interface.js =================================================================== diff -u --- lams_central/web/includes/javascript/interface.js (revision 0) +++ lams_central/web/includes/javascript/interface.js (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -0,0 +1,8 @@ +/* + * Interface elements for jQuery - http://interface.eyecon.ro + * + * Copyright (c) 2006 Stefan Petre + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('6.W={2t:D(e){u x=0;u y=0;u 34=B;u X=e.S;8(6(e).M(\'U\')==\'10\'){33=X.21;4G=X.1f;X.21=\'2B\';X.U=\'1Z\';X.1f=\'2z\';34=P}u G=e;4o(G){x+=G.5e+(G.35&&!6.1P.3W?L(G.35.5F)||0:0);y+=G.5c+(G.35&&!6.1P.3W?L(G.35.5y)||0:0);G=G.5H}G=e;4o(G&&G.5I&&G.5I.4U()!=\'1m\'){x-=G.2T||0;y-=G.2E||0;G=G.20}8(34){X.U=\'10\';X.1f=4G;X.21=33}H{x:x,y:y}},7Y:D(G){u x=0,y=0;4o(G){x+=G.5e||0;y+=G.5c||0;G=G.5H}H{x:x,y:y}},2n:D(e){u w=6.M(e,\'2J\');u h=6.M(e,\'2I\');u 1p=0;u 1j=0;u X=e.S;8(6(e).M(\'U\')!=\'10\'){1p=e.5m;1j=e.59}N{33=X.21;4G=X.1f;X.21=\'2B\';X.U=\'1Z\';X.1f=\'2z\';1p=e.5m;1j=e.59;X.U=\'10\';X.1f=4G;X.21=33}H{w:w,h:h,1p:1p,1j:1j}},4D:D(G){H{1p:G.5m||0,1j:G.59||0}},6A:D(e){u h,w,36;8(e){w=e.3I;h=e.3K}N{36=T.1O;w=2w.5t||4r.5t||(36&&36.3I)||T.1m.3I;h=2w.4O||4r.4O||(36&&36.3K)||T.1m.3K}H{w:w,h:h}},65:D(e){u t,l,w,h,3k,3e;8(e&&e.4y.4U()!=\'1m\'){t=e.2E;l=e.2T;w=e.5B;h=e.5z;3k=0;3e=0}N{8(T.1O&&T.1O.2E){t=T.1O.2E;l=T.1O.2T;w=T.1O.5B;h=T.1O.5z}N 8(T.1m){t=T.1m.2E;l=T.1m.2T;w=T.1m.5B;h=T.1m.5z}3k=4r.5t||T.1O.3I||T.1m.3I||0;3e=4r.4O||T.1O.3K||T.1m.3K||0}H{t:t,l:l,w:w,h:h,3k:3k,3e:3e}},4W:D(e,2Q){u G=6(e);u t=G.M(\'25\')||\'\';u r=G.M(\'28\')||\'\';u b=G.M(\'24\')||\'\';u l=G.M(\'2b\')||\'\';8(2Q)H{t:L(t)||0,r:L(r)||0,b:L(b)||0,l:L(l)};N H{t:t,r:r,b:b,l:l}},7X:D(e,2Q){u G=6(e);u t=G.M(\'69\')||\'\';u r=G.M(\'6a\')||\'\';u b=G.M(\'5Z\')||\'\';u l=G.M(\'60\')||\'\';8(2Q)H{t:L(t)||0,r:L(r)||0,b:L(b)||0,l:L(l)};N H{t:t,r:r,b:b,l:l}},4a:D(e,2Q){u G=6(e);u t=G.M(\'5y\')||\'\';u r=G.M(\'5P\')||\'\';u b=G.M(\'5Q\')||\'\';u l=G.M(\'5F\')||\'\';8(2Q)H{t:L(t)||0,r:L(r)||0,b:L(b)||0,l:L(l)||0};N H{t:t,r:r,b:b,l:l}},5f:D(3L){u x=3L.7V||(3L.7W+(T.1O.2T||T.1m.2T))||0;u y=3L.81||(3L.86+(T.1O.2E||T.1m.2E))||0;H{x:x,y:y}},4T:D(1T,52){52(1T);1T=1T.3O;4o(1T){6.W.4T(1T,52);1T=1T.84}},83:D(1T){6.W.4T(1T,D(G){1d(u 1n 1z G){8(3Q G[1n]===\'D\'){G[1n]=V}}})},82:D(G,1c){u 26=$.W.65();u 53=$.W.2n(G);8(!1c||1c==\'3q\')$(G).M({19:26.t+((1v.4u(26.h,26.3e)-26.t-53.1j)/2)+\'1b\'});8(!1c||1c==\'3m\')$(G).M({1a:26.l+((1v.4u(26.w,26.3k)-26.l-53.1p)/2)+\'1b\'})},7U:D(G,63){u 66=$(\'5O[@4v*="4q"]\',G||T),4q;66.1s(D(){4q=A.4v;A.4v=63;A.S.5h="7T:7L.7K.7J(4v=\'"+4q+"\')"})}};[].6c||(4K.7H.6c=D(v,n){n=(n==V)?0:n;u m=A.1i;1d(u i=n;i-5a?r:(1A(6.M(Y,17))||0);1H=1H==\'61\'?(38==\'10\'?\'4c\':\'3A\'):1H;16[1H]=P;11[17]=1H==\'4c\'?[0,Y.2L[17]]:[Y.2L[17],0];8(17!=\'18\')y[17]=11[17][0]+(17!=\'1Y\'&&17!=\'5v\'?\'1b\':\'\');N 6.1n(y,"18",11[17][0])}N{11[17]=[1A(6.2A(Y,17)),1A(1H)||0]}}N 8(6.J.64[17])11[17]=[6.J.2D(6.2A(Y,17)),6.J.2D(1H)];N 8(/^49$|4d$|3s$|3V$|54$/i.3j(17)){u m=1H.2P(/\\s+/g,\' \').2P(/2U\\s*\\(\\s*/g,\'2U(\').2P(/\\s*,\\s*/g,\',\').2P(/\\s*\\)/g,\')\').9g(/([^\\s]+)/g);9k(17){3B\'49\':3B\'4d\':3B\'54\':3B\'3V\':m[3]=m[3]||m[1]||m[0];m[2]=m[2]||m[0];m[1]=m[1]||m[0];1d(u i=0;i<6.J.3G.1i;i++){u 2p=6.J.4Q[17][0]+6.J.3G[i]+6.J.4Q[17][1];11[2p]=17==\'3V\'?[6.J.2D(6.2A(Y,2p)),6.J.2D(m[i])]:[1A(6.2A(Y,2p)),1A(m[i])]}4Z;3B\'3s\':1d(u i=0;i16.1W+z.41){6Q(z.3N);z.3N=V;1d(p 1z 11){8(p=="18")6.1n(y,"18",11[p][1]);N 8(3Q 11[p][1]==\'5p\')y[p]=\'2U(\'+11[p][1].r+\',\'+11[p][1].g+\',\'+11[p][1].b+\')\';N y[p]=11[p][1]+(p!=\'1Y\'&&p!=\'5v\'?\'1b\':\'\')}8(16.3A||16.4c)1d(u p 1z Y.2L)8(p=="18")6.1n(y,p,Y.2L[p]);N y[p]="";y.U=16.3A?\'10\':(38!=\'10\'?38:\'1Z\');y.3P=6X;Y.2k=V;8(6.6V(16.3X))16.3X.1J(Y)}N{u n=t-A.41;u 3R=n/16.1W;1d(p 1z 11){8(3Q 11[p][1]==\'5p\'){y[p]=\'2U(\'+L(6.1r[16.1r](3R,n,11[p][0].r,(11[p][1].r-11[p][0].r),16.1W))+\',\'+L(6.1r[16.1r](3R,n,11[p][0].g,(11[p][1].g-11[p][0].g),16.1W))+\',\'+L(6.1r[16.1r](3R,n,11[p][0].b,(11[p][1].b-11[p][0].b),16.1W))+\')\'}N{u 5w=6.1r[16.1r](3R,n,11[p][0],(11[p][1]-11[p][0]),16.1W);8(p=="18")6.1n(y,"18",5w);N y[p]=5w+(p!=\'1Y\'&&p!=\'5v\'?\'1b\':\'\')}}}};z.3N=6S(D(){z.1U()},13);Y.2k=z},4J:D(Y,1U){8(1U)Y.2k.41-=9c;N{2w.6Q(Y.2k.3N);Y.2k=V;6.97(Y,"J")}}});6.4V=D(2q){u 2e={};8(3Q 2q==\'96\'){2q=2q.4U().78(\';\');1d(u i=0;i<2q.1i;i++){3n=2q[i].78(\':\');8(3n.1i==2){2e[6.6g(3n[0].2P(/\\-(\\w)/g,D(m,c){H c.9p()}))]=6.6g(3n[1])}}}H 2e};6.I={3d:[],2f:{},O:B,3g:V,70:D(){8(6.C.k==V){H}u 1M,1u,c,1x;6.I.O.Q(0).4x=6.C.k.7.2M;1M=6.I.O.Q(0).S;1M.U=\'1Z\';6.I.O.R=6.1K(6.W.2t(6.I.O.Q(0)),6.W.2n(6.I.O.Q(0)));1M.2J=6.C.k.7.R.1p+\'1b\';1M.2I=6.C.k.7.R.1j+\'1b\';1u=6.W.4W(6.C.k);1M.25=1u.t;1M.28=1u.r;1M.24=1u.b;1M.2b=1u.l;8(6.C.k.7.1G==P){c=6.C.k.6B(P);1x=c.S;1x.25=\'1t\';1x.28=\'1t\';1x.24=\'1t\';1x.2b=\'1t\';1x.U=\'1Z\';6.I.O.5k().2o(c)}6(6.C.k).6M(6.I.O.Q(0));6.C.k.S.U=\'10\'},6h:D(e){8(!e.7.1F&&6.K.2g.5D){8(e.7.1I)e.7.1I.1J(k);6(e).M(\'1f\',e.7.5E||e.7.2Z);6(e).4I();6(6.K.2g).6k(e)}6.I.O.3J(e.7.2M).9l(\'&6v;\');6.I.3g=V;u 1M=6.I.O.Q(0).S;1M.U=\'10\';6.I.O.6M(e);8(e.7.J>0){6(e).9f(e.7.J)}6(\'1m\').2o(6.I.O.Q(0));u 3E=[];u 3C=B;1d(u i=0;i<6.I.3d.1i;i++){u F=6.K.1w[6.I.3d[i]].Q(0);u 1e=6.1n(F,\'1e\');u 3x=6.I.3U(1e);8(F.E.4p!=3x.3H){F.E.4p=3x.3H;8(3C==B&&F.E.1B){3C=F.E.1B}3x.1e=1e;3E[3E.1i]=3x}}6.I.3d=[];8(3C!=B&&3E.1i>0){3C(3E)}},4A:D(e,o){8(!6.C.k)H;u 2j=B;u i=0;8(e.E.G.6t()>0){1d(i=e.E.G.6t();i>0;i--){8(e.E.G.Q(i-1)!=6.C.k){8(!e.2h.4L){8((e.E.G.Q(i-1).2F.y+e.E.G.Q(i-1).2F.1j/2)>6.C.k.7.1R){2j=e.E.G.Q(i-1)}N{4Z}}N{8((e.E.G.Q(i-1).2F.x+e.E.G.Q(i-1).2F.1p/2)>6.C.k.7.2c&&(e.E.G.Q(i-1).2F.y+e.E.G.Q(i-1).2F.1j/2)>6.C.k.7.1R){2j=e.E.G.Q(i-1)}}}}}8(2j&&6.I.3g!=2j){6.I.3g=2j;6(2j).9h(6.I.O.Q(0))}N 8(!2j&&(6.I.3g!=V||6.I.O.Q(0).20!=e)){6.I.3g=V;6(e).2o(6.I.O.Q(0))}6.I.O.Q(0).S.U=\'1Z\'},4S:D(e){8(6.C.k==V){H}e.E.G.1s(D(){A.2F=6.1K(6.W.4D(A),6.W.2t(A))})},3U:D(s){u i;u h=\'\';u o={};8(s){8(6.I.2f[s]){o[s]=[];6(\'#\'+s+\' .\'+6.I.2f[s]).1s(D(){8(h.1i>0){h+=\'&\'}h+=s+\'[]=\'+6.1n(A,\'1e\');o[s][o[s].1i]=6.1n(A,\'1e\')})}N{1d(a 1z s){8(6.I.2f[s[a]]){o[s[a]]=[];6(\'#\'+s[a]+\' .\'+6.I.2f[s[a]]).1s(D(){8(h.1i>0){h+=\'&\'}h+=s[a]+\'[]=\'+6.1n(A,\'1e\');o[s[a]][o[s[a]].1i]=6.1n(A,\'1e\')})}}}}N{1d(i 1z 6.I.2f){o[i]=[];6(\'#\'+i+\' .\'+6.I.2f[i]).1s(D(){8(h.1i>0){h+=\'&\'}h+=i+\'[]=\'+6.1n(A,\'1e\');o[i][o[i].1i]=6.1n(A,\'1e\')})}}H{3H:h,o:o}},6l:D(e){8(!e.9i){H}H A.1s(D(){8(!A.2h||!6(e).4R(\'.\'+A.2h.1N))6(e).3D(A.2h.1N);6(e).4P(A.2h.7)})},32:D(){H A.1s(D(){6(\'.\'+A.2h.1N).4I();6(A).6O();A.2h=V;A.6o=V})},31:D(o){8(o.1N&&6.W&&6.C&&6.K){8(!6.I.O){6(\'1m\',T).2o(\'<3T 1e="6N">&6v;\');6.I.O=6(\'#6N\');6.I.O.Q(0).S.U=\'10\'}A.6R({1N:o.1N,4B:o.4B?o.4B:B,4h:o.4h?o.4h:B,2r:o.2r?o.2r:B,3a:o.3a||o.77,2R:o.2R||o.6P,5D:P,1B:o.1B||o.9j,J:o.J?o.J:B,1G:o.1G?P:B,2C:o.2C?o.2C:\'5u\'});H A.1s(D(){u 7={2v:o.2v?P:B,6j:6i,18:o.18?1A(o.18):B,2M:o.2r?o.2r:B,J:o.J?o.J:B,1F:P,1G:o.1G?P:B,2l:o.2l?o.2l:V,15:o.15?o.15:V,1X:o.1X&&o.1X.1D==29?o.1X:B,1Q:o.1Q&&o.1Q.1D==29?o.1Q:B,1I:o.1I&&o.1I.1D==29?o.1I:B,1c:/3q|3m/.3j(o.1c)?o.1c:B,2G:o.2G?L(o.2G)||0:B,1k:o.1k?o.1k:B};6(\'.\'+o.1N,A).4P(7);A.6o=P;A.2h={1N:o.1N,2v:o.2v?P:B,6j:6i,18:o.18?1A(o.18):B,2M:o.2r?o.2r:B,J:o.J?o.J:B,1F:P,1G:o.1G?P:B,2l:o.2l?o.2l:V,15:o.15?o.15:V,4L:o.4L?P:B,7:7}})}}};6.4F.1K({8J:6.I.31,6k:6.I.6l,8A:6.I.32});6.8W=6.I.3U;6.C={O:V,k:V,32:D(){H A.1s(D(){8(A.4l){A.7.1S.5j(\'73\',6.C.51);A.7=V;A.4l=B;8(6.1P.2S){A.5A="8X"}N{A.S.8Y=\'\';A.S.6z=\'\';A.S.6F=\'\'}}})},51:D(e){8(6.C.k!=V){6.C.40(e);H B}u q=A.4H;6(T).4Y(\'6E\',6.C.5g).4Y(\'6K\',6.C.40);q.7.1o=6.W.5f(e);q.7.1L=q.7.1o;q.7.4i=B;q.7.8U=A!=A.4H;6.C.k=q;8(q.7.2x&&A!=A.4H){5q=6.W.2t(q.20);57=6.W.2n(q);5s={x:L(6.M(q,\'1a\'))||0,y:L(6.M(q,\'19\'))||0};12=q.7.1L.x-5q.x-57.1p/2-5s.x;14=q.7.1L.y-5q.y-57.1j/2-5s.y;6.5b.a5(q,[12,14])}H 6.9R||B},6w:D(e){u q=6.C.k;q.7.4i=P;u 4j=q.S;q.7.3l=6.M(q,\'U\');q.7.2Z=6.M(q,\'1f\');8(!q.7.5E)q.7.5E=q.7.2Z;q.7.1h={x:L(6.M(q,\'1a\'))||0,y:L(6.M(q,\'19\'))||0};q.7.4n=0;q.7.4s=0;8(6.1P.2S){u 5G=6.W.4a(q,P);q.7.4n=5G.l||0;q.7.4s=5G.t||0}q.7.R=6.1K(6.W.2t(q),6.W.2n(q));8(q.7.2Z!=\'3y\'&&q.7.2Z!=\'2z\'){4j.1f=\'3y\'}6.C.O.5k();u 23=q.6B(P);6(23).M({U:\'1Z\',1a:\'1t\',19:\'1t\'});23.S.25=\'0\';23.S.28=\'0\';23.S.24=\'0\';23.S.2b=\'0\';6.C.O.2o(23);u 1E=6.C.O.Q(0).S;8(q.7.5o){1E.2J=\'6D\';1E.2I=\'6D\'}N{1E.2I=q.7.R.1j+\'1b\';1E.2J=q.7.R.1p+\'1b\'}1E.U=\'1Z\';1E.25=\'1t\';1E.28=\'1t\';1E.24=\'1t\';1E.2b=\'1t\';6.1K(q.7.R,6.W.2n(23));8(q.7.1k){8(q.7.1k.1a){q.7.1h.x+=q.7.1o.x-q.7.R.x-q.7.1k.1a;q.7.R.x=q.7.1o.x-q.7.1k.1a}8(q.7.1k.19){q.7.1h.y+=q.7.1o.y-q.7.R.y-q.7.1k.19;q.7.R.y=q.7.1o.y-q.7.1k.19}8(q.7.1k.44){q.7.1h.x+=q.7.1o.x-q.7.R.x-q.7.R.1j+q.7.1k.44;q.7.R.x=q.7.1o.x-q.7.R.1p+q.7.1k.44}8(q.7.1k.4b){q.7.1h.y+=q.7.1o.y-q.7.R.y-q.7.R.1j+q.7.1k.4b;q.7.R.y=q.7.1o.y-q.7.R.1j+q.7.1k.4b}}q.7.2c=q.7.1h.x;q.7.1R=q.7.1h.y;8(q.7.3M||q.7.15==\'4z\'){3t=6.W.4a(q.20,P);q.7.R.x=q.5e+(6.1P.2S?0:6.1P.3W?-3t.l:3t.l);q.7.R.y=q.5c+(6.1P.2S?0:6.1P.3W?-3t.t:3t.t);6(q.20).2o(6.C.O.Q(0))}8(q.7.15){6.C.6C(q);q.7.27.15=6.C.6r}8(q.7.2x){6.5b.9U(q)}1E.1a=q.7.R.x-q.7.4n+\'1b\';1E.19=q.7.R.y-q.7.4s+\'1b\';1E.2J=q.7.R.1p+\'1b\';1E.2I=q.7.R.1j+\'1b\';6.C.k.7.4k=B;8(q.7.3h){q.7.27.2i=6.C.6p}8(q.7.1Y!=B){6.C.O.M(\'1Y\',q.7.1Y)}8(q.7.18){6.C.O.M(\'18\',q.7.18);8(2w.4f){6.C.O.M(\'5h\',\'6y(18=\'+q.7.18*5i+\')\')}}8(q.7.3c){6.C.O.3D(q.7.3c);6.C.O.Q(0).3O.S.U=\'10\'}8(q.7.1X)q.7.1X.1J(q,[23,q.7.1h.x,q.7.1h.y]);8(6.K&&6.K.3r>0){6.K.71(q)}8(q.7.1G==B){4j.U=\'10\'}H B},6C:D(q){8(q.7.15.1D==6G){8(q.7.15==\'4z\'){q.7.1q=6.1K({x:0,y:0},6.W.2n(q.20));u 3z=6.W.4a(q.20,P);q.7.1q.w=q.7.1q.1p-3z.l-3z.r;q.7.1q.h=q.7.1q.1j-3z.t-3z.b}N 8(q.7.15==\'T\'){u 5l=6.W.6A();q.7.1q={x:0,y:0,w:5l.w,h:5l.h}}}N 8(q.7.15.1D==4K){q.7.1q={x:L(q.7.15[0])||0,y:L(q.7.15[1])||0,w:L(q.7.15[2])||0,h:L(q.7.15[3])||0}}q.7.1q.12=q.7.1q.x-q.7.R.x;q.7.1q.14=q.7.1q.y-q.7.R.y},4w:D(k){8(k.7.3M||k.7.15==\'4z\'){6(\'1m\',T).2o(6.C.O.Q(0))}6.C.O.5k().3A().M(\'18\',1);8(2w.4f){6.C.O.M(\'5h\',\'6y(18=5i)\')}},40:D(e){6(T).5j(\'6E\',6.C.5g).5j(\'6K\',6.C.40);8(6.C.k==V){H}u k=6.C.k;6.C.k=V;8(k.7.4i==B){H B}8(k.7.1F==P){6(k).M(\'1f\',k.7.2Z)}u 4j=k.S;8(k.2x){6.C.O.M(\'6I\',\'6J\')}8(k.7.3c){6.C.O.3J(k.7.3c)}8(k.7.2v==B){8(k.7.J>0){8(!k.7.1c||k.7.1c==\'3m\'){u x=2u 6.J(k,{1W:k.7.J},\'1a\');x.6H(k.7.1h.x,k.7.3v)}8(!k.7.1c||k.7.1c==\'3q\'){u y=2u 6.J(k,{1W:k.7.J},\'19\');y.6H(k.7.1h.y,k.7.3F)}}N{8(!k.7.1c||k.7.1c==\'3m\')k.S.1a=k.7.3v+\'1b\';8(!k.7.1c||k.7.1c==\'3q\')k.S.19=k.7.3F+\'1b\'}6.C.4w(k);8(k.7.1G==B){6(k).M(\'U\',k.7.3l)}}N 8(k.7.J>0){k.7.4k=P;u 30=B;8(6.K&&6.I&&k.7.1F){30=6.W.2t(6.I.O.Q(0))}6.C.O.6m({1a:30?30.x:k.7.R.x,19:30?30.y:k.7.R.y},k.7.J,D(){k.7.4k=B;8(k.7.1G==B){k.S.U=k.7.3l}6.C.4w(k)})}N{6.C.4w(k);8(k.7.1G==B){6(k).M(\'U\',k.7.3l)}}8(6.K&&6.K.3r>0){6.K.6Z(k)}8(6.I&&k.7.1F){6.I.6h(k)}8(k.7.1B&&(k.7.3v!=k.7.1h.x||k.7.3F!=k.7.1h.y)){k.7.1B.1J(k,k.7.9x||[0,0,k.7.3v,k.7.3F])}8(k.7.1I)k.7.1I.1J(k);H B},6p:D(x,y,12,14){8(12!=0)12=L((12+(A.7.3h*12/1v.6q(12))/2)/A.7.3h)*A.7.3h;8(14!=0)14=L((14+(A.7.3w*14/1v.6q(14))/2)/A.7.3w)*A.7.3w;H{12:12,14:14,x:0,y:0}},6r:D(x,y,12,14){12=1v.72(1v.4u(12,A.7.1q.12),A.7.1q.w+A.7.1q.12-A.7.R.1p);14=1v.72(1v.4u(14,A.7.1q.14),A.7.1q.h+A.7.1q.14-A.7.R.1j);H{12:12,14:14,x:0,y:0}},5g:D(e){8(6.C.k==V||6.C.k.7.4k==P){H}u k=6.C.k;k.7.1L=6.W.5f(e);8(k.7.4i==B){6n=1v.7C(1v.6s(k.7.1o.x-k.7.1L.x,2)+1v.6s(k.7.1o.y-k.7.1L.y,2));8(6n0){6.K.4A(k)}H B},31:D(o){8(!6.C.O){6(\'1m\',T).2o(\'<3T 1e="6x">\');6.C.O=6(\'#6x\');u G=6.C.O.Q(0);u 2a=G.S;2a.1f=\'2z\';2a.U=\'10\';2a.6I=\'6J\';2a.6L=\'10\';2a.3P=\'2B\';8(2w.4f){G.5A="6u"}N{2a.7i=\'10\';2a.6F=\'10\';2a.6z=\'10\'}}8(!o){o={}}H A.1s(D(){8(A.4l||!6.W)H;8(2w.4f){A.7g=D(){H B};A.7c=D(){H B}}u G=A;u 1S=o.2l?6(A).7e(o.2l):6(A);8(6.1P.2S){1S.1s(D(){A.5A="6u"})}N{1S.M(\'-8c-3b-4E\',\'10\');1S.M(\'3b-4E\',\'10\');1S.M(\'-8u-3b-4E\',\'10\')}A.7={1S:1S,2v:o.2v?P:B,1G:o.1G?P:B,1F:o.1F?o.1F:B,2x:o.2x?o.2x:B,3M:o.3M?o.3M:B,1Y:o.1Y?L(o.1Y)||0:B,18:o.18?1A(o.18):B,J:L(o.J)||V,2M:o.2M?o.2M:B,27:{},1o:{},1X:o.1X&&o.1X.1D==29?o.1X:B,1I:o.1I&&o.1I.1D==29?o.1I:B,1B:o.1B&&o.1B.1D==29?o.1B:B,1c:/3q|3m/.3j(o.1c)?o.1c:B,2G:o.2G?L(o.2G)||0:0,1k:o.1k?o.1k:B,5o:o.5o?P:B,3c:o.3c||B};8(o.27&&o.27.1D==29)A.7.27.3b=o.27;8(o.1Q&&o.1Q.1D==29)A.7.1Q=o.1Q;8(o.15&&((o.15.1D==6G&&(o.15==\'4z\'||o.15==\'T\'))||(o.15.1D==4K&&o.15.1i==4))){A.7.15=o.15}8(o.4M){A.7.4M=o.4M}8(o.2i){8(3Q o.2i==\'7I\'){A.7.3h=L(o.2i)||1;A.7.3w=L(o.2i)||1}N 8(o.2i.1i==2){A.7.3h=L(o.2i[0])||1;A.7.3w=L(o.2i[1])||1}}8(o.3i&&o.3i.1D==29){A.7.3i=o.3i}A.4l=P;1S.1s(D(){A.4H=G});1S.4Y(\'73\',6.C.51)})}};6.4F.1K({4I:6.C.32,4P:6.C.31});6.K={6U:D(2d,22,3p,3o){H 2d<=6.C.k.7.2c&&(2d+3p)>=(6.C.k.7.2c+6.C.k.7.R.w)&&22<=6.C.k.7.1R&&(22+3o)>=(6.C.k.7.1R+6.C.k.7.R.h)?P:B},5u:D(2d,22,3p,3o){H!(2d>(6.C.k.7.2c+6.C.k.7.R.w)||(2d+3p)<6.C.k.7.2c||22>(6.C.k.7.1R+6.C.k.7.R.h)||(22+3o)<6.C.k.7.1R)?P:B},1o:D(2d,22,3p,3o){H 2d<6.C.k.7.1L.x&&(2d+3p)>6.C.k.7.1L.x&&22<6.C.k.7.1L.y&&(22+3o)>6.C.k.7.1L.y?P:B},2g:B,1C:{},3r:0,1w:{},71:D(q){8(6.C.k==V){H}u i;6.K.1C={};u 4X=B;1d(i 1z 6.K.1w){8(6.K.1w[i]!=V){u F=6.K.1w[i].Q(0);8(6(6.C.k).4R(\'.\'+F.E.a)){8(F.E.m==B){F.E.p=6.1K(6.W.2t(F),6.W.4D(F));F.E.m=P}8(F.E.2N){6.K.1w[i].3D(F.E.2N)}6.K.1C[i]=6.K.1w[i];8(6.I&&F.E.s&&6.C.k.7.1F){F.E.G=6(\'.\'+F.E.a,F);q.S.U=\'10\';6.I.4S(F);F.E.4p=6.I.3U(6.1n(F,\'1e\')).3H;q.S.U=q.7.3l;4X=P}8(F.E.4t){F.E.4t.1J(6.K.1w[i].Q(0),[6.C.k])}}}}8(4X){6.I.70()}},79:D(){6.K.1C={};1d(i 1z 6.K.1w){8(6.K.1w[i]!=V){u F=6.K.1w[i].Q(0);8(6(6.C.k).4R(\'.\'+F.E.a)){F.E.p=6.1K(6.W.2t(F),6.W.4D(F));8(F.E.2N){6.K.1w[i].3D(F.E.2N)}6.K.1C[i]=6.K.1w[i];8(6.I&&F.E.s&&6.C.k.7.1F){F.E.G=6(\'.\'+F.E.a,F);q.S.U=\'10\';6.I.4S(F);q.S.U=q.7.3l}}}}},4A:D(e){8(6.C.k==V){H}6.K.2g=B;u i;u 5r=B;u 76=0;1d(i 1z 6.K.1C){u F=6.K.1C[i].Q(0);8(6.K.2g==B&&6.K[F.E.t](F.E.p.x,F.E.p.y,F.E.p.1p,F.E.p.1j)){8(F.E.2O&&F.E.h==B){6.K.1C[i].3D(F.E.2O)}8(F.E.h==B&&F.E.3a){5r=P}F.E.h=P;6.K.2g=F;8(6.I&&F.E.s&&6.C.k.7.1F){6.I.O.Q(0).4x=F.E.6W;6.I.4A(F)}76++}N 8(F.E.h==P){8(F.E.2R){F.E.2R.1J(F,[e,6.C.O.Q(0).3O,F.E.J])}8(F.E.2O){6.K.1C[i].3J(F.E.2O)}F.E.h=B}}8(6.I&&!6.K.2g&&6.C.k.1F){6.I.O.Q(0).S.U=\'10\'}8(5r){6.K.2g.E.3a.1J(6.K.2g,[e,6.C.O.Q(0).3O])}},6Z:D(e){u i;1d(i 1z 6.K.1C){u F=6.K.1C[i].Q(0);8(F.E.2N){6.K.1C[i].3J(F.E.2N)}8(F.E.2O){6.K.1C[i].3J(F.E.2O)}8(F.E.s){6.I.3d[6.I.3d.1i]=i}8(F.E.4g&&F.E.h==P){F.E.h=B;F.E.4g.1J(F,[e,F.E.J])}F.E.m=B;F.E.h=B}6.K.1C={}},32:D(){H A.1s(D(){8(A.4m){8(A.E.s){1e=6.1n(A,\'1e\');6.I.2f[1e]=V;6(\'.\'+A.E.a,A).4I()}6.K.1w[\'d\'+A.5n]=V;A.4m=B;A.f=V}})},31:D(o){H A.1s(D(){8(A.4m==P||!o.1N||!6.W||!6.C){H}A.E={a:o.1N,2N:o.4B||B,2O:o.4h||B,6W:o.2r||B,4g:o.80||o.4g||B,3a:o.3a||o.77||B,2R:o.2R||o.6P||B,4t:o.4t||B,t:o.2C&&(o.2C==\'6U\'||o.2C==\'5u\')?o.2C:\'1o\',J:o.J?o.J:B,m:B,h:B};8(o.5D==P&&6.I){1e=6.1n(A,\'1e\');6.I.2f[1e]=A.E.a;A.E.s=P;8(o.1B){A.E.1B=o.1B;A.E.4p=6.I.3U(1e).3H}}A.4m=P;A.5n=L(1v.6Y()*5a);6.K.1w[\'d\'+A.5n]=6(A);6.K.3r++})}};6.4F.1K({6O:6.K.32,6R:6.K.31});6.7Z=6.K.79;',62,627,'||||||jQuery|dragCfg|if||||||||||||dragged||||||elm||||var||||||this|false|iDrag|function|dropCfg|iEL|el|return|iSort|fx|iDrop|parseInt|css|else|helper|true|get|oC|style|document|display|null|iUtil|es|elem|255|none|props|dx||dy|containment|options|tp|opacity|top|left|px|axis|for|id|position|oldStyle|oR|length|hb|cursorAt|result|body|attr|pointer|wb|cont|easing|each|0px|margins|Math|zones|cs|wrs|in|parseFloat|onChange|highlighted|constructor|dhs|so|ghosting|vp|onStop|apply|extend|currentPointer|shs|accept|documentElement|browser|onDrag|ny|dhe|nodeEl|step|color|duration|onStart|zIndex|block|parentNode|visibility|zoney|clonedEl|marginBottom|marginTop|clientScroll|onDragModifier|marginRight|Function|els|marginLeft|nx|zonex|newStyles|collected|overzone|sortCfg|grid|cur|animationHandler|handle|old|getSize|append|nmp|styles|helperclass|prop|getPosition|new|revert|window|si|128|absolute|curCSS|hidden|tolerance|parseColor|scrollTop|pos|snapDistance|wr|height|width|newCoords|orig|hpc|ac|hc|replace|toInteger|onOut|msie|scrollLeft|rgb|0x|139|F0|fA|oP|dh|build|destroy|oldVisibility|restoreStyle|currentStyle|de|cssRules|oldDisplay|np|onHover|user|frameClass|changed|ih|speed|inFrontOf|gx|onSlide|test|iw|oD|horizontally|rule|zoneh|zonew|vertically|count|border|parentBorders|namedColors|nRx|gy|ser|relative|contBorders|hide|case|fnc|addClass|ts|nRy|cssSides|hash|clientWidth|removeClass|clientHeight|event|insideParent|timer|firstChild|overflow|typeof|pr|queue|div|serialize|borderColor|opera|complete|sideEnd|192|dragstop|startTime||getValues|right|opt|callback||styleSheets|margin|getBorder|bottom|show|padding|exec|ActiveXObject|onDrop|hoverclass|init|dEs|prot|isDraggable|isDroppable|diffX|while|os|png|self|diffY|onActivate|max|src|hidehelper|className|nodeName|parent|checkhover|activeclass|211|getSizeLite|select|fn|oldPosition|dragElem|DraggableDestroy|stopAnim|Array|floats|fractions|pause|innerHeight|Draggable|cssSidesEnd|is|measure|traverseDOM|toLowerCase|parseStyle|getMargins|oneIsSortable|bind|break||draginit|func|windowSize|borderWidth||Color|sliderSize|169|offsetHeight|10000|iSlider|offsetTop|oldFloat|offsetLeft|getPointer|dragmove|filter|100|unbind|empty|clnt|offsetWidth|idsa|autoSize|object|parentPos|applyOnHover|sliderPos|innerWidth|intersect|fontWeight|pValue|sizes|borderTopWidth|scrollHeight|unselectable|scrollWidth|floatVal|sortable|initialPosition|borderLeftWidth|oldBorder|offsetParent|tagName|fxe|styleFloat|insertBefore|245|wid|img|borderRightWidth|borderBottomWidth|107|notColor|224|165|144|230|240|140|paddingBottom|paddingLeft|toggle|cssProps|emptyGIF|colorCssProps|getScroll|images|linear|values|paddingTop|paddingRight|fxCheckTag|indexOf|firstNum|delta|Width|trim|check|3000|zindex|SortableAddItem|addItem|animate|distance|isSortable|snapToGrid|abs|fitToContainer|pow|size|on|nbsp|dragstart|dragHelper|alpha|KhtmlUserSelect|getClient|cloneNode|getContainment|auto|mousemove|userSelect|String|custom|cursor|move|mouseup|listStyle|after|sortHelper|DroppableDestroy|onout|clearInterval|Droppable|setInterval|getTime|fit|isFunction|shc|oldOverflow|random|checkdrop|start|highlight|min|mousedown|Date||hlt|onhover|split|remeasure|appendChild|204|ondragstart|darkred|find|fxWrapper|onselectstart|cssFloat|mozUserSelect|darkorchid|brown|183|darkmagenta|blue|cyan|darkblue|darkkhaki|darkgrey|darkcyan|189|black|darkolivegreen|darkgreen|aqua|153|wrapper|azure|beige|sqrt|220|darkorange|Object|float|prototype|number|AlphaImageLoader|Microsoft|DXImageTransform|tr|td|tfoot|col|thead|caption|tbody|progid|fixPNG|pageX|clientX|getPadding|getPositionLite|recallDroppables|ondrop|pageY|centerEl|purgeEvents|nextSibling||clientY|colgroup|th|input|hr|br|moz|createElement|textarea|iframe|ul|dl|table|form|button|w_|darksalmon|frameset|option|frame|script|header|optgroup|meta|khtml|buildWrapper|removeChild|destroyWrapper|ol|darkviolet|SortableDestroy|outlineColor|borderTopColor|borderRightColor|borderLeftColor|Top|Right|stop|stopAll|Sortable|Left|Bottom|borderBottomColor|233|minWidth|outlineOffset|minHeight|maxWidth|maxHeight|outlineWidth|fromHandler|textIndent|SortSerialize|off|MozUserSelect|cos|PI|inset|outset|ridge|groove|double|string|dequeue|selectorText|RegExp|rules|borderStyle|100000000|solid|dashed|fadeIn|match|before|childNodes|onchange|switch|html|dotted|transparent|isNaN|toUpperCase|lineHeight|backgroundColor|lightgreen|238|letterSpacing|216|173|lastSi|lightgrey|lightyellow|193|182|lightpink|lightblue|khaki|148|cssText|122|150|fuchsia|gold|130|indigo|green|215|lime|lightcyan|selectKeyHelper|red|purple|modifyContainer|silver|magenta|white|yellow|203|fontSize|navy|maroon|orange|olive|dragmoveBy|pink'.split('|'),0,{})) Index: lams_central/web/main.jsp =================================================================== diff -u -rb1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e -r97336c15381a6a96013b087b0844f173d1ddedd7 --- lams_central/web/main.jsp (.../main.jsp) (revision b1a3f31300216ef2e6a6ecfd7ed348920ab9dd0e) +++ lams_central/web/main.jsp (.../main.jsp) (revision 97336c15381a6a96013b087b0844f173d1ddedd7) @@ -29,16 +29,41 @@ +