/*
 * ====================================================================== 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);

    /**
     * Facility subclasses can refuse copying of resources.
     * @return True if resources that use this facility can be copied.
     */
    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, content;
        boolean manage = false;

        java.util.Date openDate, closeDate;
        String available_date;

        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}");
        }

        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("\" alt=\"Manage heading.\">&gt;</a>");
        }

        out.print("</strong>");

        out.print("</h"); // end of node_title
        out.print(hlevel);
        out.println(">");

//      Headings don't normally display a description, but it is possible.
//      TODO: Set a flag to specify whether or not a description is displayed,
//      rather than using an HTML comment in description.
        content = resource.getDescription();

        content = (content == null) ? "" : content;

        out.print("<div class=\"" + state.css_class_prefix + "_node_content");

        if (depth == 1)
        {// was commented out in orig code??
            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>");
    }
}