Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.html
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <form wicket:id="form">
+               <div style="margin-bottom: 30px;"><wicket:message 
key="594"/></div>
+               <div class="fileinput fileinput-new" data-provides="fileinput" 
style="margin: 0;">
+                       <div style="display: block;" 
class="fileinput-filename"></div>
+                       <span class="btn btn-file ui-button ui-widget 
ui-state-default ui-corner-all ui-button-text-only" style="width: 120px;">
+                               <span class="ui-button-text"><wicket:message 
key="596"/></span>
+                               <input type="file" wicket:id="file"/>
+                       </span>
+               </div>
+               <div wicket:id="feedback"></div>
+               <span wicket:id="progress">[progressbar]</span>
+               <div style="margin-top: 30px;"><input 
type="checkbox"/><label><wicket:message key="1312"/></label></div>
+       </form>
+       <form wicket:id="name-form">
+               <input type="hidden" wicket:id="name"/>
+       </form>
+</wicket:panel>
+</html>

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,194 @@
+/*
+ * 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.WebSession.getUserId;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.core.data.file.FileProcessor;
+import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.util.StoredFile;
+import org.apache.openmeetings.util.process.ConverterProcessResultList;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.room.RoomPanel;
+import org.apache.openmeetings.web.util.BootstrapFileUploadBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import 
org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.markup.html.form.upload.FileUpload;
+import org.apache.wicket.markup.html.form.upload.FileUploadField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.string.Strings;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+public class UploadDialog extends AbstractFormDialog<String> {
+       private static final long serialVersionUID = 1L;
+       private final KendoFeedbackPanel feedback = new 
KendoFeedbackPanel("feedback", new Options("button", true));
+       private final Form<String> form;
+       private final DialogButton upload;
+       private final DialogButton cancel;
+       private final FileUploadField uploadField;
+       private final HiddenField<String> fileName;
+       private final RoomFilePanel roomFiles;
+       private final RoomPanel room;
+
+       public UploadDialog(String id, RoomPanel room, RoomFilePanel roomFiles) 
{
+               super(id, Application.getString(304));
+               this.roomFiles = roomFiles;
+               this.room = room;
+               add(form = new Form<>("form"));
+               upload = new DialogButton("upload", Application.getString(593), 
false) {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public boolean isIndicating() {
+                               return true;
+                       }
+               };
+               cancel = new DialogButton("close", Application.getString(85));
+               form.add(feedback.setOutputMarkupId(true));
+       
+               form.setMultiPart(true);
+               
form.setMaxSize(Bytes.bytes(getBean(ConfigurationDao.class).getMaxUploadSize()));
+               // Model is necessary here to avoid writing image to the User 
object
+               form.add(uploadField = new FileUploadField("file", new 
IModel<List<FileUpload>>() {
+                       private static final long serialVersionUID = 1L;
+
+                       //FIXME this need to be eliminated
+                       @Override
+                       public void detach() {
+                       }
+                       
+                       @Override
+                       public void setObject(List<FileUpload> object) {
+                       }
+                       
+                       @Override
+                       public List<FileUpload> getObject() {
+                               return null;
+                       }
+               }));
+               uploadField.add(AttributeAppender.append("accept", 
StoredFile.getAcceptAttr()));
+               Form<String> nameForm = new Form<>("name-form");
+               fileName = new HiddenField<>("name", Model.of(""));
+               fileName.add(new AjaxFormSubmitBehavior(nameForm, "change") {
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       protected void onSubmit(AjaxRequestTarget target) {
+                               if 
(!Strings.isEmpty(getComponent().getDefaultModelObjectAsString())) {
+                                       upload.setEnabled(true, target);
+                               }
+                       }
+               }).setOutputMarkupId(true);
+               form.add(new UploadProgressBar("progress", form, uploadField));
+               add(nameForm.add(fileName.setOutputMarkupId(true)));
+               add(BootstrapFileUploadBehavior.INSTANCE);
+       }
+
+       @Override
+       public void onClick(AjaxRequestTarget target, DialogButton button) {
+               if (button == null || button.match("close")) {
+                       super.onClick(target, button);
+               }
+       }
+       
+       @Override
+       protected List<DialogButton> getButtons() {
+               return Arrays.asList(upload, cancel);
+       }
+       
+       @Override
+       public DialogButton getSubmitButton() {
+               return upload;
+       }
+
+       @Override
+       public Form<?> getForm() {
+               return form;
+       }
+
+       @Override
+       protected void onOpen(IPartialPageRequestHandler handler) {
+               super.onOpen(handler);
+               handler.appendJavaScript(String.format("bindUpload('%s', 
'%s');", form.getMarkupId(), fileName.getMarkupId()));
+       }
+       
+       @Override
+       protected void onError(AjaxRequestTarget target) {
+               target.add(feedback);
+       }
+
+       @Override
+       protected void onSubmit(AjaxRequestTarget target) {
+               FileUpload fu = uploadField.getFileUpload();
+               if (fu != null) {
+                       FileExplorerItem f = new FileExplorerItem();
+                       f.setSize(fu.getSize());
+                       f.setName(fu.getClientFileName());
+                       FileItem parent = roomFiles.getSelectedFile();
+                       if (parent == null || !(parent instanceof 
FileExplorerItem)) {
+                               f.setOwnerId(getUserId());
+                       } else {
+                               f.setRoomId(parent.getRoomId());
+                               f.setOwnerId(parent.getOwnerId());
+                               if (parent.getId() > 0) {
+                                       f.setParentId(FileItem.Type.Folder == 
parent.getType() ? parent.getId() : parent.getParentId());
+                               }
+                       }
+                       f.setInsertedBy(getUserId());
+                       
+                       try {
+                               ConverterProcessResultList result = 
getBean(FileProcessor.class).processFile(getUserId(), f, fu.getInputStream());
+                               if (result.hasError()) {
+                                       error(result.getLogMessage());
+                               } else {
+                                       close(target, null);
+                               }
+                       } catch (Exception e) {
+                               error(e.getMessage());
+                       }
+               }
+       }
+
+       @Override
+       public void renderHead(IHeaderResponse response) {
+               super.renderHead(response);
+               response.render(new 
PriorityHeaderItem(JavaScriptHeaderItem.forReference(new 
JavaScriptResourceReference(UploadDialog.class, "upload.js"))));
+       }
+}

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/upload.js
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,31 @@
+/**
+ * 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.
+ */
+function bindUpload(markupId, hiddenId) {
+       var fi = $('#' + markupId + ' .fileinput');
+       if (!fi.eventAdded) {
+               $('#' + markupId + ' .fileinput').on('change.bs.fileinput', 
function(event) {
+                       event.stopPropagation();
+                       var hi = $('#' + hiddenId);
+                       hi.val($('#' + markupId + ' .fileinput 
.fileinput-filename').text());
+                       hi.trigger('change');
+                       return false;
+               });
+               fi.eventAdded = true;
+       }
+}

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/AviRecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/AviRecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OmFileHelper.getRecording;
 
@@ -37,12 +37,12 @@ public class AviRecordingResourceReferen
        }
        
        @Override
-       String getFileName(Recording r) {
+       protected String getFileName(Recording r) {
                return r.getAlternateDownload();
        }
        
        @Override
-       File getFile(Recording r) {
+       protected File getFile(Recording r) {
                return getRecording(r.getAlternateDownload());
        }
 }

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FlvRecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/FlvRecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OmFileHelper.getRecording;
 
@@ -37,12 +37,12 @@ public class FlvRecordingResourceReferen
        }
        
        @Override
-       String getFileName(Recording r) {
+       protected String getFileName(Recording r) {
                return r.getHash();
        }
        
        @Override
-       File getFile(Recording r) {
+       protected File getFile(Recording r) {
                return getRecording(r.getHash());
        }
 }

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/JpgRecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/JpgRecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OmFileHelper.getRecording;
 
@@ -37,12 +37,12 @@ public class JpgRecordingResourceReferen
        }
        
        @Override
-       String getFileName(Recording r) {
+       protected String getFileName(Recording r) {
                return r.getPreviewImage();
        }
        
        @Override
-       File getFile(Recording r) {
+       protected File getFile(Recording r) {
                return getRecording(r.getPreviewImage());
        }
 }

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/Mp4RecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/Mp4RecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OmFileHelper.MP4_EXTENSION;
 import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording;
@@ -38,12 +38,12 @@ public class Mp4RecordingResourceReferen
        }
        
        @Override
-       String getFileName(Recording r) {
+       protected String getFileName(Recording r) {
                return r.getHash() + MP4_EXTENSION;
        }
        
        @Override
-       File getFile(Recording r) {
+       protected File getFile(Recording r) {
                return getMp4Recording(r.getHash());
        }
 }

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OggRecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/OggRecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OmFileHelper.OGG_EXTENSION;
 import static org.apache.openmeetings.util.OmFileHelper.getOggRecording;
@@ -38,12 +38,12 @@ public class OggRecordingResourceReferen
        }
        
        @Override
-       String getFileName(Recording r) {
+       protected String getFileName(Recording r) {
                return r.getHash() + OGG_EXTENSION;
        }
        
        @Override
-       File getFile(Recording r) {
+       protected File getFile(Recording r) {
                return getOggRecording(r.getHash());
        }
 }

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.openmeetings.web.util;
+package org.apache.openmeetings.web.user.record;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.web.app.Application.getBean;
@@ -25,26 +25,19 @@ import static org.apache.openmeetings.we
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.red5.logging.Red5LoggerFactory.getLogger;
 
-import java.io.File;
-import java.io.IOException;
-
-import javax.servlet.http.HttpServletResponse;
-
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.user.GroupUserDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.web.util.FileItemResourceReference;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
-import org.apache.wicket.resource.FileSystemResource;
-import org.apache.wicket.resource.FileSystemResourceReference;
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
 
-public abstract class RecordingResourceReference extends 
FileSystemResourceReference {
+public abstract class RecordingResourceReference extends 
FileItemResourceReference<Recording> {
        private static final long serialVersionUID = 1L;
        private static final Logger log = 
getLogger(RecordingResourceReference.class, webAppRootKey);
 
@@ -53,36 +46,27 @@ public abstract class RecordingResourceR
        }
 
        @Override
-       public IResource getResource() {
-               return new FileSystemResource() {
-                       private static final long serialVersionUID = 1L;
-                       private File file;
-                       
-                       @Override
-                       protected String getMimeType() throws IOException {
-                               return 
RecordingResourceReference.this.getMimeType();
-                       }
-                       
-                       @Override
-                       protected ResourceResponse 
newResourceResponse(Attributes attributes) {
-                               Recording r = getRecording(attributes);
-                               if (r != null) {
-                                       file = getFile(r);
-                                       return 
createResourceResponse(file.toPath());
-                               } else {
-                                       log.debug("No recording was found");
-                                       ResourceResponse rr = new 
ResourceResponse();
-                                       
rr.setError(HttpServletResponse.SC_NOT_FOUND);
-                                       return rr;
-                               }
+       protected Recording getFileItem(Attributes attributes) {
+               PageParameters params = attributes.getParameters();
+               StringValue _id = params.get("id");
+               Long id = null;
+               try {
+                       id = _id.toOptionalLong();
+               } catch (NumberFormatException e) {
+                       //no-op expected
+               }
+               WebSession ws = WebSession.get();
+               if (id != null && ws.isSignedIn()) {
+                       return getRecording(id);
+               } else {
+                       ws.invalidate();
+                       if (ws.signIn(_id.toString(), true)) {
+                               return getRecording(getRecordingId());
                        }
-               };
+               }
+               return null;
        }
        
-       abstract String getMimeType();
-       abstract String getFileName(Recording r);
-       abstract File getFile(Recording r);
-       
        private static Recording getRecording(Long id) {
                Recording r = getBean(RecordingDao.class).get(id);
                // TODO should we process public?
@@ -99,32 +83,12 @@ public abstract class RecordingResourceR
                //TODO external group check was added for plugin recording 
download
                String extType = getExternalType();
                if (extType != null) {
+                       log.debug("External recording requested: " + extType);
                        User creator = 
getBean(UserDao.class).get(r.getInsertedBy());
                        if (extType.equals(creator.getExternalType())) {
                                return r;
                        }
                }
                return null;
-       }
-       
-       private static Recording getRecording(Attributes attributes) {
-               PageParameters params = attributes.getParameters();
-               StringValue _id = params.get("id");
-               Long id = null;
-               try {
-                       id = _id.toOptionalLong();
-               } catch (NumberFormatException e) {
-                       //no-op expected
-               }
-               WebSession ws = WebSession.get();
-               if (id != null && ws.isSignedIn()) {
-                       return getRecording(id);
-               } else {
-                       ws.invalidate();
-                       if (ws.signIn(_id.toString(), true)) {
-                               return getRecording(getRecordingId());
-                       }
-               }
-               return null;
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java?rev=1739871&r1=1739870&r2=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/VideoPlayer.java
 Tue Apr 19 08:58:04 2016
@@ -21,8 +21,6 @@ package org.apache.openmeetings.web.user
 import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording;
 
 import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.web.util.Mp4RecordingResourceReference;
-import org.apache.openmeetings.web.util.OggRecordingResourceReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.media.Source;

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java?rev=1739871&r1=1739870&r2=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/BootstrapFileUploadBehavior.java
 Tue Apr 19 08:58:04 2016
@@ -25,13 +25,14 @@ import org.apache.wicket.markup.head.IHe
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
 
 public class BootstrapFileUploadBehavior extends Behavior {
        private static final long serialVersionUID = 1L;
-       private final static JavaScriptResourceReference 
BOOTSTRAP_FILEUPLOAD_JS_REFERENCE
-                       = new 
JavaScriptResourceReference(BootstrapFileUploadBehavior.class, 
"bootstrap-fileupload.js");
-       private final static CssResourceReference 
BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE
-                       = new 
CssResourceReference(BootstrapFileUploadBehavior.class, 
"bootstrap-fileupload.css");
+       private final static ResourceReference BOOTSTRAP_FILEINPUT_JS_REFERENCE
+                       = new 
JavaScriptResourceReference(BootstrapFileUploadBehavior.class, "fileinput.js");
+       private final static ResourceReference BOOTSTRAP_FILEINPUT_CSS_REFERENCE
+                       = new 
CssResourceReference(BootstrapFileUploadBehavior.class, "fileinput.css");
        public final static BootstrapFileUploadBehavior INSTANCE = new 
BootstrapFileUploadBehavior(); 
        
        private BootstrapFileUploadBehavior() {
@@ -40,7 +41,7 @@ public class BootstrapFileUploadBehavior
        @Override
        public void renderHead(Component component, IHeaderResponse response) {
                super.renderHead(component, response);
-        
response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_JS_REFERENCE));
-        
response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEUPLOAD_CSS_REFERENCE));
+               
response.render(JavaScriptHeaderItem.forReference(BOOTSTRAP_FILEINPUT_JS_REFERENCE));
+               
response.render(CssHeaderItem.forReference(BOOTSTRAP_FILEINPUT_CSS_REFERENCE));
        }
 }

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/FileItemResourceReference.java
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,77 @@
+/*
+ * 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.util;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+import static org.red5.logging.Red5LoggerFactory.getLogger;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.IResource.Attributes;
+import org.apache.wicket.resource.FileSystemResource;
+import org.apache.wicket.resource.FileSystemResourceReference;
+import org.slf4j.Logger;
+
+public abstract class FileItemResourceReference<T extends FileItem> extends 
FileSystemResourceReference {
+       private static final long serialVersionUID = 1L;
+       private static final Logger log = 
getLogger(FileItemResourceReference.class, webAppRootKey);
+
+       public FileItemResourceReference(String name) {
+               super(name);
+       }
+
+       @Override
+       public IResource getResource() {
+               return new FileSystemResource() {
+                       private static final long serialVersionUID = 1L;
+                       private File file;
+                       
+                       @Override
+                       protected String getMimeType() throws IOException {
+                               return 
FileItemResourceReference.this.getMimeType();
+                       }
+                       
+                       @Override
+                       protected ResourceResponse 
newResourceResponse(Attributes attributes) {
+                               T r = getFileItem(attributes);
+                               if (r != null) {
+                                       file = getFile(r);
+                                       ResourceResponse rr = 
createResourceResponse(file.toPath());
+                                       rr.setFileName(getFileName(r));
+                                       return rr;
+                               } else {
+                                       log.debug("No file item was found");
+                                       ResourceResponse rr = new 
ResourceResponse();
+                                       
rr.setError(HttpServletResponse.SC_NOT_FOUND);
+                                       return rr;
+                               }
+                       }
+               };
+       }
+       
+       protected abstract String getMimeType();
+       protected abstract String getFileName(T r);
+       protected abstract File getFile(T r);
+       protected abstract T getFileItem(Attributes attributes);
+}

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.css
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.css
 Tue Apr 19 08:58:04 2016
@@ -1,124 +1,234 @@
 /*!
- * Bootstrap v2.3.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap)
+ * Copyright 2011-2014 Arnold Daniels.
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
(https://github.com/jasny/bootstrap/blob/master/LICENSE)
  */
-.btn-file {
-       position: relative;
-       overflow: hidden;
-       vertical-align: middle;
-}
-
-.btn-file>input {
-       position: absolute;
-       top: 0;
-       right: 0;
-       margin: 0;
-       font-size: 23px;
-       cursor: pointer;
-       opacity: 0;
-       filter: alpha(opacity = 0);
-       transform: translate(-300px, 0) scale(4);
-       direction: ltr;
-}
-
-.fileupload {
-       margin-bottom: 9px;
-}
-
-.fileupload .uneditable-input {
-       display: inline-block;
-       margin-bottom: 0;
-       vertical-align: middle;
-       cursor: text;
-}
-
-.fileupload .thumbnail {
-       display: inline-block;
-       margin-bottom: 5px;
-       overflow: hidden;
-       text-align: center;
-       vertical-align: middle;
-}
-
-.fileupload .thumbnail>img {
-       display: inline-block;
-       max-height: 100%;
-       vertical-align: middle;
-}
-
-.fileupload .btn {
-       vertical-align: middle;
-}
-
-.fileupload-exists .fileupload-new,.fileupload-new .fileupload-exists {
-       display: none;
-}
-
-.fileupload-inline .fileupload-controls {
-       display: inline;
-}
 
-.fileupload-new .input-append .btn-file {
-       -webkit-border-radius: 0 3px 3px 0;
-       -moz-border-radius: 0 3px 3px 0;
-       border-radius: 0 3px 3px 0;
+.btn-labeled {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.btn-label {
+  position: relative;
+  background: transparent;
+  background: rgba(0, 0, 0, 0.15);
+  display: inline-block;
+  padding: 6px 12px;
+  left: -12px;
+  border-radius: 3px 0 0 3px;
+}
+.btn-label.btn-label-right {
+  left: auto;
+  right: -12px;
+  border-radius: 0 3px 3px 0;
+}
+.btn-lg .btn-label {
+  padding: 10px 16px;
+  left: -16px;
+  border-radius: 5px 0 0 5px;
+}
+.btn-lg .btn-label.btn-label-right {
+  left: auto;
+  right: -16px;
+  border-radius: 0 5px 5px 0;
+}
+.btn-sm .btn-label {
+  padding: 5px 10px;
+  left: -10px;
+  border-radius: 2px 0 0 2px;
+}
+.btn-sm .btn-label.btn-label-right {
+  left: auto;
+  right: -10px;
+  border-radius: 0 2px 2px 0;
+}
+.btn-xs .btn-label {
+  padding: 1px 5px;
+  left: -5px;
+  border-radius: 2px 0 0 2px;
+}
+.btn-xs .btn-label.btn-label-right {
+  left: auto;
+  right: -5px;
+  border-radius: 0 2px 2px 0;
+}
+.nav-tabs-bottom {
+  border-bottom: 0;
+  border-top: 1px solid #dddddd;
+}
+.nav-tabs-bottom > li {
+  margin-bottom: 0;
+  margin-top: -1px;
+}
+.nav-tabs-bottom > li > a {
+  border-radius: 0 0 4px 4px;
+}
+.nav-tabs-bottom > li > a:hover,
+.nav-tabs-bottom > li > a:focus,
+.nav-tabs-bottom > li.active > a,
+.nav-tabs-bottom > li.active > a:hover,
+.nav-tabs-bottom > li.active > a:focus {
+  border: 1px solid #dddddd;
+  border-top-color: transparent;
+}
+.nav-tabs-left {
+  border-bottom: 0;
+  border-right: 1px solid #dddddd;
+}
+.nav-tabs-left > li {
+  margin-bottom: 0;
+  margin-right: -1px;
+  float: none;
+}
+.nav-tabs-left > li > a {
+  border-radius: 4px 0 0 4px;
+  margin-right: 0;
+  margin-bottom: 2px;
+}
+.nav-tabs-left > li > a:hover,
+.nav-tabs-left > li > a:focus,
+.nav-tabs-left > li.active > a,
+.nav-tabs-left > li.active > a:hover,
+.nav-tabs-left > li.active > a:focus {
+  border: 1px solid #dddddd;
+  border-right-color: transparent;
+}
+.row > .nav-tabs-left {
+  padding-right: 0;
+  padding-left: 15px;
+  margin-right: -1px;
+  position: relative;
+  z-index: 1;
+}
+.row > .nav-tabs-left + .tab-content {
+  border-left: 1px solid #dddddd;
+}
+.nav-tabs-right {
+  border-bottom: 0;
+  border-left: 1px solid #dddddd;
+}
+.nav-tabs-right > li {
+  margin-bottom: 0;
+  margin-left: -1px;
+  float: none;
+}
+.nav-tabs-right > li > a {
+  border-radius: 0 4px 4px 0;
+  margin-left: 0;
+  margin-bottom: 2px;
+}
+.nav-tabs-right > li > a:hover,
+.nav-tabs-right > li > a:focus,
+.nav-tabs-right > li.active > a,
+.nav-tabs-right > li.active > a:hover,
+.nav-tabs-right > li.active > a:focus {
+  border: 1px solid #dddddd;
+  border-left-color: transparent;
+}
+.row > .nav-tabs-right {
+  padding-left: 0;
+  padding-right: 15px;
 }
-
-.thumbnail-borderless .thumbnail {
-       padding: 0;
-       border: none;
-       -webkit-border-radius: 0;
-       -moz-border-radius: 0;
-       border-radius: 0;
-       -webkit-box-shadow: none;
-       -moz-box-shadow: none;
-       box-shadow: none;
-}
-
-.fileupload-new.thumbnail-borderless .thumbnail {
-       border: 1px solid #ddd;
-}
-
-.control-group.warning .fileupload .uneditable-input {
-       color: #a47e3c;
-       border-color: #a47e3c;
-}
-
-.control-group.warning .fileupload .fileupload-preview {
-       color: #a47e3c;
-}
-
-.control-group.warning .fileupload .thumbnail {
-       border-color: #a47e3c;
+.btn-file {
+  overflow: hidden;
+  position: relative;
+  vertical-align: middle;
+}
+.btn-file > input {
+  position: absolute;
+  top: 0;
+  right: 0;
+  margin: 0;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  font-size: 23px;
+  height: 100%;
+  width: 100%;
+  direction: ltr;
+  cursor: pointer;
+}
+.fileinput {
+  margin-bottom: 9px;
+  display: inline-block;
+}
+.fileinput .form-control {
+  padding-top: 7px;
+  padding-bottom: 5px;
+  display: inline-block;
+  margin-bottom: 0px;
+  vertical-align: middle;
+  cursor: text;
+}
+.fileinput .thumbnail {
+  overflow: hidden;
+  display: inline-block;
+  margin-bottom: 5px;
+  vertical-align: middle;
+  text-align: center;
+}
+.fileinput .thumbnail > img {
+  max-height: 100%;
+}
+.fileinput .btn {
+  vertical-align: middle;
+}
+.fileinput-exists .fileinput-new,
+.fileinput-new .fileinput-exists {
+  display: none;
+}
+.fileinput-inline .fileinput-controls {
+  display: inline;
+}
+.fileinput-filename {
+  vertical-align: middle;
+  display: inline-block;
+  overflow: hidden;
+}
+.form-control .fileinput-filename {
+  vertical-align: bottom;
+}
+.fileinput.input-group {
+  display: table;
+}
+.fileinput.input-group > * {
+  position: relative;
+  z-index: 2;
+}
+.fileinput.input-group > .btn-file {
+  z-index: 1;
+}
+.fileinput-new.input-group .btn-file,
+.fileinput-new .input-group .btn-file {
+  border-radius: 0 4px 4px 0;
+}
+.fileinput-new.input-group .btn-file.btn-xs,
+.fileinput-new .input-group .btn-file.btn-xs,
+.fileinput-new.input-group .btn-file.btn-sm,
+.fileinput-new .input-group .btn-file.btn-sm {
+  border-radius: 0 3px 3px 0;
+}
+.fileinput-new.input-group .btn-file.btn-lg,
+.fileinput-new .input-group .btn-file.btn-lg {
+  border-radius: 0 6px 6px 0;
+}
+.form-group.has-warning .fileinput .fileinput-preview {
+  color: #8a6d3b;
+}
+.form-group.has-warning .fileinput .thumbnail {
+  border-color: #faebcc;
+}
+.form-group.has-error .fileinput .fileinput-preview {
+  color: #a94442;
+}
+.form-group.has-error .fileinput .thumbnail {
+  border-color: #ebccd1;
 }
-
-.control-group.error .fileupload .uneditable-input {
-       color: #b94a48;
-       border-color: #b94a48;
+.form-group.has-success .fileinput .fileinput-preview {
+  color: #3c763d;
 }
-
-.control-group.error .fileupload .fileupload-preview {
-       color: #b94a48;
+.form-group.has-success .fileinput .thumbnail {
+  border-color: #d6e9c6;
 }
-
-.control-group.error .fileupload .thumbnail {
-       border-color: #b94a48;
+.input-group-addon:not(:first-child) {
+  border-left: 0;
 }
-
-.control-group.success .fileupload .uneditable-input {
-       color: #468847;
-       border-color: #468847;
-}
-
-.control-group.success .fileupload .fileupload-preview {
-       color: #468847;
-}
-
-.control-group.success .fileupload .thumbnail {
-       border-color: #468847;
-}
\ No newline at end of file

Copied: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js
 (from r1739688, 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js)
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js?p2=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js&p1=openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js&r1=1739688&r2=1739871&rev=1739871&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/bootstrap-fileupload.js
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.js
 Tue Apr 19 08:58:04 2016
@@ -1,8 +1,8 @@
 /* ===========================================================
- * bootstrap-fileupload.js j2
- * http://jasny.github.com/bootstrap/javascript.html#fileupload
+ * Bootstrap: fileinput.js v3.1.3
+ * http://jasny.github.com/bootstrap/javascript/#fileinput
  * ===========================================================
- * Copyright 2012 Jasny BV, Netherlands.
+ * Copyright 2012-2014 Arnold Daniels
  *
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
@@ -17,152 +17,181 @@
  * limitations under the License.
  * ========================================================== */
 
-!function ($) {
++function ($) { "use strict";
 
-  "use strict"; // jshint ;_
+  var isIE = window.navigator.appName == 'Microsoft Internet Explorer'
 
- /* FILEUPLOAD PUBLIC CLASS DEFINITION
-  * ================================= */
+  // FILEUPLOAD PUBLIC CLASS DEFINITION
+  // =================================
 
-  var Fileupload = function (element, options) {
+  var Fileinput = function (element, options) {
     this.$element = $(element)
-    this.type = this.$element.data('uploadtype') || 
(this.$element.find('.thumbnail').length > 0 ? "image" : "file")
-      
+    
     this.$input = this.$element.find(':file')
     if (this.$input.length === 0) return
 
     this.name = this.$input.attr('name') || options.name
 
-    this.$hidden = 
this.$element.find('input[type=hidden][name="'+this.name+'"]')
+    this.$hidden = this.$element.find('input[type=hidden][name="' + this.name 
+ '"]')
     if (this.$hidden.length === 0) {
-      this.$hidden = $('<input type="hidden" />')
-      this.$element.prepend(this.$hidden)
+      this.$hidden = $('<input type="hidden">').insertBefore(this.$input)
     }
 
-    this.$preview = this.$element.find('.fileupload-preview')
+    this.$preview = this.$element.find('.fileinput-preview')
     var height = this.$preview.css('height')
-    if (this.$preview.css('display') != 'inline' && height != '0px' && height 
!= 'none') this.$preview.css('line-height', height)
-
+    if (this.$preview.css('display') !== 'inline' && height !== '0px' && 
height !== 'none') {
+      this.$preview.css('line-height', height)
+    }
+        
     this.original = {
-      'exists': this.$element.hasClass('fileupload-exists'),
-      'preview': this.$preview.html(),
-      'hiddenVal': this.$hidden.val()
+      exists: this.$element.hasClass('fileinput-exists'),
+      preview: this.$preview.html(),
+      hiddenVal: this.$hidden.val()
     }
     
-    this.$remove = this.$element.find('[data-dismiss="fileupload"]')
-
-    this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', 
$.proxy(this.trigger, this))
-
     this.listen()
   }
   
-  Fileupload.prototype = {
+  Fileinput.prototype.listen = function() {
+    this.$input.on('change.bs.fileinput', $.proxy(this.change, this))
+    $(this.$input[0].form).on('reset.bs.fileinput', $.proxy(this.reset, this))
     
-    listen: function() {
-      this.$input.on('change.fileupload', $.proxy(this.change, this))
-      $(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this))
-      if (this.$remove) this.$remove.on('click.fileupload', 
$.proxy(this.clear, this))
-    },
+    this.$element.find('[data-trigger="fileinput"]').on('click.bs.fileinput', 
$.proxy(this.trigger, this))
+    this.$element.find('[data-dismiss="fileinput"]').on('click.bs.fileinput', 
$.proxy(this.clear, this))
+  },
+
+  Fileinput.prototype.change = function(e) {
+    var files = e.target.files === undefined ? (e.target && e.target.value ? 
[{ name: e.target.value.replace(/^.+\\/, '')}] : []) : e.target.files
     
-    change: function(e, invoked) {
-      if (invoked === 'clear') return
-      
-      var file = e.target.files !== undefined ? e.target.files[0] : 
(e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null)
-      
-      if (!file) {
-        this.clear()
-        return
-      }
-      
-      this.$hidden.val('')
-      this.$hidden.attr('name', '')
-      this.$input.attr('name', this.name)
-
-      if (this.type === "image" && this.$preview.length > 0 && (typeof 
file.type !== "undefined" ? file.type.match('image.*') : 
file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
-        var reader = new FileReader()
-        var preview = this.$preview
-        var element = this.$element
-
-        reader.onload = function(e) {
-          preview.html('<img src="' + e.target.result + '" ' + 
(preview.css('max-height') != 'none' ? 'style="max-height: ' + 
preview.css('max-height') + ';"' : '') + ' />')
-          element.addClass('fileupload-exists').removeClass('fileupload-new')
-        }
-
-        reader.readAsDataURL(file)
-      } else {
-        this.$preview.text(file.name)
-        
this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
-      }
-    },
+    e.stopPropagation()
 
-    clear: function(e) {
-      this.$hidden.val('')
-      this.$hidden.attr('name', this.name)
-      this.$input.attr('name', '')
-
-      //ie8+ doesn't support changing the value of input with type=file so 
clone instead
-      if (navigator.userAgent.match(/msie/i)){ 
-          var inputClone = this.$input.clone(true);
-          this.$input.after(inputClone);
-          this.$input.remove();
-          this.$input = inputClone;
-      }else{
-          this.$input.val('')
-      }
+    if (files.length === 0) {
+      this.clear()
+      return
+    }
 
-      this.$preview.html('')
-      this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
+    this.$hidden.val('')
+    this.$hidden.attr('name', '')
+    this.$input.attr('name', this.name)
+
+    var file = files[0]
+
+    if (this.$preview.length > 0 && (typeof file.type !== "undefined" ? 
file.type.match(/^image\/(gif|png|jpeg)$/) : 
file.name.match(/\.(gif|png|jpe?g)$/i)) && typeof FileReader !== "undefined") {
+      var reader = new FileReader()
+      var preview = this.$preview
+      var element = this.$element
+
+      reader.onload = function(re) {
+        var $img = $('<img>')
+        $img[0].src = re.target.result
+        files[0].result = re.target.result
+        
+        element.find('.fileinput-filename').text(file.name)
+        
+        // if parent has max-height, using `(max-)height: 100%` on child 
doesn't take padding and border into account
+        if (preview.css('max-height') != 'none') $img.css('max-height', 
parseInt(preview.css('max-height'), 10) - parseInt(preview.css('padding-top'), 
10) - parseInt(preview.css('padding-bottom'), 10)  - 
parseInt(preview.css('border-top'), 10) - 
parseInt(preview.css('border-bottom'), 10))
+        
+        preview.html($img)
+        element.addClass('fileinput-exists').removeClass('fileinput-new')
 
-      if (e) {
-        this.$input.trigger('change', [ 'clear' ])
-        e.preventDefault()
+        element.trigger('change.bs.fileinput', files)
       }
-    },
-    
-    reset: function(e) {
-      this.clear()
+
+      reader.readAsDataURL(file)
+    } else {
+      this.$element.find('.fileinput-filename').text(file.name)
+      this.$preview.text(file.name)
       
-      this.$hidden.val(this.original.hiddenVal)
-      this.$preview.html(this.original.preview)
+      this.$element.addClass('fileinput-exists').removeClass('fileinput-new')
       
-      if (this.original.exists) 
this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
-       else 
this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
-    },
+      this.$element.trigger('change.bs.fileinput')
+    }
+  },
+
+  Fileinput.prototype.clear = function(e) {
+    if (e) e.preventDefault()
     
-    trigger: function(e) {
-      this.$input.trigger('click')
-      e.preventDefault()
+    this.$hidden.val('')
+    this.$hidden.attr('name', this.name)
+    this.$input.attr('name', '')
+
+    //ie8+ doesn't support changing the value of input with type=file so clone 
instead
+    if (isIE) { 
+      var inputClone = this.$input.clone(true);
+      this.$input.after(inputClone);
+      this.$input.remove();
+      this.$input = inputClone;
+    } else {
+      this.$input.val('')
     }
+
+    this.$preview.html('')
+    this.$element.find('.fileinput-filename').text('')
+    this.$element.addClass('fileinput-new').removeClass('fileinput-exists')
+    
+    if (e !== undefined) {
+      this.$input.trigger('change')
+      this.$element.trigger('clear.bs.fileinput')
+    }
+  },
+
+  Fileinput.prototype.reset = function() {
+    this.clear()
+
+    this.$hidden.val(this.original.hiddenVal)
+    this.$preview.html(this.original.preview)
+    this.$element.find('.fileinput-filename').text('')
+
+    if (this.original.exists) 
this.$element.addClass('fileinput-exists').removeClass('fileinput-new')
+     else 
this.$element.addClass('fileinput-new').removeClass('fileinput-exists')
+    
+    this.$element.trigger('reset.bs.fileinput')
+  },
+
+  Fileinput.prototype.trigger = function(e) {
+    this.$input.trigger('click')
+    e.preventDefault()
   }
 
   
- /* FILEUPLOAD PLUGIN DEFINITION
-  * =========================== */
+  // FILEUPLOAD PLUGIN DEFINITION
+  // ===========================
 
-  $.fn.fileupload = function (options) {
+  var old = $.fn.fileinput
+  
+  $.fn.fileinput = function (options) {
     return this.each(function () {
-      var $this = $(this)
-      , data = $this.data('fileupload')
-      if (!data) $this.data('fileupload', (data = new Fileupload(this, 
options)))
+      var $this = $(this),
+          data = $this.data('bs.fileinput')
+      if (!data) $this.data('bs.fileinput', (data = new Fileinput(this, 
options)))
       if (typeof options == 'string') data[options]()
     })
   }
 
-  $.fn.fileupload.Constructor = Fileupload
+  $.fn.fileinput.Constructor = Fileinput
+
+
+  // FILEINPUT NO CONFLICT
+  // ====================
+
+  $.fn.fileinput.noConflict = function () {
+    $.fn.fileinput = old
+    return this
+  }
 
 
- /* FILEUPLOAD DATA-API
-  * ================== */
+  // FILEUPLOAD DATA-API
+  // ==================
 
-  $(document).on('click.fileupload.data-api', '[data-provides="fileupload"]', 
function (e) {
+  $(document).on('click.fileinput.data-api', '[data-provides="fileinput"]', 
function (e) {
     var $this = $(this)
-    if ($this.data('fileupload')) return
-    $this.fileupload($this.data())
+    if ($this.data('bs.fileinput')) return
+    $this.fileinput($this.data())
       
-    var $target = 
$(e.target).closest('[data-dismiss="fileupload"],[data-trigger="fileupload"]');
+    var $target = 
$(e.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');
     if ($target.length > 0) {
-      $target.trigger('click.fileupload')
       e.preventDefault()
+      $target.trigger('click.bs.fileinput')
     }
   })
 

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.css
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,7 @@
+/*!
+ * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap)
+ * Copyright 2011-2014 Arnold Daniels.
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
(https://github.com/jasny/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-labeled{padding-top:0;padding-bottom:0}.btn-label{position:relative;background:transparent;background:rgba(0,0,0,0.15);display:inline-block;padding:6px
 12px;left:-12px;border-radius:3px 0 0 
3px}.btn-label.btn-label-right{left:auto;right:-12px;border-radius:0 3px 3px 
0}.btn-lg .btn-label{padding:10px 16px;left:-16px;border-radius:5px 0 0 
5px}.btn-lg .btn-label.btn-label-right{left:auto;right:-16px;border-radius:0 
5px 5px 0}.btn-sm .btn-label{padding:5px 10px;left:-10px;border-radius:2px 0 0 
2px}.btn-sm .btn-label.btn-label-right{left:auto;right:-10px;border-radius:0 
2px 2px 0}.btn-xs .btn-label{padding:1px 5px;left:-5px;border-radius:2px 0 0 
2px}.btn-xs .btn-label.btn-label-right{left:auto;right:-5px;border-radius:0 2px 
2px 0}.nav-tabs-bottom{border-bottom:0;border-top:1px solid 
#ddd}.nav-tabs-bottom>li{margin-bottom:0;margin-top:-1px}.nav-tabs-bottom>li>a{border-radius:0
 0 4px 
4px}.nav-tabs-bottom>li>a:hover,.nav-tabs-bottom>li>a:focus,.nav-tabs-bottom>li.active>a,.nav-tabs-bot
 tom>li.active>a:hover,.nav-tabs-bottom>li.active>a:focus{border:1px solid 
#ddd;border-top-color:transparent}.nav-tabs-left{border-bottom:0;border-right:1px
 solid 
#ddd}.nav-tabs-left>li{margin-bottom:0;margin-right:-1px;float:none}.nav-tabs-left>li>a{border-radius:4px
 0 0 
4px;margin-right:0;margin-bottom:2px}.nav-tabs-left>li>a:hover,.nav-tabs-left>li>a:focus,.nav-tabs-left>li.active>a,.nav-tabs-left>li.active>a:hover,.nav-tabs-left>li.active>a:focus{border:1px
 solid 
#ddd;border-right-color:transparent}.row>.nav-tabs-left{padding-right:0;padding-left:15px;margin-right:-1px;position:relative;z-index:1}.row>.nav-tabs-left+.tab-content{border-left:1px
 solid #ddd}.nav-tabs-right{border-bottom:0;border-left:1px solid 
#ddd}.nav-tabs-right>li{margin-bottom:0;margin-left:-1px;float:none}.nav-tabs-right>li>a{border-radius:0
 4px 4px 
0;margin-left:0;margin-bottom:2px}.nav-tabs-right>li>a:hover,.nav-tabs-right>li>a:focus,.nav-tabs-right>li.active>a,.nav-tabs-right>li.active>a:hover,.nav-tabs-rig
 ht>li.active>a:focus{border:1px solid 
#ddd;border-left-color:transparent}.row>.nav-tabs-right{padding-left:0;padding-right:15px}.btn-file{overflow:hidden;position:relative;vertical-align:middle}.btn-file>input{position:absolute;top:0;right:0;margin:0;opacity:0;filter:alpha(opacity=0);font-size:23px;height:100%;width:100%;direction:ltr;cursor:pointer}.fileinput{margin-bottom:9px;display:inline-block}.fileinput
 
.form-control{padding-top:7px;padding-bottom:5px;display:inline-block;margin-bottom:0px;vertical-align:middle;cursor:text}.fileinput
 
.thumbnail{overflow:hidden;display:inline-block;margin-bottom:5px;vertical-align:middle;text-align:center}.fileinput
 .thumbnail>img{max-height:100%}.fileinput 
.btn{vertical-align:middle}.fileinput-exists .fileinput-new,.fileinput-new 
.fileinput-exists{display:none}.fileinput-inline 
.fileinput-controls{display:inline}.fileinput-filename{vertical-align:middle;display:inline-block;overflow:hidden}.form-control
 .fileinput-filename{vertical-align:botto
 
m}.fileinput.input-group{display:table}.fileinput.input-group>*{position:relative;z-index:2}.fileinput.input-group>.btn-file{z-index:1}.fileinput-new.input-group
 .btn-file,.fileinput-new .input-group .btn-file{border-radius:0 4px 4px 
0}.fileinput-new.input-group .btn-file.btn-xs,.fileinput-new .input-group 
.btn-file.btn-xs,.fileinput-new.input-group .btn-file.btn-sm,.fileinput-new 
.input-group .btn-file.btn-sm{border-radius:0 3px 3px 
0}.fileinput-new.input-group .btn-file.btn-lg,.fileinput-new .input-group 
.btn-file.btn-lg{border-radius:0 6px 6px 0}.form-group.has-warning .fileinput 
.fileinput-preview{color:#8a6d3b}.form-group.has-warning .fileinput 
.thumbnail{border-color:#faebcc}.form-group.has-error .fileinput 
.fileinput-preview{color:#a94442}.form-group.has-error .fileinput 
.thumbnail{border-color:#ebccd1}.form-group.has-success .fileinput 
.fileinput-preview{color:#3c763d}.form-group.has-success .fileinput 
.thumbnail{border-color:#d6e9c6}.input-group-addon:not(:first-child){bord
 er-left:0}

Added: 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js?rev=1739871&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js
 (added)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/fileinput.min.js
 Tue Apr 19 08:58:04 2016
@@ -0,0 +1,7 @@
+/*!
+ * Jasny Bootstrap v3.1.0 (http://jasny.github.com/bootstrap)
+ * Copyright 2011-2014 Arnold Daniels.
+ * Licensed under the Apache License, Version 2.0 (the "License"); 
(https://github.com/jasny/bootstrap/blob/master/LICENSE)
+ */
+
++function(a){"use strict";var b=window.navigator.appName=="Microsoft Internet 
Explorer",c=function(b,c){this.$element=a(b),this.$input=this.$element.find(":file");if(this.$input.length===0)return;this.name=this.$input.attr("name")||c.name,this.$hidden=this.$element.find('input[type=hidden][name="'+this.name+'"]'),this.$hidden.length===0&&(this.$hidden=a('<input
 
type="hidden">').insertBefore(this.$input)),this.$preview=this.$element.find(".fileinput-preview");var
 
d=this.$preview.css("height");this.$preview.css("display")!=="inline"&&d!=="0px"&&d!=="none"&&this.$preview.css("line-height",d),this.original={exists:this.$element.hasClass("fileinput-exists"),preview:this.$preview.html(),hiddenVal:this.$hidden.val()},this.listen()};c.prototype.listen=function(){this.$input.on("change.bs.fileinput",a.proxy(this.change,this)),a(this.$input[0].form).on("reset.bs.fileinput",a.proxy(this.reset,this)),this.$element.find('[data-trigger="fileinput"]').on("click.bs.fileinput",a.proxy(this.trigger,t
 
his)),this.$element.find('[data-dismiss="fileinput"]').on("click.bs.fileinput",a.proxy(this.clear,this))},c.prototype.change=function(b){var
 
c=b.target.files===undefined?b.target&&b.target.value?[{name:b.target.value.replace(/^.+\\/,"")}]:[]:b.target.files;b.stopPropagation();if(c.length===0){this.clear();return}this.$hidden.val(""),this.$hidden.attr("name",""),this.$input.attr("name",this.name);var
 d=c[0];if(this.$preview.length>0&&(typeof 
d.type!="undefined"?d.type.match(/^image\/(gif|png|jpeg)$/):d.name.match(/\.(gif|png|jpe?g)$/i))&&typeof
 FileReader!="undefined"){var e=new 
FileReader,f=this.$preview,g=this.$element;e.onload=function(b){var 
e=a("<img>");e[0].src=b.target.result,c[0].result=b.target.result,g.find(".fileinput-filename").text(d.name),f.css("max-height")!="none"&&e.css("max-height",parseInt(f.css("max-height"),10)-parseInt(f.css("padding-top"),10)-parseInt(f.css("padding-bottom"),10)-parseInt(f.css("border-top"),10)-parseInt(f.css("border-bottom"),10)),f.html(e),g.a
 
ddClass("fileinput-exists").removeClass("fileinput-new"),g.trigger("change.bs.fileinput",c)},e.readAsDataURL(d)}else
 
this.$element.find(".fileinput-filename").text(d.name),this.$preview.text(d.name),this.$element.addClass("fileinput-exists").removeClass("fileinput-new"),this.$element.trigger("change.bs.fileinput")},c.prototype.clear=function(a){a&&a.preventDefault(),this.$hidden.val(""),this.$hidden.attr("name",this.name),this.$input.attr("name","");if(b){var
 
c=this.$input.clone(!0);this.$input.after(c),this.$input.remove(),this.$input=c}else
 
this.$input.val("");this.$preview.html(""),this.$element.find(".fileinput-filename").text(""),this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),a!==undefined&&(this.$input.trigger("change"),this.$element.trigger("clear.bs.fileinput"))},c.prototype.reset=function(){this.clear(),this.$hidden.val(this.original.hiddenVal),this.$preview.html(this.original.preview),this.$element.find(".fileinput-filename").text(""),this.original
 
.exists?this.$element.addClass("fileinput-exists").removeClass("fileinput-new"):this.$element.addClass("fileinput-new").removeClass("fileinput-exists"),this.$element.trigger("reset.bs.fileinput")},c.prototype.trigger=function(a){this.$input.trigger("click"),a.preventDefault()};var
 d=a.fn.fileinput;a.fn.fileinput=function(b){return this.each(function(){var 
d=a(this),e=d.data("bs.fileinput");e||d.data("bs.fileinput",e=new 
c(this,b)),typeof 
b=="string"&&e[b]()})},a.fn.fileinput.Constructor=c,a.fn.fileinput.noConflict=function(){return
 
a.fn.fileinput=d,this},a(document).on("click.fileinput.data-api",'[data-provides="fileinput"]',function(b){var
 c=a(this);if(c.data("bs.fileinput"))return;c.fileinput(c.data());var 
d=a(b.target).closest('[data-dismiss="fileinput"],[data-trigger="fileinput"]');d.length>0&&(b.preventDefault(),d.trigger("click.bs.fileinput"))})}(window.jQuery)


Reply via email to