/*
 * Servlet.java
 *
 * Created on August 9, 2012, 5:38 PM
 */

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.regex.*;
/**
 *
 * @author  PETER STARR
 * @version
 */
public class StartServlet extends HttpServlet {

    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);

    }

    /** Destroys the servlet

     */
    public void destroy() {

    }

    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        response.setContentType("text/html");
        java.io.PrintWriter out = response.getWriter();
        out.println("<html>");
        HttpSession LedSession = request.getSession(true);
		if (LedSession.getAttribute("LedSessionID")==null) {
			out.println(LedMethods.TimeOut());
			out.close();
		}
        Pattern ptrn = Pattern.compile(":");
        int j,i, FormPtr, DBOK, ptr, isfy, JnlCtr;
        DBOK=1;
        String x,ledname,ledfy,lastfy,ledperd,ledtaxid,ledfystruct,HiCatByClass,FileName,PerdEndDate,FormFieldName,GotNewJnlData, Listln;
        String JnlCode, JnlDefFldName, JnlDef, WkServletName, ErrMsg, TableName, SQLStmt, NewJnlSetError, SelectPerds, DataPath;
        String PathDelim, FormFieldValue, RepeatDay;
        String origfy = (String)LedSession.getAttribute("ledfy");
        String LedInfoFileName = (String)LedSession.getAttribute("LedInfoFileName");
        //ledid=(String)LedSession.getAttribute("ledid");  //------SHOULD NOT BE PASSED ANY MORE IN "INDEX.HTML ANYMORE
        //-------------------------------------------------------LED ID WAS EMBEDDED IN LEDPARMS.JAVA -----
        RepeatDay="";
        ErrMsg="";
        Listln="";
        GotNewJnlData="N";
        NewJnlSetError="`";
        String FN[] = new String[1];
        String FV[] = new String[1];
        String[][] NewJnlData = new String[7][100];
        for (i = 0; i < NewJnlData[0].length; i++) {  //----Initialize NewJnlData array------
			for (j = 0; j < NewJnlData.length; j++) {
				NewJnlData[j][i]="";
			}
		}
		List jnldescList = new ArrayList();
		List jnldefList = new ArrayList();
        List wkList = new ArrayList();
        List HTMLList = new ArrayList();
        List JnlList = new ArrayList();
        List EditMenuHTML=new ArrayList();
        List BankList=new ArrayList();
        LedSession.setAttribute("JnlList",JnlList);
        x="";
		String LedInfoFieldNames[] = (String[])LedSession.getAttribute("LedInfoFieldNames");
        String LedInfoFieldValues[] = new String[LedInfoFieldNames.length];
        Enumeration paramNames = request.getParameterNames();  //Build Lists of form field names and values------
        while(paramNames.hasMoreElements()) {
			FormFieldName=(String)paramNames.nextElement();
			FormFieldValue = request.getParameterValues(FormFieldName)[0];
			ptr=MethLib.locate(LedInfoFieldNames, FormFieldName);
			LedInfoFieldValues[ptr]=FormFieldValue;
		}
		DataPath = LedParms.getDataPath();
		PathDelim=(String)LedSession.getAttribute("PathDelim");
		ledfy=MethLib.GetFldValue("fy", LedInfoFieldNames, LedInfoFieldValues);	//---get fy from Form
		//----Verify existance of Data Base Tramsaction Table--------
		TableName=LedMethods.bldtrntblname("",ledfy);
		x=LedSQL.VerifyTable(TableName);
		if (!(x.equals("OK"))) {
        	out.println("<center><b><font color=\"#FF0000\">Data Base Transaction Table for Fiscal Year " + ledfy + " does not exist</font></b></center>");
        	DBOK=0;
		}
		//----Verify existance of Data Base Ledger Table--------

    	TableName=LedMethods.bldledtblname("", ledfy);
		x=LedSQL.VerifyTable(TableName);
		if (!(x.equals("OK"))) {
			out.println("<br><center><b><font color=\"#FF0000\">Data Base Ledger Table for Fiscal Year " + ledfy + " does not exist.</font></b></center>");
        	DBOK=0;
		}

		if (DBOK==1) {
			//----Update Led Info Text File-------------
			try {
				PrintStream LedInfoData = MethLib.create(DataPath + LedInfoFileName);
				for (i = 0; i < LedInfoFieldNames.length; i++) {
						LedInfoData.println(LedInfoFieldNames[i] + "|" + LedInfoFieldValues[i]);
				}
				LedInfoData.close();
			}
			catch (FileNotFoundException e) {
				out.println("Cannot create " + DataPath + LedInfoFileName);
			}
		}
		//-------------------------------------------------------------
        ledname=MethLib.GetFldValue("name", LedInfoFieldNames, LedInfoFieldValues);
		i = -1+Integer.parseInt(ledfy);
        lastfy=MethLib.convertInteger(i);
		ledtaxid=MethLib.GetFldValue("taxid", LedInfoFieldNames, LedInfoFieldValues);
		ledperd=MethLib.GetFldValue("perd", LedInfoFieldNames, LedInfoFieldValues);
		ledfystruct=MethLib.GetFldValue("fystruct", LedInfoFieldNames, LedInfoFieldValues);
		SelectPerds=MethLib.SelectOption(ledfystruct, ledperd);
		HiCatByClass=MethLib.GetFldValue("classes", LedInfoFieldNames, LedInfoFieldValues);
		JnlCtr=1;
                ptr=-1;
		//-----Build jnldescList AND jnldefs arrrays from LedInfo ArraYS---------------------------
		while (ptr==-1){
			JnlCode = MethLib.convertInteger(JnlCtr);
			JnlDefFldName=JnlCode+"jdesc";
			JnlDef=JnlCode+":";
			x=MethLib.GetFldValue(JnlDefFldName, LedInfoFieldNames, LedInfoFieldValues);
                        if (x==null) {
                            x="";
                        }
			ptr=x.indexOf("Invalid");   //----Invalid Field Name means the end-------
			if (ptr>-1) {
				break;
			}
			jnldescList.add(x);
			x=JnlCode+"sign";
			x=MethLib.GetFldValue(x, LedInfoFieldNames, LedInfoFieldValues);
			JnlDef=JnlDef+x+":";
			x=JnlCode+"post";
			x=MethLib.GetFldValue(x, LedInfoFieldNames, LedInfoFieldValues);
			JnlDef=JnlDef+x;
			jnldefList.add(JnlDef);
			JnlCtr=JnlCtr+1;
		}
		String jnldefs[] = new String[jnldefList.size()];
		jnldefList.toArray(jnldefs);
		String JnlDescs[] = new String[jnldescList.size()];
		jnldescList.toArray(JnlDescs);
		/*
		jnldefs[0]="P:"+MethLib.GetFldValue("psign", LedInfoFieldNames, LedInfoFieldValues)+":"+MethLib.GetFldValue("ppost", LedInfoFieldNames, LedInfoFieldValues);
		jnldefs[1]="R:"+MethLib.GetFldValue("rsign", LedInfoFieldNames, LedInfoFieldValues)+":"+MethLib.GetFldValue("rpost", LedInfoFieldNames, LedInfoFieldValues);
		jnldefs[2]="D:"+MethLib.GetFldValue("dsign", LedInfoFieldNames, LedInfoFieldValues)+":"+MethLib.GetFldValue("dpost", LedInfoFieldNames, LedInfoFieldValues);
		jnldefs[3]="J:"+MethLib.GetFldValue("jsign", LedInfoFieldNames, LedInfoFieldValues)+":"+MethLib.GetFldValue("jpost", LedInfoFieldNames, LedInfoFieldValues);
		*/
		LedSession.setAttribute("JnlDescs", JnlDescs);
		LedSession.setAttribute("ledname", ledname);
		LedSession.setAttribute("ledfy", ledfy);
		LedSession.setAttribute("ledtaxid", ledtaxid);
		LedSession.setAttribute("ledperd", ledperd);
		LedSession.setAttribute("ledfystruct", ledfystruct);
		LedSession.setAttribute("HiCatByClass", HiCatByClass);
		LedSession.setAttribute("jnldefs", jnldefs);
		LedSession.setAttribute("NewJnlData", NewJnlData);
		LedSession.setAttribute("NewJnlSetError", NewJnlSetError);
		LedSession.setAttribute("GotNewJnlData", GotNewJnlData);
		LedSession.setAttribute("RepeatDay", RepeatDay);
		LedSession.setAttribute("BankList", BankList);
        x="AN:AM:DS:RF:DY";
        String AddJnlFCodes[] = ptrn.split(x);  //----Form Field Codes for Screen to add journal entries---------
		LedSession.setAttribute("AddJnlFCodes", AddJnlFCodes);
        x="ACCTNO:AMOUNT:DESCRIPTION:SOURCE:DAY"; //----Translate New Jnl Form Field Codes to Jnl Field Names------
        String[] FcodeToFnames= ptrn.split(x);
		LedSession.setAttribute("FcodeToFnames",FcodeToFnames );
		x=LedMethods.PerdDate(ledfystruct, ledperd, ledfy, "");
		isfy=LedMethods.isfy(ledfystruct);
		String PerdDateArray[] = ptrn.split(x);
		LedSession.setAttribute("PerdDateArray", PerdDateArray);
		//------Month Day, Year-------------------------
		PerdEndDate=PerdDateArray[0] + " " + PerdDateArray[1] + ", " + PerdDateArray[2];
		PerdEndDate=PerdEndDate.toUpperCase();
		//----------------Build Menu Web Page--------------------------------------------
		x=LedMethods.BldListFromTextFile("menu.txt",wkList);
		if (!(x.equals("OK"))) {
			DBOK=0;
			ErrMsg=x;
		}
		if (DBOK==1) {
			out.println("<center><b><font size=+2>LEDGER SYSTEM MENU");
			out.println("<br>" + ledname + " (" + ledtaxid + ")");
    		if (isfy==1) {	//----FISCAL YEAR---
				out.println("<br><b><font size=+2>FOR FISCAL YEAR " + lastfy + " - " + ledfy + "</font></b>");
			}
			else {			//----CALENDAR YEAR---
				out.println("<br><b><font size=+2>FOR CALENDAR YEAR " + ledfy + "</font></b>");
			}
			out.println("<br>PERIOD ENDING " + PerdEndDate);
			EditMenuHTML.add("<center><b><font size=+2>LEDGER SYSTEM MENU");
			EditMenuHTML.add("<br>" + ledname + " (" + ledtaxid + ")");
    		if (isfy==1) {	//----FISCAL YEAR---
				EditMenuHTML.add("<br><b><font size=+2>FOR FISCAL YEAR " + lastfy + " - " + ledfy + "</font></b>");
			}
			else {			//----CALENDAR YEAR---
				EditMenuHTML.add("<br><b><font size=+2>FOR CALENDAR YEAR " + ledfy + "</font></b>");
			}
			//------------------------------------------------------------------------
			EditMenuHTML.add("<br>PERIOD ENDING " + PerdEndDate);
			FN[0]="endday";
			FV[0]=PerdDateArray[1];
			//-----------Verify Existance of tables for previous fiscaL YEAR------------------------
    		TableName=LedMethods.bldtrntblname("", ledfy);
			x=LedSQL.VerifyTable(TableName);
			if (!(x.equals("OK"))) {
				out.println("<center><b><font color=\"#FF0000\">Transaction Table for " + lastfy + " does not exist</font></b></center>");
				EditMenuHTML.add("<center><b><font color=\"#FF0000\">Transaction Table for " + lastfy + " does not exist</font></b></center>");
			}
    		TableName=LedMethods.bldledtblname("", ledfy);
			x=LedSQL.VerifyTable(TableName);
			if (!(x.equals("OK"))) {
				out.println("<center><b><font color=\"#FF0000\">Ledger Table for " + lastfy + " does not exist</font></b></center>");
				EditMenuHTML.add("<center><b><font color=\"#FF0000\">Ledger Table for " + lastfy + " does not exist</font></b></center>");
			}
			//----------------------------------------------------------------------------------------
			for (j=0; j < wkList.size(); j++) {
				Listln=wkList.get(j).toString();
				FormPtr=Listln.indexOf("</html");
				if (FormPtr != -1) {
					break;
				}
            	FormPtr=Listln.indexOf("<!form");
            	if (FormPtr != -1) {  //----Replace with Form Tag
					String ServletName[] = ptrn.split(Listln);
					WkServletName=ServletName[1];
					if (WkServletName.equals("Inquiry")) {
						WkServletName=WkServletName+"Servlet";
						Listln=LedMethods.insertURL(WkServletName,"LookupForm");
						Listln=Listln + "<center>CATEGORY ACTIVITY</center><br>Starting Period:<select NAME=\"perdstart\">" + SelectPerds;
						Listln=Listln + "</select><br>Ending Period:<select NAME=\"perdend\">" + SelectPerds + "</select>";
						Listln=Listln + "<br>Category Lookup:" + LedMethods.GetLookupClass("LookupClass");
					}
					else {
						WkServletName=WkServletName+"Servlet";
						Listln=LedMethods.insertURL(WkServletName,"");
					}

				}
				FormPtr=Listln.indexOf("<!jnltypes>");
				if (FormPtr != -1) {		//--------Insert JournaL Types---------------------
					Listln="";
					for (i=0; i < jnldescList.size(); i++) {
						x=jnldescList.get(i).toString();
						Listln=Listln+"<option>"+x;
					}
					Listln=Listln+"</select>";
				}

				//----Create Jounal from Bank Transactions-------------------
				FormPtr=Listln.indexOf("<!bank>");
				if (FormPtr != -1) {
					Listln="";
					Listln="<br><center><input TYPE=\"submit\" Name =\"SubmitButt\" VALUE=\"CREATE JOURNAL FROM BANK TRANSACTIONS\">";
				}
            	String WorkLine = MethLib.BuildLine("`", Listln, FV, FN, FV, FV);
            	out.println(WorkLine);
            	EditMenuHTML.add(WorkLine);
			}
			Listln=LedMethods.insertURL("InitLedServlet", "");
			Listln=Listln+"<br><center><input TYPE=\"submit\" VALUE=\"RESTART LEDGER SYSTEM\"></center></form></center>";
        	out.println(Listln);
        	EditMenuHTML.add(Listln);
			Listln=LedMethods.insertURL("SignOffServlet", "");
			Listln=Listln+"<center><input TYPE=\"submit\" VALUE=\"SIGNOFF\"></center></form></center</html>";
			out.println(Listln);
        	EditMenuHTML.add(Listln);
        	LedSession.setAttribute("EditMenuHTML", EditMenuHTML);
		}
		else {
			out.println(LedMethods.insertURL("InitLedServlet",""));
			out.println("<br><br><center><input TYPE=\"submit\" VALUE=\"PROCEED\"><center>");
		}
  		out.close();
	}

    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {

	}

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }

}
