You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2016/04/14 13:46:53 UTC

svn commit: r1739063 [3/3] - in /openmeetings/application/branches/3.2.x: ./ openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/ openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ openmeetings-core/src/main/j...

Added: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java?rev=1739063&view=auto
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java (added)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java Thu Apr 14 11:46:52 2016
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.openmeetings.web.room.sidebar;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.Application.getRoomUsers;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.web.app.Client;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.ui.widget.tabs.TabbedPanel;
+
+public class RoomSidebar extends Panel {
+	private static final long serialVersionUID = 1L;
+	private final RoomPanel room;
+	private final TabbedPanel tabs;
+	private final ITab userTab;
+	private final ITab fileTab;
+	private boolean showFiles;
+	private final ListView<RoomClient> users = new ListView<RoomClient>("user", new ArrayList<RoomClient>()) {
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		protected void populateItem(ListItem<RoomClient> item) {
+			RoomClient rc = item.getModelObject();
+			item.setMarkupId(String.format("user%s", rc.c.getUid()));
+			item.add(new Label("name", rc.u.getFirstname() + " " + rc.u.getLastname()));
+			item.add(AttributeAppender.append("data-userid", rc.u.getId()));
+			item.add(new WebMarkupContainer("privateChat").setVisible(!room.getRoom().isChatHidden() && getUserId() != rc.u.getId()));
+			if (room.getClient() != null && rc.c.getUid().equals(room.getClient().getUid())) {
+				item.add(AttributeAppender.append("class", "current"));
+			}
+		}
+	};
+	
+	public RoomSidebar(String id, final RoomPanel room) {
+		super(id);
+		this.room = room;
+		Room r = room.getRoom();
+		showFiles = !r.getHideFilesExplorer();//TODO add moderation check
+		
+		userTab = new ITab() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public boolean isVisible() {
+				return true;
+			}
+			
+			@Override
+			public IModel<String> getTitle() {
+				return Model.of(getString("613"));
+			}
+			
+			@Override
+			public WebMarkupContainer getPanel(String containerId) {
+				return new UserFragment(containerId, "user-panel");
+			}
+		};
+		fileTab = new ITab() {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public boolean isVisible() {
+				return showFiles;
+			}
+			
+			@Override
+			public IModel<String> getTitle() {
+				return Model.of(getString("614"));
+			}
+			
+			@Override
+			public WebMarkupContainer getPanel(String containerId) {
+				return new FileFragment(containerId, "file-panel");
+			}
+		};
+		add(tabs = new TabbedPanel("tabs", Arrays.asList(userTab, fileTab)).setActiveTab(r.isFilesOpened() ? 1 : 0));
+	}
+	
+	public class UserFragment extends Fragment {
+		private static final long serialVersionUID = 1L;
+
+		public UserFragment(String id, String markupId) {
+            super(id, markupId, RoomSidebar.this);
+            add(users.setList(getUsers()));
+		}
+	}
+	
+	public class FileFragment extends Fragment {
+		private static final long serialVersionUID = 1L;
+
+		public FileFragment(String id, String markupId) {
+            super(id, markupId, RoomSidebar.this);
+            add(new RoomFilePanel("tree", room.getRoom().getId()));
+        }
+	}
+
+	private List<RoomClient> getUsers() {
+		List<RoomClient> list = new ArrayList<>();
+		for (Client cl : getRoomUsers(room.getRoom().getId())) {
+			list.add(new RoomClient(cl));
+		}
+		return list;
+	}
+	
+	static class RoomClient implements Serializable {
+		private static final long serialVersionUID = 1L;
+		private final Client c;
+		private final User u;
+		
+		RoomClient(Client c) {
+			this.c = c;
+			this.u = getBean(UserDao.class).get(c.getUserId());
+		}
+	}
+	
+	public void updateUsers(IPartialPageRequestHandler handler) {
+		users.setList(getUsers());
+		handler.add(tabs);
+	}
+
+	public boolean isShowFiles() {
+		return showFiles;
+	}
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/swf-functions.js
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/swf-functions.js?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/swf-functions.js (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/swf-functions.js Thu Apr 14 11:46:52 2016
@@ -27,7 +27,6 @@ function initSwf(swfurl) {
 			__lzminimumversion : 8
 		};
 	var options = $.extend({}, general, {allowfullscreen : 'true'});
-	$('#header, #topControls, #chatPanel').hide();
 	$('div[id="contents"], div[id="contents"] > div').css('height', '100%');
 	var embed = $('<embed>').attr('quality', 'high').attr('bgcolor', options.bgcolor)
 		.attr('src', "public/" + options.url)
@@ -40,9 +39,3 @@ function initSwf(swfurl) {
 		.attr('pluginspage', 'http://www.macromedia.com/go/getflashplayer');
 	$('#swfloading').after($('<div id="lzappContainer">').append(embed)).width('1px').height('1px');
 }
-function roomExit() {
-	$('#header, #topControls, #chatPanel').show();
-	$('div[id="contents"], div[id="contents"] > div').css('height', 'auto');
-	window.location.hash = "#rooms/public";
-	$('#lzappContainer').remove();
-}
\ No newline at end of file

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/ChatPanel.java Thu Apr 14 11:46:52 2016
@@ -55,6 +55,7 @@ import org.apache.wicket.ajax.json.JSONE
 import org.apache.wicket.ajax.json.JSONObject;
 import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
 import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.CssHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -189,7 +190,7 @@ public class ChatPanel extends BasePanel
 
 	public void roomEnter(Room r, AjaxRequestTarget target) {
 		if (r.isChatHidden()) {
-			target.add(setVisible(false));
+			toggle(target, false);
 			return;
 		}
 		StringBuilder sb = new StringBuilder();
@@ -204,6 +205,18 @@ public class ChatPanel extends BasePanel
 		target.appendJavaScript(sb);
 	}
 	
+	public void roomExit(Room r, IPartialPageRequestHandler handler) {
+		if (r.isChatHidden()) {
+			return;
+		}
+		handler.appendJavaScript(String.format("removeChatTab('%1$s%2$d');", ID_ROOM_PREFIX, r.getId()));
+	}
+	
+	public void toggle(IPartialPageRequestHandler handler, boolean visible) {
+		handler.add(setVisible(visible));
+		handler.appendJavaScript("reinit();");
+	}
+	
 	@Override
 	public void renderHead(IHeaderResponse response) {
 		super.renderHead(response);

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat.js Thu Apr 14 11:46:52 2016
@@ -37,6 +37,9 @@ $(function() {
 			}
 		}
 	});
