<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Copyright 2006 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. -->
<document>

	<properties>
		<title>Timezones</title>
		<author email="sebawagner@apache.org">
			OpenMeetings Team
		</author>
	</properties>

	<body>

		<section name="Introduction">
			<p>
				List of default Timezones:
				<a
					href="http://openmeetings.googlecode.com/svn/trunk/singlewebapp/WebContent/languages/timezones.xml"
					rel="nofollow">http://openmeetings.googlecode.com/svn/trunk/singlewebapp/WebContent/languages/timezones.xml
				</a>
			</p>
			<p>
				To add a new Time Zone you have to lookup its represant in Java's
				Timezone registry. You can then add freely new time zones to the XML
				file. The XML entries are imported into the database into the table
				<strong>om_timezone</strong>
				during the installation of OpenMeetings. (Don't forget to stop the
				server before you change anything in the database).
			</p>
			<p>
				The Servers default timezone is stored in the configuration table in
				the attribute
				<strong>default.timezone</strong>
				. The name in this value links to an attribute in the table
				om_timezone in the column
				<strong>jname</strong>
				.
			</p>
			<p>
				You can set a Flag
				<strong>forceTimeZoneCheck</strong>
				for each user that gives him a Pop-Up notification to change his
				time zone. The Flag can be changed in the user administration of
				OpenMeetings. This can be handy if you update from a previous
				version of OpenMeetings to make sure users see the new feature and
				update their settings.
			</p>
			
			
			
		</section>
		
		<section name="How to lookup timezone's">
		
		  <div class="xmlcode">
		  
                    String[] ids = TimeZone.getAvailableIDs();<br/>
                    for (String id : ids) {<br/>
                        
                        <div style="margin-left:20px">
                        TimeZone timeZone = TimeZone.getTimeZone(id);<br/>
                        //TimeZone timeZone = timeRegistry.getTimeZone(id);<br/>
                        <br/>
                        Calendar cal = Calendar.getInstance();<br/>
                                <div style="margin-left:20px">
                                cal.setTimeZone(timeZone);<br/>
                                // + cal.get(Calendar.DST_OFFSET)<br/>
                                int offset = cal.get(Calendar.ZONE_OFFSET);<br/>
                        <br/>
                                int offsetInMinutes = offset/1000/60;<br/>
                                <br/>
                                System.out.println("name" + id + "name offset "+offsetInMinutes+"offset ");
                                </div>
                        </div>
                    }
		  
		  </div>
		  
		  
		</section>

	</body>

</document>