@SuppressWarnings("unchecked")
 public ActionForward execute(
     ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response) {
   request.setAttribute("jsprun_action", "21");
   int annid = Common.toDigit(request.getParameter("id"));
   int total = 0;
   int page = Common.intval(request.getParameter("page"));
   HttpSession session = request.getSession();
   int timestamp = (Integer) (request.getAttribute("timestamp"));
   String groupid = session.getAttribute("jsprun_groupid").toString();
   Members member = (Members) session.getAttribute("user");
   Map<String, String> settings = ForumInit.settings;
   int ppp =
       member != null && member.getPpp() > 0
           ? member.getPpp()
           : Integer.valueOf(settings.get("postperpage"));
   List<Map<String, String>> announces =
       dataBaseService.executeQuery(
           "SELECT id, groups FROM jrun_announcements WHERE type!=2 AND starttime<='"
               + timestamp
               + "' AND (endtime='0' OR endtime>'"
               + timestamp
               + "') ORDER BY displayorder, starttime DESC, id DESC");
   if (announces != null && announces.size() > 0) {
     for (Map<String, String> announce : announces) {
       String groups = announce.get("groups");
       if (groups.length() == 0 || Common.in_array(groups.split(","), groupid)) {
         total++;
         if (annid > 0 && Integer.valueOf(announce.get("id")) == annid) {
           page = (int) Math.ceil((double) total / (double) ppp);
         }
       }
     }
   }
   page = Math.max(1, page);
   Map<String, Integer> multiInfo = Common.getMultiInfo(total, ppp, page);
   page = multiInfo.get("curpage");
   int start_limit = multiInfo.get("start_limit");
   Map<String, Object> multi =
       Common.multi(total, ppp, page, "announcement.jsp", 0, 10, true, false, null);
   request.setAttribute("multi", multi);
   List<Map<String, String>> announcements =
       dataBaseService.executeQuery(
           "SELECT * FROM jrun_announcements WHERE type!=2 AND starttime<='"
               + timestamp
               + "' AND (endtime='0' OR endtime>'"
               + timestamp
               + "') ORDER BY displayorder, starttime DESC, id DESC LIMIT "
               + start_limit
               + ", "
               + ppp);
   if (announcements != null && announcements.size() > 0) {
     String timeoffset = (String) session.getAttribute("timeoffset");
     String dateformat = (String) session.getAttribute("dateformat");
     SimpleDateFormat sdf_all = Common.getSimpleDateFormat(dateformat, timeoffset);
     List<Map<String, String>> announcementList = new ArrayList<Map<String, String>>();
     for (Map<String, String> announcement : announcements) {
       String groups = announcement.get("groups");
       if (groups.length() == 0 || Common.in_array(groups.split(","), groupid)) {
         announcement.put("authorenc", Common.encode(announcement.get("author")));
         int endtime = Integer.parseInt(announcement.get("endtime"));
         announcement.put(
             "starttime", Common.gmdate(sdf_all, Integer.parseInt(announcement.get("starttime"))));
         announcement.put(
             "endtime",
             endtime > 0 ? Common.gmdate(sdf_all, endtime) : getMessage(request, "unlimite"));
         String message = announcement.get("message");
         if ("1".equals(announcement.get("type"))) {
           message = "<a href=\"" + message + "\" target=\"_blank\">" + message + "</a>";
         }
         announcement.put("message", Common.nl2br(message));
         announcementList.add(announcement);
       }
     }
     request.setAttribute("announcements", announcementList);
     request.setAttribute("annid", annid);
     return mapping.findForward("toAnnouncement");
   } else {
     request.setAttribute("errorInfo", getMessage(request, "announcement_nonexistence"));
     return mapping.findForward("showMessage");
   }
 }