');
+ var parentId = null;
+ if (isNested) {
+ // second tier, a part of optional sequence or
+ // branching
+ parentId = $('td', parent).attr('id');
+ // find last activity from sequence and put
+ // current one after it to keep ordering
+ row.insertAfter($('td[id^=' + parentId + ']',
+ container).last().parent());
+ isCurrent |= childActivity.status == 0;
+ } else {
+ parentId = container.attr('id');
+ row.appendTo(parent);
+ }
+
+ var cellId = parentId + 'child'
+ + childActivityIndex;
+ var cell = $('
').attr('id', cellId).appendTo(
+ row);
+ if (isNested) {
+ cell.hide();
+ }
+
+ // each row has its own paper
+ var paper = childActivity.bar.paper = Raphael(
+ cellId, 145, 23);
+ // draw the inner activity
+ childActivity.shape = paper
+ .path(childActivity.path);
+ childActivity.shape.attr(ActivityUtils
+ .getShapeAttributes(childActivity));
+ ActivityUtils.addDecoration(childActivity, null,
+ true);
+
+ var label = paper.text(35, childActivity.y + 11,
+ // add dash before name
+ (isNested ? '- ' : '') + childActivity.name)
+ // align to left
+ .attr('text-anchor', 'start');
+ // fix a bug in FF layout
+ $('tspan', label.node).attr('dy', 0);
+
+ var click = null;
+ if (!isNested) {
+ // only first tier inner activities
+ if (childActivityIndex == 0) {
+ click = function() {
+ // first row is the parent activity
+ // itself; hide content box when clicked
+ container.slideUp();
+ }
+ } else if (childActivity.childActivities) {
+ // show/hide 2nd tier inner activities
+ childActivity.toggleChildren = function(
+ forceCommand) {
+ if (cell.is(':visible')) {
+ var childCells = $('td[id^='
+ + cellId + 'child]', parent);
+ var isOpen = childCells
+ .is(':visible');
+ if (!forceCommand
+ || (isOpen ? forceCommand == 'close'
+ : forceCommand == 'open')) {
+ var containerHeightDelta = 27 * childCells.length;
+ childCells.toggle();
+ // resize inner content box
+ container.height(container.height()
+ + (isOpen ? -containerHeightDelta
+ : containerHeightDelta));
+ }
+ }
+ }
+
+ click = function() {
+ // show 2nd tier when 1st tier activity
+ // is clicked
+ childActivity.toggleChildren();
+ }
+ }
+ }
+ var dblclick = function() {
+ if (childActivity.url) {
+ if (childActivity.status == 1) {
+ openActivity(childActivity.url);
+ } else {
+ loadFrame(childActivity.url);
+ }
+ }
+ }
+ handleClicks(cell, click, dblclick);
+
+ if (childActivity.childActivities) {
+ isCurrent |= ActivityUtils
+ .addChildActivitiesRows(childActivity,
+ row, container, true);
+ if (isCurrent && childActivity.toggleChildren) {
+ childActivity.toggleChildren('open');
+ }
+ }
+ });
+
+ return isCurrent;
+ },
+
+ // replace single Branching activity with list of branch activities
+ expandBranch : function(bar, branchIndex, branchActivities) {
+ // hide any boxes obstructing the view
+ ActivityUtils.hideOtherComplexContent();
+
+ var activityShift = branchActivities.length - 1;
+ // how many pixels move subsequent activities down
+ var yShift = 60 * activityShift;
+ // activity just after branching
+ var afterBranchActivity = null;
+ // move down existing activities that come after Branching; start with
+ // the last one
+ var activities = bar.activities;
+ for ( var activityIndex = activities.length - 1; activityIndex > branchIndex; activityIndex--) {
+ afterBranchActivity = activities[activityIndex];
+ activities[activityIndex + activityShift] = afterBranchActivity;
+ afterBranchActivity.y += yShift;
+ afterBranchActivity.path = Raphael.transformPath(
+ afterBranchActivity.path, 'T0,' + yShift);
+ afterBranchActivity.elements.forEach(function(elem) {
+ var y = elem.attr('y');
+ var targetProperties = null;
+ // text, rectangles etc. have 'y', paths have 'path'
+ if (y) {
+ targetProperties = {
+ 'y' : elem.attr('y') + yShift
+ };
+ } else {
+ var path = elem.attr('path');
+ targetProperties = {
+ 'path' : Raphael.transformPath(path, 'T0,' + yShift)
+ };
+ }
+ elem.animate(targetProperties, 2000, "linear");
+ });
+ }
+
+ // smoothly remove Branching activity
+ activities[branchIndex].elements.forEach(function(elem) {
+ elem.animate({
+ 'opacity' : 0
+ }, 2000, "linear", function() {
+ elem.remove();
+ });
+ });
+
+ // create branch activities structures
+ for ( var activityIndex = 0; activityIndex < branchActivities.length; activityIndex++) {
+ var activityData = branchActivities[activityIndex];
+ var activity = new Activity(bar, activityIndex + branchIndex,
+ activityData.id, activityData.type, activityData.name,
+ activityData.status, activityData.url,
+ activityData.childActivities);
+ activities[activityIndex + branchIndex] = activity;
+ if (activity.status == 0) {
+ currentActivityIndex = activityIndex;
+ }
+ }
+
+ // smoothly draw branch activities
+ setTimeout(
+ function() {
+ for ( var activityIndex = 0; activityIndex < branchActivities.length; activityIndex++) {
+ ActivityUtils
+ .drawActivity(
+ activities[activityIndex + branchIndex],
+ false,
+ !afterBranchActivity
+ && activityIndex == branchActivities.length - 1);
+ }
+ }, 2000);
+ }
+}
+
+// main activities
+function Activity(bar, index, id, type, name, status, url, childActivitiesData) {
+ this.bar = bar;
+ this.index = index;
+ this.id = id;
+ this.type = type;
+ this.name = name;
+ this.status = status;
+ this.url = url;
+
+ // Optional Activities, Optional Sequences or Branching in preview mode
+ this.isComplex = type == 'o' || (isPreview && type == 'b');
+
+ if (isHorizontalBar) {
+ this.middle = 48 + 60 * index;
+ this.y = 10;
+ } else {
+ // X positioning
+ this.middle = 70;
+ // 20 is the first line segment and following activities take 60 px each
+ // (together with following vertical line)
+ this.y = 20 + 60 * index;
+ }
+
+ // first draw the inner shape, then put back the realY for background gray
+ // square
+ var finalY = this.y;
+ if (!isHorizontalBar && this.isComplex) {
+ this.y += 5;
+ }
+
+ if (type == 'g') {
+ // gate activity
+ if (isHorizontalBar) {
+ this.y -= 5;
+ }
+ ActivityUtils.shapeGateActivity(this);
+ } else {
+ ActivityUtils.shapeByStatus(this);
+ }
+
+ // special behaviour for complex activities
+ if (this.isComplex) {
+ this.y = finalY - (isHorizontalBar ? 5 : 0);
+ ActivityUtils.shapeComplexActivityContainer(this);
+
+ this.childActivities = [ new OptionalActivity(bar, name, status, url) ];
+ var childActivities = this.childActivities;
+ $.each(childActivitiesData, function(childActivityIndex,
+ childActivityData) {
+ childActivities[childActivityIndex + 1] = new OptionalActivity(bar,
+ childActivityData.name, childActivityData.status,
+ childActivityData.url, childActivityData.childActivities,
+ false);
+ });
+ }
+}
+
+// Support (floating) activities are show in separate box and behave differently
+function SupportActivity(bar, index, name, status, url) {
+ this.bar = bar;
+ this.name = name;
+ this.status = status;
+ this.url = url;
+
+ this.middle = 24;
+ this.y = 17 + 33 * index;
+
+ if (status <= 2) {
+ ActivityUtils.shapeAttemptedActivity(this);
+ } else if (status == 3) {
+ ActivityUtils.shapeToStartActivity(this);
+ }
+ this.statusTooltip = SUPPORT_ACTIVITY_LABEL;
+
+ this.transformToAttempted = function() {
+ var oldDecoration = this.decoration;
+ ActivityUtils.shapeAttemptedActivity(this);
+ this.statusTooltip = SUPPORT_ACTIVITY_LABEL;
+
+ ActivityUtils.animate(this, oldDecoration);
+ }
+}
+
+// Optional and Branching inner activities
+function OptionalActivity(bar, name, status, url, childActivitiesData, isNested) {
+ this.bar = bar;
+ this.name = name;
+ this.status = status;
+ this.url = url;
+
+ this.middle = isNested ? 22 : 15;
+ this.y = 5;
+
+ ActivityUtils.shapeByStatus(this);
+
+ // if Sequence or Branching, this is the 2nd tier of inner activities
+ if (childActivitiesData) {
+ this.childActivities = [];
+ var childActivities = this.childActivities;
+ $.each(childActivitiesData, function(childActivityIndex,
+ childActivityData) {
+ childActivities[childActivityIndex] = new OptionalActivity(bar,
+ childActivityData.name, childActivityData.status,
+ childActivityData.url, null, true);
+ });
+ }
+}
+
+// refresh progress bar on first/next activity load
+function fillProgressBar(barId) {
+ var bar = bars[barId];
+ if (!bar) {
+ // bar must be initialised first!
+ return false;
+ }
+
+ $.ajax({
+ url : LAMS_URL + 'monitoring/monitoring.do',
+ data : {
+ 'method' : 'getLearnerProgressJSON',
+ 'lessonID' : lessonId,
+ 'userID' : bar.userId
+ },
+ cache : false,
+ dataType : 'json',
+ success : function(result) {
+ // if nothing changed, don't do any calculations
+ if (!bar.currentActivityId
+ || result.currentActivityId != bar.currentActivityId) {
+ bar.currentActivityId = result.currentActivityId;
+ isPreview = result.isPreview;
+
+ var paper = bar.paper;
+ if (!paper) {
+ // create paper only the first time
+ paper = bar.paper = Raphael(bar.containerId,
+ isHorizontalBar ? 40 + 60 * result.activities.length : 140,
+ isHorizontalBar ? 60 : 60 * result.activities.length);
+ // first line on the top
+ paper.path(isHorizontalBar ? 'M 0 18 h 35'
+ : 'M 70 0 v 20');
+ }
+
+ // we need this to scroll to the current activity
+ var currentActivityIndex = 0;
+
+ for (var activityIndex = 0; activityIndex < result.activities.length; activityIndex++) {
+ var activityData = result.activities[activityIndex];
+ // prepare the Activity descriptor, but do not draw
+ // yet
+ var activity = new Activity(bar, activityIndex,
+ activityData.id, activityData.type,
+ activityData.name, activityData.status,
+ activityData.url,
+ activityData.childActivities);
+ if (activity.status == 0) {
+ currentActivityIndex = activityIndex;
+ }
+
+ var activities = bar.activities;
+ if (!activities) {
+ activities = bar.activities = [];
+ }
+
+ var existingActivity = activities[activityIndex];
+ if (existingActivity) {
+ // if in preview mode, always display all inner
+ // activities, i.e. never expand
+ if (!isPreview && existingActivity.type == 'b'
+ && existingActivity.id != activity.id) {
+
+ var branchActivityId = activityIndex;
+ var afterBranchActivityId = activityIndex + 1 < activities.length ? activities[activityIndex + 1].id
+ : null;
+ var branchActivities = [ activity ];
+ activityIndex++;
+
+ // find which activities are new (branch)
+ // and which ones already existed
+ while (activityIndex < result.activities.length) {
+ activityData = result.activities[activityIndex];
+ var activity = new Activity(bar,
+ activityIndex, activityData.id,
+ activityData.type,
+ activityData.name,
+ activityData.status,
+ activityData.url,
+ activityData.childActivities);
+ if (activity.id == afterBranchActivityId) {
+ // prepare for the next big loop
+ // iteration, which executes
+ // normally
+ activityIndex--;
+ break;
+ } else {
+ branchActivities.push(activity);
+ activityIndex++;
+ }
+ }
+
+ // resize main paper to accomodate new
+ // activities
+ paper.setSize(140, 60 * (activities.length
+ + branchActivities.length - 1));
+ ActivityUtils.expandBranch(bar,
+ branchActivityId, branchActivities);
+ } else {
+ // refresh existing bar, transform
+ // activities if needed
+ ActivityUtils.transform(existingActivity,
+ activity);
+ }
+ } else {
+ // draw new activity
+ ActivityUtils
+ .drawActivity(
+ activity,
+ true,
+ activityIndex == result.activities.length - 1);
+ }
+ }
+
+ // draw support activities if they exist
+ if (result.support
+ && !supportSeparatorRow.is(':visible')) {
+ supportSeparatorRow.show();
+ supportPart.height(17 + 33 * result.support.length)
+ .show();
+
+ // separate paper for Suppor Activities frame
+ var supportPaper = Raphael('supportPart');
+
+ $.each(result.support, function(activityIndex,
+ activityData) {
+ var activity = new SupportActivity(
+ supportPaper, activityIndex,
+ activityData.name, activityData.status,
+ activityData.url);
+ activity.shape = supportPaper
+ .path(activity.path);
+ activity.shape.attr(ActivityUtils
+ .getShapeAttributes(activity));
+ ActivityUtils.addDecoration(activity, null,
+ true);
+ ActivityUtils.addEffects(activity);
+ supportPaper.text(90, 24 + 33 * activityIndex,
+ activity.name);
+ });
+ }
+
+ resizeElements();
+ // scroll to the current activity
+ if (!isHorizontalBar) {
+ $('#' + bar.containerId).scrollTop(
+ Math.max((currentActivityIndex - 1) * 60,0)
+ );
+ }
+ }
+ }
+ });
+
+ return true;
+}
\ No newline at end of file
Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java,v
diff -u -r1.50 -r1.51
--- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java 5 Dec 2012 14:01:17 -0000 1.50
+++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java 17 May 2013 09:36:08 -0000 1.51
@@ -26,7 +26,6 @@
import java.io.IOException;
import java.io.PrintWriter;
-import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@@ -36,11 +35,8 @@
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
-import org.apache.tomcat.util.json.JSONException;
-import org.apache.tomcat.util.json.JSONObject;
import org.lamsfoundation.lams.learning.service.ICoreLearnerService;
import org.lamsfoundation.lams.learning.service.LearnerServiceProxy;
-import org.lamsfoundation.lams.learning.web.bean.ActivityURL;
import org.lamsfoundation.lams.learning.web.util.ActivityMapping;
import org.lamsfoundation.lams.learning.web.util.LearningWebUtil;
import org.lamsfoundation.lams.learningdesign.Activity;
@@ -78,7 +74,7 @@
* @since 3/03/2005
* @version 1.1
*
- * ----------------XDoclet Tags--------------------
+ * ----------------XDoclet Tags--------------------
*
* @struts:action path="/learner" parameter="method" validate="false"
* @struts:action-forward name="displayActivity" path="/DisplayActivity.do"
@@ -134,15 +130,15 @@
*
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
*
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
*
@@ -195,15 +191,15 @@
*
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
*
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
*
@@ -263,15 +259,15 @@
* component.
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
*
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
*
@@ -365,15 +361,15 @@
*
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
*
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
@@ -385,8 +381,6 @@
LearnerAction.log.debug("Getting Flash progress data...");
}
-
-
FlashMessage message = null;
try {
@@ -402,20 +396,20 @@
message = new FlashMessage("getFlashProgressData", learnerProgress);
} catch (Exception e) {
- message = handleException(e, "getFlashProgressData", LearnerServiceProxy.getLearnerService(getServlet()
- .getServletContext()));
+ message = handleException(e, "getFlashProgressData",
+ LearnerServiceProxy.getLearnerService(getServlet().getServletContext()));
}
String wddxPacket = WDDXProcessor.serialize(message);
if (LearnerAction.log.isDebugEnabled()) {
LearnerAction.log.debug("Sending learner progress data to flash:" + wddxPacket);
}
- // LDEV-2835
+ // LDEV-2835
response.addHeader("Pragma", "no-cache");
- response.addHeader("Cache-Control", "no-cache");
- response.addDateHeader("Expires", System.currentTimeMillis() - LamsDispatchAction.HEADER_EXPIRES_VALUE);
+ response.addHeader("Cache-Control", "no-cache");
+ response.addDateHeader("Expires", System.currentTimeMillis() - LamsDispatchAction.HEADER_EXPIRES_VALUE);
- response.getWriter().print(wddxPacket);
+ response.getWriter().print(wddxPacket);
// don't need to return a action forward because it sent the wddx packet
// back already.
@@ -429,15 +423,15 @@
*
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
*
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
@@ -461,8 +455,8 @@
message = new FlashMessage("getLearnerActivityURL", activityDTO);
} catch (Exception e) {
- message = handleException(e, "getLearnerActivityURL", LearnerServiceProxy.getLearnerService(getServlet()
- .getServletContext()));
+ message = handleException(e, "getLearnerActivityURL",
+ LearnerServiceProxy.getLearnerService(getServlet().getServletContext()));
}
String wddxPacket = WDDXProcessor.serialize(message);
@@ -500,14 +494,14 @@
* Flash packet.
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
@@ -526,79 +520,19 @@
return mapping.findForward("displayProgress");
}
-
- @SuppressWarnings("unchecked")
- public ActionForward displayProgressJSON(ActionMapping mapping, ActionForm form, HttpServletRequest request,
- HttpServletResponse response) throws JSONException, IOException {
- Integer learnerId = LearningWebUtil.getUserId();
- Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID);
- ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext());
- Object[] ret = learnerService.getStructuredActivityURLs(learnerId, lessonId);
-
- JSONObject responseJSON = new JSONObject();
- responseJSON.put("currentActivityId", ret[1]);
- responseJSON.put("isPreview", ret[2]);
- for (ActivityURL activity : (List) ret[0]) {
- if (activity.getFloating()) {
- // these are support activities
- for (ActivityURL childActivity : activity.getChildActivities()) {
- responseJSON.append("support", activityToJSON(childActivity, null));
- }
- } else {
- responseJSON.append("activities", activityToJSON(activity, (Long) ret[1]));
- }
- }
-
- response.setContentType("application/json;charset=utf-8");
- response.getWriter().print(responseJSON.toString());
-
- return null;
- }
-
- private JSONObject activityToJSON(ActivityURL activity, Long currentActivityId) throws JSONException {
- JSONObject activityJSON = new JSONObject();
- activityJSON.put("id", activity.getActivityId());
- activityJSON.put("name", activity.getTitle());
- activityJSON.put("status", activity.getActivityId().equals(currentActivityId) ? 0 : activity.getStatus());
-
- if (activity.getUrl() != null) {
- activityJSON.put("url", activity.getUrl());
- }
-
- String actType = activity.getType().toLowerCase();
- String type = "a";
- if (actType.contains("gate")) {
- type = "g";
- } else if (actType.contains("options")) {
- type = "o";
- } else if (actType.contains("branching")) {
- type = "b";
- }
-
- activityJSON.put("type", type);
-
- if (activity.getChildActivities() != null) {
- for (ActivityURL childActivity : activity.getChildActivities()) {
- activityJSON.append("childActivities", activityToJSON(childActivity, currentActivityId));
- }
- }
-
- return activityJSON;
- }
-
/**
* Forces a move to a destination Activity in the learning sequence, returning a WDDX packet
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
@@ -638,14 +572,14 @@
* returning a WDDX packet.
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
@@ -744,14 +678,14 @@
* Flash packet.
*
* @param mapping
- * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to
- * send the end-user.
+ * An ActionMapping class that will be used by the Action class to tell the ActionServlet where to send
+ * the end-user.
* @param form
- * The ActionForm class that will contain any data submitted by the end-user via a form.
+ * The ActionForm class that will contain any data submitted by the end-user via a form.
* @param request
- * A standard Servlet HttpServletRequest class.
+ * A standard Servlet HttpServletRequest class.
* @param response
- * A standard Servlet HttpServletResponse class.
+ * A standard Servlet HttpServletResponse class.
* @return An ActionForward class that will be returned to the ActionServlet indicating where the user is to go
* next.
* @throws IOException
Index: lams_learning/web/main.jsp
===================================================================
RCS file: /usr/local/cvsroot/lams_learning/web/main.jsp,v
diff -u -r1.23 -r1.24
--- lams_learning/web/main.jsp 9 May 2013 07:53:55 -0000 1.23
+++ lams_learning/web/main.jsp 17 May 2013 09:36:08 -0000 1.24
@@ -30,6 +30,7 @@
+
@@ -40,31 +41,39 @@
+
+
+
@@ -254,7 +264,7 @@
@@ -288,7 +298,15 @@