	package es.ejie.frmk.presentacion.iu.taglib.html.menu.displayer;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Enumeration;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;

import org.apache.struts.util.RequestUtils;

import es.ejie.frmk.control.excepciones.Q70FrameworkException;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70Traza;
import es.ejie.frmk.presentacion.iu.taglib.base.Q70Constants;
import es.ejie.frmk.presentacion.iu.taglib.html.menu.base.Q70MenuComponent;

public class Q70DHTMLTabbedMenuDisplayer extends Q70ListMenuDisplayer  {

	//Instancia del log de trazas
	private static Q70Traza tr = Q70Traza.getSingleton();
	
    private static final String DEFAULT_JAVASCRIPTFILES ="dhtmltabs.js";

    protected String getJavaScriptsFilesDefault() {
    	return DEFAULT_JAVASCRIPTFILES;
    }
    
	/**
	 * @param menu
	 * @param pageContext
	 */
    public void display(Q70MenuComponent menu,PageContext pageContext) throws JspException, IOException 
    {
		super.setSecureId(menu.getSecureId());
		if (Q70Constants.MODE_NOTDISPLAYED != super.getDisplayMode())
		{        	
            displayComponents(menu, 0,pageContext,false);
        }
    }

    /**
     * Metodo recursivo que pinta el arbol de menus
     * @param menu
     * @param level
     * @param pageContext
     */
    protected void displayComponents(Q70MenuComponent menu, int level,PageContext pageContext,boolean puesto)
    	throws JspException, IOException 
    {
    	menu.setListaI18nKey(getListaI18nKey());
        super.displayComponents(menu,pageContext);
        
        try{
    		setPageLocation(menu);
    	}catch (MalformedURLException m)
    	 {	                    
			if (tr.isTraceActive())	{
				tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "Action o forward incorrecto: " + m.getMessage());
				tr.trace(COMPONENTE, Q70TraceLevel.DEBUG, "Estableciendo location a #");
			} 																			                    
            menu.setLocation("#");
        }	
        Q70MenuComponent[] components;
		try {
			components = menu.getMenuComponents();
		} catch (Q70FrameworkException e) {
			if (tr.isTraceActive())
			{
				tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "Error en la obtención de los menus. Q70TabbedMenuDisplayer");
			}
			
			RequestUtils.saveException(pageContext, e);
			throw new JspException("Error en la obtención de los menus. Q70TabbedMenuDisplayer",e);
		}

        if (components.length > 0) {
        	if (!puesto){
        		out.print("\t<li>");
        	}

            String menuClass = "submenu";
            String imprTab = "tmd.menu.tab";

            if (level >= 1) {
                menuClass = "deepmenu";
                imprTab = "tmd.menu.tab1";
                
            }
			
            String strUrl = menu.getUrl(); 
            if (menu.getUrl() == null) 
            {
				// El menu no tiene definido el atributo location. Se usara la propia url invocante como url del menu.
				strUrl = obtenerURLMenu(pageContext);
            }
            
			printComponent(imprTab, menu, strUrl);
			
			
            for (int i = 0; i < components.length; i++) {
                // check the permissions on this component
				components[i].setI18nKey(menu.getI18nKey());
				super.setSecureId(components[i].getSecureId());
				if (Q70Constants.MODE_NOTDISPLAYED != super.getDisplayMode())
				{ 				
					try {
						if (components[i].getMenuComponents().length > 0) 
						{
						    // and an <li> for submenus (but not deepmenus)
						    if (menuClass.equals("submenu")) {
						        out.print("<li>");
						    }

						    displayComponents(components[i], level + 1,pageContext,true);

						    out.println("</ul></li>");

						    if (i == (components[i].getMenuComponents().length - 1)) 
						    { // last one
						    	if (!puesto){
						    		out.println("</li>");
						    	}
						    }
						} 
						else 
						{
							setPageLocation(components[i]);
							printComponent("tmd.menu.item", components[i], components[i].getLocation());
						}
					}  catch (Q70FrameworkException e) {
						if (tr.isTraceActive())
						{
							tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "Error en la obtención de los menus. Q70TabbedMenuDisplayer");
						}
						RequestUtils.saveException(pageContext, e);
						throw new JspException("Error en la obtención de los menus. Q70TabbedMenuDisplayer",e);
					}
                }
            }
            // close the </ul> for the top menu
            if (menuClass.equals("submenu")) {
                out.println("\t</ul>");
            }
            out.print("\t</li>");
        } 
        else 
        {
			printComponent("tmd.menu.item", menu, menu.getUrl());
        }
    }

    /**
     * This will output the ending javascript statements to intialize each menu
     * <code>END_STATEMENT</code> and <code>SCRIPT_END</code>
     * @param context
     */
    public void end(PageContext context) 
    {
    	
        try 
        {
        //	out.print("</ul>");
        	
            out.print(getConfigMessage("lmd.end"));
            out.print(getConfigMessage("tmd.menu.content"));
            out.print(getConfigMessage("tmd.menu.content"));
        } 
        catch (Exception e) {
			if (tr.isTraceActive())
			{
				tr.trace(COMPONENTE, Q70TraceLevel.ERROR, "Q70TabbedMenuDisplayer: throwable en metodo end(): " + e.getMessage());
			}    
        }
    }

	/**
	 * Manda al navegador el codigo para pintar el componente (solo si seguridad lo permite).
	 * @param key: clave del recurso de internacionalizacion
	 * @param menu: objeto menu 
	 * @param level: nivel de profuncidad del menu
	 * @throws JspException
	 */
	private void printComponent(String key, Q70MenuComponent menu, String url)
		throws JspException, IOException 
	{
		super.setSecureId(menu.getSecureId());
		menu.setPageContext(pageContext);
    	menu.setListaI18nKey(getListaI18nKey());
    			
		if (Q70Constants.MODE_NOTDISPLAYED != super.getDisplayMode())
		{ 		        	
			out.println(getConfigMessage(key,
										 url, 
										 super.getMenuToolTip(menu),
										 getMessage(menu.getListaI18nKey(),menu.getTitle())));
		}
	}
	
	/**
	 * Se obtienen los parametros de la URL, cuando el menu no tiene asignada URL 
	 * @param pageContext
	 * @return
	 */
	private String obtenerURLMenu(PageContext pageContext){

		String cadena="";
		Enumeration enumParam=pageContext.getRequest().getParameterNames();
		while (enumParam.hasMoreElements()){
			String value=(String)enumParam.nextElement();
			cadena+="?"+value+"="+pageContext.getRequest().getParameter(value);
		}
		
		return (null==cadena||cadena.trim().length()==0)?"?":cadena;
	}

}
