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>


Reply via email to