/**
   * 處理學生退選線上選課紀錄之方法
   *
   * @param mapping org.apache.struts.action.ActionMapping object
   * @param form org.apache.struts.action.ActionForm object
   * @param request javax.servlet.http.HttpServletRequest object
   * @param response javax.servlet.http.HttpServletResponse object
   * @return org.apache.struts.action.ActionForward object
   * @exception java.lang.Exception
   */
  public ActionForward deleteCourse(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {

    DynaActionForm aForm = (DynaActionForm) form;
    ActionMessages messages = validateInputForUpdate(aForm, Toolket.getBundle(request));
    if (!messages.isEmpty()) {
      saveErrors(request, messages);
      return mapping.findForward(IConstants.ACTION_MAIN_NAME);
    } else {

      List<SeldDataInfo> aList = getSeldDataListByIndex(request);
      if (!aList.isEmpty()) {

        CourseManager cm = (CourseManager) getBean(COURSE_MANAGER_BEAN_NAME);
        // 取得選課欲退選之Oid列表
        StringBuffer seldBuf = new StringBuffer();
        for (SeldDataInfo info : aList) {
          seldBuf.append(info.getSeldOid()).append(",");
        }
        String inSyntax = StringUtils.substringBeforeLast(seldBuf.toString(), ",");
        log.info("Seld Oid SQL IN Syntax : " + inSyntax);
        String studentNo = aForm.getString("stdNo").toUpperCase();
        MemberManager mm = (MemberManager) getBean(MEMBER_MANAGER_BEAN_NAME);
        String classNo = mm.findStudentByNo(studentNo).getDepartClass();
        // 只有第一階段不會檢查選課人數下限
        cm.txRemoveSelectedSeld(studentNo, classNo, 1, inSyntax, false);
        String idno = getUserCredential(request.getSession(false)).getMember().getIdno();
        for (SeldDataInfo info : aList) {
          cm.txSaveAdcdHistory(info.getDtimeOid(), studentNo.toUpperCase(), idno, "D");
        }
        messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("Message.DeleteSuccessful"));
        saveMessages(request, messages);
        // aForm.initialize(mapping);
        Toolket.resetCheckboxCookie(response, SELD_LIST_NAME);
        setContentPage(request.getSession(false), "course/OnlineAddRemoveCourse.jsp");
      } else {
        messages = new ActionMessages();
        messages.add(
            ActionMessages.GLOBAL_MESSAGE,
            new ActionMessage("Course.onlineAddRemoveCourse.unselected"));
        saveErrors(request, messages);
        return mapping.findForward(IConstants.ACTION_MAIN_NAME);
      }
    }

    return list(mapping, form, request, response);
  }
  @SuppressWarnings("unchecked")
  private List<SeldDataInfo> getSeldDataListByIndex(HttpServletRequest request) {

    List<SeldDataInfo> aList = new ArrayList<SeldDataInfo>();
    HttpSession session = request.getSession(false);
    String index = Toolket.getSelectedIndexFromCookie(request, SELD_LIST_NAME);
    List<SeldDataInfo> seldDataList = (List<SeldDataInfo>) session.getAttribute(SELD_LIST_NAME);
    for (SeldDataInfo sdi : seldDataList) {
      if (Toolket.isValueInCookie(sdi.getPosition().toString(), index)) {
        aList.add(sdi);
      }
    }

    return aList;
  }
  /**
   * 處理以學號查詢學生選課清單
   *
   * @param mapping org.apache.struts.action.ActionMapping object
   * @param form org.apache.struts.action.ActionForm object
   * @param request javax.servlet.http.HttpServletRequest object
   * @param response javax.servlet.http.HttpServletResponse object
   * @return org.apache.struts.action.ActionForward object
   * @exception java.lang.Exception
   */
  @SuppressWarnings("unchecked")
  public ActionForward list(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {

    DynaActionForm aForm = (DynaActionForm) form;
    HttpSession session = request.getSession(false);
    Toolket.resetCheckboxCookie(response, SELD_LIST_NAME);
    // 確實清除變數"seldList"內所存資料,因學生可能無選課資料
    session.removeAttribute(SELD_LIST_NAME);
    ActionMessages messages = validateInputForUpdate(aForm, Toolket.getBundle(request));
    if (!messages.isEmpty()) {
      saveErrors(request, messages);
      return mapping.findForward(IConstants.ACTION_MAIN_NAME);
    } else {
      try {
        CourseManager cm = (CourseManager) getBean(COURSE_MANAGER_BEAN_NAME);
        log.info("Student NO : " + aForm.getString("stdNo"));
        List<Map> seldList =
            doForDuplicate(cm.getSeldDataByStudentNo(aForm.getString("stdNo"), "1"));
        if (!seldList.isEmpty()) {
          session.setAttribute("NO", aForm.getString("stdNo").toUpperCase());
          int hours = 0, position = 0;
          float credit = 0.0F;
          List<SeldDataInfo> result = new ArrayList<SeldDataInfo>();
          SeldDataInfo info = null;
          for (Map content : seldList) {
            info = new SeldDataInfo();
            Integer dtimeOid = (Integer) content.get("oid");
            info.setClassNo((String) content.get("classNo"));
            info.setClassName((String) content.get("className"));
            info.setCsCode((String) content.get("cscode"));
            info.setCsName((String) content.get("chi_Name"));
            info.setStuSelect(String.valueOf(cm.findSeldCountByDtimeOid(dtimeOid)));
            info.setSelectLimit(((Integer) content.get("select_Limit")).toString());
            info.setHour(Short.valueOf(((Integer) content.get("thour")).toString()));
            info.setCredit((Float) content.get("credit"));
            info.setSeldOid((Integer) content.get("soid")); // Seld Oid
            String opt = (String) content.get("opt");
            info.setOpt(opt);
            info.setOptName(Toolket.getCourseOpt(opt));
            info.setDtimeOid(dtimeOid); // Dtime Oid
            info.setPosition(Integer.valueOf(position++));
            info.setTerm((String) content.get("sterm"));
            hours += ((Integer) content.get("thour")).intValue();
            credit += ((Float) content.get("credit")).floatValue();
            result.add(info);
          }
          session.setAttribute(SELD_LIST_COUNT, Integer.valueOf(seldList.size()));
          session.setAttribute(SELD_LIST_HOURS, Integer.valueOf(hours));
          session.setAttribute(
              SELD_LIST_CREDITS, Float.valueOf(new DecimalFormat("0.0").format(credit)));
          session.setAttribute(SELD_LIST_NAME, result);
          session.setAttribute("mode", "ALL");
        } else {
          // 查無資料則回傳空白List
          session.setAttribute(SELD_LIST_NAME, Collections.EMPTY_LIST);
          session.setAttribute("mode", "NONE");
          ActionMessages msg = new ActionMessages();
          msg.add(
              ActionMessages.GLOBAL_MESSAGE, new ActionMessage("Course.messageN1", "查無任何選課資料!!"));
          saveMessages(request, msg);
        }

      } catch (Exception e) {
        ActionMessages errors = new ActionMessages();
        errors.add(
            ActionMessages.GLOBAL_MESSAGE, new ActionMessage("Exception.generic", e.getMessage()));
        saveErrors(request, errors);
        return mapping.findForward(IConstants.ACTION_MAIN_NAME);
      }
    }

    setContentPage(request.getSession(false), "course/OnlineAddRemoveCourse.jsp");
    return mapping.findForward(IConstants.ACTION_MAIN_NAME);
  }