+	reinit();
+});
+function reinit() {
 	chatTabs = $("#chatTabs").tabs({
 		activate: function(event, ui) {
 			$('#activeChatTab').val(ui.newPanel[0].id);
@@ -48,7 +51,7 @@ $(function() {
 		$("#" + panelId).remove();
 		chatTabs.tabs("refresh");
 	});
-});
+}
 function openChat() {
 	if ($('#chatPanel').height() < 24) {
 		$('#chat .control.block .ui-icon').removeClass('ui-icon-carat-1-n').addClass('ui-icon-carat-1-s');
@@ -74,7 +77,10 @@ function activateTab(id) {
 	chatTabs.tabs("option", "active", chatTabs.find('a[href="#' + id + '"]').parent().index());
 }
 function addChatTab(id, label) {
-	if ($('#chat').length < 1 || $('#' + id).length > 0) {
+	if (!$("#chatTabs").data("ui-tabs")) {
+		reinit();
+	}
+	if ($('#chat').length < 1 || $('#' + id).length) {
 		return;
 	}
 	var li = $(tabTemplate.replace(/#\{href\}/g, "#" + id).replace(/#\{label\}/g, label));
@@ -86,6 +92,11 @@ function addChatTab(id, label) {
 	chatTabs.tabs("refresh");
 	activateTab(id);
 }
+function removeChatTab(id) {
+	$('li[aria-controls="' + id + '"]').remove();
+	$('#' + id).remove();
+	chatTabs.tabs("refresh");
+}
 function addChatMessage(m) {
 	if ($('#chat').length > 0 && m && m.type == "chat") {
 		var msg;

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java Thu Apr 14 11:46:52 2016
@@ -269,7 +269,7 @@ public class OmUrlFragment implements Se
 					Long roomId = Long.valueOf(type);
 					Room r = getBean(RoomDao.class).get(roomId);
 					if (r != null) {
-						basePanel = new RoomPanel(CHILD_ID, roomId);
+						basePanel = new RoomPanel(CHILD_ID, r);
 					}
 				} catch(NumberFormatException ne) {
 					//skip it, bad roomid passed

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml Thu Apr 14 11:46:52 2016
@@ -64,7 +64,6 @@
 			-->
 		</property>
 	</bean>
-	<bean id="openmeetings.EmoticonsManager" class="org.apache.openmeetings.core.data.whiteboard.EmoticonsManager" />
 
 	<!-- Singleton for memory based cache -->
 	<bean id="openmeetings.HashMapStore" scope="singleton" class="org.apache.openmeetings.core.session.store.HashMapStore" />
@@ -94,7 +93,6 @@
 	<bean id="openmeetings.FlvExplorerConverter" class="org.apache.openmeetings.core.converter.FlvExplorerConverter" />
 	<bean id="errorservice.service" class="org.apache.openmeetings.core.remote.ErrorService" />
 	<bean id="conferenceservice.service" class="org.apache.openmeetings.core.remote.ConferenceService" />
-	<bean id="chatservice.service" class="org.apache.openmeetings.core.remote.ChatService" />
 	<bean id="recordingservice.service" class="org.apache.openmeetings.core.remote.RecordingService" />
 	<bean id="mobile.service" class="org.apache.openmeetings.core.remote.MobileService" />
 	<bean id="openmeetings.RecordingConverterTask" class="org.apache.openmeetings.core.data.record.converter.RecordingConverterTask" />

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/web.xml Thu Apr 14 11:46:52 2016
@@ -51,7 +51,7 @@
 	<filter-mapping>
 		<filter-name>LoggerContextFilter</filter-name>
 		<url-pattern>/*</url-pattern>
-	</filter-mapping>   
+	</filter-mapping>
 	
 	<filter>
 		<filter-name>OpenmeetingsApplication</filter-name>
@@ -66,7 +66,7 @@
 		</init-param>
 		<init-param>
 			<param-name>ignorePaths</param-name>
-			<param-value>conf,css,default,docs,images,js,persistence,public,screenshare,streams,upload,uploadtemp,services,networktest.,DownloadHandler</param-value>
+			<param-value>conf,css,default,docs,images,js,persistence,public,screenshare,streams,upload,uploadtemp,services,networktest.</param-value>
 		</init-param>
 	</filter>
 	<filter-mapping>
@@ -97,10 +97,6 @@
 		<servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
 	</servlet>
 	<servlet>
-		<servlet-name>DownloadHandler</servlet-name>
-		<servlet-class>org.apache.openmeetings.core.servlet.outputhandler.DownloadHandler</servlet-class>
-	</servlet>
-	<servlet>
 		<servlet-name>ExportToImage</servlet-name>
 		<servlet-class>org.apache.openmeetings.core.servlet.outputhandler.ExportToImage</servlet-class>
 	</servlet>
@@ -110,10 +106,6 @@
 		<url-pattern>*.upload</url-pattern>
 	</servlet-mapping>
 	<servlet-mapping>
-		<servlet-name>DownloadHandler</servlet-name>
-		<url-pattern>/DownloadHandler</url-pattern>
-	</servlet-mapping>
-	<servlet-mapping>
 		<servlet-name>ExportToImage</servlet-name>
 		<url-pattern>/ExportToImage</url-pattern>
 	</servlet-mapping>

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/activities.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/activities.css?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/activities.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/activities.css Thu Apr 14 11:46:52 2016
@@ -32,7 +32,16 @@
 	padding-left: 20px;
 }
 #activitiesPanel .area {
-	height: 310px;
+	height: 319px;
 	overflow-y: auto;
+}
+.activity.item {
+	position: relative;
+	background: 0;
 	padding: 5px;
-}
\ No newline at end of file
+	margin-bottom: 3px
+}
+.activity.item .ui-icon-close {
+	border-width: 1px;
+	border-style: solid;
+}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/css/room.css Thu Apr 14 11:46:52 2016
@@ -19,11 +19,14 @@
 .room.container {
 	width: 100%;
 }
-.room.menu.exit {
-	padding-left: 20px;
+.ui-icon.room.menu.exit {
 	background-image: url(images/exit_button.png);
 	background-repeat: no-repeat;
-	background-position: 5px 5px;
+	background-size: 16px 16px;
+	margin-left: 5px;
+}
+.top.room.menu.exit {
+	padding-left: 30px;
 }
 .room.menu.right {
 	position: absolute;
@@ -65,8 +68,10 @@
 	width: 80%;
 	float: left;
 }
+.room.sidebar.left .ui-tabs .ui-tabs-panel {
+	padding: 0;
+}
 .room.sidebar.left .user.list {
-	border-right: 1px solid #dddddd;
 	height: 100%;
 	overflow-y: auto;
 }
@@ -102,10 +107,3 @@
 	max-height: 100px;
 	overflow-y: auto;
 }
-.activity.item {
-	position: relative;
-}
-.activity.item .ui-dialog-titlebar-close {
-	width: 20px;
-	height: 20px;
-}

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/js/history.js
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/js/history.js?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/js/history.js (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/js/history.js Thu Apr 14 11:46:52 2016
@@ -17,634 +17,667 @@
  *
  */
 BrowserHistoryUtils = {
-    addEvent: function(elm, evType, fn, useCapture) {
-        useCapture = useCapture || false;
-        if (elm.addEventListener) {
-            elm.addEventListener(evType, fn, useCapture);
-            return true;
-        } else if (elm.attachEvent) {
-            var r = elm.attachEvent('on' + evType, fn);
-            return r;
-        } else {
-            elm['on' + evType] = fn;
-        }
-    }
+	addEvent : function(elm, evType, fn, useCapture) {
+		useCapture = useCapture || false;
+		if (elm.addEventListener) {
+			elm.addEventListener(evType, fn, useCapture);
+			return true;
+		} else if (elm.attachEvent) {
+			var r = elm.attachEvent('on' + evType, fn);
+			return r;
+		} else {
+			elm['on' + evType] = fn;
+		}
+	}
 }
 
 BrowserHistory = (function() {
-    // type of browser
-    var browser = {
-        ie: false,
-        ie8: false,
-        firefox: false,
-        safari: false,
-        opera: false,
-        version: -1
-    };
-
-    // Default app state URL to use when no fragment ID present
-    var defaultHash = '';
-
-    // Last-known app state URL
-    var currentHref = document.location.href;
-
-    // Initial URL (used only by IE)
-    var initialHref = document.location.href;
-
-    // Initial URL (used only by IE)
-    var initialHash = document.location.hash;
-
-    // History frame source URL prefix (used only by IE)
-    var historyFrameSourcePrefix = 'history/historyFrame.html?';
-
-    // History maintenance (used only by Safari)
-    var currentHistoryLength = -1;
-
-    // Flag to denote the existence of onhashchange
-    var browserHasHashChange = false;
-
-    var historyHash = [];
-
-    var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash);
-
-    var backStack = [];
-    var forwardStack = [];
-
-    var currentObjectId = null;
-
-    //UserAgent detection
-    var useragent = navigator.userAgent.toLowerCase();
-
-    if (useragent.indexOf("opera") != -1) {
-        browser.opera = true;
-    } else if (useragent.indexOf("msie") != -1) {
-        browser.ie = true;
-        browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4));
-        if (browser.version == 8) {
-            browser.ie = false;
-            browser.ie8 = true;
-        }
-    } else if (useragent.indexOf("safari") != -1) {
-        browser.safari = true;
-        browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7));
-    } else if (useragent.indexOf("gecko") != -1) {
-        browser.firefox = true;
-    }
-
-    if (browser.ie == true && browser.version == 7) {
-        window["_ie_firstload"] = false;
-    }
-
-    function hashChangeHandler() {
-        currentHref = document.location.href;
-        var flexAppUrl = getHash();
-        //ADR: to fix multiple
-        if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
-            var pl = getPlayers();
-            for (var i = 0; i < pl.length; i++) {
-                pl[i].browserURLChange(flexAppUrl);
-            }
-        } else {
-            getPlayer().browserURLChange(flexAppUrl);
-        }
-    }
-
-    // Accessor functions for obtaining specific elements of the page.
-
-    function getHistoryFrame() {
-        return document.getElementById('ie_historyFrame');
-    }
-
-    function getFormElement() {
-        return document.getElementById('safari_formDiv');
-    }
-
-    function getRememberElement() {
-        return document.getElementById("safari_remember_field");
-    }
-
-    // Get the Flash player object for performing ExternalInterface callbacks.
-    // Updated for changes to SWFObject2.
-
-    function getPlayer(id) {
-        var i;
-
-        if (id && document.getElementById(id)) {
-            var r = document.getElementById(id);
-            if (typeof r.SetVariable != "undefined") {
-                return r;
-            } else {
-                var o = r.getElementsByTagName("object");
-                var e = r.getElementsByTagName("embed");
-                for (i = 0; i < o.length; i++) {
-                    if (typeof o[i].browserURLChange != "undefined")
-                        return o[i];
-                }
-                for (i = 0; i < e.length; i++) {
-                    if (typeof e[i].browserURLChange != "undefined")
-                        return e[i];
-                }
-            }
-        } else {
-            var o = document.getElementsByTagName("object");
-            var e = document.getElementsByTagName("embed");
-            for (i = 0; i < e.length; i++) {
-                if (typeof e[i].browserURLChange != "undefined") {
-                    return e[i];
-                }
-            }
-            for (i = 0; i < o.length; i++) {
-                if (typeof o[i].browserURLChange != "undefined") {
-                    return o[i];
-                }
-            }
-        }
-        return undefined;
-    }
-
-    function getPlayers() {
-        var i;
-        var players = [];
-        if (players.length == 0) {
-            var tmp = document.getElementsByTagName('object');
-            for (i = 0; i < tmp.length; i++) {
-                if (typeof tmp[i].browserURLChange != "undefined")
-                    players.push(tmp[i]);
-            }
-        }
-        if (players.length == 0 || players[0].object == null) {
-            var tmp = document.getElementsByTagName('embed');
-            for (i = 0; i < tmp.length; i++) {
-                if (typeof tmp[i].browserURLChange != "undefined")
-                    players.push(tmp[i]);
-            }
-        }
-        return players;
-    }
-
-    function getIframeHash() {
-        var doc = getHistoryFrame().contentWindow.document;
-        var hash = String(doc.location.search);
-        if (hash.length == 1 && hash.charAt(0) == "?") {
-            hash = "";
-        } else if (hash.length >= 2 && hash.charAt(0) == "?") {
-            hash = hash.substring(1);
-        }
-        return hash;
-    }
-
-    /* Get the current location hash excluding the '#' symbol. */
-
-    function getHash() {
-        // It would be nice if we could use document.location.hash here,
-        // but it's faulty sometimes.
-        var idx = document.location.href.indexOf('#');
-        return (idx >= 0) ? document.location.href.substr(idx + 1) : '';
-    }
-
-    /* Get the current location hash excluding the '#' symbol. */
-
-    function setHash(hash) {
-        // It would be nice if we could use document.location.hash here,
-        // but it's faulty sometimes.
-        if (hash == '') hash = '#'
-        document.location.hash = hash;
-    }
-
-    function createState(baseUrl, newUrl, flexAppUrl) {
-        return {
-            'baseUrl': baseUrl,
-            'newUrl': newUrl,
-            'flexAppUrl': flexAppUrl,
-            'title': null
-        };
-    }
-
-    /* Add a history entry to the browser.
-     *   baseUrl: the portion of the location prior to the '#'
-     *   newUrl: the entire new URL, including '#' and following fragment
-     *   flexAppUrl: the portion of the location following the '#' only
-     */
-
-    function addHistoryEntry(baseUrl, newUrl, flexAppUrl) {
-
-        //delete all the history entries
-        forwardStack = [];
-
-        if (browser.ie) {
-            //Check to see if we are being asked to do a navigate for the first
-            //history entry, and if so ignore, because it's coming from the creation
-            //of the history iframe
-            if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) {
-                currentHref = initialHref;
-                return;
-            }
-            if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) {
-                newUrl = baseUrl + '#' + defaultHash;
-                flexAppUrl = defaultHash;
-            } else {
-                // for IE, tell the history frame to go somewhere without a '#'
-                // in order to get this entry into the browser history.
-                getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl;
-            }
-            setHash(flexAppUrl);
-        } else {
-
-            //ADR
-            if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) {
-                initialState = createState(baseUrl, newUrl, flexAppUrl);
-            } else if (backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) {
-                backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl);
-            }
-
-            if (browser.safari && !browserHasHashChange) {
-                // for Safari, submit a form whose action points to the desired URL
-                if (browser.version <= 419.3) {
-                    var file = window.location.pathname.toString();
-                    file = file.substring(file.lastIndexOf("/") + 1);
-                    getFormElement().innerHTML = '<form name="historyForm" action="' + file + '#' + flexAppUrl + '" method="GET"></form>';
-                    //get the current elements and add them to the form
-                    var qs = window.location.search.substring(1);
-                    var qs_arr = qs.split("&");
-                    for (var i = 0; i < qs_arr.length; i++) {
-                        var tmp = qs_arr[i].split("=");
-                        var elem = document.createElement("input");
-                        elem.type = "hidden";
-                        elem.name = tmp[0];
-                        elem.value = tmp[1];
-                        document.forms.historyForm.appendChild(elem);
-                    }
-                    document.forms.historyForm.submit();
-                } else {
-                    top.location.hash = flexAppUrl;
-                }
-                // We also have to maintain the history by hand for Safari
-                historyHash[history.length] = flexAppUrl;
-                _storeStates();
-            } else {
-                // Otherwise, just tell the browser to go there
-                setHash(flexAppUrl);
-            }
-        }
-        backStack.push(createState(baseUrl, newUrl, flexAppUrl));
-    }
-
-    function _storeStates() {
-        if (browser.safari) {
-            getRememberElement().value = historyHash.join(",");
-        }
-    }
-
-    function handleBackButton() {
-        //The "current" page is always at the top of the history stack.
-        var current = backStack.pop();
-        if (!current) {
-            return;
-        }
-        var last = backStack[backStack.length - 1];
-        if (!last && backStack.length == 0) {
-            last = initialState;
-        }
-        forwardStack.push(current);
-    }
-
-    function handleForwardButton() {
-        //summary: private method. Do not call this directly.
-
-        var last = forwardStack.pop();
-        if (!last) {
-            return;
-        }
-        backStack.push(last);
-    }
-
-    function handleArbitraryUrl() {
-        //delete all the history entries
-        forwardStack = [];
-    }
-
-    /* Called periodically to poll to see if we need to detect navigation that has occurred */
-
-    function checkForUrlChange() {
-
-        if (browser.ie) {
-            if (currentHref != document.location.href && currentHref + '#' != document.location.href) {
-                //This occurs when the user has navigated to a specific URL
-                //within the app, and didn't use browser back/forward
-                //IE seems to have a bug where it stops updating the URL it
-                //shows the end-user at this point, but programatically it
-                //appears to be correct.  Do a full app reload to get around
-                //this issue.
-                if (browser.version < 7) {
-                    currentHref = document.location.href;
-                    document.location.reload();
-                } else {
-                    if (getHash() != getIframeHash()) {
-                        // this.iframe.src = this.blankURL + hash;
-                        var sourceToSet = historyFrameSourcePrefix + getHash();
-                        getHistoryFrame().src = sourceToSet;
-                        currentHref = document.location.href;
-                    }
-                }
-            }
-        }
-
-        if (browser.safari && !browserHasHashChange) {
-            // For Safari, we have to check to see if history.length changed.
-            if (currentHistoryLength >= 0 && history.length != currentHistoryLength) {
-                //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|"));
-                var flexAppUrl = getHash();
-                if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */ ) {
-                    // If it did change and we're running Safari 3.x or earlier, 
-                    // then we have to look the old state up in our hand-maintained 
-                    // array since document.location.hash won't have changed, 
-                    // then call back into BrowserManager.
-                    currentHistoryLength = history.length;
-                    flexAppUrl = historyHash[currentHistoryLength];
-                }
-
-                //ADR: to fix multiple
-                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
-                    var pl = getPlayers();
-                    for (var i = 0; i < pl.length; i++) {
-                        pl[i].browserURLChange(flexAppUrl);
-                    }
-                } else {
-                    getPlayer().browserURLChange(flexAppUrl);
-                }
-                _storeStates();
-            }
-        }
-        if (browser.firefox && !browserHasHashChange) {
-            if (currentHref != document.location.href) {
-                var bsl = backStack.length;
-
-                var urlActions = {
-                    back: false,
-                    forward: false,
-                    set: false
-                }
-
-                if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) {
-                    urlActions.back = true;
-                    // FIXME: could this ever be a forward button?
-                    // we can't clear it because we still need to check for forwards. Ugg.
-                    // clearInterval(this.locationTimer);
-                    handleBackButton();
-                }
-
-                // first check to see if we could have gone forward. We always halt on
-                // a no-hash item.
-                if (forwardStack.length > 0) {
-                    if (forwardStack[forwardStack.length - 1].flexAppUrl == getHash()) {
-                        urlActions.forward = true;
-                        handleForwardButton();
-                    }
-                }
-
-                // ok, that didn't work, try someplace back in the history stack
-                if ((bsl >= 2) && (backStack[bsl - 2])) {
-                    if (backStack[bsl - 2].flexAppUrl == getHash()) {
-                        urlActions.back = true;
-                        handleBackButton();
-                    }
-                }
-
-                if (!urlActions.back && !urlActions.forward) {
-                    var foundInStacks = {
-                        back: -1,
-                        forward: -1
-                    }
-
-                    for (var i = 0; i < backStack.length; i++) {
-                        if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {
-                            arbitraryUrl = true;
-                            foundInStacks.back = i;
-                        }
-                    }
-                    for (var i = 0; i < forwardStack.length; i++) {
-                        if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) {
-                            arbitraryUrl = true;
-                            foundInStacks.forward = i;
-                        }
-                    }
-                    handleArbitraryUrl();
-                }
-
-                // Firefox changed; do a callback into BrowserManager to tell it.
-                currentHref = document.location.href;
-                var flexAppUrl = getHash();
-                //ADR: to fix multiple
-                if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
-                    var pl = getPlayers();
-                    for (var i = 0; i < pl.length; i++) {
-                        pl[i].browserURLChange(flexAppUrl);
-                    }
-                } else {
-                    getPlayer().browserURLChange(flexAppUrl);
-                }
-            }
-        }
-    }
-
-    var _initialize = function() {
-
-        browserHasHashChange = ("onhashchange" in document.body);
-
-        if (browser.ie) {
-            var scripts = document.getElementsByTagName('script');
-            for (var i = 0, s; s = scripts[i]; i++) {
-                if (s.src.indexOf("history.js") > -1) {
-                    var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html");
-                }
-            }
-            historyFrameSourcePrefix = iframe_location + "?";
-            var src = historyFrameSourcePrefix;
-
-            var iframe = document.createElement("iframe");
-            iframe.id = 'ie_historyFrame';
-            iframe.name = 'ie_historyFrame';
-            iframe.src = 'javascript:false;';
-
-            try {
-                document.body.appendChild(iframe);
-            } catch (e) {
-                setTimeout(function() {
-                    document.body.appendChild(iframe);
-                }, 0);
-            }
-        }
-
-        if (browser.safari && !browserHasHashChange) {
-            var rememberDiv = document.createElement("div");
-            rememberDiv.id = 'safari_rememberDiv';
-            document.body.appendChild(rememberDiv);
-            rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">';
-
-            var formDiv = document.createElement("div");
-            formDiv.id = 'safari_formDiv';
-            document.body.appendChild(formDiv);
-
-            var reloader_content = document.createElement('div');
-            reloader_content.id = 'safarireloader';
-            var scripts = document.getElementsByTagName('script');
-            for (var i = 0, s; s = scripts[i]; i++) {
-                if (s.src.indexOf("history.js") > -1) {
-                    html = (new String(s.src)).replace(".js", ".html");
-                }
-            }
-            reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>';
-            document.body.appendChild(reloader_content);
-            reloader_content.style.position = 'absolute';
-            reloader_content.style.left = reloader_content.style.top = '-9999px';
-            iframe = reloader_content.getElementsByTagName('iframe')[0];
-
-            if (document.getElementById("safari_remember_field").value != "") {
-                historyHash = document.getElementById("safari_remember_field").value.split(",");
-            }
-        }
-
-        if (browserHasHashChange)
-            document.body.onhashchange = hashChangeHandler;
-    }
-
-    return {
-        historyHash: historyHash,
-        backStack: function() {
-            return backStack;
-        },
-        forwardStack: function() {
-            return forwardStack
-        },
-        getPlayer: getPlayer,
-        initialize: function(src) {
-            _initialize(src);
-        },
-        setURL: function(url) {
-            document.location.href = url;
-        },
-        getURL: function() {
-            return document.location.href;
-        },
-        getTitle: function() {
-            return document.title;
-        },
-        setTitle: function(title) {
-            try {
-                backStack[backStack.length - 1].title = title;
-            } catch (e) {}
-            //if on safari, set the title to be the empty string. 
-            if (browser.safari) {
-                if (title == "") {
-                    try {
-                        var tmp = window.location.href.toString();
-                        title = tmp.substring((tmp.lastIndexOf("/") + 1), tmp.lastIndexOf("#"));
-                    } catch (e) {
-                        title = "";
-                    }
-                }
-            }
-            document.title = title;
-        },
-        setDefaultURL: function(def) {
-            defaultHash = def;
-            def = getHash();
-            //trailing ? is important else an extra frame gets added to the history
-            //when navigating back to the first page.  Alternatively could check
-            //in history frame navigation to compare # and ?.
-            if (browser.ie) {
-                window['_ie_firstload'] = true;
-                var sourceToSet = historyFrameSourcePrefix + def;
-                var func = function() {
-                    getHistoryFrame().src = sourceToSet;
-                    window.location.replace("#" + def);
-                    setInterval(checkForUrlChange, 50);
-                }
-                try {
-                    func();
-                } catch (e) {
-                    window.setTimeout(function() {
-                        func();
-                    }, 0);
-                }
-            }
-
-            if (browser.safari) {
-                currentHistoryLength = history.length;
-                if (historyHash.length == 0) {
-                    historyHash[currentHistoryLength] = def;
-                    var newloc = "#" + def;
-                    window.location.replace(newloc);
-                } else {
-                    //alert(historyHash[historyHash.length-1]);
-                }
-                setInterval(checkForUrlChange, 50);
-            }
-
-
-            if (browser.firefox || browser.opera) {
-                var reg = new RegExp("#" + def + "$");
-                if (window.location.toString().match(reg)) {} else {
-                    var newloc = "#" + def;
-                    window.location.replace(newloc);
-                }
-                setInterval(checkForUrlChange, 50);
-            }
-
-        },
-
-        /* Set the current browser URL; called from inside BrowserManager to propagate
-         * the application state out to the container.
-         */
-        setBrowserURL: function(flexAppUrl, objectId) {
-            if (browser.ie && typeof objectId != "undefined") {
-                currentObjectId = objectId;
-            }
-            //fromIframe = fromIframe || false;
-            //fromFlex = fromFlex || false;
-            //alert("setBrowserURL: " + flexAppUrl);
-            //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ;
-
-            var pos = document.location.href.indexOf('#');
-            var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href;
-            var newUrl = baseUrl + '#' + flexAppUrl;
-
-            if (document.location.href != newUrl && document.location.href + '#' != newUrl) {
-                currentHref = newUrl;
-                addHistoryEntry(baseUrl, newUrl, flexAppUrl);
-                currentHistoryLength = history.length;
-            }
-        },
-
-        browserURLChange: function(flexAppUrl) {
-            var objectId = null;
-            if (browser.ie && currentObjectId != null) {
-                objectId = currentObjectId;
-            }
-
-            if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) {
-                var pl = getPlayers();
-                for (var i = 0; i < pl.length; i++) {
-                    try {
-                        pl[i].browserURLChange(flexAppUrl);
-                    } catch (e) {}
-                }
-            } else {
-                try {
-                    getPlayer(objectId).browserURLChange(flexAppUrl);
-                } catch (e) {}
-            }
-
-            currentObjectId = null;
-        },
-        getUserAgent: function() {
-            return navigator.userAgent;
-        },
-        getPlatform: function() {
-            return navigator.platform;
-        }
+	// type of browser
+	var browser = {
+		ie : false,
+		ie8 : false,
+		firefox : false,
+		safari : false,
+		opera : false,
+		version : -1
+	};
+
+	// Default app state URL to use when no fragment ID present
+	var defaultHash = '';
+
+	// Last-known app state URL
+	var currentHref = document.location.href;
+
+	// Initial URL (used only by IE)
+	var initialHref = document.location.href;
+
+	// Initial URL (used only by IE)
+	var initialHash = document.location.hash;
+
+	// History frame source URL prefix (used only by IE)
+	var historyFrameSourcePrefix = 'history/historyFrame.html?';
+
+	// History maintenance (used only by Safari)
+	var currentHistoryLength = -1;
+
+	// Flag to denote the existence of onhashchange
+	var browserHasHashChange = false;
+
+	var historyHash = [];
+
+	var initialState = createState(initialHref,
+			initialHref + '#' + initialHash, initialHash);
+
+	var backStack = [];
+	var forwardStack = [];
+
+	var currentObjectId = null;
+
+	//UserAgent detection
+	var useragent = navigator.userAgent.toLowerCase();
+
+	if (useragent.indexOf("opera") != -1) {
+		browser.opera = true;
+	} else if (useragent.indexOf("msie") != -1) {
+		browser.ie = true;
+		browser.version = parseFloat(useragent.substring(useragent
+				.indexOf('msie') + 4));
+		if (browser.version == 8) {
+			browser.ie = false;
+			browser.ie8 = true;
+		}
+	} else if (useragent.indexOf("safari") != -1) {
+		browser.safari = true;
+		browser.version = parseFloat(useragent.substring(useragent
+				.indexOf('safari') + 7));
+	} else if (useragent.indexOf("gecko") != -1) {
+		browser.firefox = true;
+	}
+
+	if (browser.ie == true && browser.version == 7) {
+		window["_ie_firstload"] = false;
+	}
+
+	function hashChangeHandler() {
+		currentHref = document.location.href;
+		var flexAppUrl = getHash();
+		//ADR: to fix multiple
+		if (typeof BrowserHistory_multiple != "undefined"
+				&& BrowserHistory_multiple == true) {
+			var pl = getPlayers();
+			for (var i = 0; i < pl.length; i++) {
+				pl[i].browserURLChange(flexAppUrl);
+			}
+		} else {
+			var p = getPlayer();
+			if (p) {
+				p.browserURLChange(flexAppUrl);
+			}
+		}
+	}
+
+	// Accessor functions for obtaining specific elements of the page.
+
+	function getHistoryFrame() {
+		return document.getElementById('ie_historyFrame');
+	}
+
+	function getFormElement() {
+		return document.getElementById('safari_formDiv');
+	}
+
+	function getRememberElement() {
+		return document.getElementById("safari_remember_field");
+	}
+
+	// Get the Flash player object for performing ExternalInterface callbacks.
+	// Updated for changes to SWFObject2.
+
+	function getPlayer(id) {
+		var i;
+
+		if (id && document.getElementById(id)) {
+			var r = document.getElementById(id);
+			if (typeof r.SetVariable != "undefined") {
+				return r;
+			} else {
+				var o = r.getElementsByTagName("object");
+				var e = r.getElementsByTagName("embed");
+				for (i = 0; i < o.length; i++) {
+					if (typeof o[i].browserURLChange != "undefined")
+						return o[i];
+				}
+				for (i = 0; i < e.length; i++) {
+					if (typeof e[i].browserURLChange != "undefined")
+						return e[i];
+				}
+			}
+		} else {
+			var o = document.getElementsByTagName("object");
+			var e = document.getElementsByTagName("embed");
+			for (i = 0; i < e.length; i++) {
+				if (typeof e[i].browserURLChange != "undefined") {
+					return e[i];
+				}
+			}
+			for (i = 0; i < o.length; i++) {
+				if (typeof o[i].browserURLChange != "undefined") {
+					return o[i];
+				}
+			}
+		}
+		return undefined;
+	}
+
+	function getPlayers() {
+		var i;
+		var players = [];
+		if (players.length == 0) {
+			var tmp = document.getElementsByTagName('object');
+			for (i = 0; i < tmp.length; i++) {
+				if (typeof tmp[i].browserURLChange != "undefined")
+					players.push(tmp[i]);
+			}
+		}
+		if (players.length == 0 || players[0].object == null) {
+			var tmp = document.getElementsByTagName('embed');
+			for (i = 0; i < tmp.length; i++) {
+				if (typeof tmp[i].browserURLChange != "undefined")
+					players.push(tmp[i]);
+			}
+		}
+		return players;
+	}
+
+	function getIframeHash() {
+		var doc = getHistoryFrame().contentWindow.document;
+		var hash = String(doc.location.search);
+		if (hash.length == 1 && hash.charAt(0) == "?") {
+			hash = "";
+		} else if (hash.length >= 2 && hash.charAt(0) == "?") {
+			hash = hash.substring(1);
+		}
+		return hash;
+	}
+
+	/* Get the current location hash excluding the '#' symbol. */
+
+	function getHash() {
+		// It would be nice if we could use document.location.hash here,
+		// but it's faulty sometimes.
+		var idx = document.location.href.indexOf('#');
+		return (idx >= 0) ? document.location.href.substr(idx + 1) : '';
+	}
+
+	/* Get the current location hash excluding the '#' symbol. */
+
+	function setHash(hash) {
+		// It would be nice if we could use document.location.hash here,
+		// but it's faulty sometimes.
+		if (hash == '')
+			hash = '#'
+		document.location.hash = hash;
+	}
+
+	function createState(baseUrl, newUrl, flexAppUrl) {
+		return {
+			'baseUrl' : baseUrl,
+			'newUrl' : newUrl,
+			'flexAppUrl' : flexAppUrl,
+			'title' : null
+		};
+	}
+
+	/* Add a history entry to the browser.
+	 *   baseUrl: the portion of the location prior to the '#'
+	 *   newUrl: the entire new URL, including '#' and following fragment
+	 *   flexAppUrl: the portion of the location following the '#' only
+	 */
+
+	function addHistoryEntry(baseUrl, newUrl, flexAppUrl) {
+
+		//delete all the history entries
+		forwardStack = [];
+
+		if (browser.ie) {
+			//Check to see if we are being asked to do a navigate for the first
+			//history entry, and if so ignore, because it's coming from the creation
+			//of the history iframe
+			if (flexAppUrl == defaultHash
+					&& document.location.href == initialHref
+					&& window['_ie_firstload']) {
+				currentHref = initialHref;
+				return;
+			}
+			if ((!flexAppUrl || flexAppUrl == defaultHash)
+					&& window['_ie_firstload']) {
+				newUrl = baseUrl + '#' + defaultHash;
+				flexAppUrl = defaultHash;
+			} else {
+				// for IE, tell the history frame to go somewhere without a '#'
+				// in order to get this entry into the browser history.
+				getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl;
+			}
+			setHash(flexAppUrl);
+		} else {
+
+			//ADR
+			if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) {
+				initialState = createState(baseUrl, newUrl, flexAppUrl);
+			} else if (backStack.length > 0
+					&& backStack[backStack.length - 1].flexAppUrl == flexAppUrl) {
+				backStack[backStack.length - 1] = createState(baseUrl, newUrl,
+						flexAppUrl);
+			}
+
+			if (browser.safari && !browserHasHashChange) {
+				// for Safari, submit a form whose action points to the desired URL
+				if (browser.version <= 419.3) {
+					var file = window.location.pathname.toString();
+					file = file.substring(file.lastIndexOf("/") + 1);
+					getFormElement().innerHTML = '<form name="historyForm" action="'
+							+ file
+							+ '#'
+							+ flexAppUrl
+							+ '" method="GET"></form>';
+					//get the current elements and add them to the form
+					var qs = window.location.search.substring(1);
+					var qs_arr = qs.split("&");
+					for (var i = 0; i < qs_arr.length; i++) {
+						var tmp = qs_arr[i].split("=");
+						var elem = document.createElement("input");
+						elem.type = "hidden";
+						elem.name = tmp[0];
+						elem.value = tmp[1];
+						document.forms.historyForm.appendChild(elem);
+					}
+					document.forms.historyForm.submit();
+				} else {
+					top.location.hash = flexAppUrl;
+				}
+				// We also have to maintain the history by hand for Safari
+				historyHash[history.length] = flexAppUrl;
+				_storeStates();
+			} else {
+				// Otherwise, just tell the browser to go there
+				setHash(flexAppUrl);
+			}
+		}
+		backStack.push(createState(baseUrl, newUrl, flexAppUrl));
+	}
+
+	function _storeStates() {
+		if (browser.safari) {
+			getRememberElement().value = historyHash.join(",");
+		}
+	}
+
+	function handleBackButton() {
+		//The "current" page is always at the top of the history stack.
+		var current = backStack.pop();
+		if (!current) {
+			return;
+		}
+		var last = backStack[backStack.length - 1];
+		if (!last && backStack.length == 0) {
+			last = initialState;
+		}
+		forwardStack.push(current);
+	}
+
+	function handleForwardButton() {
+		//summary: private method. Do not call this directly.
+
+		var last = forwardStack.pop();
+		if (!last) {
+			return;
+		}
+		backStack.push(last);
+	}
+
+	function handleArbitraryUrl() {
+		//delete all the history entries
+		forwardStack = [];
+	}
+
+	/* Called periodically to poll to see if we need to detect navigation that has occurred */
+
+	function checkForUrlChange() {
+
+		if (browser.ie) {
+			if (currentHref != document.location.href
+					&& currentHref + '#' != document.location.href) {
+				//This occurs when the user has navigated to a specific URL
+				//within the app, and didn't use browser back/forward
+				//IE seems to have a bug where it stops updating the URL it
+				//shows the end-user at this point, but programatically it
+				//appears to be correct.  Do a full app reload to get around
+				//this issue.
+				if (browser.version < 7) {
+					currentHref = document.location.href;
+					document.location.reload();
+				} else {
+					if (getHash() != getIframeHash()) {
+						// this.iframe.src = this.blankURL + hash;
+						var sourceToSet = historyFrameSourcePrefix + getHash();
+						getHistoryFrame().src = sourceToSet;
+						currentHref = document.location.href;
+					}
+				}
+			}
+		}
+
+		if (browser.safari && !browserHasHashChange) {
+			// For Safari, we have to check to see if history.length changed.
+			if (currentHistoryLength >= 0
+					&& history.length != currentHistoryLength) {
+				//alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|"));
+				var flexAppUrl = getHash();
+				if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */) {
+					// If it did change and we're running Safari 3.x or earlier, 
+					// then we have to look the old state up in our hand-maintained 
+					// array since document.location.hash won't have changed, 
+					// then call back into BrowserManager.
+					currentHistoryLength = history.length;
+					flexAppUrl = historyHash[currentHistoryLength];
+				}
+
+				//ADR: to fix multiple
+				if (typeof BrowserHistory_multiple != "undefined"
+						&& BrowserHistory_multiple == true) {
+					var pl = getPlayers();
+					for (var i = 0; i < pl.length; i++) {
+						pl[i].browserURLChange(flexAppUrl);
+					}
+				} else {
+					getPlayer().browserURLChange(flexAppUrl);
+				}
+				_storeStates();
+			}
+		}
+		if (browser.firefox && !browserHasHashChange) {
+			if (currentHref != document.location.href) {
+				var bsl = backStack.length;
+
+				var urlActions = {
+					back : false,
+					forward : false,
+					set : false
+				}
+
+				if ((window.location.hash == initialHash || window.location.href == initialHref)
+						&& (bsl == 1)) {
+					urlActions.back = true;
+					// FIXME: could this ever be a forward button?
+					// we can't clear it because we still need to check for forwards. Ugg.
+					// clearInterval(this.locationTimer);
+					handleBackButton();
+				}
+
+				// first check to see if we could have gone forward. We always halt on
+				// a no-hash item.
+				if (forwardStack.length > 0) {
+					if (forwardStack[forwardStack.length - 1].flexAppUrl == getHash()) {
+						urlActions.forward = true;
+						handleForwardButton();
+					}
+				}
+
+				// ok, that didn't work, try someplace back in the history stack
+				if ((bsl >= 2) && (backStack[bsl - 2])) {
+					if (backStack[bsl - 2].flexAppUrl == getHash()) {
+						urlActions.back = true;
+						handleBackButton();
+					}
+				}
+
+				if (!urlActions.back && !urlActions.forward) {
+					var foundInStacks = {
+						back : -1,
+						forward : -1
+					}
+
+					for (var i = 0; i < backStack.length; i++) {
+						if (backStack[i].flexAppUrl == getHash()
+								&& i != (bsl - 2)) {
+							arbitraryUrl = true;
+							foundInStacks.back = i;
+						}
+					}
+					for (var i = 0; i < forwardStack.length; i++) {
+						if (forwardStack[i].flexAppUrl == getHash()
+								&& i != (bsl - 2)) {
+							arbitraryUrl = true;
+							foundInStacks.forward = i;
+						}
+					}
+					handleArbitraryUrl();
+				}
+
+				// Firefox changed; do a callback into BrowserManager to tell it.
+				currentHref = document.location.href;
+				var flexAppUrl = getHash();
+				//ADR: to fix multiple
+				if (typeof BrowserHistory_multiple != "undefined"
+						&& BrowserHistory_multiple == true) {
+					var pl = getPlayers();
+					for (var i = 0; i < pl.length; i++) {
+						pl[i].browserURLChange(flexAppUrl);
+					}
+				} else {
+					getPlayer().browserURLChange(flexAppUrl);
+				}
+			}
+		}
+	}
+
+	var _initialize = function() {
+
+		browserHasHashChange = ("onhashchange" in document.body);
+
+		if (browser.ie) {
+			var scripts = document.getElementsByTagName('script');
+			for (var i = 0, s; s = scripts[i]; i++) {
+				if (s.src.indexOf("history.js") > -1) {
+					var iframe_location = (new String(s.src)).replace(
+							"history.js", "historyFrame.html");
+				}
+			}
+			historyFrameSourcePrefix = iframe_location + "?";
+			var src = historyFrameSourcePrefix;
+
+			var iframe = document.createElement("iframe");
+			iframe.id = 'ie_historyFrame';
+			iframe.name = 'ie_historyFrame';
+			iframe.src = 'javascript:false;';
+
+			try {
+				document.body.appendChild(iframe);
+			} catch (e) {
+				setTimeout(function() {
+					document.body.appendChild(iframe);
+				}, 0);
+			}
+		}
+
+		if (browser.safari && !browserHasHashChange) {
+			var rememberDiv = document.createElement("div");
+			rememberDiv.id = 'safari_rememberDiv';
+			document.body.appendChild(rememberDiv);
+			rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">';
+
+			var formDiv = document.createElement("div");
+			formDiv.id = 'safari_formDiv';
+			document.body.appendChild(formDiv);
+
+			var reloader_content = document.createElement('div');
+			reloader_content.id = 'safarireloader';
+			var scripts = document.getElementsByTagName('script');
+			for (var i = 0, s; s = scripts[i]; i++) {
+				if (s.src.indexOf("history.js") > -1) {
+					html = (new String(s.src)).replace(".js", ".html");
+				}
+			}
+			reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>';
+			document.body.appendChild(reloader_content);
+			reloader_content.style.position = 'absolute';
+			reloader_content.style.left = reloader_content.style.top = '-9999px';
+			iframe = reloader_content.getElementsByTagName('iframe')[0];
+
+			if (document.getElementById("safari_remember_field").value != "") {
+				historyHash = document.getElementById("safari_remember_field").value
+						.split(",");
+			}
+		}
+
+		if (browserHasHashChange)
+			document.body.onhashchange = hashChangeHandler;
+	}
+
+	return {
+		historyHash : historyHash,
+		backStack : function() {
+			return backStack;
+		},
+		forwardStack : function() {
+			return forwardStack
+		},
+		getPlayer : getPlayer,
+		initialize : function(src) {
+			_initialize(src);
+		},
+		setURL : function(url) {
+			document.location.href = url;
+		},
+		getURL : function() {
+			return document.location.href;
+		},
+		getTitle : function() {
+			return document.title;
+		},
+		setTitle : function(title) {
+			try {
+				backStack[backStack.length - 1].title = title;
+			} catch (e) {
+			}
+			//if on safari, set the title to be the empty string. 
+			if (browser.safari) {
+				if (title == "") {
+					try {
+						var tmp = window.location.href.toString();
+						title = tmp.substring((tmp.lastIndexOf("/") + 1), tmp
+								.lastIndexOf("#"));
+					} catch (e) {
+						title = "";
+					}
+				}
+			}
+			document.title = title;
+		},
+		setDefaultURL : function(def) {
+			defaultHash = def;
+			def = getHash();
+			//trailing ? is important else an extra frame gets added to the history
+			//when navigating back to the first page.  Alternatively could check
+			//in history frame navigation to compare # and ?.
+			if (browser.ie) {
+				window['_ie_firstload'] = true;
+				var sourceToSet = historyFrameSourcePrefix + def;
+				var func = function() {
+					getHistoryFrame().src = sourceToSet;
+					window.location.replace("#" + def);
+					setInterval(checkForUrlChange, 50);
+				}
+				try {
+					func();
+				} catch (e) {
+					window.setTimeout(function() {
+						func();
+					}, 0);
+				}
+			}
+
+			if (browser.safari) {
+				currentHistoryLength = history.length;
+				if (historyHash.length == 0) {
+					historyHash[currentHistoryLength] = def;
+					var newloc = "#" + def;
+					window.location.replace(newloc);
+				} else {
+					//alert(historyHash[historyHash.length-1]);
+				}
+				setInterval(checkForUrlChange, 50);
+			}
+
+			if (browser.firefox || browser.opera) {
+				var reg = new RegExp("#" + def + "$");
+				if (window.location.toString().match(reg)) {
+				} else {
+					var newloc = "#" + def;
+					window.location.replace(newloc);
+				}
+				setInterval(checkForUrlChange, 50);
+			}
+
+		},
+
+		/* Set the current browser URL; called from inside BrowserManager to propagate
+		 * the application state out to the container.
+		 */
+		setBrowserURL : function(flexAppUrl, objectId) {
+			if (browser.ie && typeof objectId != "undefined") {
+				currentObjectId = objectId;
+			}
+			//fromIframe = fromIframe || false;
+			//fromFlex = fromFlex || false;
+			//alert("setBrowserURL: " + flexAppUrl);
+			//flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ;
+
+			var pos = document.location.href.indexOf('#');
+			var baseUrl = pos != -1 ? document.location.href.substr(0, pos)
+					: document.location.href;
+			var newUrl = baseUrl + '#' + flexAppUrl;
+
+			if (document.location.href != newUrl
+					&& document.location.href + '#' != newUrl) {
+				currentHref = newUrl;
+				addHistoryEntry(baseUrl, newUrl, flexAppUrl);
+				currentHistoryLength = history.length;
+			}
+		},
+
+		browserURLChange : function(flexAppUrl) {
+			var objectId = null;
+			if (browser.ie && currentObjectId != null) {
+				objectId = currentObjectId;
+			}
+
+			if (typeof BrowserHistory_multiple != "undefined"
+					&& BrowserHistory_multiple == true) {
+				var pl = getPlayers();
+				for (var i = 0; i < pl.length; i++) {
+					try {
+						pl[i].browserURLChange(flexAppUrl);
+					} catch (e) {
+					}
+				}
+			} else {
+				try {
+					getPlayer(objectId).browserURLChange(flexAppUrl);
+				} catch (e) {
+				}
+			}
+
+			currentObjectId = null;
+		},
+		getUserAgent : function() {
+			return navigator.userAgent;
+		},
+		getPlatform : function() {
+			return navigator.platform;
+		}
 
-    }
+	}
 
 })();
 
