You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sk...@apache.org on 2005/11/29 21:13:21 UTC

svn commit: r349804 [7/11] - in /myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule: ./ model/ renderer/ resource/css/ resource/javascript/ util/

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java?rev=349804&r1=349803&r2=349804&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java Tue Nov 29 12:12:53 2005
@@ -1,766 +1,766 @@
-/*
- * Copyright 2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.myfaces.custom.schedule.renderer;
-
-import java.io.IOException;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeSet;
-
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIForm;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-
-import org.apache.myfaces.custom.schedule.HtmlSchedule;
-import org.apache.myfaces.custom.schedule.model.ScheduleDay;
-import org.apache.myfaces.custom.schedule.model.ScheduleEntry;
-import org.apache.myfaces.renderkit.html.HTML;
-
-/**
- * <p>
- * Renderer for the day and workweek views of the Schedule component
- * </p>
- *
- * @author Jurgen Lust (latest modification by $Author$)
- * @author Bruno Aranda (adaptation of Jurgen's code to myfaces)
- * @version $Revision$
- */
-public class ScheduleDetailedDayRenderer extends AbstractScheduleRenderer
-{
-    //~ Instance fields --------------------------------------------------------
-
-    private final int rowHeightInPixels = 22;
-
-    //~ Methods ----------------------------------------------------------------
-
-    /**
-     * @see javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext,
-     *      javax.faces.component.UIComponent)
-     */
-    public void encodeBegin(FacesContext context, UIComponent component)
-            throws IOException
-    {
-        if (!component.isRendered())
-        {
-            return;
-        }
-
-        super.encodeBegin(context, component);
-
-        HtmlSchedule schedule = (HtmlSchedule) component;
-        ResponseWriter writer = context.getResponseWriter();
-
-        //the number of rows in the grid is the number of half hours between
-        //visible start hour and visible end hour, plus 1 for the header
-        int numberOfRows = ((schedule.getVisibleEndHour() - schedule
-                .getVisibleStartHour()) * 2) + 1;
-
-        //the grid height = 22 pixels times the number of rows + 3, for the
-        //table border and the cellpadding
-        int gridHeight = (numberOfRows * 22) + 3 + 10;
-
-        //container div for the schedule grid
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "schedule-detailed", null);
-        writer.writeAttribute(HTML.STYLE_ATTR, "height: "
-                + String.valueOf(gridHeight) + "px; overflow: hidden;", null);
-        writeBackground(context, schedule, writer);
-        writeForegroundStart(context, schedule, writer);
-    }
-
-    /**
-     * @see javax.faces.render.Renderer#encodeChildren(javax.faces.context.FacesContext,
-     *      javax.faces.component.UIComponent)
-     */
-    public void encodeChildren(FacesContext context, UIComponent component)
-            throws IOException
-    {
-        if (!component.isRendered())
-        {
-            return;
-        }
-
-        HtmlSchedule schedule = (HtmlSchedule) component;
-        ResponseWriter writer = context.getResponseWriter();
-
-        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
-                .hasNext();)
-        {
-            ScheduleDay day = (ScheduleDay) dayIterator.next();
-            writer.startElement(HTML.TD_ELEM, schedule);
-            writer.writeAttribute(HTML.CLASS_ATTR, "column", null);
-            writer.writeAttribute(HTML.STYLE_ATTR, "height: 100%;", null);
-            writer.startElement(HTML.DIV_ELEM, schedule);
-            writer.writeAttribute(HTML.CLASS_ATTR, "column", null);
-            writer
-                    .writeAttribute(
-                            HTML.STYLE_ATTR,
-                            "position: relative; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 0;",
-                            null);
-            writeEntries(context, schedule, day, writer);
-            writer.endElement(HTML.DIV_ELEM);
-            writer.endElement(HTML.TD_ELEM);
-        }
-    }
-
-    /**
-     * @see javax.faces.render.Renderer#encodeEnd(javax.faces.context.FacesContext,
-     *      javax.faces.component.UIComponent)
-     */
-    public void encodeEnd(FacesContext context, UIComponent component)
-            throws IOException
-    {
-        if (!component.isRendered())
-        {
-            return;
-        }
-
-        HtmlSchedule schedule = (HtmlSchedule) component;
-        ResponseWriter writer = context.getResponseWriter();
-
-        writeForegroundEnd(context, schedule, writer);
-        writer.endElement(HTML.DIV_ELEM);
-    }
-
-    private String getCellClass(HtmlSchedule schedule, int column, int row)
-    {
-        String cellClass = "free";
-        ScheduleDay day = (ScheduleDay) schedule.getModel().get(column);
-
-        if (!day.isWorkingDay())
-        {
-            return cellClass;
-        }
-
-        if (((schedule.getVisibleStartHour() + (row / 2)) >= schedule
-                .getWorkingStartHour())
-                && ((schedule.getVisibleStartHour() + (row / 2)) < schedule
-                        .getWorkingEndHour()))
-        {
-            cellClass = ((row % 2) == 0) ? "even" : "uneven";
-        }
-
-        return cellClass;
-    }
-
-    private boolean isSelected(HtmlSchedule schedule, EntryWrapper entry)
-    {
-        ScheduleEntry selectedEntry = schedule.getModel().getSelectedEntry();
-
-        if (selectedEntry == null)
-        {
-            return false;
-        }
-
-        boolean returnboolean = selectedEntry.getId().equals(
-                entry.entry.getId());
-
-        return returnboolean;
-    }
-
-    private void maximizeEntries(EntryWrapper[] entries, int numberOfColumns)
-    {
-        for (int i = 0; i < entries.length; i++)
-        {
-            EntryWrapper entry = entries[i];
-
-            //now see if we can expand the entry to the columns on the right
-            while (((entry.column + entry.colspan) < numberOfColumns)
-                    && entry.canFitInColumn(entry.column + entry.colspan))
-            {
-                entry.colspan++;
-            }
-        }
-    }
-
-    private void scanEntries(EntryWrapper[] entries, int index)
-    {
-        if (entries.length <= 0)
-        {
-            return;
-        }
-
-        EntryWrapper entry = entries[index];
-        entry.column = 0;
-
-        //see what columns are already taken
-        for (int i = 0; i < index; i++)
-        {
-            if (entry.overlaps(entries[i]))
-            {
-                entry.overlappingEntries.add(entries[i]);
-                entries[i].overlappingEntries.add(entry);
-            }
-        }
-
-        //find an available column
-        while (!entry.canFitInColumn(entry.column))
-        {
-            entry.column++;
-        }
-
-        //recursively scan the remaining entries for overlaps
-        if (++index < entries.length)
-        {
-            scanEntries(entries, index);
-        }
-    }
-
-    private void writeBackground(FacesContext context, HtmlSchedule schedule,
-            ResponseWriter writer) throws IOException
-    {
-        //a calendar component should always be inside a UIForm
-        UIForm parentForm = getParentForm(schedule);
-
-        if (parentForm == null)
-        {
-            throw new NullPointerException("No parent UIForm found");
-        }
-
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "background", null);
-        writer
-                .writeAttribute(
-                        HTML.STYLE_ATTR,
-                        "position: absolute;	left: 0px; top: 0px; width: 100%; height: 100%; z-index: 0;",
-                        null);
-
-        //background table for the schedule grid
-        writer.startElement(HTML.TABLE_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "background", null);
-        writer.writeAttribute(HTML.CELLPADDING_ATTR, "0", null);
-        writer.writeAttribute(HTML.CELLSPACING_ATTR, "1", null);
-        writer.writeAttribute(HTML.STYLE_ATTR, "width: 100%; height: 100%",
-                null);
-        writer.startElement(HTML.TBODY_ELEM, schedule);
-
-        //header row, containing the column names
-        writer.startElement(HTML.TR_ELEM, schedule);
-        writer.startElement(HTML.TD_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "gutter", null);
-        writer
-                .writeAttribute(
-                        HTML.STYLE_ATTR,
-                        "height: 21px; border-style: none; border-width: 0px; overflow: hidden; padding: 0px",
-                        null);
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer
-                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
-                        null);
-        writer.endElement(HTML.DIV_ELEM);
-        writer.endElement(HTML.TD_ELEM);
-
-        float columnWidth = (schedule.getModel().size() == 0) ? 100
-                : (100 / schedule.getModel().size());
-
-        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
-                .hasNext();)
-        {
-            ScheduleDay day = (ScheduleDay) dayIterator.next();
-            writer.startElement(HTML.TD_ELEM, schedule);
-            writer.writeAttribute(HTML.CLASS_ATTR, "header", null);
-            writer
-                    .writeAttribute(
-                            HTML.STYLE_ATTR,
-                            "height: 31px; border-style: none; border-width: 0px; overflow: hidden;",
-                            null);
-            writer.writeAttribute(HTML.WIDTH_ATTR, String.valueOf(columnWidth)
-                    + "%", null);
-            writer.startElement(HTML.DIV_ELEM, schedule);
-            writer
-                    .writeAttribute(
-                            HTML.STYLE_ATTR,
-                            "position: relative; left: 0px; top: 0px; width: 100%; height: 100%;",
-                            null);
-
-            //write the date
-            writer.startElement(HTML.SPAN_ELEM, schedule);
-            writer.writeAttribute(HTML.CLASS_ATTR, "date", null);
-            writer
-                    .writeAttribute(
-                            HTML.STYLE_ATTR,
-                            "position: absolute; left: 0px; top: 0px; height: 15px; width: 100%; vertical-align: top; overflow: hidden; white-space: nowrap;",
-                            null);
-            writer.writeText(getDateString(context, schedule, day.getDate()),
-                    null);
-            writer.endElement(HTML.SPAN_ELEM);
-
-            //write the name of the holiday, if there is one
-            if ((day.getSpecialDayName() != null)
-                    && (day.getSpecialDayName().length() > 0))
-            {
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "holiday", null);
-                writer
-                        .writeAttribute(
-                                HTML.STYLE_ATTR,
-                                "position: absolute; left: 0px; top: 15px; width: 100%; vertical-align: top; overflow: hidden; white-space: nowrap;",
-                                null);
-                writer.writeText(day.getSpecialDayName(), null);
-                writer.endElement(HTML.SPAN_ELEM);
-            }
-
-            writer.endElement(HTML.DIV_ELEM);
-            writer.endElement(HTML.TD_ELEM);
-        }
-
-        writer.endElement(HTML.TR_ELEM);
-
-        int numberOfRows = (schedule.getVisibleEndHour() - schedule
-                .getVisibleStartHour()) * 2;
-
-        for (int row = 0; row < numberOfRows; row++)
-        {
-            writer.startElement(HTML.TR_ELEM, schedule);
-
-            //write the hours of the day on the left
-            //this only happens on even rows, or every hour
-            if ((row % 2) == 0)
-            {
-                writer.startElement(HTML.TD_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "gutter", null);
-                writer
-                        .writeAttribute(
-                                HTML.STYLE_ATTR,
-                                "height: 21px; border-style: none; border-width: 0px; overflow: hidden; padding: 0px",
-                                null);
-                writer.writeAttribute("rowspan", "2", null);
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "hours", null);
-                writer.writeAttribute(HTML.STYLE_ATTR,
-                        "vertical-align: top; height: 100%; padding: 0px;",
-                        null);
-                writer.writeText(String.valueOf(schedule.getVisibleStartHour()
-                        + (row / 2)), null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "minutes", null);
-                writer.writeAttribute(HTML.STYLE_ATTR,
-                        "vertical-align: top; height: 100%; padding: 0px;",
-                        null);
-                writer.writeText("00", null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.endElement(HTML.TD_ELEM);
-            }
-
-            //write the cells of the day columns on this row
-            for (int column = 0; column < schedule.getModel().size(); column++)
-            {
-                writer.startElement(HTML.TD_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, getCellClass(schedule,
-                        column, row), null);
-                writer.writeAttribute(HTML.STYLE_ATTR,
-                        "overflow: hidden; height: 21px;", null);
-                writer.writeAttribute(HTML.WIDTH_ATTR, String
-                        .valueOf(columnWidth)
-                        + "%", null);
-                writer.write(HTML.NBSP_ENTITY);
-                writer.endElement(HTML.TD_ELEM);
-            }
-
-            writer.endElement(HTML.TR_ELEM);
-        }
-
-        writer.endElement(HTML.TBODY_ELEM);
-        writer.endElement(HTML.TABLE_ELEM);
-        writer.endElement(HTML.DIV_ELEM);
-    }
-
-    private void writeEntries(FacesContext context, HtmlSchedule schedule,
-            ScheduleDay day, ResponseWriter writer) throws IOException
-    {
-        TreeSet entrySet = new TreeSet();
-
-        for (Iterator entryIterator = day.iterator(); entryIterator.hasNext();)
-        {
-            entrySet.add(new EntryWrapper((ScheduleEntry) entryIterator.next(),
-                    day));
-        }
-
-        EntryWrapper[] entries = (EntryWrapper[]) entrySet
-                .toArray(new EntryWrapper[entrySet.size()]);
-
-        //determine overlaps
-        scanEntries(entries, 0);
-
-        //determine the number of columns within this day
-        int maxColumn = 0;
-
-        for (Iterator entryIterator = entrySet.iterator(); entryIterator
-                .hasNext();)
-        {
-            EntryWrapper wrapper = (EntryWrapper) entryIterator.next();
-            maxColumn = Math.max(wrapper.column, maxColumn);
-        }
-
-        int numberOfColumns = maxColumn + 1;
-
-        //make sure the entries take up all available space horizontally
-        maximizeEntries(entries, numberOfColumns);
-
-        //now determine the width in percent of 1 column
-        float columnWidth = 100 / numberOfColumns;
-
-        UIForm parentForm = getParentForm(schedule);
-
-        //and now draw the entries in the columns
-        for (Iterator entryIterator = entrySet.iterator(); entryIterator
-                .hasNext();)
-        {
-            EntryWrapper wrapper = (EntryWrapper) entryIterator.next();
-
-            if (isSelected(schedule, wrapper))
-            {
-                writer.startElement(HTML.DIV_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "entry-selected", null);
-                writer.writeAttribute(HTML.STYLE_ATTR, wrapper.getBounds(
-                        schedule, columnWidth), null);
-
-                //draw the tooltip
-                if (showTooltip(schedule))
-                {
-                    writer.writeAttribute("onmouseover", getTooltipText(
-                            wrapper.entry, schedule), null);
-                }
-
-                //draw the contents of the selected entry
-                writer.startElement(HTML.DIV_ELEM, null);
-                writer.writeAttribute(HTML.CLASS_ATTR, "text", null);
-                writer.writeAttribute(HTML.STYLE_ATTR,
-                        "height: 100%; width: 100%;", null);
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "title", null);
-                writer.writeText(wrapper.entry.getTitle(), null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.startElement("br", schedule);
-                writer.endElement("br");
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "subtitle", null);
-                writer.writeText(wrapper.entry.getSubtitle(), null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.endElement(HTML.DIV_ELEM);
-                writer.endElement(HTML.DIV_ELEM);
-            }
-            else
-            {
-                //if the schedule is read-only, the entries should not be
-                //hyperlinks
-                writer.startElement(
-                        schedule.isReadonly() ? HTML.DIV_ELEM : "a", schedule);
-
-                //draw the tooltip
-                if (showTooltip(schedule))
-                {
-                    writer.writeAttribute("onmouseover", getTooltipText(
-                            wrapper.entry, schedule), null);
-                }
-
-                if (!schedule.isReadonly())
-                {
-                    writer.writeAttribute("href", "#", null);
-
-                    String clientId = schedule.getClientId(context);
-                    StringBuffer mousedown = new StringBuffer();
-                    mousedown.append("document.forms['");
-                    mousedown.append(parentForm.getClientId(context));
-                    mousedown.append("']['");
-                    mousedown.append(clientId);
-                    mousedown.append("'].value='");
-                    mousedown.append(wrapper.entry.getId());
-                    mousedown.append("'; document.forms['");
-                    mousedown.append(parentForm.getClientId(context));
-                    mousedown.append("'].submit()");
-                    writer.writeAttribute("onmousedown", mousedown.toString(),
-                            null);
-                }
-
-                writer.writeAttribute(HTML.CLASS_ATTR, "entry", null);
-                writer.writeAttribute(HTML.STYLE_ATTR, wrapper.getBounds(
-                        schedule, columnWidth), null);
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "title", null);
-                writer.writeText(wrapper.entry.getTitle(), null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.startElement("br", schedule);
-                writer.endElement("br");
-                writer.startElement(HTML.SPAN_ELEM, schedule);
-                writer.writeAttribute(HTML.CLASS_ATTR, "subtitle", null);
-                writer.writeText(wrapper.entry.getSubtitle(), null);
-                writer.endElement(HTML.SPAN_ELEM);
-                writer.endElement(schedule.isReadonly() ? HTML.DIV_ELEM : "a");
-            }
-        }
-    }
-
-    private void writeForegroundEnd(FacesContext context,
-            HtmlSchedule schedule, ResponseWriter writer) throws IOException
-    {
-        writer.endElement(HTML.TR_ELEM);
-        writer.endElement(HTML.TABLE_ELEM);
-        writer.endElement(HTML.DIV_ELEM);
-    }
-
-    private void writeForegroundStart(FacesContext context,
-            HtmlSchedule schedule, ResponseWriter writer) throws IOException
-    {
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "foreground", null);
-        writer
-                .writeAttribute(
-                        HTML.STYLE_ATTR,
-                        "position: absolute;	left: 0px; top: 0px; width: 100%; height: 100%;	z-index: 2;",
-                        null);
-
-        writer.startElement(HTML.TABLE_ELEM, schedule);
-        writer.writeAttribute(HTML.CLASS_ATTR, "foreground", null);
-        writer.writeAttribute(HTML.CELLSPACING_ATTR, "1", null);
-        writer.writeAttribute(HTML.CELLPADDING_ATTR, "0", null);
-        writer.writeAttribute(HTML.STYLE_ATTR, "width: 100%; height: 100%",
-                null);
-        writer.startElement(HTML.TR_ELEM, schedule);
-        writer.startElement(HTML.TD_ELEM, schedule);
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer
-                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
-                        null);
-        writer.endElement(HTML.DIV_ELEM);
-        writer.endElement(HTML.TD_ELEM);
-
-        float columnWidth = (schedule.getModel().size() == 0) ? 100
-                : (100 / schedule.getModel().size());
-
-        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
-                .hasNext();)
-        {
-            ScheduleDay day = (ScheduleDay) dayIterator.next();
-            writer.startElement(HTML.TD_ELEM, schedule);
-            writer.writeAttribute(HTML.CLASS_ATTR, "header", null);
-            writer
-                    .writeAttribute(
-                            HTML.STYLE_ATTR,
-                            "height: 31px; border-style: none; border-width: 0px; overflow: hidden;",
-                            null);
-            writer.writeAttribute(HTML.WIDTH_ATTR, String.valueOf(columnWidth)
-                    + "%", null);
-
-            writer.endElement(HTML.TD_ELEM);
-        }
-
-        writer.endElement(HTML.TR_ELEM);
-
-        writer.startElement(HTML.TR_ELEM, schedule);
-        writer.startElement(HTML.TD_ELEM, schedule);
-        writer.startElement(HTML.DIV_ELEM, schedule);
-        writer
-                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
-                        null);
-        writer.endElement(HTML.DIV_ELEM);
-        writer.endElement(HTML.TD_ELEM);
-    }
-
-    //~ Inner Classes ----------------------------------------------------------
-
-    private class EntryWrapper implements Comparable
-    {
-        //~ Static fields/initializers -----------------------------------------
-
-        private static final int HALF_HOUR = 1000 * 60 * 30;
-
-        //~ Instance fields ----------------------------------------------------
-
-        private final ScheduleDay day;
-        private final ScheduleEntry entry;
-        private final TreeSet overlappingEntries;
-        private int colspan;
-        private int column;
-
-        //~ Constructors -------------------------------------------------------
-
-        EntryWrapper(ScheduleEntry entry, ScheduleDay day)
-        {
-            this.entry = entry;
-            this.day = day;
-            this.column = 0;
-            this.colspan = 1;
-            this.overlappingEntries = new TreeSet();
-        }
-
-        //~ Methods ------------------------------------------------------------
-
-        /**
-         * @see java.lang.Comparable#compareTo(java.lang.Object)
-         */
-        public int compareTo(Object o)
-        {
-            return comparator.compare(entry, o);
-        }
-
-        /**
-         * @see java.lang.Object#equals(java.lang.Object)
-         */
-        public boolean equals(Object o)
-        {
-            if (o instanceof EntryWrapper)
-            {
-                EntryWrapper other = (EntryWrapper) o;
-
-                boolean returnboolean = (entry.getStartTime()
-                        .equals(other.entry.getStartTime()))
-                        && (entry.getEndTime().equals(other.entry.getEndTime()))
-                        && (entry.getId().equals(other.entry.getId()))
-                        && (day.equals(other.day));
-                /*
-                 new EqualsBuilder().append(
-                 entry.getStartTime(), other.entry.getStartTime()
-                 ).append(entry.getEndTime(), other.entry.getEndTime())
-                 .append(
-                 entry.getId(), other.entry.getId()
-                 ).append(day, other.day).isEquals();
-                 */
-                return returnboolean;
-            }
-
-            return false;
-        }
-
-        /**
-         * @see java.lang.Object#hashCode()
-         */
-        public int hashCode()
-        {
-            int returnint = entry.getStartTime().hashCode()
-                    ^ entry.getEndTime().hashCode() ^ entry.getId().hashCode();
-
-            return returnint;
-        }
-
-        /**
-         * <p>
-         * Determine the bounds of this entry, in CSS position attributes
-         * </p>
-         *
-         * @param schedule the schedule
-         * @param columnWidth the width of a column
-         *
-         * @return the bounds
-         */
-        String getBounds(HtmlSchedule schedule, float columnWidth)
-        {
-            float width = (columnWidth * colspan) - 0.5f;
-            float left = column * columnWidth;
-            Calendar cal = GregorianCalendar.getInstance();
-            cal.setTime(day.getDate());
-
-            int curyear = cal.get(Calendar.YEAR);
-            int curmonth = cal.get(Calendar.MONTH);
-            int curday = cal.get(Calendar.DATE);
-
-            cal.setTime(entry.getStartTime());
-            cal.set(curyear, curmonth, curday);
-
-            long startMillis = cal.getTimeInMillis();
-            cal.set(Calendar.HOUR_OF_DAY, schedule.getVisibleStartHour());
-            cal.set(Calendar.MINUTE, 0);
-            cal.set(Calendar.SECOND, 0);
-            cal.set(Calendar.MILLISECOND, 0);
-
-            long visibleStartMillis = cal.getTimeInMillis();
-            startMillis = day.equalsDate(entry.getStartTime()) ? Math.max(
-                    startMillis, visibleStartMillis) : visibleStartMillis;
-            cal.setTime(entry.getEndTime());
-            cal.set(curyear, curmonth, curday);
-
-            long endMillis = cal.getTimeInMillis();
-            cal.set(Calendar.HOUR_OF_DAY, schedule.getVisibleEndHour());
-            cal.set(Calendar.MINUTE, 0);
-            cal.set(Calendar.SECOND, 0);
-            cal.set(Calendar.MILLISECOND, 0);
-
-            long visibleEndMillis = cal.getTimeInMillis();
-            endMillis = day.equalsDate(entry.getEndTime()) ? Math.min(
-                    endMillis, visibleEndMillis) : visibleEndMillis;
-
-            int top = (int) (((startMillis - visibleStartMillis) * rowHeightInPixels) / HALF_HOUR);
-            int height = (int) (((endMillis - startMillis) * rowHeightInPixels) / HALF_HOUR);
-            StringBuffer buffer = new StringBuffer();
-            buffer.append("position: absolute; height: ");
-            buffer.append(height);
-            buffer.append("px; top: ");
-            buffer.append(top);
-            buffer.append("px; left: ");
-            buffer.append(left);
-            buffer.append("%; width: ");
-            buffer.append(width);
-            buffer
-                    .append("%; padding: 0px; overflow: hidden; border-width: 1.0px; border-style:solid;");
-
-            return buffer.toString();
-        }
-
-        /**
-         * <p>
-         * Can this entry fit in the specified column?
-         * </p>
-         *
-         * @param column the column
-         *
-         * @return whether the entry fits
-         */
-        boolean canFitInColumn(int column)
-        {
-            for (Iterator overlapIterator = overlappingEntries.iterator(); overlapIterator
-                    .hasNext();)
-            {
-                EntryWrapper overlap = (EntryWrapper) overlapIterator.next();
-
-                if (overlap.column == column)
-                {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-
-        /**
-         * <p>
-         * Does this entry overlap with another?
-         * </p>
-         *
-         * @param other the other entry
-         *
-         * @return whether the entries overlap
-         */
-        boolean overlaps(EntryWrapper other)
-        {
-            if ((entry.getStartTime() == null) || (entry.getEndTime() == null))
-            {
-                return false;
-            }
-
-            boolean returnboolean = (entry.getStartTime().before(
-                    other.entry.getEndTime()) && entry.getEndTime().after(
-                    other.entry.getStartTime()));
-
-            return returnboolean;
-        }
-    }
-}
-//The End
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.myfaces.custom.schedule.renderer;
+
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeSet;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIForm;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+
+import org.apache.myfaces.custom.schedule.HtmlSchedule;
+import org.apache.myfaces.custom.schedule.model.ScheduleDay;
+import org.apache.myfaces.custom.schedule.model.ScheduleEntry;
+import org.apache.myfaces.renderkit.html.HTML;
+
+/**
+ * <p>
+ * Renderer for the day and workweek views of the Schedule component
+ * </p>
+ *
+ * @author Jurgen Lust (latest modification by $Author$)
+ * @author Bruno Aranda (adaptation of Jurgen's code to myfaces)
+ * @version $Revision$
+ */
+public class ScheduleDetailedDayRenderer extends AbstractScheduleRenderer
+{
+    //~ Instance fields --------------------------------------------------------
+
+    private final int rowHeightInPixels = 22;
+
+    //~ Methods ----------------------------------------------------------------
+
+    /**
+     * @see javax.faces.render.Renderer#encodeBegin(javax.faces.context.FacesContext,
+     *      javax.faces.component.UIComponent)
+     */
+    public void encodeBegin(FacesContext context, UIComponent component)
+            throws IOException
+    {
+        if (!component.isRendered())
+        {
+            return;
+        }
+
+        super.encodeBegin(context, component);
+
+        HtmlSchedule schedule = (HtmlSchedule) component;
+        ResponseWriter writer = context.getResponseWriter();
+
+        //the number of rows in the grid is the number of half hours between
+        //visible start hour and visible end hour, plus 1 for the header
+        int numberOfRows = ((schedule.getVisibleEndHour() - schedule
+                .getVisibleStartHour()) * 2) + 1;
+
+        //the grid height = 22 pixels times the number of rows + 3, for the
+        //table border and the cellpadding
+        int gridHeight = (numberOfRows * 22) + 3 + 10;
+
+        //container div for the schedule grid
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "schedule-detailed", null);
+        writer.writeAttribute(HTML.STYLE_ATTR, "height: "
+                + String.valueOf(gridHeight) + "px; overflow: hidden;", null);
+        writeBackground(context, schedule, writer);
+        writeForegroundStart(context, schedule, writer);
+    }
+
+    /**
+     * @see javax.faces.render.Renderer#encodeChildren(javax.faces.context.FacesContext,
+     *      javax.faces.component.UIComponent)
+     */
+    public void encodeChildren(FacesContext context, UIComponent component)
+            throws IOException
+    {
+        if (!component.isRendered())
+        {
+            return;
+        }
+
+        HtmlSchedule schedule = (HtmlSchedule) component;
+        ResponseWriter writer = context.getResponseWriter();
+
+        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
+                .hasNext();)
+        {
+            ScheduleDay day = (ScheduleDay) dayIterator.next();
+            writer.startElement(HTML.TD_ELEM, schedule);
+            writer.writeAttribute(HTML.CLASS_ATTR, "column", null);
+            writer.writeAttribute(HTML.STYLE_ATTR, "height: 100%;", null);
+            writer.startElement(HTML.DIV_ELEM, schedule);
+            writer.writeAttribute(HTML.CLASS_ATTR, "column", null);
+            writer
+                    .writeAttribute(
+                            HTML.STYLE_ATTR,
+                            "position: relative; top: 0px; left: 0px; width: 100%; height: 100%; z-index: 0;",
+                            null);
+            writeEntries(context, schedule, day, writer);
+            writer.endElement(HTML.DIV_ELEM);
+            writer.endElement(HTML.TD_ELEM);
+        }
+    }
+
+    /**
+     * @see javax.faces.render.Renderer#encodeEnd(javax.faces.context.FacesContext,
+     *      javax.faces.component.UIComponent)
+     */
+    public void encodeEnd(FacesContext context, UIComponent component)
+            throws IOException
+    {
+        if (!component.isRendered())
+        {
+            return;
+        }
+
+        HtmlSchedule schedule = (HtmlSchedule) component;
+        ResponseWriter writer = context.getResponseWriter();
+
+        writeForegroundEnd(context, schedule, writer);
+        writer.endElement(HTML.DIV_ELEM);
+    }
+
+    private String getCellClass(HtmlSchedule schedule, int column, int row)
+    {
+        String cellClass = "free";
+        ScheduleDay day = (ScheduleDay) schedule.getModel().get(column);
+
+        if (!day.isWorkingDay())
+        {
+            return cellClass;
+        }
+
+        if (((schedule.getVisibleStartHour() + (row / 2)) >= schedule
+                .getWorkingStartHour())
+                && ((schedule.getVisibleStartHour() + (row / 2)) < schedule
+                        .getWorkingEndHour()))
+        {
+            cellClass = ((row % 2) == 0) ? "even" : "uneven";
+        }
+
+        return cellClass;
+    }
+
+    private boolean isSelected(HtmlSchedule schedule, EntryWrapper entry)
+    {
+        ScheduleEntry selectedEntry = schedule.getModel().getSelectedEntry();
+
+        if (selectedEntry == null)
+        {
+            return false;
+        }
+
+        boolean returnboolean = selectedEntry.getId().equals(
+                entry.entry.getId());
+
+        return returnboolean;
+    }
+
+    private void maximizeEntries(EntryWrapper[] entries, int numberOfColumns)
+    {
+        for (int i = 0; i < entries.length; i++)
+        {
+            EntryWrapper entry = entries[i];
+
+            //now see if we can expand the entry to the columns on the right
+            while (((entry.column + entry.colspan) < numberOfColumns)
+                    && entry.canFitInColumn(entry.column + entry.colspan))
+            {
+                entry.colspan++;
+            }
+        }
+    }
+
+    private void scanEntries(EntryWrapper[] entries, int index)
+    {
+        if (entries.length <= 0)
+        {
+            return;
+        }
+
+        EntryWrapper entry = entries[index];
+        entry.column = 0;
+
+        //see what columns are already taken
+        for (int i = 0; i < index; i++)
+        {
+            if (entry.overlaps(entries[i]))
+            {
+                entry.overlappingEntries.add(entries[i]);
+                entries[i].overlappingEntries.add(entry);
+            }
+        }
+
+        //find an available column
+        while (!entry.canFitInColumn(entry.column))
+        {
+            entry.column++;
+        }
+
+        //recursively scan the remaining entries for overlaps
+        if (++index < entries.length)
+        {
+            scanEntries(entries, index);
+        }
+    }
+
+    private void writeBackground(FacesContext context, HtmlSchedule schedule,
+            ResponseWriter writer) throws IOException
+    {
+        //a calendar component should always be inside a UIForm
+        UIForm parentForm = getParentForm(schedule);
+
+        if (parentForm == null)
+        {
+            throw new NullPointerException("No parent UIForm found");
+        }
+
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "background", null);
+        writer
+                .writeAttribute(
+                        HTML.STYLE_ATTR,
+                        "position: absolute;	left: 0px; top: 0px; width: 100%; height: 100%; z-index: 0;",
+                        null);
+
+        //background table for the schedule grid
+        writer.startElement(HTML.TABLE_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "background", null);
+        writer.writeAttribute(HTML.CELLPADDING_ATTR, "0", null);
+        writer.writeAttribute(HTML.CELLSPACING_ATTR, "1", null);
+        writer.writeAttribute(HTML.STYLE_ATTR, "width: 100%; height: 100%",
+                null);
+        writer.startElement(HTML.TBODY_ELEM, schedule);
+
+        //header row, containing the column names
+        writer.startElement(HTML.TR_ELEM, schedule);
+        writer.startElement(HTML.TD_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "gutter", null);
+        writer
+                .writeAttribute(
+                        HTML.STYLE_ATTR,
+                        "height: 21px; border-style: none; border-width: 0px; overflow: hidden; padding: 0px",
+                        null);
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer
+                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
+                        null);
+        writer.endElement(HTML.DIV_ELEM);
+        writer.endElement(HTML.TD_ELEM);
+
+        float columnWidth = (schedule.getModel().size() == 0) ? 100
+                : (100 / schedule.getModel().size());
+
+        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
+                .hasNext();)
+        {
+            ScheduleDay day = (ScheduleDay) dayIterator.next();
+            writer.startElement(HTML.TD_ELEM, schedule);
+            writer.writeAttribute(HTML.CLASS_ATTR, "header", null);
+            writer
+                    .writeAttribute(
+                            HTML.STYLE_ATTR,
+                            "height: 31px; border-style: none; border-width: 0px; overflow: hidden;",
+                            null);
+            writer.writeAttribute(HTML.WIDTH_ATTR, String.valueOf(columnWidth)
+                    + "%", null);
+            writer.startElement(HTML.DIV_ELEM, schedule);
+            writer
+                    .writeAttribute(
+                            HTML.STYLE_ATTR,
+                            "position: relative; left: 0px; top: 0px; width: 100%; height: 100%;",
+                            null);
+
+            //write the date
+            writer.startElement(HTML.SPAN_ELEM, schedule);
+            writer.writeAttribute(HTML.CLASS_ATTR, "date", null);
+            writer
+                    .writeAttribute(
+                            HTML.STYLE_ATTR,
+                            "position: absolute; left: 0px; top: 0px; height: 15px; width: 100%; vertical-align: top; overflow: hidden; white-space: nowrap;",
+                            null);
+            writer.writeText(getDateString(context, schedule, day.getDate()),
+                    null);
+            writer.endElement(HTML.SPAN_ELEM);
+
+            //write the name of the holiday, if there is one
+            if ((day.getSpecialDayName() != null)
+                    && (day.getSpecialDayName().length() > 0))
+            {
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "holiday", null);
+                writer
+                        .writeAttribute(
+                                HTML.STYLE_ATTR,
+                                "position: absolute; left: 0px; top: 15px; width: 100%; vertical-align: top; overflow: hidden; white-space: nowrap;",
+                                null);
+                writer.writeText(day.getSpecialDayName(), null);
+                writer.endElement(HTML.SPAN_ELEM);
+            }
+
+            writer.endElement(HTML.DIV_ELEM);
+            writer.endElement(HTML.TD_ELEM);
+        }
+
+        writer.endElement(HTML.TR_ELEM);
+
+        int numberOfRows = (schedule.getVisibleEndHour() - schedule
+                .getVisibleStartHour()) * 2;
+
+        for (int row = 0; row < numberOfRows; row++)
+        {
+            writer.startElement(HTML.TR_ELEM, schedule);
+
+            //write the hours of the day on the left
+            //this only happens on even rows, or every hour
+            if ((row % 2) == 0)
+            {
+                writer.startElement(HTML.TD_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "gutter", null);
+                writer
+                        .writeAttribute(
+                                HTML.STYLE_ATTR,
+                                "height: 21px; border-style: none; border-width: 0px; overflow: hidden; padding: 0px",
+                                null);
+                writer.writeAttribute("rowspan", "2", null);
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "hours", null);
+                writer.writeAttribute(HTML.STYLE_ATTR,
+                        "vertical-align: top; height: 100%; padding: 0px;",
+                        null);
+                writer.writeText(String.valueOf(schedule.getVisibleStartHour()
+                        + (row / 2)), null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "minutes", null);
+                writer.writeAttribute(HTML.STYLE_ATTR,
+                        "vertical-align: top; height: 100%; padding: 0px;",
+                        null);
+                writer.writeText("00", null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.endElement(HTML.TD_ELEM);
+            }
+
+            //write the cells of the day columns on this row
+            for (int column = 0; column < schedule.getModel().size(); column++)
+            {
+                writer.startElement(HTML.TD_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, getCellClass(schedule,
+                        column, row), null);
+                writer.writeAttribute(HTML.STYLE_ATTR,
+                        "overflow: hidden; height: 21px;", null);
+                writer.writeAttribute(HTML.WIDTH_ATTR, String
+                        .valueOf(columnWidth)
+                        + "%", null);
+                writer.write(HTML.NBSP_ENTITY);
+                writer.endElement(HTML.TD_ELEM);
+            }
+
+            writer.endElement(HTML.TR_ELEM);
+        }
+
+        writer.endElement(HTML.TBODY_ELEM);
+        writer.endElement(HTML.TABLE_ELEM);
+        writer.endElement(HTML.DIV_ELEM);
+    }
+
+    private void writeEntries(FacesContext context, HtmlSchedule schedule,
+            ScheduleDay day, ResponseWriter writer) throws IOException
+    {
+        TreeSet entrySet = new TreeSet();
+
+        for (Iterator entryIterator = day.iterator(); entryIterator.hasNext();)
+        {
+            entrySet.add(new EntryWrapper((ScheduleEntry) entryIterator.next(),
+                    day));
+        }
+
+        EntryWrapper[] entries = (EntryWrapper[]) entrySet
+                .toArray(new EntryWrapper[entrySet.size()]);
+
+        //determine overlaps
+        scanEntries(entries, 0);
+
+        //determine the number of columns within this day
+        int maxColumn = 0;
+
+        for (Iterator entryIterator = entrySet.iterator(); entryIterator
+                .hasNext();)
+        {
+            EntryWrapper wrapper = (EntryWrapper) entryIterator.next();
+            maxColumn = Math.max(wrapper.column, maxColumn);
+        }
+
+        int numberOfColumns = maxColumn + 1;
+
+        //make sure the entries take up all available space horizontally
+        maximizeEntries(entries, numberOfColumns);
+
+        //now determine the width in percent of 1 column
+        float columnWidth = 100 / numberOfColumns;
+
+        UIForm parentForm = getParentForm(schedule);
+
+        //and now draw the entries in the columns
+        for (Iterator entryIterator = entrySet.iterator(); entryIterator
+                .hasNext();)
+        {
+            EntryWrapper wrapper = (EntryWrapper) entryIterator.next();
+
+            if (isSelected(schedule, wrapper))
+            {
+                writer.startElement(HTML.DIV_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "entry-selected", null);
+                writer.writeAttribute(HTML.STYLE_ATTR, wrapper.getBounds(
+                        schedule, columnWidth), null);
+
+                //draw the tooltip
+                if (showTooltip(schedule))
+                {
+                    writer.writeAttribute("onmouseover", getTooltipText(
+                            wrapper.entry, schedule), null);
+                }
+
+                //draw the contents of the selected entry
+                writer.startElement(HTML.DIV_ELEM, null);
+                writer.writeAttribute(HTML.CLASS_ATTR, "text", null);
+                writer.writeAttribute(HTML.STYLE_ATTR,
+                        "height: 100%; width: 100%;", null);
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "title", null);
+                writer.writeText(wrapper.entry.getTitle(), null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.startElement("br", schedule);
+                writer.endElement("br");
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "subtitle", null);
+                writer.writeText(wrapper.entry.getSubtitle(), null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.endElement(HTML.DIV_ELEM);
+                writer.endElement(HTML.DIV_ELEM);
+            }
+            else
+            {
+                //if the schedule is read-only, the entries should not be
+                //hyperlinks
+                writer.startElement(
+                        schedule.isReadonly() ? HTML.DIV_ELEM : "a", schedule);
+
+                //draw the tooltip
+                if (showTooltip(schedule))
+                {
+                    writer.writeAttribute("onmouseover", getTooltipText(
+                            wrapper.entry, schedule), null);
+                }
+
+                if (!schedule.isReadonly())
+                {
+                    writer.writeAttribute("href", "#", null);
+
+                    String clientId = schedule.getClientId(context);
+                    StringBuffer mousedown = new StringBuffer();
+                    mousedown.append("document.forms['");
+                    mousedown.append(parentForm.getClientId(context));
+                    mousedown.append("']['");
+                    mousedown.append(clientId);
+                    mousedown.append("'].value='");
+                    mousedown.append(wrapper.entry.getId());
+                    mousedown.append("'; document.forms['");
+                    mousedown.append(parentForm.getClientId(context));
+                    mousedown.append("'].submit()");
+                    writer.writeAttribute("onmousedown", mousedown.toString(),
+                            null);
+                }
+
+                writer.writeAttribute(HTML.CLASS_ATTR, "entry", null);
+                writer.writeAttribute(HTML.STYLE_ATTR, wrapper.getBounds(
+                        schedule, columnWidth), null);
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "title", null);
+                writer.writeText(wrapper.entry.getTitle(), null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.startElement("br", schedule);
+                writer.endElement("br");
+                writer.startElement(HTML.SPAN_ELEM, schedule);
+                writer.writeAttribute(HTML.CLASS_ATTR, "subtitle", null);
+                writer.writeText(wrapper.entry.getSubtitle(), null);
+                writer.endElement(HTML.SPAN_ELEM);
+                writer.endElement(schedule.isReadonly() ? HTML.DIV_ELEM : "a");
+            }
+        }
+    }
+
+    private void writeForegroundEnd(FacesContext context,
+            HtmlSchedule schedule, ResponseWriter writer) throws IOException
+    {
+        writer.endElement(HTML.TR_ELEM);
+        writer.endElement(HTML.TABLE_ELEM);
+        writer.endElement(HTML.DIV_ELEM);
+    }
+
+    private void writeForegroundStart(FacesContext context,
+            HtmlSchedule schedule, ResponseWriter writer) throws IOException
+    {
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "foreground", null);
+        writer
+                .writeAttribute(
+                        HTML.STYLE_ATTR,
+                        "position: absolute;	left: 0px; top: 0px; width: 100%; height: 100%;	z-index: 2;",
+                        null);
+
+        writer.startElement(HTML.TABLE_ELEM, schedule);
+        writer.writeAttribute(HTML.CLASS_ATTR, "foreground", null);
+        writer.writeAttribute(HTML.CELLSPACING_ATTR, "1", null);
+        writer.writeAttribute(HTML.CELLPADDING_ATTR, "0", null);
+        writer.writeAttribute(HTML.STYLE_ATTR, "width: 100%; height: 100%",
+                null);
+        writer.startElement(HTML.TR_ELEM, schedule);
+        writer.startElement(HTML.TD_ELEM, schedule);
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer
+                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
+                        null);
+        writer.endElement(HTML.DIV_ELEM);
+        writer.endElement(HTML.TD_ELEM);
+
+        float columnWidth = (schedule.getModel().size() == 0) ? 100
+                : (100 / schedule.getModel().size());
+
+        for (Iterator dayIterator = schedule.getModel().iterator(); dayIterator
+                .hasNext();)
+        {
+            ScheduleDay day = (ScheduleDay) dayIterator.next();
+            writer.startElement(HTML.TD_ELEM, schedule);
+            writer.writeAttribute(HTML.CLASS_ATTR, "header", null);
+            writer
+                    .writeAttribute(
+                            HTML.STYLE_ATTR,
+                            "height: 31px; border-style: none; border-width: 0px; overflow: hidden;",
+                            null);
+            writer.writeAttribute(HTML.WIDTH_ATTR, String.valueOf(columnWidth)
+                    + "%", null);
+
+            writer.endElement(HTML.TD_ELEM);
+        }
+
+        writer.endElement(HTML.TR_ELEM);
+
+        writer.startElement(HTML.TR_ELEM, schedule);
+        writer.startElement(HTML.TD_ELEM, schedule);
+        writer.startElement(HTML.DIV_ELEM, schedule);
+        writer
+                .writeAttribute(HTML.STYLE_ATTR, "height: 1px; width: 56px",
+                        null);
+        writer.endElement(HTML.DIV_ELEM);
+        writer.endElement(HTML.TD_ELEM);
+    }
+
+    //~ Inner Classes ----------------------------------------------------------
+
+    private class EntryWrapper implements Comparable
+    {
+        //~ Static fields/initializers -----------------------------------------
+
+        private static final int HALF_HOUR = 1000 * 60 * 30;
+
+        //~ Instance fields ----------------------------------------------------
+
+        private final ScheduleDay day;
+        private final ScheduleEntry entry;
+        private final TreeSet overlappingEntries;
+        private int colspan;
+        private int column;
+
+        //~ Constructors -------------------------------------------------------
+
+        EntryWrapper(ScheduleEntry entry, ScheduleDay day)
+        {
+            this.entry = entry;
+            this.day = day;
+            this.column = 0;
+            this.colspan = 1;
+            this.overlappingEntries = new TreeSet();
+        }
+
+        //~ Methods ------------------------------------------------------------
+
+        /**
+         * @see java.lang.Comparable#compareTo(java.lang.Object)
+         */
+        public int compareTo(Object o)
+        {
+            return comparator.compare(entry, o);
+        }
+
+        /**
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        public boolean equals(Object o)
+        {
+            if (o instanceof EntryWrapper)
+            {
+                EntryWrapper other = (EntryWrapper) o;
+
+                boolean returnboolean = (entry.getStartTime()
+                        .equals(other.entry.getStartTime()))
+                        && (entry.getEndTime().equals(other.entry.getEndTime()))
+                        && (entry.getId().equals(other.entry.getId()))
+                        && (day.equals(other.day));
+                /*
+                 new EqualsBuilder().append(
+                 entry.getStartTime(), other.entry.getStartTime()
+                 ).append(entry.getEndTime(), other.entry.getEndTime())
+                 .append(
+                 entry.getId(), other.entry.getId()
+                 ).append(day, other.day).isEquals();
+                 */
+                return returnboolean;
+            }
+
+            return false;
+        }
+
+        /**
+         * @see java.lang.Object#hashCode()
+         */
+        public int hashCode()
+        {
+            int returnint = entry.getStartTime().hashCode()
+                    ^ entry.getEndTime().hashCode() ^ entry.getId().hashCode();
+
+            return returnint;
+        }
+
+        /**
+         * <p>
+         * Determine the bounds of this entry, in CSS position attributes
+         * </p>
+         *
+         * @param schedule the schedule
+         * @param columnWidth the width of a column
+         *
+         * @return the bounds
+         */
+        String getBounds(HtmlSchedule schedule, float columnWidth)
+        {
+            float width = (columnWidth * colspan) - 0.5f;
+            float left = column * columnWidth;
+            Calendar cal = GregorianCalendar.getInstance();
+            cal.setTime(day.getDate());
+
+            int curyear = cal.get(Calendar.YEAR);
+            int curmonth = cal.get(Calendar.MONTH);
+            int curday = cal.get(Calendar.DATE);
+
+            cal.setTime(entry.getStartTime());
+            cal.set(curyear, curmonth, curday);
+
+            long startMillis = cal.getTimeInMillis();
+            cal.set(Calendar.HOUR_OF_DAY, schedule.getVisibleStartHour());
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+
+            long visibleStartMillis = cal.getTimeInMillis();
+            startMillis = day.equalsDate(entry.getStartTime()) ? Math.max(
+                    startMillis, visibleStartMillis) : visibleStartMillis;
+            cal.setTime(entry.getEndTime());
+            cal.set(curyear, curmonth, curday);
+
+            long endMillis = cal.getTimeInMillis();
+            cal.set(Calendar.HOUR_OF_DAY, schedule.getVisibleEndHour());
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+
+            long visibleEndMillis = cal.getTimeInMillis();
+            endMillis = day.equalsDate(entry.getEndTime()) ? Math.min(
+                    endMillis, visibleEndMillis) : visibleEndMillis;
+
+            int top = (int) (((startMillis - visibleStartMillis) * rowHeightInPixels) / HALF_HOUR);
+            int height = (int) (((endMillis - startMillis) * rowHeightInPixels) / HALF_HOUR);
+            StringBuffer buffer = new StringBuffer();
+            buffer.append("position: absolute; height: ");
+            buffer.append(height);
+            buffer.append("px; top: ");
+            buffer.append(top);
+            buffer.append("px; left: ");
+            buffer.append(left);
+            buffer.append("%; width: ");
+            buffer.append(width);
+            buffer
+                    .append("%; padding: 0px; overflow: hidden; border-width: 1.0px; border-style:solid;");
+
+            return buffer.toString();
+        }
+
+        /**
+         * <p>
+         * Can this entry fit in the specified column?
+         * </p>
+         *
+         * @param column the column
+         *
+         * @return whether the entry fits
+         */
+        boolean canFitInColumn(int column)
+        {
+            for (Iterator overlapIterator = overlappingEntries.iterator(); overlapIterator
+                    .hasNext();)
+            {
+                EntryWrapper overlap = (EntryWrapper) overlapIterator.next();
+
+                if (overlap.column == column)
+                {
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        /**
+         * <p>
+         * Does this entry overlap with another?
+         * </p>
+         *
+         * @param other the other entry
+         *
+         * @return whether the entries overlap
+         */
+        boolean overlaps(EntryWrapper other)
+        {
+            if ((entry.getStartTime() == null) || (entry.getEndTime() == null))
+            {
+                return false;
+            }
+
+            boolean returnboolean = (entry.getStartTime().before(
+                    other.entry.getEndTime()) && entry.getEndTime().after(
+                    other.entry.getStartTime()));
+
+            return returnboolean;
+        }
+    }
+}
+//The End

Propchange: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/renderer/ScheduleDetailedDayRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css?rev=349804&r1=349803&r2=349804&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css Tue Nov 29 12:12:53 2005
@@ -1,294 +1,294 @@
-/* This is the default theme for the schedule and planner components */
-
-/* PART I: Detailed Day Renderer */
-
-div.schedule-detailed {
- 	border-style: solid;
-	border-width: 1px;
-	border-color: rgb(163,177,140);
-	position: relative;
-	width: 100%;
-	left: 0px;
-    right: 0px;
-}
-
-div.schedule-detailed table.background {
-    background-color: rgb(255,255,255);
-}
-
-div.schedule-detailed td.gutter {
-    background-color: rgb(205,214,198);
-    color: rgb(0,0,0);
-    text-align: right;
-    vertical-align: top;
-}
-
-div.schedule-detailed table.background td.header, div.schedule-detailed table.foreground td.header {
-    font-family: Verdana, Arial, Helvetica, Sans-Serif;
-    font-size: 10px;
-    color: rgb(0,0,0);
-    text-align: center;
-    vertical-align: middle;
-}
-
-div.schedule-detailed table.background td.header {
-    background-color: rgb(205,214,198);
-}
-
-div.schedule-detailed td.header span.date, div.schedule-detailed td.header span.holiday {
-  text-align: center;
-}
-
-div.schedule-detailed td.header span.date {
-}
-
-div.schedule-detailed td.header span.holiday {
-}
-
-div.schedule-detailed td.gutter span.hours {
-    font-size: 26px;
-}
-
-div.schedule-detailed td.gutter span.minutes {
-    font-size: 13px;
-}
-
-div.schedule-detailed table.background td.even,
-div.schedule-detailed table.background td.uneven,
-div.schedule-detailed table.background td.free {
-    font-family: Verdana, Arial, Helvetica, Sans-Serif;
-    font-size: 10px;
-    text-align: center;
-}
-
-div.schedule-detailed table.background td.uneven {
-    background-color: rgb(240,244,233);
-    color: rgb(240,244,233);
-}
-
-div.schedule-detailed table.background td.even {
-    background-color: rgb(235,239,228);
-    color: rgb(235,239,228);
-}
-
-div.schedule-detailed table.background td.free {
-	background-color: rgb(215,219,208);
-	color: rgb(215,219,208);
-}
-
-div.schedule-detailed .entry, div.schedule-detailed div.entry-selected {
-  background-color: rgb(255,255,255);
-  text-align: center;
-  font-family: Verdana, Arial, Helvetica, Sans-Serif;
-  font-size: 11px;
-  vertical-align: middle;
-  border-color: rgb(0,0,0);
-  text-decoration: none;
-}
-
-div.schedule-detailed a.entry:hover,
-div.schedule-detailed div.entry-selected {
-  border-color: rgb(153,204,51);
-}
-
-div.schedule-detailed div.entry-selected div.text {
-  border-left: solid rgb(153,204,51) 5.0px;
-}
-
-div.schedule-detailed .entry span.subtitle,
-div.schedule-detailed .entry-selected span.subtitle {
-	font-style: italic;
-	font-size: 9px;
-}
-
-div.schedule-detailed .entry span.title,
-div.schedule-detailed .entry-selected span.title {
-	font-size: 11px;
-}
-
-
-
-/* PART II: Compact Renderer */
-div.schedule-compact {
-	position: relative;
-	width: 100%;
-	left: 0px;
-	background-color: rgb(163,177,140);
-}
-
-div.schedule-compact table.day {
-  background-color: rgb(255,255,255);
-}
-
-div.schedule-compact table.day td.header {
-  background-color: rgb(205,214,198);
-  font-family: Verdana, Arial, Helvetica, Sans-Serif;
-  font-size: 10px;
-  color: rgb(0,0,0);
-  text-align: left;
-  vertical-align: middle;
-}
-
-div.schedule-compact td.content div {
-}
-
-div.schedule-compact td.content td {
-  background-color: rgb(255,255,255);
-  color: rgb(0,0,0);
-  text-align: left;
-  font-family: Verdana, Arial, Helvetica, Sans-Serif;
-  font-size: 11px;
-  padding: 1px;
-  border-color: rgb(255,255,255);
-  border-width: 1.0px;
-  border-style: solid;  
-}
-
-div.schedule-compact a {
-  text-decoration: none;
-  color: rgb(0,0,0);
-  text-align: left;
-  font-family: Verdana, Arial, Helvetica, Sans-Serif;
-  font-size: 11px;
-}
-
-div.schedule-compact td.content td.selected {
-  background-color: rgb(153,204,51);
-  border-color: rgb(153,204,51);
-}
-
-div.schedule-compact td.inactive-day td.content {
-  background-color: rgb(205,214,198);
-  visibility: visible;
-}
-
-div.schedule-compact td.inactive-day td.header {
-  background-color: rgb(205,214,198);
-  visibility: visible;
-}
-
-
-
-/* Part III: Planner renderer */
-div.planner {
- 	border-style: solid;
-	border-width: 1px;
-	border-color: rgb(163,177,140);
-	position: relative;
-	width: 100%;
-	left: 0px;
-}
-
-div.planner table.background {
-    background-color: rgb(255,255,255);
-}
-
-div.planner div.background td.gutter, div.planner div.foreground td.gutter {
-    color: rgb(0,0,0);
-    text-align: right;
-}
-
-div.planner div.background td.gutter {
-    background-color: rgb(205,214,198);
-}
-
-
-div.planner div.background td.header, div.planner div.foreground td.header, div.planner div.background td.hours {
-    font-family: Verdana, Arial, Helvetica, Sans-Serif;
-    font-size: 10px;
-    color: rgb(0,0,0);
-    text-align: center;
-    vertical-align: middle;
-    border-style: none;
-    border-width: 0px;
-}
-
-div.planner div.background td.hours {
-	border-color: rgb(255,255,255);
-    background-color: rgb(205,214,198);
-}
-
-div.planner div.foreground td.hours {
-    text-align: center;
-    vertical-align: middle;
-}
-
-div.planner div.background td.header {
-    background-color: rgb(205,214,198);
-}
-
-div.planner div.background div.header span.date {
-  text-align: left;
-  font-weight: bold;
-  vertical-align: top;
-}
-
-div.planner div.background div.header span.holiday {
-  text-align: left;
-  vertical-align: top;
-}
-
-div.planner div.background div.header span.hours {
-  text-align: left;
-  vertical-align: middle;
-}
-
-div.planner td.gutter span.title {
-    font-family: Verdana, Arial, Helvetica, Sans-Serif;
-    vertical-align: middle;
-    padding: 1px;
-    font-size: 10px;
-    font-weight: bold;
-}
-
-div.planner td.even, div.planner td.uneven, div.planner td.free {
-    border-color : rgb(255,255,255);
-    font-family: Verdana, Arial, Helvetica, Sans-Serif;
-    font-size: 10px;
-    text-align: center;
-}
-
-div.planner td.uneven {
-    background-color: rgb(240,244,233);
-    color: rgb(240,244,233);
-}
-
-div.planner td.even {
-    background-color: rgb(235,239,228);
-    color: rgb(235,239,228);
-}
-
-div.planner td.free {
-	background-color: rgb(215,219,208);
-	color: rgb(215,219,208);
-}
-
-div.planner table.foreground td.row {
-  border-color: rgb(255,255,255);
-}
-
-div.planner div.row div.entry {
-  background-color: rgb(0,0,255);
-  vertical-align: middle;
-  text-decoration: none;
-}
-
-
-
-/* PART IV: Tooltips */
-div.domTT {
-    border: 1px solid #333366;
-    background-color: #333366;
-}
-div.domTT .caption {
-    font-family: Verdana, Helvetica;
-    font-size: 10px;
-    font-weight: bold;
-    color: #FFFFFF;
-}
-div.domTT .contents {
-    font-size: 10px;
-    font-family: Verdana, Helvetica;
-    padding: 2px;
-    background-color: #F1F1FF;
-}
+/* This is the default theme for the schedule and planner components */
+
+/* PART I: Detailed Day Renderer */
+
+div.schedule-detailed {
+ 	border-style: solid;
+	border-width: 1px;
+	border-color: rgb(163,177,140);
+	position: relative;
+	width: 100%;
+	left: 0px;
+    right: 0px;
+}
+
+div.schedule-detailed table.background {
+    background-color: rgb(255,255,255);
+}
+
+div.schedule-detailed td.gutter {
+    background-color: rgb(205,214,198);
+    color: rgb(0,0,0);
+    text-align: right;
+    vertical-align: top;
+}
+
+div.schedule-detailed table.background td.header, div.schedule-detailed table.foreground td.header {
+    font-family: Verdana, Arial, Helvetica, Sans-Serif;
+    font-size: 10px;
+    color: rgb(0,0,0);
+    text-align: center;
+    vertical-align: middle;
+}
+
+div.schedule-detailed table.background td.header {
+    background-color: rgb(205,214,198);
+}
+
+div.schedule-detailed td.header span.date, div.schedule-detailed td.header span.holiday {
+  text-align: center;
+}
+
+div.schedule-detailed td.header span.date {
+}
+
+div.schedule-detailed td.header span.holiday {
+}
+
+div.schedule-detailed td.gutter span.hours {
+    font-size: 26px;
+}
+
+div.schedule-detailed td.gutter span.minutes {
+    font-size: 13px;
+}
+
+div.schedule-detailed table.background td.even,
+div.schedule-detailed table.background td.uneven,
+div.schedule-detailed table.background td.free {
+    font-family: Verdana, Arial, Helvetica, Sans-Serif;
+    font-size: 10px;
+    text-align: center;
+}
+
+div.schedule-detailed table.background td.uneven {
+    background-color: rgb(240,244,233);
+    color: rgb(240,244,233);
+}
+
+div.schedule-detailed table.background td.even {
+    background-color: rgb(235,239,228);
+    color: rgb(235,239,228);
+}
+
+div.schedule-detailed table.background td.free {
+	background-color: rgb(215,219,208);
+	color: rgb(215,219,208);
+}
+
+div.schedule-detailed .entry, div.schedule-detailed div.entry-selected {
+  background-color: rgb(255,255,255);
+  text-align: center;
+  font-family: Verdana, Arial, Helvetica, Sans-Serif;
+  font-size: 11px;
+  vertical-align: middle;
+  border-color: rgb(0,0,0);
+  text-decoration: none;
+}
+
+div.schedule-detailed a.entry:hover,
+div.schedule-detailed div.entry-selected {
+  border-color: rgb(153,204,51);
+}
+
+div.schedule-detailed div.entry-selected div.text {
+  border-left: solid rgb(153,204,51) 5.0px;
+}
+
+div.schedule-detailed .entry span.subtitle,
+div.schedule-detailed .entry-selected span.subtitle {
+	font-style: italic;
+	font-size: 9px;
+}
+
+div.schedule-detailed .entry span.title,
+div.schedule-detailed .entry-selected span.title {
+	font-size: 11px;
+}
+
+
+
+/* PART II: Compact Renderer */
+div.schedule-compact {
+	position: relative;
+	width: 100%;
+	left: 0px;
+	background-color: rgb(163,177,140);
+}
+
+div.schedule-compact table.day {
+  background-color: rgb(255,255,255);
+}
+
+div.schedule-compact table.day td.header {
+  background-color: rgb(205,214,198);
+  font-family: Verdana, Arial, Helvetica, Sans-Serif;
+  font-size: 10px;
+  color: rgb(0,0,0);
+  text-align: left;
+  vertical-align: middle;
+}
+
+div.schedule-compact td.content div {
+}
+
+div.schedule-compact td.content td {
+  background-color: rgb(255,255,255);
+  color: rgb(0,0,0);
+  text-align: left;
+  font-family: Verdana, Arial, Helvetica, Sans-Serif;
+  font-size: 11px;
+  padding: 1px;
+  border-color: rgb(255,255,255);
+  border-width: 1.0px;
+  border-style: solid;  
+}
+
+div.schedule-compact a {
+  text-decoration: none;
+  color: rgb(0,0,0);
+  text-align: left;
+  font-family: Verdana, Arial, Helvetica, Sans-Serif;
+  font-size: 11px;
+}
+
+div.schedule-compact td.content td.selected {
+  background-color: rgb(153,204,51);
+  border-color: rgb(153,204,51);
+}
+
+div.schedule-compact td.inactive-day td.content {
+  background-color: rgb(205,214,198);
+  visibility: visible;
+}
+
+div.schedule-compact td.inactive-day td.header {
+  background-color: rgb(205,214,198);
+  visibility: visible;
+}
+
+
+
+/* Part III: Planner renderer */
+div.planner {
+ 	border-style: solid;
+	border-width: 1px;
+	border-color: rgb(163,177,140);
+	position: relative;
+	width: 100%;
+	left: 0px;
+}
+
+div.planner table.background {
+    background-color: rgb(255,255,255);
+}
+
+div.planner div.background td.gutter, div.planner div.foreground td.gutter {
+    color: rgb(0,0,0);
+    text-align: right;
+}
+
+div.planner div.background td.gutter {
+    background-color: rgb(205,214,198);
+}
+
+
+div.planner div.background td.header, div.planner div.foreground td.header, div.planner div.background td.hours {
+    font-family: Verdana, Arial, Helvetica, Sans-Serif;
+    font-size: 10px;
+    color: rgb(0,0,0);
+    text-align: center;
+    vertical-align: middle;
+    border-style: none;
+    border-width: 0px;
+}
+
+div.planner div.background td.hours {
+	border-color: rgb(255,255,255);
+    background-color: rgb(205,214,198);
+}
+
+div.planner div.foreground td.hours {
+    text-align: center;
+    vertical-align: middle;
+}
+
+div.planner div.background td.header {
+    background-color: rgb(205,214,198);
+}
+
+div.planner div.background div.header span.date {
+  text-align: left;
+  font-weight: bold;
+  vertical-align: top;
+}
+
+div.planner div.background div.header span.holiday {
+  text-align: left;
+  vertical-align: top;
+}
+
+div.planner div.background div.header span.hours {
+  text-align: left;
+  vertical-align: middle;
+}
+
+div.planner td.gutter span.title {
+    font-family: Verdana, Arial, Helvetica, Sans-Serif;
+    vertical-align: middle;
+    padding: 1px;
+    font-size: 10px;
+    font-weight: bold;
+}
+
+div.planner td.even, div.planner td.uneven, div.planner td.free {
+    border-color : rgb(255,255,255);
+    font-family: Verdana, Arial, Helvetica, Sans-Serif;
+    font-size: 10px;
+    text-align: center;
+}
+
+div.planner td.uneven {
+    background-color: rgb(240,244,233);
+    color: rgb(240,244,233);
+}
+
+div.planner td.even {
+    background-color: rgb(235,239,228);
+    color: rgb(235,239,228);
+}
+
+div.planner td.free {
+	background-color: rgb(215,219,208);
+	color: rgb(215,219,208);
+}
+
+div.planner table.foreground td.row {
+  border-color: rgb(255,255,255);
+}
+
+div.planner div.row div.entry {
+  background-color: rgb(0,0,255);
+  vertical-align: middle;
+  text-decoration: none;
+}
+
+
+
+/* PART IV: Tooltips */
+div.domTT {
+    border: 1px solid #333366;
+    background-color: #333366;
+}
+div.domTT .caption {
+    font-family: Verdana, Helvetica;
+    font-size: 10px;
+    font-weight: bold;
+    color: #FFFFFF;
+}
+div.domTT .contents {
+    font-size: 10px;
+    font-family: Verdana, Helvetica;
+    padding: 2px;
+    background-color: #F1F1FF;
+}

Propchange: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/schedule/resource/css/default.css
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL