CalendarControl.java

package com.mycim.webapp;

import com.mycim.framework.logging.Logger;
import com.mycim.framework.logging.LoggerFactory;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpUtils;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Hashtable;

@WebServlet(value = "/calendar")
public class CalendarControl extends HttpServlet {
    private static final String BGCOLOR1 = "bgcolor1";

    private static final String BGCOLOR2 = "bgcolor2";

    private static final String SIZE1 = "size1";

    private static final String BORDER = "border";

    private static final String BASE = "base";

    private static final String STYLE = "style";

    private static final String CONFIG = "config";

    private static final String ACTION = "deal";

    private static final String LEFT = "left";

    private static final String RIGHT = "right";

    private static final String DATE = "date";

    private static final String NEW = "new";

    private static final String SHOW = "show";

    private static final String MSG = "msg";

    private static final String MNT = "mnt";

    private static final String[] Mnth = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"
            , "Dec"};

    private static final String[] wkdays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

    public static Object forLock = new Object();

    private static String NEWLINE = "\n";

    private static String SEPARATOR = "/";

    private static String EXT = ".htm";

    private static Hashtable cnf;

    private Logger log = LoggerFactory.getLogger(CalendarControl.class);

    @Override
    public void init(ServletConfig servletconfig) throws ServletException {
        debug("start here $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$S");

        super.init(servletconfig);

        NEWLINE = System.getProperty("line.separator");
        SEPARATOR = System.getProperty("file.separator");

        cnf = new Hashtable();
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter printwriter = response.getWriter();

        String s = "";
        String s10 = "";

        Object obj = new GregorianCalendar();

        s10 = HttpUtils.getRequestURL(request).toString();

        debug("request param s10 is ............................. " + s10);

        int i;

        if ((i = s10.indexOf("?")) > 0) {
            s10 = s10.substring(0, i);
        }

        response.setContentType("text/html");

        // ? why and where to get the parameters
        s = request.getQueryString();

        debug("request param s is ............................. " + s);

        // config file is required or we could hardcode here
        Hashtable h = initConfig();

        String s2 = getFromQuery(s, "date=");

        debug("param s2 is " + s2);

        if (s2.length() == 0) {
            ((Calendar) obj).setTime(new Date());
        } else {
            if (s2.indexOf("/") > 0) {
                obj = parseDateWithSymbol(s2);
            } else {
                obj = parseDate(s2);
            }
        }

        printwriter.println("<body bgcolor=\"" + h.get("bgcolor1") + "\" onLoad=\"setTimeout(window.focus,0);\">");

        String s3 = (String) h.get("size1");

        if (s3 != null) {
            printwriter.println("<font size=" + s3 + ">");
        }

        String config = request.getParameter("config");

        printwriter.println(getMonthTable(h, config, s10, (Calendar) obj));

        if (s3 != null) {
            printwriter.println("</font>");
        }

        printwriter.println("</body>");

        printwriter.flush();
        printwriter.close();
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    private void debug(String s) {
        log.debug(s);
    }

    private String stringDate(Calendar calendar) {
        String s = String.valueOf(calendar.get(1));
        String s1 = String.valueOf(calendar.get(2));

        if (s1.length() == 1) {
            s1 = "0" + s1;
        }

        s = s + s1;
        s1 = String.valueOf(calendar.get(5));

        if (s1.length() == 1) {
            s1 = "0" + s1;
        }

        s = s + s1;

        return s;
    }

    // format as dd/mm/yyyy
    // format as yyyy/mm/dd
    private String stringDateFormat(Calendar calendar) {
        String ret = "";

        // year
        String yyyy = String.valueOf(calendar.get(1));

        // month
        String mm = String.valueOf(calendar.get(2) + 1);

        // day
        String dd = String.valueOf(calendar.get(5));

        if (dd.length() == 1) {
            dd = "0" + dd;
        }

        if (mm.length() == 1) {
            mm = "0" + mm;
        }

        // ret = dd + "/" + mm + "/" + yyyy;
        ret = yyyy + "/" + mm + "/" + dd;

        return ret;
    }

    private int getDay(Calendar calendar, String s) {
        if (s.compareTo("2") == 0) {
            return calendar.get(7) - 1;
        } else {
            return (calendar.get(7) + 5) % 7;
        }
    }

    private String getMonthTable(Hashtable hashtable, String s, String s1, Calendar calendar) {
        int i = calendar.get(2);
        StringBuffer sb = new StringBuffer();
        String s2 = (String) hashtable.get("style");
        String s3 = (String) hashtable.get("size1");
        GregorianCalendar gCalendar = new GregorianCalendar(calendar.get(1), calendar.get(2), 1);
        GregorianCalendar gCalendar1 = new GregorianCalendar(calendar.get(1) + 1, calendar.get(2), 1);
        GregorianCalendar gCalendar2 = new GregorianCalendar(calendar.get(1) - 1, calendar.get(2), 1);

        // generate years
        sb.append("<table width=100%>");
        sb.append("<tr>");
        sb.append("<td nowrap>");

        // generate months
        showMonth(s3, s, s1, sb, gCalendar);
        Calendar c = Calendar.getInstance();
        int day = c.get(Calendar.DAY_OF_MONTH);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);

        sb.append("<input type=text readonly size=6 value=" + gCalendar.get(1) + ">");

        sb.append("<img src=\"img/icon.gif\" width=\"17\" height=\"18\" border=\"0\" usemap=\"#Map\">");

        sb.append("<map name=\"Map\">");
        sb.append("<area shape=\"rect\" coords=\"1,1,17,9\" href=\"" + s1 + "?" + "config" + "=" + s + "&" + "deal" +
                          "=" + "left" + "&" + "date" + "=" + gCalendar2.get(1) + twoDigits(calendar.get(2)) +
                          twoDigits(calendar.get(5)) + "\">");
        sb.append("<area shape=\"rect\" coords=\"1,9,17,17\" href=\"" + s1 + "?" + "config" + "=" + s + "&" + "deal" +
                          "=" + "left" + "&" + "date" + "=" + gCalendar1.get(1) + twoDigits(calendar.get(2)) +
                          twoDigits(calendar.get(5)) + "\">");
        sb.append("</map>");

        sb.append("</td>");

        sb.append("</tr>");
        sb.append("</table>");

        sb.append("<table width=100%>  <tr style=\"font-family: Arial, Helvetica, sans-serif, font-size: " + "12px; " +
                          "font-weight: bold; color: #FFFFFF; background-color: #005BB7\">\n");

        if (s2.compareTo("2") == 0) {
            sb.append("<th align=right>" + formatObject(s3, wkdays[0]) + "</th>\n");

            for (int j = 1; j < 7; j++) {
                sb.append("<th align=right>" + formatObject(s3, wkdays[j]) + "</th>\n");
            }
        } else {
            sb.append("<th align=right>" + formatObject(s3, wkdays[1]) + "</th>" + NEWLINE);

            for (int k = 2; k < 8; k++) {
                sb.append("<th align=right>" + formatObject(s3, wkdays[k % 7]) + "</th>" + NEWLINE);
            }
        }

        sb.append("  </tr>" + NEWLINE);

        int l = 0;

        if (getDay(gCalendar, s2) > 0) {
            sb.append("  <tr style=\"font-family: Arial, Helvetica, sans-serif, font-size: 10pt; font-weight:" + " " +
                              "normal; color: #000000\">");

            for (; l < getDay(gCalendar, s2); l++) {
                sb.append("<td align=right>");

                if (s3 != null) {
                    sb.append("<font size=" + s3 + "></font>");
                }

                sb.append("</td>" + NEWLINE);
            }
        }

        for (; gCalendar.get(2) == i; gCalendar.add(5, 1)) {
            int i1 = (l + gCalendar.get(5)) % 7;

            if (i1 == 1) {
                sb.append(
                        "  <tr style=\"font-family: Arial, Helvetica, sans-serif,  font-size: 10pt; " + "font-weight:" +
                                " normal; color: #000000\">" + NEWLINE);
            }

            if (gCalendar.get(5) == day && gCalendar.get(2) == month && gCalendar.get(1) == year) {

                sb.append("<td align=right>").append("<span style= 'background-color: red'>");
            } else {
                sb.append("<td align=right>");
            }

            if (s3 != null) {
                sb.append("<font size=" + s3 + ">");
            }

            sb.append("<a href=\"javascript:opener.document.forms[0].elements['" + s + "'].value='" +
                              stringDateFormat(gCalendar) + "';window.close();\">" + gCalendar.get(5) + "</a>\n");

            if (s3 != null) {
                sb.append("</font>");
            }

            sb.append("</td>" + NEWLINE);

            if (i1 == 0) {
                sb.append("  </tr>" + NEWLINE);
            }
        }

        l = (gCalendar.get(5) - 1) + l;

        if ((l % 7) != 0) {
            for (; (l % 7) != 0; l++) {
                sb.append("<td align=right>");

                if (s3 != null) {
                    sb.append("<font size=" + s3 + "></font>");
                }

                sb.append("</td>" + NEWLINE);
            }

            sb.append("  </tr>" + NEWLINE);
        }

        sb.append("</table></center>" + NEWLINE);

        return sb.toString();
    }

    private void showMonth(String s, String s1, String s2, StringBuffer sb, Calendar calendar) {
        int j = calendar.get(2);
        GregorianCalendar gCalendar = new GregorianCalendar(calendar.get(1), 0, 1);

        sb.append("<select style=\"width=100px\" onChange=\"location=this.options[this.selectedIndex]" + ".value\">");

        for (int i = 0; i < 12; i++) {
            if (gCalendar.get(2) == j) {
                sb.append("  <option selected><b>" + getMnth(s, gCalendar) + "</b></option>\n");
            } else {
                sb.append("  <option value=\"" + s2 + "?" + "config" + "=" + s1 + "&" + "deal" + "=" + "left" + "&" +
                                  "date" + "=" + stringDate(gCalendar) + "\">" + getMnth(s, gCalendar) + "</option>\n");
            }

            gCalendar.add(2, 1);
        }

        sb.append("</select>");
    }

    private String getMnth(String s, Calendar calendar) {
        return formatObject(s, Mnth[calendar.get(2)]);
    }

    private String formatObject(String s, Object obj) {
        String s1 = "";

        if (obj != null) {
            s1 = String.valueOf(obj);
        }

        if (s == null) {
            return s1;
        } else {
            return "<font size=" + s + ">" + s1 + "</font>";
        }
    }

    private Calendar parseDate(String s) {
        String s1 = s;
        String s2 = s1.substring(0, 4);
        String s3 = s1.substring(4, 6);
        String s4 = s1.substring(6, 8);

        return new GregorianCalendar(Integer.parseInt(s2), Integer.parseInt(s3), Integer.parseInt(s4));
    }

    private Calendar parseDateWithSymbol(String s) {
        String s1 = s;
        String s2 = s1.substring(s1.lastIndexOf("/") + 1, s1.lastIndexOf("/") + 5);
        String s3 = s1.substring(s1.lastIndexOf("/") - 2, s1.lastIndexOf("/"));
        String s4 = s1.substring(0, 2);

        return new GregorianCalendar(Integer.parseInt(s2), Integer.parseInt(s3) - 1, Integer.parseInt(s4));
    }

    private String twoDigits(int i) {
        String s = String.valueOf(i);

        if (s.length() == 1) {
            s = "0" + s;
        }

        return s;
    }

    private Hashtable initConfig() {
        Hashtable h = new Hashtable();

        h.put("border", "0");
        h.put("style", "1");
        h.put("add", "1");
        h.put("edit", "0");
        h.put("delete", "0");
        h.put("share", "0");
        h.put("bgcolor1", "#FFFFFF");
        h.put("bgcolor2", "#FFFFFF");
        h.put("title", "");

        return h;
    }

    private String getFromQuery(String s, String s1) {
        int i = s.indexOf(s1);

        if (i < 0) {
            return "";
        }

        String s2 = s.substring(i + s1.length());

        if ((i = s2.indexOf("&")) < 0) {
            return s2;
        } else {
            return s2.substring(0, i);
        }
    }

}