@@ -653,51 +686,52 @@ BrowserHistory = (function() {
 // Automated unit testing and other diagnostics
 
 function setURL(url) {
-    document.location.href = url;
+	document.location.href = url;
 }
 
 function backButton() {
-    history.back();
+	history.back();
 }
 
 function forwardButton() {
-    history.forward();
+	history.forward();
 }
 
 function goForwardOrBackInHistory(step) {
-    history.go(step);
+	history.go(step);
 }
 
 //BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); });
 (function(i) {
-    var u = navigator.userAgent;
-    var e = /*@cc_on!@*/ false;
-    var st = setTimeout;
-    if (/webkit/i.test(u)) {
-        st(function() {
-            var dr = document.readyState;
-            if (dr == "loaded" || dr == "complete") {
-                i()
-            } else {
-                st(arguments.callee, 10);
-            }
-        }, 10);
-    } else if ((/mozilla/i.test(u) && !/(compati)/.test(u)) || (/opera/i.test(u))) {
-        document.addEventListener("DOMContentLoaded", i, false);
-    } else if (e) {
-        (function() {
-            var t = document.createElement('doc:rdy');
-            try {
-                t.doScroll('left');
-                i();
-                t = null;
-            } catch (e) {
-                st(arguments.callee, 0);
-            }
-        })();
-    } else {
-        window.onload = i;
-    }
+	var u = navigator.userAgent;
+	var e = /*@cc_on!@*/false;
+	var st = setTimeout;
+	if (/webkit/i.test(u)) {
+		st(function() {
+			var dr = document.readyState;
+			if (dr == "loaded" || dr == "complete") {
+				i()
+			} else {
+				st(arguments.callee, 10);
+			}
+		}, 10);
+	} else if ((/mozilla/i.test(u) && !/(compati)/.test(u))
+			|| (/opera/i.test(u))) {
+		document.addEventListener("DOMContentLoaded", i, false);
+	} else if (e) {
+		(function() {
+			var t = document.createElement('doc:rdy');
+			try {
+				t.doScroll('left');
+				i();
+				t = null;
+			} catch (e) {
+				st(arguments.callee, 0);
+			}
+		})();
+	} else {
+		window.onload = i;
+	}
 })(function() {
-    BrowserHistory.initialize();
-});
\ No newline at end of file
+	BrowserHistory.initialize();
+});

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/theme.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/theme.xml?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/theme.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/public/theme.xml Thu Apr 14 11:46:52 2016
@@ -54,16 +54,6 @@
 				description="color of text for menus" />		
 	
 	<!-- Icons -->
