<?xml version="1.0" encoding="UTF-8"?>
<!--
   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>