/*
 * ====================================================================== The
 * Bodington System Software License, Version 1.0 Copyright (c) 2001 The
 * University of Leeds. All rights reserved. Redistribution and use in source
 * and binary forms, with or without modification, are permitted provided that
 * the following conditions are met: 1. Redistributions of source code must
 * retain the above copyright notice, this list of conditions and the following
 * disclaimer. 2. Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution. 3. The
 * end-user documentation included with the redistribution, if any, must include
 * the following acknowledgement: "This product includes software developed by
 * the University of Leeds (http://www.bodington.org/)." Alternately, this
 * acknowledgement may appear in the software itself, if and wherever such
 * third-party acknowledgements normally appear. 4. The names "Bodington",
 * "Nathan Bodington", "Bodington System", "Bodington Open Source Project", and
 * "The University of Leeds" must not be used to endorse or promote products
 * derived from this software without prior written permission. For written
 * permission, please contact d.gardner@leeds.ac.uk. 5. The name "Bodington" may
 * not appear in the name of products derived from this software without prior
 * written permission of the University of Leeds. THIS SOFTWARE IS PROVIDED ``AS
 * IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * TITLE, THE IMPLIED WARRANTIES OF QUALITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF LEEDS OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * ========================================================= This software was
 * originally created by the University of Leeds and may contain voluntary
 * contributions from others. For more information on the Bodington Open Source
 * Project, please see http://bodington.org/
 * ======================================================================
 */

package org.bodington.servlet.facilities;

import org.apache.log4j.Logger;

import org.bodington.servlet.*;
import java.io.*;
import javax.servlet.*;

import org.bodington.server.resources.Resource;
import org.bodington.server.resources.HeadingResource;
import org.bodington.server.BuildingServerException;
import org.bodington.server.realm.Permission;

public class HeadingFacility extends org.bodington.servlet.facilities.Facility
{
    private static Logger log = Logger.getLogger(HeadingFacility.class);

    public boolean canCopy(Resource resource)
    {
        return true;
    }

    public boolean willAcceptFacility(Facility f)
    {
        return false;
    }

    public Resource newResource()
    {
        return new HeadingResource();
    }

    public void insert(Request req, PrintWriter out, String command,
        String insertname) throws ServletException, IOException
    {
        log.debug(" HeadingFacility insert()");
        super.insert(req, out, command, insertname);
    }

    protected void resourceMenuItem(Resource resource, Request breq,
        PrintWriter out, ResourceMenuOutputState state, int depth, int highlight)
    throws IOException, BuildingServerException
    {
        String href = null, title = null, target = null;
        boolean manage = false;
        
        manage = resource.checkPermission(Permission.MANAGE);
        
        href = ( !state.rootless && depth==1  )? null:
            ( breq.getContextPath() +breq.getServletPath() + resource.getFullName() );
        
        target = "_top";
        
        title = resource.getTitle();
        
        // heading level for title line matches depth but there are only
        // six heading levels in HTML so stop there.
        int hlevel = (depth > 6) ? 6 : depth;
        int level = ((depth - 1) % 10) + 1;
        
        // title in heading with appropriate class attribute
        out.print("          <h");
        out.print(hlevel);
        
        out.print(" class=\"" + state.css_class_prefix
            + "_heading_node_title\">");
        
        out.print("<strong>");
        
        if (title != null)
        {
            out.print(title);
        }
        else
        {
            out.print("{untitled item}");
        }
        
        // headings have 'manage' link after title
        if (href != null && manage)
        {
            out.print("&nbsp;<a");
            if (target != null)
            {
                out.print(" target=\"");
                out.print(target);
                out.print("\"");
            }
            out.print(" href=\"");
            out.print(href);
            out.print("\" title=\"Manage Heading.\"><span style=\"font-size: x-small\"><sup>Manage</sup></span></a>");
        }
        
        out.print("</strong>");
        
        out.print("</h"); // end of node_title
        out.print(hlevel);
        out.println(">");
        
        String content = resource.getDescription();
        
        if ( content != null && content.length() > 0 )
        {            
            out.print("<div class=\"" + state.css_class_prefix + "_node_content");
            
            if (depth == 1)
            {
                out.print("_without_stalk");
            }
            out.print("_lev");
            out.print(level);
            out.print("_hl");
            out.print(highlight);
            out.print("\">");
            
            out.print(content);
            
            String markup = timedResourceText(resource);
            if (markup != null)
                out.print("<div>" + markup + "</div>");

            out.print("</div>");
            out.print( "<div class=\"clearer\">&nbsp;</div>\n");
        }
    }
}