-	<resource name="logo_image" 
-				description="Logo to display on Main BG Navi" 
-				license="APL"
-				src="themes/basic-theme/general/logo.png" />
-	
-	<resource name="icon_facebook_rsc_png" 
-				description="Icon for facebook button in login" 
-				license="Unkown"
-				src="themes/basic-theme/auth/icon_facebook.png" />
-				
 	<resource name="warning_popup_icon_rsc" 
 				description="Toolbar Icon" 
 				license="FamFam Icon Set"
@@ -339,20 +329,4 @@
 				license="APL author sebawagner"
 				src="themes/basic-theme/dashboard/conference_icon_normal.png" />	
 				
-	<!-- Conference room -->	
-	<resource name="users_tab_btn" 
-				description="Conference Room Tab User" 
-				license="FamFam Icon Set"
-				src="themes/basic-theme/conference/group.png" />
-		
-	<resource name="files_tab_btn" 
-				description="Conference Room Tab Files" 
-				license="FamFam Icon Set"
-				src="themes/basic-theme/conference/folder_explore.png" />
-	
-	<resource name="exit_btn_rsc" 
-				description="Conference Room Tab Icon" 
-				license="APL author sebawagner"
-				src="themes/basic-theme/conference/exit_button.png" />			
-	
-</theme>
\ No newline at end of file
+</theme>

Modified: openmeetings/application/branches/3.2.x/pom.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/pom.xml?rev=1739063&r1=1739062&r2=1739063&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/pom.xml (original)
+++ openmeetings/application/branches/3.2.x/pom.xml Thu Apr 14 11:46:52 2016
@@ -26,7 +26,7 @@
 	</parent>
 	<groupId>org.apache.openmeetings</groupId>
 	<artifactId>openmeetings-parent</artifactId>
-	<version>3.1.2-SNAPSHOT</version>
+	<version>3.2.0-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>Openmeetings</name>
 	<description>OpenMeetings Maven Parent</description>
@@ -41,7 +41,7 @@
 		<maven.javadoc.version>2.10.3</maven.javadoc.version>
 		<maven.surefire.version>2.19.1</maven.surefire.version>
 		<maven-site.version>3.5</maven-site.version>
-		<wicket.version>7.2.0</wicket.version>
+		<wicket.version>7.3.0-SNAPSHOT</wicket.version>
 		<wicketju.version>7.2.2-SNAPSHOT</wicketju.version>
 		<wickets.version>7.2.0</wickets.version>
 		<red5-server.version>1.0.7-M10</red5-server.version>