Re: [opennms-devel] [PATCH] Timezone support in OpenNMS

"Aaron Paxson" <[email protected]>
Newsgroups gmane.network.opennms.bugs
Message-ID <[email protected]>
Cool!!  I could use that feature.

On Feb 8, 2008 1:48 PM, Marc Petit-Huguenin <[email protected]> wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>
> We use OpenNMS on multiple data centers on different timezones and the
> sysadmins are also working from different timezones.  Because of this,
> we added in OpenNMS the possibility for a user to choose the timezone
> used to display date/time in the web application or in the emails
> received.  So we are submitting the attached patch for review and
> inclusion in the OpenNMS repository.
>
> The code is copyrighted 2008 8x8 Inc. and is released under the GPL
> license.  The code was written by Isabelle Dalmasso.
>
> The code was developed and tested on OpenNMS 1.3.9.  I will merge 1.3.10
> soon in our repository and can submit a new patch after this if needed.
>
> Thanks.
>
> - --
> Marc Petit-Huguenin           [                                 ]
> Home: [email protected] [RFC1855-compliant space for rent ]
> Work: [email protected]            [                                 ]
> [                                                               ]
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.6 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
>
> iD8DBQFHrLIi9RoMZyVa61cRAgwkAKCqvgPpl8czKwc+g1wbHxhhHtmGwACghThX
> xCp4vKKWZt9AbupLAW1JGeY=
> =OYzx
> -----END PGP SIGNATURE-----
>
> Index: opennms-config/src/main/castor/users.xsd
> ===================================================================
> --- opennms-config/src/main/castor/users.xsd    (.../external/current)
>  (revision 47)
> +++ opennms-config/src/main/castor/users.xsd    (.../trunk)     (revision
> 47)
> @@ -50,6 +50,8 @@
>
>         <element maxOccurs="1" minOccurs="1" name="password"
> type="string"/>
>
> +        <element maxOccurs="1" minOccurs="0" name="user-timezone"
> type="string"/>
> +
>         <element maxOccurs="unbounded" minOccurs="0" ref="this:contact"/>
>
>         <element maxOccurs="unbounded" minOccurs="0" name="duty-schedule"
> Index:
> opennms-services/src/main/java/org/opennms/netmgt/notifd/NotificationTask.java
> ===================================================================
> ---
> opennms-services/src/main/java/org/opennms/netmgt/notifd/NotificationTask.java
>      (.../external/current)  (revision 47)
> +++
> opennms-services/src/main/java/org/opennms/netmgt/notifd/NotificationTask.java
>      (.../trunk)     (revision 47)
> @@ -46,7 +46,11 @@
>  import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
> +import java.util.TimeZone;
> +import java.text.DateFormat;
> +import java.text.SimpleDateFormat;
>
> +
>  import org.apache.log4j.Category;
>  import org.exolab.castor.xml.MarshalException;
>  import org.exolab.castor.xml.ValidationException;
> @@ -213,6 +217,7 @@
>                 if (getUserManager().isUserOnDuty(m_user.getUserId(),
> Calendar.getInstance())) {
>                     // send the notice
>
> +                    replaceByUserTimezone(m_user.getUserTimezone());
>                     ExecutorStrategy command = null;
>                     String cntct = "";
>
> @@ -335,6 +340,36 @@
>         return value;
>     }
>
> +    private final static String MARKER = "--timeuser";
> +
> +    private void replaceByUserTimezone(String timezone) {
> +        for (String key : m_params.keySet())
> +        {
> +            if (m_params.get(key).indexOf(MARKER) != -1)
> +            {
> +                String finalText = m_params.get(key).replaceAll(MARKER,
> "");
> +                if (timezone != null && timezone.length() > 0)
> +                {
> +                    try
> +                    {
> +                        DateFormat formatter =
> DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
> +                        formatter.setTimeZone(TimeZone.getTimeZone(
> timezone.trim()));
> +
> +                        String dateToParse =
> m_params.get(key).split(MARKER)[1];
> +                        String finalDate = formatter.format(
> DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).parse(
> dateToParse.trim()));
> +                        finalText = finalText.replaceFirst(dateToParse,
> finalDate);
> +                    }
> +                    catch (Exception e)
> +                    {
> +                        log().error("Unexpected error to
> NotifcationTask", e);
> +                    }
> +                }
> +                m_params.put(key, finalText);
> +            }
> +        }
> +    }
> +
> +
>     public String getEmail() throws IOException, MarshalException,
> ValidationException {
>         return getContactInfo("email");
>     }
> Index:
> opennms-services/src/main/java/org/opennms/netmgt/config/UserManager.java
> ===================================================================
> ---
> opennms-services/src/main/java/org/opennms/netmgt/config/UserManager.java
> (.../external/current)  (revision 47)
> +++
> opennms-services/src/main/java/org/opennms/netmgt/config/UserManager.java
> (.../trunk)     (revision 47)
> @@ -394,7 +394,36 @@
>     }
>
>     /**
> +     * Get a User timezone
> +     *
> +     * @param userid the userid of the user to return
> +     * @return String the timezone.
>      */
> +
> +    public String getTimeZone(User user) throws IOException,
> MarshalException, ValidationException {
> +        if (user == null) return null;
> +        update();
> +
> +        return user.getUserTimezone();
> +    }
> +
> +    /**
> +     * Get a User timezone
> +     *
> +     * @param userid the userid of the user to return.
> +     * @return String the timezone.
> +     */
> +
> +    public String getTimeZone(String userid) throws IOException,
> MarshalException, ValidationException {
> +        if (userid == null) return null;
> +        update();
> +
> +        User user = (User) m_users.get(userid);
> +        return getTimeZone(user);
> +    }
> +
> +    /**
> +     */
>     public synchronized void saveUsers(Collection usersList) throws
> Exception {
>         // clear out the interanal structure and reload it
>         m_users.clear();
> Index:
> opennms-webapp/src/main/java/org/opennms/web/admin/users/UpdateUserServlet.java
> ===================================================================
> ---
> opennms-webapp/src/main/java/org/opennms/web/admin/users/UpdateUserServlet.java
>     (.../external/current)  (revision 47)
> +++
> opennms-webapp/src/main/java/org/opennms/web/admin/users/UpdateUserServlet.java
>     (.../trunk)     (revision 47)
> @@ -78,6 +78,7 @@
>             // get the rest of the user information from the form
>             newUser.setFullName(request.getParameter("fullName"));
>             newUser.setUserComments(request.getParameter("userComments"));
> +            newUser.setUserTimezone(request.getParameter
> ("userTimezone"));
>
>             String password = request.getParameter("password");
>             if (password != null && !password.trim().equals("")) {
> Index:
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneActionServlet.java
> ===================================================================
> ---
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneActionServlet.java
>      (.../external/current)  (revision 0)
> +++
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneActionServlet.java
>      (.../trunk)     (revision 47)
> @@ -0,0 +1,87 @@
> +//
> +// This file is part of the OpenNMS(R) Application.
> +//
> +// OpenNMS(R) is Copyright (C) 2002-2003 The OpenNMS Group, Inc.  All
> rights reserved.
> +// OpenNMS(R) is a derivative work, containing both original code,
> included code and modified
> +// code that was published under the GNU General Public License.
> Copyrights for modified
> +// and included code are below.
> +//
> +// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
> +//
> +// Modifications:
> +//
> +// Copyright (C) 2008 8x8 Inc.  All rights reserved.
> +//
> +// This program is free software; you can redistribute it and/or modify
> +// it under the terms of the GNU General Public License as published by
> +// the Free Software Foundation; either version 2 of the License, or
> +// (at your option) any later version.
> +//
> +// This program is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +// GNU General Public License for more details.
> +//
> +// You should have received a copy of the GNU General Public License
> +// along with this program; if not, write to the Free Software
> +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
> USA.
> +//
> +// For more information contact:
> +//      OpenNMS Licensing       <[email protected]>
> +//      http://www.opennms.org/
> +//      http://www.opennms.com/
> +//
> +
> +package org.opennms.web.account.selfService;
> +
> +import java.io.IOException;
> +
> +import javax.servlet.RequestDispatcher;
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import javax.servlet.http.HttpSession;
> +
> +import org.opennms.netmgt.config.UserFactory;
> +import org.opennms.netmgt.config.UserManager;
> +import org.opennms.netmgt.config.users.User;
> +
> +/**
> + * A servlet that handles changing a user's timezone
> + */
> +public class NewTimezoneActionServlet extends HttpServlet {
> +    private static final long serialVersionUID = 1L;
> +
> +    public void doPost(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
> +        try {
> +            UserFactory.init();
> +        } catch (Exception e) {
> +            throw new ServletException("NewTimezoneActionServlet: Error
> initializing user factory." + e);
> +        }
> +        HttpSession userSession = request.getSession(false);
> +        UserManager userFactory = UserFactory.getInstance();
> +
> +        User user = (User) userSession.getAttribute("user.newTimezone.jsp
> ");
> +        String newTimezone = request.getParameter("newTimezone");
> +
> +        if (user.getUserTimezone()!= null && user.getUserTimezone().equals(newTimezone))
> {
> +            RequestDispatcher dispatcher = this.getServletContext
> ().getRequestDispatcher("/account/selfService/newTimezone.jsp?action=redo");
> +            dispatcher.forward(request, response);
> +        } else {
> +            user.setUserTimezone(newTimezone);
> +
> +            userSession.setAttribute("user.newTimezone.jsp", user);
> +            try {
> +                userFactory.saveUser(user.getUserId(), user);
> +            }
> +            catch (Exception e) {
> +                throw new ServletException("Error saving user " +
> user.getUserId(), e);
> +            }
> +
> +            // forward the request for proper display
> +            RequestDispatcher dispatcher = this.getServletContext
> ().getRequestDispatcher("/account/selfService/timezoneChanged.jsp");
> +            dispatcher.forward(request, response);
> +        }
> +    }
> +}
> Index:
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneEntryServlet.java
> ===================================================================
> ---
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneEntryServlet.java
>       (.../external/current)  (revision 0)
> +++
> opennms-webapp/src/main/java/org/opennms/web/account/selfService/NewTimezoneEntryServlet.java
>       (.../trunk)     (revision 47)
> @@ -0,0 +1,80 @@
> +//
> +// This file is part of the OpenNMS(R) Application.
> +//
> +// OpenNMS(R) is Copyright (C) 2002-2003 The OpenNMS Group, Inc.  All
> rights reserved.
> +// OpenNMS(R) is a derivative work, containing both original code,
> included code and modified
> +// code that was published under the GNU General Public License.
> Copyrights for modified
> +// and included code are below.
> +//
> +// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
> +//
> +// Modifications:
> +//
> +// Copyright (C) 2008 8x8 Inc.  All rights reserved.
> +//
> +// This program is free software; you can redistribute it and/or modify
> +// it under the terms of the GNU General Public License as published by
> +// the Free Software Foundation; either version 2 of the License, or
> +// (at your option) any later version.
> +//
> +// This program is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +// GNU General Public License for more details.
> +//
> +// You should have received a copy of the GNU General Public License
> +// along with this program; if not, write to the Free Software
> +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
> USA.
> +//
> +// For more information contact:
> +//      OpenNMS Licensing       <[email protected]>
> +//      http://www.opennms.org/
> +//      http://www.opennms.com/
> +//
> +
> +package org.opennms.web.account.selfService;
> +
> +import java.io.IOException;
> +
> +import javax.servlet.RequestDispatcher;
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import javax.servlet.http.HttpSession;
> +
> +import org.opennms.netmgt.config.UserFactory;
> +import org.opennms.netmgt.config.UserManager;
> +import org.opennms.netmgt.config.users.User;
> +
> +/**
> + * A servlet that retrieves a user's password in preparation for changing
> the password
> + *
> + */
> +public class NewTimezoneEntryServlet extends HttpServlet {
> +    private static final long serialVersionUID = 1L;
> +
> +    public void doPost(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
> +        HttpSession userSession = request.getSession(false);
> +
> +        try {
> +            UserFactory.init();
> +        } catch (Exception e) {
> +            throw new ServletException("NewTimezoneEntryServlet: Error
> initializing user factory." + e);
> +        }
> +        UserManager userFactory = UserFactory.getInstance();
> +
> +        if (userSession != null) {
> +            String userid = request.getRemoteUser();
> +            try {
> +                User user = userFactory.getUser(userid);
> +                userSession.setAttribute("user.newTimezone.jsp", user);
> +            }
> +            catch (Exception e) {
> +                throw new ServletException("Couldn't initialize
> UserFactory", e);
> +            }
> +            RequestDispatcher dispatcher = this.getServletContext
> ().getRequestDispatcher("/account/selfService/newTimezone.jsp");
> +            dispatcher.forward(request, response);
> +        }
> +    }
> +}
> Index: opennms-webapp/src/main/java/org/opennms/web/Util.java
> ===================================================================
> --- opennms-webapp/src/main/java/org/opennms/web/Util.java
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/java/org/opennms/web/Util.java
>  (.../trunk)     (revision 47)
> @@ -48,6 +48,7 @@
>  import java.util.Iterator;
>  import java.util.Map;
>  import java.util.Set;
> +import java.util.TimeZone;
>  import java.util.TreeMap;
>
>  import javax.servlet.http.HttpServletRequest;
> @@ -565,4 +566,28 @@
>         return DateFormat.getDateTimeInstance(DateFormat.SHORT,
> DateFormat.MEDIUM).format(date);
>     }
>
> +    private final static String MARKER = "--timeuser";
> +    public static final String formatMessageToUserTZ(String message,
> String timezone) {
> +        if (message.indexOf(MARKER) == -1) return new String(message);
> +
> +        String finalText = message.replaceAll(MARKER, "");
> +        if (timezone != null && timezone.length() > 0)
> +        {
> +            try
> +            {
> +                DateFormat formatter = DateFormat.getDateTimeInstance(
> DateFormat.FULL, DateFormat.FULL);
> +                formatter.setTimeZone(TimeZone.getTimeZone(timezone.trim
> ()));
> +
> +                String dateToParse = message.split(MARKER)[1];
> +                String finalDate = formatter.format(
> DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL).parse(
> dateToParse.trim()));
> +                finalText = finalText.replaceFirst(dateToParse,
> finalDate);
> +            }
> +            catch (Exception e)
> +            {
> +                e.printStackTrace();
> +            }
> +        }
> +    return finalText;
> +    }
> +
>  }
> Index: opennms-webapp/src/main/webapp/outage/list.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/outage/list.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/outage/list.jsp      (.../trunk)
> (revision 47)
> @@ -183,7 +183,7 @@
>
>           <!-- lost service time -->
>           <td class="noWrap">
> -           <fmt:formatDate value="${outage.lostServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${outage.lostServiceTime}"
> type="time" pattern="HH:mm:ss"/>
> +           <fmt:formatDate value="${outage.lostServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${outage.lostServiceTime}"
> type="time" pattern="HH:mm:ss z"/>
>               <a href="<%=OutageUtil.makeLink( request, parms, new
> LostServiceDateAfterFilter(outages[i].getLostServiceTime()), true)%>"
> title="Only show outages beginning after this one"><%=AFTER_ICON%></a>
>               <a href="<%=OutageUtil.makeLink( request, parms, new
> LostServiceDateBeforeFilter(outages[i].getLostServiceTime()), true)%>"
> title="Only show outages beginning before this one"><%=BEFORE_ICON%></a>
>           </td>
> @@ -192,7 +192,7 @@
>           <% Date regainedTime = outages[i].getRegainedServiceTime(); %>
>           <% if(regainedTime != null ) { %>
>             <td class="noWrap">
> -           <fmt:formatDate value="${outage.regainedServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss"/>
> +           <fmt:formatDate value="${outage.regainedServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss z"/>
>                 <a href="<%=OutageUtil.makeLink( request, parms, new
> RegainedServiceDateAfterFilter(outages[i].getRegainedServiceTime()),
> true)%>" title="Only show outages resolving after this
> one"><%=AFTER_ICON%></a>
>                 <a href="<%=OutageUtil.makeLink( request, parms, new
> RegainedServiceDateBeforeFilter(outages[i].getRegainedServiceTime()),
> true)%>" title="Only show outages resolving before this
> one"><%=BEFORE_ICON%></a>
>             </td>
> Index: opennms-webapp/src/main/webapp/outage/current.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/outage/current.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/outage/current.jsp   (.../trunk)
> (revision 47)
> @@ -160,7 +160,7 @@
>
>                   <td><a
> href="element/service.jsp?node=<%=nodeId%>&intf=<%=ipAddr%>&service=<%=
> outage.getServiceId()%>"><%=outage.getServiceName()%></a></td>
>                  <td>
> -                 <fmt:formatDate value="${outage.timeDown}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${outage.timeDown}"
> type="time" pattern="HH:mm:ss"/>
> +                 <fmt:formatDate value="${outage.timeDown}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${outage.timeDown}"
> type="time" pattern="HH:mm:ss z"/>
>                  </td>
>                   <td><a
> href="outage/detail.jsp?id=<%=outageId%>"><%=outageId%></a></td>
>                 </tr>
> Index: opennms-webapp/src/main/webapp/outage/detail.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/outage/detail.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/outage/detail.jsp    (.../trunk)
> (revision 47)
> @@ -48,9 +48,7 @@
>        "
>  %>
>
> -<%!
> -    public static DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance
> (DateFormat.SHORT, DateFormat.MEDIUM);
> -%>
> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
>
>  <%
>     String outageIdString = request.getParameter( "id" );
> @@ -73,6 +71,7 @@
>     if( outage == null ) {
>         throw new org.opennms.web.outage.OutageIdNotFoundException( "An
> outage with this id was not found.", String.valueOf(outageId) );
>     }
> +    pageContext.setAttribute("outage", outage);
>
>     String action = null;
>     String buttonName=null;
> @@ -101,8 +100,7 @@
>           </td>
>
>           <td class="standardheader"
> width="10%">Lost&nbsp;Service&nbsp;Time:</td>
> -          <td class="standard"><%=DATE_FORMAT.format(
> outage.getLostServiceTime())%></td>
> -
> +          <td class="standard"><fmt:formatDate value="${
> outage.lostServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${outage.lostServiceTime}"
> type="time" pattern="HH:mm:ss z" /></td>
>           <td class="standardheader"
> width="10%">Lost&nbsp;Service&nbsp;Event:</td>
>           <td class="standard"><a href="event/detail.jsp?id=<%=
> outage.getLostServiceEventId()%>"><%=outage.getLostServiceEventId
> ()%></a></td>
>
> @@ -126,7 +124,7 @@
>             <% Date regainTime = outage.getRegainedServiceTime(); %>
>
>             <% if(regainTime != null) { %>
> -              <%=DATE_FORMAT.format(regainTime)%>
> +                <fmt:formatDate value="${outage.regainedServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss z" />
>             <% } else { %>
>               <% String label = OutageUtil.getStatusLabel(outage); %>
>               <%=(label == null) ? "&nbsp;" : label %>
> Index: opennms-webapp/src/main/webapp/notification/list.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/notification/list.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/notification/list.jsp
>  (.../trunk)     (revision 47)
> @@ -43,9 +43,10 @@
>  <%@page language="java"
>        contentType="text/html"
>        session="true"
> -       import="org.opennms.web.notification.*,
> +       import="java.util.*,
> +               org.opennms.web.notification.*,
>                org.opennms.web.event.*,
> -               org.opennms.web.MissingParameterException,
> +               org.opennms.web.MissingParameterException,
>                org.opennms.web.acegisecurity.Authentication
>        "
>  %>
> @@ -62,7 +63,16 @@
>         throw new MissingParameterException( "username" );
>     }
>
> -    Notification[] notices = this.model.getOutstandingNotices( username
> );
> +    Notification[] notices = this.model.getOutstandingNotices( username
> );
> +    String userTimezone = TimeZone.getDefault().getID();
> +    try {
> +        TimeZone tz =
> (TimeZone)javax.servlet.jsp.jstl.core.Config.find(pageContext,
> javax.servlet.jsp.jstl.core.Config.FMT_TIME_ZONE);
> +        if (tz != null) {
> +            userTimezone = tz.getID();
> +        }
> +    }
> +    catch (Exception e) {
> +    }
>  %>
>
>  <jsp:include page="/includes/header.jsp" flush="false" >
> @@ -145,7 +155,7 @@
>       <td><a
> href="event/detail.jsp?id=<%=notices[i].getEventId()%>"><%=notices[i].getEventId()%></a></td>
>       <td class="bright"><%=eventSeverity%></td>
>       <td class="noWrap"><%=notices[i].getTimeSent()%></td>
> -      <td><%=notices[i].getTextMessage()%></td>
> +      <td><%=org.opennms.web.Util.formatMessageToUserTZ(notices[i].getTextMessage(),
> userTimezone)%></td>
>     </tr>
>   <% } %>
>  </table>
> Index: opennms-webapp/src/main/webapp/notification/detail.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/notification/detail.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/notification/detail.jsp
>  (.../trunk)     (revision 47)
> @@ -43,12 +43,15 @@
>        contentType="text/html"
>        session="true"
>        import="java.util.*,
> +               org.opennms.web.*,
>                org.opennms.web.notification.*,
>                org.opennms.web.element.*,
>                 org.opennms.web.event.*
>        "
>  %>
>
> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
> +
>  <%!
>     NotificationModel model = new NotificationModel();
>  %>
> @@ -69,6 +72,7 @@
>     }
>
>     Notification notice = this.model.getNoticeInfo(noticeID);
> +    pageContext.setAttribute("notice", notice);
>
>     if( notice == null ) {
>         throw new NoticeIdNotFoundException("An notice with this id was
> not found.", String.valueOf(noticeID));
> @@ -81,6 +85,16 @@
>        eventSeverity = new String("Cleared");
>     }
>
> +    String userTimezone = TimeZone.getDefault().getID();
> +    try {
> +        TimeZone tz =
> (TimeZone)javax.servlet.jsp.jstl.core.Config.find(pageContext,
> javax.servlet.jsp.jstl.core.Config.FMT_TIME_ZONE);
> +        if (tz != null) {
> +            userTimezone = tz.getID();
> +        }
> +    }
> +    catch (Exception e) {
> +    }
> +
>  %>
>
>  <jsp:include page="/includes/header.jsp" flush="false" >
> @@ -107,9 +121,9 @@
>  <table>
>   <tr class="<%=eventSeverity%>">
>     <td width="15%">Notification Time</td>
> -    <td width="17%"><%=org.opennms.netmgt.EventConstants.formatToUIString
> (notice.getTimeSent())%></td>
> +    <td width="17%"><fmt:formatDate value="${notice.timeSent}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> notice.timeSent}" type="time" pattern="HH:mm:ss z" /></td>
>     <td width="15%">Time&nbsp;Replied</td>
> -    <td width="17%"><%=notice.getTimeReplied()!=null ?
> org.opennms.netmgt.EventConstants.formatToUIString(notice.getTimeReplied())
> : "&nbsp"%></td>
> +    <td width="17%"><fmt:formatDate value="${notice.timeReplied}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> notice.timeReplied}" type="time" pattern="HH:mm:ss z" /></td>
>     <td width="15%">Responder</td>
>     <td width="17%"><%=notice.getResponder()!=null ? notice.getResponder()
> : "&nbsp"%></td>
>   </tr>
> @@ -175,7 +189,7 @@
>       </tr>
>
>       <tr class="<%=eventSeverity%>">
> -        <td><%=notice.getTextMessage()%></td>
> +        <td><%=org.opennms.web.Util.formatMessageToUserTZ(
> notice.getTextMessage(), userTimezone)%></td>
>       </tr>
>     <% } %>
>   </table>
> @@ -193,12 +207,13 @@
>
>   <% List sentToList = notice.getSentTo(); %>
>   <%  for (int i=0; i < sentToList.size(); i++) { %>
> -    <%  NoticeSentTo sentTo = (NoticeSentTo)sentToList.get(i); %>
> -
> +    <%  NoticeSentTo sentTo = (NoticeSentTo)sentToList.get(i);
> +        pageContext.setAttribute("notice", sentTo);
> +    %>
>     <tr class="<%=eventSeverity%>">
>       <td><%=sentTo.getUserId()%></td>
>
> -      <td><%=org.opennms.netmgt.EventConstants.formatToUIString(
> sentTo.getTime())%></td>
> +      <td><fmt:formatDate value="${notice.time}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${notice.time}"
> type="time" pattern="HH:mm:ss z" /></td>
>
>       <td>
>         <% if (sentTo.getMedia()!=null &&
> !sentTo.getMedia().trim().equals("")) { %>
> Index: opennms-webapp/src/main/webapp/notification/acknowledge.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/notification/acknowledge.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/notification/acknowledge.jsp
> (.../trunk)     (revision 47)
> @@ -84,6 +84,17 @@
>     for (int i = 0; i < noticeIds.length; i++) {
>         notices[i] = this.model.getNoticeInfo(Integer.parseInt
> (noticeIds[i]));
>     }
> +
> +    String userTimezone = java.util.TimeZone.getDefault().getID();
> +    try {
> +        java.util.TimeZone tz = (java.util.TimeZone)javax.servlet.jsp.jstl.core.Config.find(pageContext,
> javax.servlet.jsp.jstl.core.Config.FMT_TIME_ZONE);
> +        if (tz != null) {
> +            userTimezone = tz.getID();
> +        }
> +    }
> +    catch (Exception e) {
> +    }
> +
>  %>
>
>  <jsp:include page="/includes/header.jsp" flush="false" >
> @@ -158,7 +169,7 @@
>     <%if (notices[i].getTextMessage() != null) { %>
>       <tr class="<%=eventSeverity%>">
>         <td colspan="6">
> -          <%=notices[i].getTextMessage()%>
> +          <%=org.opennms.web.Util.formatMessageToUserTZ(notices[i].getTextMessage(),
> userTimezone)%>
>         </td>
>       </tr>
>     <% } %>
> Index: opennms-webapp/src/main/webapp/notification/browser.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/notification/browser.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/notification/browser.jsp
> (.../trunk)     (revision 47)
> @@ -55,6 +55,8 @@
>        "
>  %>
>
> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
> +
>  <%--
>   This page is written to be the display (view) portion of the
> NotificationQueryServlet
>   at the /notification/list URL.  It will not work by itself, as it
> requires two request
> @@ -97,7 +99,17 @@
>     HashMap nodeLabelMap = new HashMap();
>
>     //useful constant strings
> -    String addPositiveFilterString = "[+]";
> +    String addPositiveFilterString = "[+]";
> +    String userTimezone = TimeZone.getDefault().getID();
> +    try {
> +        TimeZone tz =
> (TimeZone)javax.servlet.jsp.jstl.core.Config.find(pageContext,
> javax.servlet.jsp.jstl.core.Config.FMT_TIME_ZONE);
> +        if (tz != null) {
> +            userTimezone = tz.getID();
> +        }
> +    }
> +    catch (Exception e) {
> +    }
> +
>  %>
>
>  <jsp:include page="/includes/header.jsp" flush="false" >
> @@ -239,7 +251,8 @@
>         </tr>
>       </thead>
>
> -      <% for( int i=0; i < notices.length; i++ ) {
> +      <% for( int i=0; i < notices.length; i++ ) {
> +               pageContext.setAttribute("notice", notices[i]);
>         Event event = EventFactory.getEvent( notices[i].getEventId() );
>         String eventSeverity = EventUtil.getSeverityLabel(
> event.getSeverity());%>
>         <tr class="<%=eventSeverity%>">
> @@ -254,7 +267,7 @@
>             <% } %>
>           </td>
>           <td class="bright divider" rowspan="2"><%=eventSeverity%></td>
> -          <td class="divider"><%=
> org.opennms.netmgt.EventConstants.formatToUIString
> (notices[i].getTimeSent())%></td>
> +          <td class="divider"><fmt:formatDate value="${notice.timeSent}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> notice.timeSent}" type="time" pattern="HH:mm:ss z" /></td>
>           <td class="divider"><% NoticeFactory.Filter responderFilter =
> new NoticeFactory.ResponderFilter(notices[i].getResponder()); %>
>             <% if(notices[i].getResponder()!=null) {%>
>               <%=notices[i].getResponder()%>
> @@ -265,9 +278,9 @@
>           </td>
>           <td class="divider">
>             <%if (notices[i].getTimeReplied()!=null) { %>
> -              <%=org.opennms.netmgt.EventConstants.formatToUIString
> (notices[i].getTimeReplied())%>
> +                <fmt:formatDate value="${notice.timeReplied}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${notice.timeSent}"
> type="time" pattern="HH:mm:ss z" />
>             <% } %>
> -                                       </td>
> +          </td>
>           <td class="divider">
>             <% if(notices[i].getNodeId() != 0 ) { %>
>               <% NoticeFactory.Filter nodeFilter = new
> NoticeFactory.NodeFilter(notices[i].getNodeId()); %>
> @@ -306,7 +319,7 @@
>           </td>
>         </tr>
>         <tr class="<%=eventSeverity%>">
> -          <td colspan="6"><%=notices[i].getTextMessage()%></td>
> +          <td colspan="6"><%=org.opennms.web.Util.formatMessageToUserTZ(notices[i].getTextMessage(),
> userTimezone)%></td>
>         </tr>
>       <% } /*end for*/%>
>       </table>
> Index: opennms-webapp/src/main/webapp/alarm/list-long.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/alarm/list-long.jsp (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/alarm/list-long.jsp  (.../trunk)
> (revision 47)
> @@ -365,14 +365,14 @@
>             <% } %>
>           </td>
>           <td class="divider">
> -            <nobr><span title="Event <%= alarms[i].getLastEventID()
> %>"><a href="event/detail.jsp?id=<%= alarms[i].getLastEventID()
> %>"><fmt:formatDate value="${alarm.lastEventTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${alarm.lastEventTime}"
> type="time" pattern="HH:mm:ss"/></a></span></nobr>
> +            <nobr><span title="Event <%= alarms[i].getLastEventID()
> %>"><a href="event/detail.jsp?id=<%= alarms[i].getLastEventID()
> %>"><fmt:formatDate value="${alarm.lastEventTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${alarm.lastEventTime}"
> type="time" pattern="HH:mm:ss z"/></a></span></nobr>
>             <nobr>
>               <a href="<%=this.makeLink( parms, new
> AfterLastEventTimeFilter(alarms[i].getLastEventTime()), true)%>"
>  class="filterLink" title="Only show alarms occurring after this
> one">${addAfterFilter}</a>
>               <a href="<%=this.makeLink( parms, new
> BeforeLastEventTimeFilter(alarms[i].getLastEventTime()), true)%>"
> class="filterLink" title="Only show alarms occurring before this
> one">${addBeforeFilter}</a>
>             </nobr>
>           </td>
>           <td class="divider">
> -            <nobr><fmt:formatDate value="${alarm.firstEventTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.firstEventTime}" type="time" pattern="HH:mm:ss"/></nobr>
> +            <nobr><fmt:formatDate value="${alarm.firstEventTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.firstEventTime}" type="time" pattern="HH:mm:ss z"/></nobr>
>             <nobr>
>               <a href="<%=this.makeLink( parms, new
> AfterFirstEventTimeFilter(alarms[i].getFirstEventTime()), true)%>"
>  class="filterLink" title="Only show alarms occurring after this
> one">${addAfterFilter}</a>
>               <a href="<%=this.makeLink( parms, new
> BeforeFirstEventTimeFilter(alarms[i].getFirstEventTime()), true)%>"
> class="filterLink" title="Only show alarms occurring before this
> one">${addBeforeFilter}</a>
> @@ -396,7 +396,12 @@
>           </td>
>
>           <td colspan="2">
> -            Ackd Time: <%=alarms[i].isAcknowledged() ?
> org.opennms.netmgt.EventConstants.formatToUIString(alarms[i].getAcknowledgeTime())
> : "&nbsp;"%>
> +            Ackd Time: <% if (alarms[i].isAcknowledged()) { %>
> +                <fmt:formatDate value="${alarm.acknowledgeTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.acknowledgeTime}" type="time" pattern="HH:mm:ss z"/>
> +            <% } else { %>
> +              &nbsp;
> +            <% } %>
> +
>           </td>
>                                <td colspan="3">
>             <% if(alarms[i].getUei() != null) { %>
> Index: opennms-webapp/src/main/webapp/alarm/list.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/alarm/list.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/alarm/list.jsp       (.../trunk)
> (revision 47)
> @@ -377,13 +377,13 @@
>             <% } %>
>           </td>
>           <td class="divider">
> -            <nobr><span title="Event <%= alarms[i].getLastEventID()
> %>"><a href="event/detail.jsp?id=<%= alarms[i].getLastEventID()
> %>"><fmt:formatDate value="${alarm.lastEventTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${alarm.lastEventTime}"
> type="time" pattern="HH:mm:ss"/></a></span></nobr>
> +            <nobr><span title="Event <%= alarms[i].getLastEventID()
> %>"><a href="event/detail.jsp?id=<%= alarms[i].getLastEventID()
> %>"><fmt:formatDate value="${alarm.lastEventTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${alarm.lastEventTime}"
> type="time" pattern="HH:mm:ss z"/></a></span></nobr>
>             <nobr>
>               <a href="<%=this.makeLink( parms, new
> AfterLastEventTimeFilter(alarms[i].getLastEventTime()), true)%>"
>  class="filterLink" title="Only show alarms occurring after this
> one">${addAfterFilter}</a>
>               <a href="<%=this.makeLink( parms, new
> BeforeLastEventTimeFilter(alarms[i].getLastEventTime()), true)%>"
> class="filterLink" title="Only show alarms occurring before this
> one">${addBeforeFilter}</a>
>             </nobr>
>           <br />
> -            <nobr><fmt:formatDate value="${alarm.firstEventTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.firstEventTime}" type="time" pattern="HH:mm:ss"/></nobr>
> +            <nobr><fmt:formatDate value="${alarm.firstEventTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.firstEventTime}" type="time" pattern="HH:mm:ss z"/></nobr>
>             <nobr>
>               <a href="<%=this.makeLink( parms, new
> AfterFirstEventTimeFilter(alarms[i].getFirstEventTime()), true)%>"
>  class="filterLink" title="Only show alarms occurring after this
> one">${addAfterFilter}</a>
>               <a href="<%=this.makeLink( parms, new
> BeforeFirstEventTimeFilter(alarms[i].getFirstEventTime()), true)%>"
> class="filterLink" title="Only show alarms occurring before this
> one">${addBeforeFilter}</a>
> Index: opennms-webapp/src/main/webapp/alarm/detail.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/alarm/detail.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/alarm/detail.jsp     (.../trunk)
> (revision 47)
> @@ -47,6 +47,7 @@
>  %>
>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
>  <%@ taglib tagdir="/WEB-INF/tags/form" prefix="form" %>
> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
>
>  <%!
>
> @@ -128,7 +129,8 @@
>         </tr>
>         <tr class="<%=AlarmUtil.getSeverityLabel(alarm.getSeverity())%>">
>           <th>Last Event</th>
> -          <td><span title="Event <%= alarm.getLastEventID() %>"><a
> href="event/detail.jsp?id=<%= alarm.getLastEventID() %>"><%=
> org.opennms.netmgt.EventConstants.formatToUIString(alarm.getLastEventTime
> ())%></a></span></td>
> +          <td><span title="Event <%= alarm.getLastEventID() %>"><a
> href="event/detail.jsp?id=<%= alarm.getLastEventID() %>">
> +                 <fmt:formatDate value="${alarm.lastEventTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.lastEventTime}" type="time" pattern="HH:mm:ss z" /></a></span></td>
>           <th>Interface</th>
>           <td>
>             <% if( alarm.getIpAddress() != null ) { %>
> @@ -142,11 +144,11 @@
>             <% } %>
>           </td>
>           <th>Time&nbsp;Acknowledged</th>
> -          <td><%=alarm.getAcknowledgeTime()!=null ?
> org.opennms.netmgt.EventConstants.formatToUIString(
> alarm.getAcknowledgeTime()) : "&nbsp"%></td>
> +          <td><fmt:formatDate value="${alarm.acknowledgeTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> alarm.acknowledgeTime}" type="time" pattern="HH:mm:ss z" /></td>
>         </tr>
>         <tr class="<%=AlarmUtil.getSeverityLabel(alarm.getSeverity())%>">
>           <th>First Event</th>
> -          <td><%=org.opennms.netmgt.EventConstants.formatToUIString(
> alarm.getFirstEventTime())%></td>
> +          <td><fmt:formatDate value="${alarm.firstEventTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${alarm.firstEventTime}"
> type="time" pattern="HH:mm:ss z" /></td>
>           <th>Service</th>
>           <td>
>             <% if( alarm.getServiceName() != null ) { %>
> Index: opennms-webapp/src/main/webapp/includes/header.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/header.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/header.jsp  (.../trunk)
> (revision 47)
> @@ -20,7 +20,7 @@
>  <%@page language="java"
>        contentType="text/html"
>        session="true"
> -       import="org.opennms.netmgt.config.NotifdConfigFactory"
> +       import="org.opennms.netmgt.config.*"
>  %>
>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
>  <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
> @@ -30,20 +30,38 @@
>     public void init() throws ServletException {
>         try {
>             NotifdConfigFactory.init();
> +            UserFactory.init();
>         } catch (Throwable t) {
> -           // notice status will be unknown if the factory can't be
> initialized
> -       }
> +        // notice status will be unknown if the factory can't be
> initialized
> +        }
>     }
>  %>
>
>  <%
>     String noticeStatus;
> +    String userTimezone = null;
>     try {
>         noticeStatus = NotifdConfigFactory.getPrettyStatus();
>     } catch (Throwable t) {
>         noticeStatus = "<font color=\"ff0000\">Unknown</font>";
>     }
>     pageContext.setAttribute("noticeStatus", noticeStatus);
> +    try {
> +        UserManager userManager = UserFactory.getInstance();
> +        if (userManager != null) {
> +            String user = request.getRemoteUser();
> +            userTimezone = userManager.getTimeZone(user);
> +        }
> +
> +        userTimezone = userTimezone == null || userTimezone.length() == 0
> +         ? java.util.TimeZone.getDefault().getID() : userTimezone;
> +
> +        pageContext.setAttribute("timezone", userTimezone);
> +
> +    } catch (Exception e) {
> +        throw new ServletException("Error retrieving remote user
> timezone", e);
> +    }
> +
>  %>
>  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> @@ -74,6 +92,8 @@
>      validator doesn't complain.  See bug #1728. --%>
>  <%= "<body>" %>
>
> +<fmt:setTimeZone value="${timezone}" scope="session"/>
> +
>  <c:choose>
>        <c:when test="${param.quiet == 'true'}">
>        <!-- No visual header is being displayed -->
> Index: opennms-webapp/src/main/webapp/includes/eventlist.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/eventlist.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/eventlist.jsp
> (.../trunk)     (revision 47)
> @@ -184,7 +184,7 @@
>              </nobr>
>            </td>
>        <% } %>
> -       <td class="divider"><fmt:formatDate value="${event.time}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${event.time}"
> type="time" pattern="HH:mm:ss"/></td>
> +       <td class="divider"><fmt:formatDate value="${event.time}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${event.time}"
> type="time" pattern="HH:mm:ss z" /></td>
>        <td class="divider bright"><%=EventUtil.getSeverityLabel
> (severity)%></td>
>        <td class="divider"><%=events[i].getLogMessage()%></td>
>      </tr>
> Index: opennms-webapp/src/main/webapp/includes/serviceOutages-box.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/serviceOutages-box.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/serviceOutages-box.jsp
>  (.../trunk)     (revision 47)
> @@ -92,11 +92,11 @@
>       pageContext.setAttribute("outage", outage);
>   %>
>      <tr class="<%=(outages[i].getRegainedServiceTime() == null) ?
> "Critical" : "Normal"%>">
> -      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>       <% if( outages[i].getRegainedServiceTime() == null ) { %>
>         <td class="divider bright"><b>DOWN</b></td>
>       <% } else { %>
> -        <td class="divider bright"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +        <td class="divider bright"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>       <% } %>
>       <td class="divider"><a
> href="outage/detail.jsp?id=<%=outages[i].getId()%>"><%=outages[i].getId()%></a></td>
>     </tr>
> Index: opennms-webapp/src/main/webapp/includes/interfaceOutages-box.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/interfaceOutages-box.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/interfaceOutages-box.jsp
>  (.../trunk)     (revision 47)
> @@ -100,11 +100,11 @@
>        <tr class="Cleared">
>      <% } %>
>       <td class="divider"><a
> href="element/service.jsp?node=<%=nodeId%>&intf=<%=outages[i].getIpAddress()%>&service=<%=outages[i].getServiceId()%>"><%=outages[i].getServiceName()%></a></td>
> -      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>       <% if( outages[i].getRegainedServiceTime() == null ) { %>
>         <td class="divider"><b>DOWN</b></td>
>       <% } else { %>
> -        <td class="divider"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +        <td class="divider"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>       <% } %>
>       <td class="divider"><a
> href="outage/detail.jsp?id=<%=outages[i].getId()%>"><%=outages[i].getId()%></a></td>
>      </tr>
> Index: opennms-webapp/src/main/webapp/includes/timeControl.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/timeControl.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/timeControl.jsp
> (.../trunk)     (revision 47)
> @@ -43,12 +43,12 @@
>  <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
>  <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
>
> -<fmt:parseDate var="morning" value="01-08-2005 03:00:00"
> pattern="dd-MM-yyyy HH:mm:ss"/>
> -<fmt:parseDate var="evening" value="01-08-2005 16:00:00"
> pattern="dd-MM-yyyy HH:mm:ss"/>
> +<fmt:parseDate var="morning" value="01-08-2005 03:00:00"
> pattern="dd-MM-yyyy HH:mm:ss z"/>
> +<fmt:parseDate var="evening" value="01-08-2005 16:00:00"
> pattern="dd-MM-yyyy HH:mm:ss z"/>
>  <c:set var="amPmList"><fmt:formatDate value="${morning}"
> pattern="a"/>,<fmt:formatDate value="${evening}" pattern="a"/></c:set>
>
>  <c:set var="prefix" value="${param.prefix}" />
> -<fmt:parseDate var="time" value="${param.time}" pattern="HH:mm:ss" />
> +<fmt:parseDate var="time" value="${param.time}" pattern="HH:mm:ss z" />
>
>                                        <select name="<c:out
> value='${prefix}'/>Hour">
>                                        <fmt:formatDate var="startHour"
> value="${time}" pattern="h"/>
> Index: opennms-webapp/src/main/webapp/includes/nodeOutages-box.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/includes/nodeOutages-box.jsp(.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/includes/nodeOutages-box.jsp(.../trunk)     (revision 47)
> @@ -101,12 +101,12 @@
>     <% } %>
>       <td class="divider"><a
> href="element/interface.jsp?node=<%=nodeId%>&intf=<%=outages[i].getIpAddress()%>"><%=outages[i].getIpAddress()%></a></td>
>       <td class="divider"><a
> href="element/service.jsp?node=<%=nodeId%>&intf=<%=outages[i].getIpAddress()%>&service=<%=outages[i].getServiceId()%>"><%=outages[i].getServiceName()%></a></td>
> -      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +      <td class="divider"><fmt:formatDate value="${outage.lostServiceTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.lostServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>
>       <% if( outages[i].getRegainedServiceTime() == null ) { %>
>         <td class="divider bright"><b>DOWN</b></td>
>       <% } else { %>
> -        <td class="divider bright"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss"/></td>
> +        <td class="divider bright"><fmt:formatDate value="${
> outage.regainedServiceTime}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> outage.regainedServiceTime}" type="time" pattern="HH:mm:ss z"/></td>
>       <% } %>
>       <td class="divider"><a
> href="outage/detail.jsp?id=<%=outages[i].getId()%>"><%=outages[i].getId()%></a></td>
>     </tr>
> Index: opennms-webapp/src/main/webapp/event/list.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/event/list.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/event/list.jsp       (.../trunk)
> (revision 47)
> @@ -289,7 +289,7 @@
>             <% } %>
>           </td>
>           <td class="divider">
> -            <nobr><fmt:formatDate value="${event.time}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${event.time}" type="time"
> pattern="HH:mm:ss"/></nobr>
> +            <nobr><fmt:formatDate value="${event.time}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${event.time}" type="time"
> pattern="HH:mm:ss z"/></nobr>
>             <nobr>
>               <a href="<%=this.makeLink( parms, new
> AfterDateFilter(events[i].getTime()), true)%>"  class="filterLink"
> title="Only show events occurring after this
> one"><%=addAfterDateFilterString%></a>
>               <a href="<%=this.makeLink( parms, new
> BeforeDateFilter(events[i].getTime()), true)%>" class="filterLink"
> title="Only show events occurring before this
> one"><%=addBeforeDateFilterString%></a>
> Index: opennms-webapp/src/main/webapp/event/detail.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/event/detail.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/event/detail.jsp     (.../trunk)
> (revision 47)
> @@ -56,6 +56,8 @@
>
>  %>
>
> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
> +
>  <%
>     String eventIdString = request.getParameter( "id" );
>
> @@ -77,7 +79,9 @@
>     if( event == null ) {
>         throw new org.opennms.web.event.EventIdNotFoundException( "An
> event with this id was not found.", String.valueOf(eventId) );
>     }
> -
> +
> +       pageContext.setAttribute("event", event);
> +
>     String action = null;
>     String buttonName=null;
>
> @@ -138,7 +142,7 @@
>
>         <tr  class="<%=EventUtil.getSeverityLabel(event.getSeverity())%>">
>           <th>Time</th>
> -          <td><%=org.opennms.netmgt.EventConstants.formatToUIString(
> event.getTime())%></td>
> +                  <td><fmt:formatDate value="${event.time}" type="date"
> dateStyle="short"/>&nbsp;<fmt:formatDate value="${event.time}" type="time"
> pattern="HH:mm:ss z" /></td>
>           <th>Interface</th>
>           <td>
>             <% if( event.getIpAddress() != null ) { %>
> @@ -152,7 +156,7 @@
>             <% } %>
>           </td>
>           <th>Time&nbsp;Acknowledged</th>
> -          <td><%=event.getAcknowledgeTime()!=null ?
> org.opennms.netmgt.EventConstants.formatToUIString(
> event.getAcknowledgeTime()) : "&nbsp"%></td>
> +                 <td><fmt:formatDate value="${event.acknowledgeTime}"
> type="date" dateStyle="short"/>&nbsp;<fmt:formatDate value="${
> event.acknowledgeTime}" type="time" pattern="HH:mm:ss z" /></td>
>         </tr>
>
>         <tr class="<%=EventUtil.getSeverityLabel(event.getSeverity())%>">
> Index: opennms-webapp/src/main/webapp/WEB-INF/web.xml
> ===================================================================
> --- opennms-webapp/src/main/webapp/WEB-INF/web.xml
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/WEB-INF/web.xml      (.../trunk)
> (revision 47)
> @@ -572,7 +572,17 @@
>     <servlet-name>newPasswordAction</servlet-name>
>     <servlet-class>
> org.opennms.web.account.selfService.NewPasswordActionServlet
> </servlet-class>
>   </servlet>
> -
> +
> +  <servlet>
> +    <servlet-name>newTimezoneEntry</servlet-name>
> +    <servlet-class>
> org.opennms.web.account.selfService.NewTimezoneEntryServlet
> </servlet-class>
> +  </servlet>
> +   <!-- servlet for self-service password change action -->
> +  <servlet>
> +    <servlet-name>newTimezoneAction</servlet-name>
> +    <servlet-class>
> org.opennms.web.account.selfService.NewTimezoneActionServlet
> </servlet-class>
> +  </servlet>
> +
>   <!-- Servlet mappings for user account self-service -->
>   <servlet-mapping>
>     <servlet-name>newPasswordEntry</servlet-name>
> @@ -583,6 +593,14 @@
>     <url-pattern>/account/selfService/newPasswordAction</url-pattern>
>   </servlet-mapping>
>
> +   <servlet-mapping>
> +    <servlet-name>newTimezoneEntry</servlet-name>
> +    <url-pattern>/account/selfService/newTimezoneEntry</url-pattern>
> +  </servlet-mapping>
> +  <servlet-mapping>
> +    <servlet-name>newTimezoneAction</servlet-name>
> +    <url-pattern>/account/selfService/newTimezoneAction</url-pattern>
> +  </servlet-mapping>
>
>   <servlet>
>     <servlet-name>nodeLabelChange</servlet-name>
> Index:
> opennms-webapp/src/main/webapp/admin/notification/noticeWizard/choosePath.jsp
> ===================================================================
> ---
> opennms-webapp/src/main/webapp/admin/notification/noticeWizard/choosePath.jsp
>       (.../external/current)  (revision 47)
> +++
> opennms-webapp/src/main/webapp/admin/notification/noticeWizard/choosePath.jsp
>       (.../trunk)     (revision 47)
> @@ -76,6 +76,16 @@
>                varbindValue=varbind.getVbvalue();
>         }
>     }
> +    String userTimezone = TimeZone.getDefault().getID();
> +    try {
> +        TimeZone tz =
> (TimeZone)javax.servlet.jsp.jstl.core.Config.find(pageContext,
> javax.servlet.jsp.jstl.core.Config.FMT_TIME_ZONE);
> +        if (tz != null) {
> +            userTimezone = tz.getID();
> +        }
> +    }
> +    catch (Exception e) {
> +    }
> +
>  %>
>
>  <jsp:include page="/includes/header.jsp" flush="false" >
> @@ -173,7 +183,7 @@
>             Text Message:
>           </td>
>           <td valign="top" align="left">
> -            <textarea rows="3" cols="100" name="textMsg"><%=(
> newNotice.getTextMessage()!=null ? newNotice.getTextMessage() :
> "")%></textarea>
> +            <textarea rows="3" cols="100" name="textMsg"><%=(
> newNotice.getTextMessage()!=null ?
> org.opennms.web.Util.formatMessageToUserTZ(newNotice.getTextMessage(),
> userTimezone) : "")%></textarea>
>           </td>
>          </tr>
>          <tr>
> Index:
> opennms-webapp/src/main/webapp/admin/userGroupView/users/modifyUser.jsp
> ===================================================================
> ---
> opennms-webapp/src/main/webapp/admin/userGroupView/users/modifyUser.jsp
> (.../external/current)  (revision 47)
> +++
> opennms-webapp/src/main/webapp/admin/userGroupView/users/modifyUser.jsp
> (.../trunk)     (revision 47)
> @@ -200,6 +200,7 @@
>         String textPin = null;
>         String fullName = null;
>         String comments = null;
> +        String timezone = null;
>         try {
>             email = userFactory.getEmail(userid);
>             pagerEmail = userFactory.getPagerEmail(userid);
> @@ -210,6 +211,7 @@
>             textPin = userFactory.getTextPin(userid);
>             fullName = user.getFullName();
>             comments = user.getUserComments();
> +            timezone = user.getUserTimezone();
>         } catch (org.exolab.castor.xml.MarshalException e) {
>             throw new ServletException("An Error occurred reading the
> users file", e);
>         } catch (org.exolab.castor.xml.ValidationException e) {
> @@ -234,6 +236,14 @@
>               </td>
>             </tr>
>             <tr>
> +              <td valign="top">
> +                <label id="timezoneLabel"
> for="userTimezone">Timezone:</label>
> +              </td>
> +              <td align="left" valign="top">
> +                <input id="userTimezone" type="text" size="35"
> name="userTimezone" value="<%=(timezone == null ? "": timezone) %>" />
> +              </td>
> +            </tr>
> +            <tr>
>               <td colspan="2">
>                 &nbsp;
>               </td>
> Index: opennms-webapp/src/main/webapp/admin/userGroupView/users/list.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/admin/userGroupView/users/list.jsp
> (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/admin/userGroupView/users/list.jsp
> (.../trunk)     (revision 47)
> @@ -148,6 +148,7 @@
>           <td width="15%"><b>Email</b></td>
>           <td width="15%"><b>Pager Email</b></td>
>           <td width="15%"><b>XMPP Address</b></td>
> +          <td width="10%"><b>Timezone</b></td>
>           <!--
>           <td width="10%"><b>Num Service</b></td>
>           <td width="10%"><b>Num Pin</b></td>
> @@ -196,9 +197,9 @@
>           <td width="15%">
>            <div id="<%= "users("+curUser.getUserId()+").fullName" %>">
>            <% if(curUser.getFullName() != null){ %>
> -                   <%= (curUser.getFullName().equals("") ? "&nbsp;" :
> curUser.getFullName()) %>
> -           <% } %>
> -             </div>
> +            <%= (curUser.getFullName().equals("") ? "&nbsp;" :
> curUser.getFullName()) %>
> +        <% } %>
> +          </div>
>           </td>
>           <td width="15%">
>             <div id="<%= "users("+curUser.getUserId()+").email" %>">
> @@ -210,11 +211,18 @@
>             <%= ((pagerEmail == null || pagerEmail.equals("")) ? "&nbsp;"
> : pagerEmail) %>
>             </div>
>           </td>
> -          <td width="15">
> +          <td width="15%">
>            <div id="<%= "users("+curUser.getUserId()+").xmppAddress" %>">
>             <%= ((xmppAddress == null || xmppAddress.equals("")) ?
> "&nbsp;" : xmppAddress) %>
>            </div>
>           </td>
> +          <td width="10%">
> +            <div id="<%= "users("+curUser.getUserId()+").userTimezone"
> %>">
> +          <% if(curUser.getUserTimezone() != null){ %>
> +             <%= (curUser.getUserTimezone().equals("") ? "&nbsp" :
> curUser.getUserTimezone()) %>
> +          <% } %>
> +            </div>
> +          </td>
>           <!--
>           <td width="10%">
>             <div id="<%= "users("+curUser.getUserId()+").numericService"
> %>">
> @@ -239,13 +247,12 @@
>           -->
>           </tr>
>           <tr bgcolor=<%=row%2==0 ? "#ffffff" : "#cccccc"%>>
> -            <td colspan="5">
> +            <td colspan="6">
>              <div id="<%= "users("+curUser.getUserId()+").userComments"
> %>">
> -             <% if(curUser.getUserComments() != null){ %>
> -                     <%= (curUser.getUserComments().equals("") ? "No
> Comments" : curUser.getUserComments()) %>
> -
> -             <% } %>
> -               </div>
> +          <% if(curUser.getUserComments() != null){ %>
> +              <%= (curUser.getUserComments().equals("") ? "No Comments" :
> curUser.getUserComments()) %>
> +          <% } %>
> +            </div>
>             </td>
>           </tr>
>          <% row++;
> Index: opennms-webapp/src/main/webapp/account/selfService/newTimezone.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/account/selfService/newTimezone.jsp
>  (.../external/current)  (revision 0)
> +++ opennms-webapp/src/main/webapp/account/selfService/newTimezone.jsp
>  (.../trunk)     (revision 47)
> @@ -0,0 +1,111 @@
> +<%--
> +
> +//
> +// This file is part of the OpenNMS(R) Application.
> +//
> +// OpenNMS(R) is Copyright (C) 2002-2007 The OpenNMS Group, Inc.  All
> rights reserved.
> +// OpenNMS(R) is a derivative work, containing both original code,
> included code and modified
> +// code that was published under the GNU General Public License.
> Copyrights for modified
> +// and included code are below.
> +//
> +// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
> +//
> +// Copyright (C) 2008 8x8 Inc.  All rights reserved.
> +//
> +// This program is free software; you can redistribute it and/or modify
> +// it under the terms of the GNU General Public License as published by
> +// the Free Software Foundation; either version 2 of the License, or
> +// (at your option) any later version.
> +//
> +// This program is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +// GNU General Public License for more details.
> +//
> +// You should have received a copy of the GNU General Public License
> +// along with this program; if not, write to the Free Software
> +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
> USA.
> +//
> +// For more information contact:
> +//      OpenNMS Licensing       <[email protected]>
> +//      http://www.opennms.org/
> +//      http://www.opennms.com/
> +//
> +
> +--%>
> +
> +<%@page language="java"
> +    contentType="text/html"
> +    session="true"
> +    import="org.opennms.netmgt.config.*,
> +        java.util.*,
> +        org.opennms.netmgt.config.users.*
> +    "
> +%>
> +
> +<%
> +
> +        HttpSession userSession = request.getSession(false);
> +        String timezone = null;
> +        try {
> +            if (userSession != null) {
> +              User user = (User) userSession.getAttribute("
> user.newTimezone.jsp");
> +              if (user != null) {
> +                 timezone = user.getUserTimezone();
> +                 }
> +            }
> +        } catch (Exception e) {
> +            throw new ServletException("An Error occurred reading the
> users file", e);
> +        }
> +%>
> +
> +<jsp:include page="/includes/header.jsp" flush="false" >
> +  <jsp:param name="title" value="Change Timezone" />
> +  <jsp:param name="headTitle" value="Change Timezone" />
> +  <jsp:param name="breadcrumb" value="<a
> href='account/selfService/index.jsp'>Self-Service</a>" />
> +  <jsp:param name="breadcrumb" value="Change Timezone" />
> +</jsp:include>
> +
> +<script language="JavaScript">
> +  function updateTZ()
> +  {
> +    document.newTimezoneForm.newTimezone.value=document.goForm.tz.value;
> +    document.newTimezoneForm.action=
> "account/selfService/newTimezoneAction";
> +    document.newTimezoneForm.submit();
> +
> +    window.close();
> +  }
> +</script>
> +
> +<% if ("redo".equals(request.getParameter("action"))) { %>
> +<h3>Please enter the new timezone.</h3>
> +<% } %>
> +
> +<br/>
> +<form method="post" name="newTimezoneForm">
> +  <input type="hidden" name="newTimezone" value="">
> +</form>
> +<form method="post" name="goForm">
> +
> +<table>
> +  <tr>
> +    <td width="10%">
> +      Timezone:
> +    </td>
> +    <td width="100%">
> +      <input type="text" size="35" name="tz" value="<%=(timezone == null
> ? "": timezone) %>" />
> +      (java timezone)
> +    </td>
> +  </tr>
> +
> +  <tr>
> +    <td>
> +      <input type="button" value="OK" onClick="updateTZ()">
> +     </td>
> +    <td>
> +  </tr>
> +
> +</table>
> +</form>
> +
> +<jsp:include page="/includes/footer.jsp" flush="false" />
> Index:
> opennms-webapp/src/main/webapp/account/selfService/timezoneChanged.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/account/selfService/timezoneChanged.jsp
>      (.../external/current)  (revision 0)
> +++ opennms-webapp/src/main/webapp/account/selfService/timezoneChanged.jsp
>      (.../trunk)     (revision 47)
> @@ -0,0 +1,55 @@
> +<%--
> +
> +//
> +// This file is part of the OpenNMS(R) Application.
> +//
> +// OpenNMS(R) is Copyright (C) 2002-2007 The OpenNMS Group, Inc.  All
> rights reserved.
> +// OpenNMS(R) is a derivative work, containing both original code,
> included code and modified
> +// code that was published under the GNU General Public License.
> Copyrights for modified
> +// and included code are below.
> +//
> +// OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
> +//
> +// Copyright (C) 8x8 Inc.  All rights reserved.
> +//
> +// This program is free software; you can redistribute it and/or modify
> +// it under the terms of the GNU General Public License as published by
> +// the Free Software Foundation; either version 2 of the License, or
> +// (at your option) any later version.
> +//
> +// This program is distributed in the hope that it will be useful,
> +// but WITHOUT ANY WARRANTY; without even the implied warranty of
> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +// GNU General Public License for more details.
> +//
> +// You should have received a copy of the GNU General Public License
> +// along with this program; if not, write to the Free Software
> +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
> USA.
> +//
> +// For more information contact:
> +//      OpenNMS Licensing       <[email protected]>
> +//      http://www.opennms.org/
> +//      http://www.opennms.com/
> +//
> +
> +--%>
> +
> +<%@page language="java"
> +       contentType="text/html"
> +       session="true"
> +       import="org.opennms.netmgt.config.*,
> +               java.util.*,
> +               org.opennms.netmgt.config.users.*
> +       "
> +%>
> +<jsp:include page="/includes/header.jsp" flush="false" >
> +  <jsp:param name="title" value="Timezone Changed" />
> +  <jsp:param name="headTitle" value="Timezone Changed" />
> +  <jsp:param name="breadcrumb" value="<a
> href='account/selfService/index.jsp'>Self-Service</a>" />
> +  <jsp:param name="breadcrumb" value="Timezone Changed" />
> +</jsp:include>
> +
> +<h3>Timezone successfully changed.</h3>
> +
> +<jsp:include page="/includes/footer.jsp" flush="false" />
> +
> Index: opennms-webapp/src/main/webapp/account/selfService/index.jsp
> ===================================================================
> --- opennms-webapp/src/main/webapp/account/selfService/index.jsp
>  (.../external/current)  (revision 47)
> +++ opennms-webapp/src/main/webapp/account/selfService/index.jsp
>  (.../trunk)     (revision 47)
> @@ -54,6 +54,12 @@
>     document.selfServiceForm.action =
> "account/selfService/newPasswordEntry";
>     document.selfServiceForm.submit();
>   }
> +
> +  function changeTimezone() {
> +     document.selfServiceForm.action =
> "account/selfService/newTimezoneEntry";
> +     document.selfServiceForm.submit();
> +  }
> +
>  </script>
>
>  <div class="TwoColLeft">
> @@ -61,6 +67,7 @@
>         <div class="boxWrapper">
>         <ul class="plain">
>         <li><a href="javascript:changePassword()">Change Password</a></li>
> +        <li><a href="javascript:changeTimezone()">Change
> Timezone</a></li>
>         </ul>
>         </div>
>  </div>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Please read the OpenNMS Mailing List FAQ:
> http://www.opennms.org/index.php/Mailing_List_FAQ
>
> opennms-devel mailing list
>
> To *unsubscribe* or change your subscription options, see the bottom of
> this page:
> https://lists.sourceforge.net/lists/listinfo/opennms-devel
>



-- 
Aaron J. Paxson
---------
[email protected]
http://aaron.thepaxson5.org

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

_______________________________________________
Please read the OpenNMS Mailing List FAQ:
http://www.opennms.org/index.php/Mailing_List_FAQ

opennms-devel mailing list

To *unsubscribe* or change your subscription options, see the bottom of this page:
https://lists.sourceforge.net/lists/listinfo/opennms-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.