]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix merge conflicts
authorGeorg Ehrke <dev@georgswebsite.de>
Thu, 26 Apr 2012 16:08:49 +0000 (18:08 +0200)
committerGeorg Ehrke <dev@georgswebsite.de>
Thu, 26 Apr 2012 16:08:49 +0000 (18:08 +0200)
17 files changed:
1  2 
apps/calendar/ajax/event/edit.form.php
apps/calendar/ajax/event/move.php
apps/calendar/ajax/event/resize.php
apps/calendar/ajax/events.php
apps/contacts/css/contacts.css
apps/contacts/import.php
apps/contacts/js/contacts.js
apps/files/ajax/scan.php
apps/files/css/files.css
apps/files/index.php
apps/files/js/fileactions.js
apps/files/js/filelist.js
apps/files/js/files.js
apps/files/templates/index.php
apps/files/templates/part.list.php
lib/base.php
lib/helper.php

Simple merge
Simple merge
Simple merge
index 0bb9f975fc5f73824fdbf212826ada1e52c306be,ae96c5e4e9fecb4f44e43b4c537fcbf70fbd6f19..e3d2cfbdd66be9eaa003d7d4a542d1dc73e53d40
@@@ -100,4 -100,5 +100,4 @@@ input[type="checkbox"] { width: 20px; h
  .propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 20px; height: 20px; vertical-align: middle; }
  .propertylist li > select { float: left; max-width: 8em; }
  .typelist { float: left; max-width: 10em; } /* for multiselect */
- .addresslist { clear: both; }
+ .addresslist { clear: both; }
 -
Simple merge
Simple merge
index 488f68e6b3c0f1abf699e03171a315477adfcc3d,0000000000000000000000000000000000000000..a227dcc3ffc93a5bef7a30896eeb83effc25e7ed
mode 100644,000000..100644
--- /dev/null
@@@ -1,36 -1,0 +1,37 @@@
-               OC_FileCache::scan('',$eventSource);
 +<?php
 +
 +set_time_limit(0);//scanning can take ages
 +
 +$force=isset($_GET['force']) and $_GET['force']=='true';
++$dir=isset($_GET['dir'])?$_GET['dir']:'';
 +$checkOnly=isset($_GET['checkonly']) and $_GET['checkonly']=='true';
 +
 +if(!$checkOnly){
 +      $eventSource=new OC_EventSource();
 +}
 +
 +
 +//create the file cache if necesary
 +if($force or !OC_FileCache::inCache('')){
 +      if(!$checkOnly){
 +              OC_DB::beginTransaction();
++              OC_FileCache::scan($dir,$eventSource);
 +              OC_FileCache::clean();
 +              OC_DB::commit();
 +              $eventSource->send('success',true);
 +      }else{
 +              OC_JSON::success(array('data'=>array('done'=>true)));
 +              exit;
 +      }
 +}else{
 +      if($checkOnly){
 +              OC_JSON::success(array('data'=>array('done'=>false)));
 +              exit;
 +      }
 +      if(isset($eventSource)){
 +              $eventSource->send('success',false);
 +      }else{
 +              exit;
 +      }
 +}
 +$eventSource->close();
index 99623b6355ef9c9219f0066ac79323fa62bd9f79,0000000000000000000000000000000000000000..a135f7ded5b689a9e8b842f7d6eaf01e99286527
mode 100644,000000..100644
--- /dev/null
@@@ -1,87 -1,0 +1,91 @@@
- span.extension, td.date { color:#999; }
 +/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
 + This file is licensed under the Affero General Public License version 3 or later.
 + See the COPYING-README file. */
 +
 +/* FILE MENU */
 +.actions { padding:.3em; float:left; height:2em; }
 +.actions input, .actions button, .actions .button { margin:0; }
 +#file_menu { right:0; position:absolute; top:0; }
 +#file_menu a { display:block; float:left; background-image:none; text-decoration:none; }
 +.file_upload_form, #file_newfolder_form { display:inline; float: left; margin-left:0; }
 +#fileSelector, #file_upload_submit, #file_newfolder_submit { display:none; }
 +.file_upload_wrapper, #file_newfolder_name { background-repeat:no-repeat; background-position:.5em .5em; padding-left:2em; }
 +.file_upload_wrapper { font-weight:bold; display:-moz-inline-box; /* fallback for older firefox versions*/ display:inline-block; padding-left:0; overflow:hidden; position:relative; margin:0;}
 +.file_upload_wrapper .file_upload_button_wrapper { position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer; z-index:1000; }
 +#new { float:left; border-top-right-radius:0; border-bottom-right-radius:0; margin:0 0 0 1em; border-right:none; z-index:1010; height:1.3em; }
 +#new.active { border-bottom-left-radius:0; border-bottom:none; background:#f8f8f8 }
 +#new>a{ padding-left:1em; padding-right:1em; }
 +#new>ul { display:none; position:fixed; text-align:left; padding:.5em; background:#f8f8f8; margin-top:0.075em; border:1px solid #ddd; min-width:7em; margin-left:-.5em; z-index:-1; }
 +#new>ul>li { margin:.3em; padding-left:2em; background-repeat:no-repeat; cursor:pointer; padding-bottom:0.1em }
 +#new>ul>li>p { cursor:pointer; }
 +#new>ul>li>input { padding:0.3em; margin:-0.3em; }
 +
 +#file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; }
 +.file_upload_start, .file_upload_filename { font-size:1em; }
 +#file_newfolder_submit, #file_upload_submit { width:3em; }
 +.file_upload_target { display:none; }
 +
 +.file_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1; position:absolute; left:0; top:0; width:100%; cursor:pointer;}
 +.file_upload_filename.active { border-bottom-right-radius:0 }
 +.file_upload_filename { position: relative; z-index:100; padding-left: 0.8em; padding-right: 0.8em; cursor:pointer; border-top-left-radius:0; border-bottom-left-radius:0; }
 +.file_upload_filename img { position: absolute; top: 0.4em; left: 0.4em; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
 +
++#upload { position:absolute; right:13.5em; top:0em; }
++#upload #uploadprogressbar { position:relative; display:inline-block; width:10em; height:1.5em; top:.4em; }
 +
 +.file_upload_form, .file_upload_wrapper, .file_upload_start, .file_upload_filename, #file_upload_submit { cursor:pointer; }
 +
 +/* FILE TABLE */
 +#emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; }
 +.emptyfolder #new, .emptyfolder .file_upload_filename { background:#66f866; border:1px solid #5e5; -moz-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; }
 +table { position:relative; top:37px; width:100%; }
 +tbody tr { background-color:#fff; height:2.5em; }
 +tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; }
 +tbody tr.selected { background-color:#eee; }
 +tbody a { color:#000; }
- table td.filename .nametext, .modified { float:left; padding:.3em 0; }
++span.extension, span.uploading, td.date { color:#999; }
 +span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
 +tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; }
 +div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; }
 +div.crumb:first-child { padding-left:1em; }
 +div.crumb.last { font-weight:bold; }
 +table tr.mouseOver td { background-color:#eee; }
 +table th { height:2em; padding:0 .5em; color:#999; }
 +table th .name { float:left; margin-left:.5em; }
 +table th.multiselect { background:#ddd; color:#000; font-weight:bold; }
 +table th, table td { border-bottom:1px solid #ddd; text-align:left; font-weight:normal; }
 +table td { border-bottom:1px solid #eee; font-style:normal; background-position:1em .5em; background-repeat:no-repeat; }
 +table th#headerSize, table td.filesize { width:3em; padding:0 1em; text-align:right; }
 +table th#headerDate, table td.date { width:11em; padding:0 .1em 0 1em; text-align:left; }
 +table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; }
 +table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; }
 +table tr[data-type="dir"] td.filename a.name span.nametext {font-weight:bold; }
 +table td.filename a.name input, table td.filename a.name form { width:100%; cursor:text; }
 +table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; }
++table td.filename .nametext, .uploadtext, .modified { float:left; padding:.3em 0; }
++// TODO fix usability bug (accidental file/folder selection)
 +table td.filename .nametext { width:70%; overflow:hidden; }
++table td.filename .uploadtext { font-weight:normal; margin-left:.5em; }
 +table td.filename form { float:left; font-size:.85em; }
 +table thead.fixed tr{ position:fixed; top:6.5em; z-index:49; -moz-box-shadow:0 -3px 7px #ddd; -webkit-box-shadow:0 -3px 7px #ddd; box-shadow:0 -3px 7px #ddd; }
 +table thead.fixed { height:2em; }
 +#fileList tr td.filename>input[type=checkbox]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; }
 +#fileList tr td.filename>input[type="checkbox"]:hover:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; }
 +#fileList tr td.filename>input[type="checkbox"]:checked:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; }
 +#fileList tr td.filename { -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms; }
 +#select_all { float:left; margin:.3em 0.6em 0 .5em; }
 +#uploadsize-message,#delete-confirm { display:none; }
 +.fileactions { position:relative; top:.3em; right:-4em; font-size:.8em; }
 +#fileList .fileactions a.action img { position:relative; top:.2em; }
 +#fileList a.action { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; }
 +a.action.delete { float:right; }
 +a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; }
 +.selectedActions { display:none; float:right; }
 +.selectedActions a { display:inline; margin:-.5em 0; padding:.5em !important; }
 +.selectedActions a img { position:relative; top:.3em; }
 +
 +/* add breadcrumb divider to the File item in navigation panel */
 +#navigation>ul>li:first-child { background:url('%webroot%/core/img/breadcrumb-start.svg') no-repeat 12.5em 0px; width:12.5em; padding-right:1em; position:fixed; }
 +#navigation>ul>li:first-child+li { padding-top:2.9em; }
 +
 +#scanning-message{ top:40%; left:40%; position:absolute; display:none }
index 46b511d66eb95a9909e72f9342f69b4e3d511465,0000000000000000000000000000000000000000..8464db30f0156caa1ff672a234a63358ede5a3ae
mode 100644,000000..100644
--- /dev/null
@@@ -1,100 -1,0 +1,102 @@@
 +<?php
 +
 +/**
 +* ownCloud - ajax frontend
 +*
 +* @author Robin Appelman
 +* @copyright 2010 Robin Appelman icewind1991@gmail.com
 +*
 +* This library is free software; you can redistribute it and/or
 +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
 +* License as published by the Free Software Foundation; either
 +* version 3 of the License, or any later version.
 +*
 +* This library is distributed in the hope that it will be useful,
 +* but WITHOUT ANY WARRANTY; without even the implied warranty of
 +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
 +*
 +* You should have received a copy of the GNU Affero General Public
 +* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 +*
 +*/
 +
 +// Check if we are a user
 +OC_Util::checkLoggedIn();
 +
 +// Load the files we need
 +OC_Util::addStyle( "files", "files" );
++OC_Util::addScript( "files", "jquery.iframe-transport" );
++OC_Util::addScript( "files", "jquery.fileupload" );
 +OC_Util::addScript( "files", "files" );
 +OC_Util::addScript( 'files', 'filelist' );
 +OC_Util::addScript( 'files', 'fileactions' );
 +if(!isset($_SESSION['timezone'])){
 +      OC_Util::addScript( 'files', 'timezone' );
 +}
 +OC_App::setActiveNavigationEntry( "files_index" );
 +// Load the files
 +$dir = isset( $_GET['dir'] ) ? stripslashes($_GET['dir']) : '';
 +// Redirect if directory does not exist
 +if(!OC_Filesystem::is_dir($dir.'/')) {
 +      header("Location: ".$_SERVER['PHP_SELF']."");
 +}
 +
 +$files = array();
 +foreach( OC_Files::getdirectorycontent( $dir ) as $i ){
 +      $i["date"] = OC_Util::formatDate($i["mtime"] );
 +      if($i['type']=='file'){
 +              $fileinfo=pathinfo($i['name']);
 +              $i['basename']=$fileinfo['filename'];
 +              if (!empty($fileinfo['extension'])) {
 +                      $i['extension']='.' . $fileinfo['extension'];
 +              }
 +              else {
 +                      $i['extension']='';
 +              }
 +      }
 +      if($i['directory']=='/'){
 +              $i['directory']='';
 +      }
 +      $files[] = $i;
 +}
 +
 +// Make breadcrumb
 +$breadcrumb = array();
 +$pathtohere = "";
 +foreach( explode( "/", $dir ) as $i ){
 +      if( $i != "" ){
 +              $pathtohere .= "/".str_replace('+','%20', urlencode($i));
 +              $breadcrumb[] = array( "dir" => $pathtohere, "name" => $i );
 +      }
 +}
 +
 +// make breadcrumb und filelist markup
 +$list = new OC_Template( "files", "part.list", "" );
 +$list->assign( "files", $files );
 +$list->assign( "baseURL", OC_Helper::linkTo("files", "index.php")."?dir=");
 +$list->assign( "downloadURL", OC_Helper::linkTo("files", "download.php")."?file=");
 +$breadcrumbNav = new OC_Template( "files", "part.breadcrumb", "" );
 +$breadcrumbNav->assign( "breadcrumb", $breadcrumb );
 +$breadcrumbNav->assign( "baseURL", OC_Helper::linkTo("files", "index.php")."?dir=");
 +
 +$upload_max_filesize = OC_Helper::computerFileSize(ini_get('upload_max_filesize'));
 +$post_max_size = OC_Helper::computerFileSize(ini_get('post_max_size'));
 +$maxUploadFilesize = min($upload_max_filesize, $post_max_size);
 +
 +$freeSpace=OC_Filesystem::free_space('/');
 +$freeSpace=max($freeSpace,0);
 +$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace);
 +
 +$tmpl = new OC_Template( "files", "index", "user" );
 +$tmpl->assign( "fileList", $list->fetchPage() );
 +$tmpl->assign( "breadcrumb", $breadcrumbNav->fetchPage() );
 +$tmpl->assign( 'dir', $dir);
 +$tmpl->assign( 'readonly', !OC_Filesystem::is_writable($dir));
 +$tmpl->assign( "files", $files );
 +$tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
 +$tmpl->assign( 'uploadMaxHumanFilesize', OC_Helper::humanFileSize($maxUploadFilesize));
 +$tmpl->assign( 'allowZipDownload', intval(OC_Config::getValue('allowZipDownload', true)));
 +$tmpl->printPage();
 +
 +?>
index 481802e0d63a258c8e97ddfc4df5ff3d08d1c4d0,0000000000000000000000000000000000000000..68268a7d3a9ce0e8dd2a8870a6d4e915d7aaf365
mode 100644,000000..100644
--- /dev/null
@@@ -1,154 -1,0 +1,167 @@@
-       FileList.do_delete(filename);
 +FileActions={
 +      actions:{},
 +      defaults:{},
 +      icons:{},
 +      currentFile:null,
 +      register:function(mime,name,icon,action){
 +              if(!FileActions.actions[mime]){
 +                      FileActions.actions[mime]={};
 +              }
 +              FileActions.actions[mime][name]=action;
 +              FileActions.icons[name]=icon;
 +      },
 +      setDefault:function(mime,name){
 +              FileActions.defaults[mime]=name;
 +      },
 +      get:function(mime,type){
 +              var actions={};
 +              if(FileActions.actions.all){
 +                      actions=$.extend( actions, FileActions.actions.all )
 +              }
 +              if(mime){
 +                      if(FileActions.actions[mime]){
 +                              actions=$.extend( actions, FileActions.actions[mime] )
 +                      }
 +                      var mimePart=mime.substr(0,mime.indexOf('/'));
 +                      if(FileActions.actions[mimePart]){
 +                              actions=$.extend( actions, FileActions.actions[mimePart] )
 +                      }
 +              }
 +              if(type){//type is 'dir' or 'file'
 +                      if(FileActions.actions[type]){
 +                              actions=$.extend( actions, FileActions.actions[type] )
 +                      }
 +              }
 +              return actions;
 +      },
 +      getDefault:function(mime,type){
 +              if(mime){
 +                      var mimePart=mime.substr(0,mime.indexOf('/'));
 +              }
 +              var name=false;
 +              if(mime && FileActions.defaults[mime]){
 +                      name=FileActions.defaults[mime];
 +              }else if(mime && FileActions.defaults[mimePart]){
 +                      name=FileActions.defaults[mimePart];
 +              }else if(type && FileActions.defaults[type]){
 +                      name=FileActions.defaults[type];
 +              }else{
 +                      name=FileActions.defaults.all;
 +              }
 +              var actions=this.get(mime,type);
 +              return actions[name];
 +      },
 +      display:function(parent){
 +              FileActions.currentFile=parent;
 +              $('#fileList span.fileactions, #fileList td.date a.action').remove();
 +              var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType());
 +              var file=FileActions.getCurrentFile();
 +              if($('tr').filterAttr('data-file',file).data('renaming')){
 +                      return;
 +              }
 +              parent.children('a.name').append('<span class="fileactions" />');
 +              var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType());
 +              for(name in actions){
 +                      if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){
 +                              var img=FileActions.icons[name];
 +                              if(img.call){
 +                                      img=img(file);
 +                              }
 +                              var html='<a href="#" class="action" style="display:none">';
 +                              if(img) { html+='<img src="'+img+'"/> '; }
 +                              html += name+'</a>';
 +                              var element=$(html);
 +                              element.data('action',name);
 +                              element.click(function(event){
 +                                      event.stopPropagation();
 +                                      event.preventDefault();
 +                                      var action=actions[$(this).data('action')];
 +                                      var currentFile=FileActions.getCurrentFile();
 +                                      FileActions.hide();
 +                                      action(currentFile);
 +                              });
 +                              element.hide();
 +                              parent.find('a.name>span.fileactions').append(element);
 +                      }
 +              }
 +              if(actions['Delete']){
 +                      var img=FileActions.icons['Delete'];
 +                      if(img.call){
 +                              img=img(file);
 +                      }
 +                      var html='<a href="#" original-title="Delete" class="action delete" style="display:none" />';
 +                      var element=$(html);
 +                      if(img){
 +                              element.append($('<img src="'+img+'"/>'));
 +                      }
 +                      element.data('action','Delete');
 +                      element.click(function(event){
 +                              event.stopPropagation();
 +                              event.preventDefault();
 +                              var action=actions[$(this).data('action')];
 +                              var currentFile=FileActions.getCurrentFile();
 +                              FileActions.hide();
 +                              action(currentFile);
 +                      });
 +                      element.hide();
 +                      parent.parent().children().last().append(element);
 +              }
 +              $('#fileList .action').css('-o-transition-property','none');//temporarly disable
 +              $('#fileList .action').fadeIn(200,function(){
 +                      $('#fileList .action').css('-o-transition-property','opacity');
 +              });
 +              return false;
 +      },
 +      hide:function(){
 +              $('#fileList span.fileactions, #fileList td.date a.action').fadeOut(200,function(){
 +                      $(this).remove();
 +              });
 +      },
 +      getCurrentFile:function(){
 +              return FileActions.currentFile.parent().attr('data-file');
 +      },
 +      getCurrentMimeType:function(){
 +              return FileActions.currentFile.parent().attr('data-mime');
 +      },
 +      getCurrentType:function(){
 +              return FileActions.currentFile.parent().attr('data-type');
 +      }
 +}
 +
 +$(document).ready(function(){
 +      if($('#allowZipDownload').val() == 1){
 +              var downloadScope = 'all';
 +      } else {
 +              var downloadScope = 'file';
 +      }
 +      FileActions.register(downloadScope,'Download',function(){return OC.imagePath('core','actions/download')},function(filename){
 +              window.location=OC.filePath('files', 'ajax', 'download.php') + '?files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent($('#dir').val());
 +      });
 +});
 +
 +FileActions.register('all','Delete',function(){return OC.imagePath('core','actions/delete')},function(filename){
++      if(Files.cancelUpload(filename)) {
++              if(filename.substr){
++                      filename=[filename];
++              }
++              $.each(filename,function(index,file){
++                      var filename = $('tr').filterAttr('data-file',file);
++                      filename.hide();
++                      filename.find('input[type="checkbox"]').removeAttr('checked');
++                      filename.removeClass('selected');
++              });
++              procesSelection();
++      }else{
++              FileList.do_delete(filename);
++      }
 +});
 +
 +FileActions.register('all','Rename',function(){return OC.imagePath('core','actions/rename')},function(filename){
 +      FileList.rename(filename);
 +});
 +
 +FileActions.register('dir','Open','',function(filename){
 +      window.location='index.php?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
 +});
 +
 +FileActions.setDefault('dir','Open');
index 5bd85fc29ef5f49d10105f7715e3d978ada0e960,0000000000000000000000000000000000000000..febdfc473b1be76eb004aa1ab2e2c8197737d3d4
mode 100644,000000..100644
--- /dev/null
@@@ -1,232 -1,0 +1,233 @@@
 +FileList={
 +      useUndo:true,
 +      update:function(fileListHtml) {
 +              $('#fileList').empty().html(fileListHtml);
 +      },
 +      addFile:function(name,size,lastModified,loading){
 +              var img=(loading)?OC.imagePath('core', 'loading.gif'):OC.imagePath('core', 'filetypes/file.png');
 +              var html='<tr data-type="file" data-size="'+size+'">';
 +              if(name.indexOf('.')!=-1){
 +                      var basename=name.substr(0,name.lastIndexOf('.'));
 +                      var extension=name.substr(name.lastIndexOf('.'));
 +              }else{
 +                      var basename=name;
 +                      var extension=false;
 +              }
 +              html+='<td class="filename" style="background-image:url('+img+')"><input type="checkbox" />';
 +              html+='<a class="name" href="download.php?file='+$('#dir').val()+'/'+name+'"><span class="nametext">'+basename
 +              if(extension){
 +                      html+='<span class="extension">'+extension+'</span>';
 +              }
 +              html+='</span></a></td>';
 +              if(size!='Pending'){
 +                      simpleSize=simpleFileSize(size);
 +              }else{
 +                      simpleSize='Pending';
 +              }
 +              sizeColor = Math.round(200-size/(1024*1024)*2);
 +              lastModifiedTime=Math.round(lastModified.getTime() / 1000);
 +              modifiedColor=Math.round((Math.round((new Date()).getTime() / 1000)-lastModifiedTime)/60/60/24*14);
 +              html+='<td class="filesize" title="'+humanFileSize(size)+'" style="color:rgb('+sizeColor+','+sizeColor+','+sizeColor+')">'+simpleSize+'</td>';
 +              html+='<td class="date"><span class="modified" title="'+formatDate(lastModified)+'" style="color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')">'+relative_modified_date(lastModified.getTime() / 1000)+'</span></td>';
 +              html+='</tr>';
 +              FileList.insertElement(name,'file',$(html).attr('data-file',name));
 +              if(loading){
 +                      $('tr').filterAttr('data-file',name).data('loading',true);
 +              }else{
 +                      $('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions);
 +              }
 +      },
 +      addDir:function(name,size,lastModified){
 +              html = $('<tr></tr>').attr({ "data-type": "dir", "data-size": size, "data-file": name});
 +              td = $('<td></td>').attr({"class": "filename", "style": 'background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')' });
 +              td.append('<input type="checkbox" />');
 +              var link_elem = $('<a></a>').attr({ "class": "name", "href": "index.php?dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/') });
 +              link_elem.append($('<span></span>').addClass('nametext').text(name));
++              link_elem.append($('<span></span>').attr({'class': 'uploadtext', 'currentUploads': 0}));
 +              td.append(link_elem);
 +              html.append(td);
 +              if(size!='Pending'){
 +                      simpleSize=simpleFileSize(size);
 +              }else{
 +                      simpleSize='Pending';
 +              }
 +              sizeColor = Math.round(200-Math.pow((size/(1024*1024)),2));
 +              lastModifiedTime=Math.round(lastModified.getTime() / 1000);
 +              modifiedColor=Math.round((Math.round((new Date()).getTime() / 1000)-lastModifiedTime)/60/60/24*5);
 +              td = $('<td></td>').attr({ "class": "filesize", "title": humanFileSize(size), "style": 'color:rgb('+sizeColor+','+sizeColor+','+sizeColor+')'}).text(simpleSize);
 +              html.append(td);
 +              
 +              td = $('<td></td>').attr({ "class": "date" });
 +              td.append($('<span></span>').attr({ "class": "modified", "title": formatDate(lastModified), "style": 'color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')' }).text( relative_modified_date(lastModified.getTime() / 1000) ));
 +              html.append(td);
 +              FileList.insertElement(name,'dir',html);
 +              $('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions);
 +              $('tr').filterAttr('data-file',name).find('td.filename').droppable(folderDropOptions);
 +      },
 +      refresh:function(data) {
 +              result = jQuery.parseJSON(data.responseText);
 +              if(typeof(result.data.breadcrumb) != 'undefined'){
 +                      updateBreadcrumb(result.data.breadcrumb);
 +              }
 +              FileList.update(result.data.files);
 +              resetFileActionPanel();
 +      },
 +      remove:function(name){
 +              $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy');
 +              $('tr').filterAttr('data-file',name).remove();
 +              if($('tr[data-file]').length==0){
 +                      $('#emptyfolder').show();
 +                      $('.file_upload_filename').addClass('highlight');
 +              }
 +      },
 +      insertElement:function(name,type,element){
 +              //find the correct spot to insert the file or folder
 +              var fileElements=$('tr[data-file][data-type="'+type+'"]');
 +              var pos;
 +              if(name.localeCompare($(fileElements[0]).attr('data-file'))<0){
 +                      pos=-1;
 +              }else if(name.localeCompare($(fileElements[fileElements.length-1]).attr('data-file'))>0){
 +                      pos=fileElements.length-1;
 +              }else{
 +                      for(var pos=0;pos<fileElements.length-1;pos++){
 +                              if(name.localeCompare($(fileElements[pos]).attr('data-file'))>0 && name.localeCompare($(fileElements[pos+1]).attr('data-file'))<0){
 +                                      break;
 +                              }
 +                      }
 +              }
 +              if(fileElements.length){
 +                      if(pos==-1){
 +                              $(fileElements[0]).before(element);
 +                      }else{
 +                              $(fileElements[pos]).after(element);
 +                      }
 +              }else if(type=='dir' && $('tr[data-file]').length>0){
 +                      $('tr[data-file]').first().before(element);
 +              }else{
 +                      $('#fileList').append(element);
 +              }
 +              $('#emptyfolder').hide();
 +              $('.file_upload_filename').removeClass('highlight');
 +      },
 +      loadingDone:function(name){
 +              var tr=$('tr').filterAttr('data-file',name);
 +              tr.data('loading',false);
 +              var mime=tr.data('mime');
 +              tr.attr('data-mime',mime);
 +              getMimeIcon(mime,function(path){
 +                      tr.find('td.filename').attr('style','background-image:url('+path+')');
 +              });
 +              tr.find('td.filename').draggable(dragOptions);
 +      },
 +      isLoading:function(name){
 +              return $('tr').filterAttr('data-file',name).data('loading');
 +      },
 +      rename:function(name){
 +              var tr=$('tr').filterAttr('data-file',name);
 +              tr.data('renaming',true);
 +              var td=tr.children('td.filename');
 +              var input=$('<input class="filename"></input>').val(name);
 +              var form=$('<form></form>')
 +              form.append(input);
 +              td.children('a.name').text('');
 +              td.children('a.name').append(form)
 +              input.focus();
 +              form.submit(function(event){
 +                      event.stopPropagation();
 +                      event.preventDefault();
 +                      var newname=input.val();
 +                      tr.attr('data-file',newname);
 +                      td.children('a.name').empty();
 +                      var path = td.children('a.name').attr('href');
 +                      td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname)));
 +                      if(newname.indexOf('.')>0){
 +                              basename=newname.substr(0,newname.lastIndexOf('.'));
 +                      }else{
 +                              basename=newname;
 +                      }
 +                      var span=$('<span class="nametext"></span>');
 +                      span.text(basename);
 +                      td.children('a.name').append(span);
 +                      if(newname.indexOf('.')>0){
 +                              span.append($('<span class="extension">'+newname.substr(newname.lastIndexOf('.'))+'</span>'));
 +                      }
 +                      $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(){
 +                              tr.data('renaming',false);
 +                      });
 +                      return false;
 +              });
 +              input.click(function(event){
 +                      event.stopPropagation();
 +                      event.preventDefault();
 +              });
 +              input.blur(function(){
 +                      form.trigger('submit');
 +              });
 +      },
 +      do_delete:function(files){
 +              if(FileList.deleteFiles || !FileList.useUndo){//finish any ongoing deletes first
 +                      FileList.finishDelete(function(){
 +                              FileList.do_delete(files);
 +                      });
 +                      return;
 +              }
 +              if(files.substr){
 +                      files=[files];
 +              }
 +              $.each(files,function(index,file){
 +                      var files = $('tr').filterAttr('data-file',file);
 +                      files.hide();
 +                      files.find('input[type="checkbox"]').removeAttr('checked');
 +                      files.removeClass('selected');
 +              });
 +              procesSelection();
 +              FileList.deleteCanceled=false;
 +              FileList.deleteFiles=files;
 +              $('#notification').text(t('files','undo deletion'));
 +              $('#notification').data('deletefile',true);
 +              $('#notification').fadeIn();
 +      },
 +      finishDelete:function(ready,sync){
 +              if(!FileList.deleteCanceled && FileList.deleteFiles){
 +                      var fileNames=FileList.deleteFiles.join(';');
 +                      $.ajax({
 +                              url: 'ajax/delete.php',
 +                              async:!sync,
 +                              data: "dir="+$('#dir').val()+"&files="+encodeURIComponent(fileNames),
 +                              complete: function(data){
 +                                      boolOperationFinished(data, function(){
 +                                              $('#notification').fadeOut();
 +                                              $.each(FileList.deleteFiles,function(index,file){
 +                                                      FileList.remove(file);
 +                                              });
 +                                              FileList.deleteCanceled=true;
 +                                              FileList.deleteFiles=null;
 +                                              if(ready){
 +                                                      ready();
 +                                              }
 +                                      });
 +                              }
 +                      });
 +              }
 +      }
 +}
 +
 +$(document).ready(function(){
 +      $('#notification').hide();
 +      $('#notification').click(function(){
 +              if($('#notification').data('deletefile'))
 +              {
 +                      $.each(FileList.deleteFiles,function(index,file){
 +                              $('tr').filterAttr('data-file',file).show();
 +//                    alert(file);
 +                      });
 +                      FileList.deleteCanceled=true;
 +                      FileList.deleteFiles=null;
 +              }
 +              $('#notification').fadeOut();
 +      });
 +      FileList.useUndo=('onbeforeunload' in window)
 +      $(window).bind('beforeunload', function (){
 +              FileList.finishDelete(null,true);
 +      });
 +});
index 9d83e5e6d268d2ad81770744d3bd5e64ea045400,0000000000000000000000000000000000000000..2dce00035e162fe0195c035ea21f2dc6ab41547f
mode 100644,000000..100644
--- /dev/null
@@@ -1,591 -1,0 +1,745 @@@
-       $('.file_upload_start').live('change',function(){
-               var form=$(this).closest('form');
-               var that=this;
-               var uploadId=form.attr('data-upload-id');
-               var files=this.files;
-               var target=form.children('iframe');
-               var totalSize=0;
-               if(files){
-                       for(var i=0;i<files.length;i++){
-                               totalSize+=files[i].size;
-                               if(FileList.deleteFiles && FileList.deleteFiles.indexOf(files[i].name)!=-1){//finish delete if we are uploading a deleted file
-                                       FileList.finishDelete(function(){
-                                               $(that).change();
-                                       });
-                                       return;
-                               }
-                       }
-               }
-               if(totalSize>$('#max_upload').val()){
-                       $( "#uploadsize-message" ).dialog({
-                               modal: true,
-                               buttons: {
-                                       Close: function() {
-                                               $( this ).dialog( "close" );
++var uploadingFiles = {};
++Files={
++      cancelUpload:function(filename) {
++              if(uploadingFiles[filename]) {
++                      uploadingFiles[filename].abort();
++                      delete uploadingFiles[filename];
++                      return true;
++              }
++              return false;
++      },
++      cancelUploads:function() {
++              $.each(uploadingFiles,function(index,file) {
++                      if(typeof file['abort'] === 'function') {
++                              file.abort();
++                              var filename = $('tr').filterAttr('data-file',index);
++                              filename.hide();
++                              filename.find('input[type="checkbox"]').removeAttr('checked');
++                              filename.removeClass('selected');
++                      } else {
++                              $.each(file,function(i,f) {
++                                      f.abort();
++                                      delete file[i];
++                              });
++                      }
++                      delete uploadingFiles[index];
++              });
++              procesSelection();
++      }
++}
 +$(document).ready(function() {
 +      $('#fileList tr').each(function(){
 +              //little hack to set unescape filenames in attribute
 +              $(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
 +      });
 +
 +      if($('tr[data-file]').length==0){
 +              $('.file_upload_filename').addClass('highlight');
 +      }
 +
 +      $('#file_action_panel').attr('activeAction', false);
 +
 +      //drag/drop of files
 +      $('#fileList tr td.filename').draggable(dragOptions);
 +      $('#fileList tr[data-type="dir"][data-write="true"] td.filename').droppable(folderDropOptions);
 +      $('div.crumb:not(.last)').droppable(crumbDropOptions);
 +      $('ul#apps>li:first-child').data('dir','');
 +      if($('div.crumb').length){
 +              $('ul#apps>li:first-child').droppable(crumbDropOptions);
 +      }
 +
 +      // Triggers invisible file input
 +      $('.file_upload_button_wrapper').live('click', function() {
 +              $(this).parent().children('.file_upload_start').trigger('click');
 +              return false;
 +      });
 +
 +      // Sets the file-action buttons behaviour :
 +      $('tr').live('mouseenter',function(event) {
 +              FileActions.display($(this).children('td.filename'));
 +      });
 +      $('tr').live('mouseleave',function(event) {
 +              FileActions.hide();
 +      });
 +
 +      var lastChecked;
 +
 +      // Sets the file link behaviour :
 +      $('td.filename a').live('click',function(event) {
 +              event.preventDefault();
 +              if (event.ctrlKey || event.shiftKey) {
 +                      if (event.shiftKey) {
 +                              var last = $(lastChecked).parent().parent().prevAll().length;
 +                              var first = $(this).parent().parent().prevAll().length;
 +                              var start = Math.min(first, last);
 +                              var end = Math.max(first, last);
 +                              var rows = $(this).parent().parent().parent().children('tr');
 +                              for (var i = start; i < end; i++) {
 +                                      $(rows).each(function(index) {
 +                                              if (index == i) {
 +                                                      var checkbox = $(this).children().children('input:checkbox');
 +                                                      $(checkbox).attr('checked', 'checked');
 +                                                      $(checkbox).parent().parent().addClass('selected');
 +                                              }
 +                                      });
 +                              }
 +                      }
 +                      var checkbox = $(this).parent().children('input:checkbox');
 +                      lastChecked = checkbox;
 +                      if ($(checkbox).attr('checked')) {
 +                              $(checkbox).removeAttr('checked');
 +                              $(checkbox).parent().parent().removeClass('selected');
 +                              $('#select_all').removeAttr('checked');
 +                      } else {
 +                              $(checkbox).attr('checked', 'checked');
 +                              $(checkbox).parent().parent().toggleClass('selected');
 +                              var selectedCount=$('td.filename input:checkbox:checked').length;
 +                              if (selectedCount == $('td.filename input:checkbox').length) {
 +                                      $('#select_all').attr('checked', 'checked');
 +                              }
 +                      }
 +                      procesSelection();
 +              } else {
 +                      var filename=$(this).parent().parent().attr('data-file');
 +                      var tr=$('tr').filterAttr('data-file',filename);
 +                      var renaming=tr.data('renaming');
 +                      if(!renaming && !FileList.isLoading(filename)){
 +                              var mime=$(this).parent().parent().data('mime');
 +                              var type=$(this).parent().parent().data('type');
 +                              var action=FileActions.getDefault(mime,type);
 +                              if(action){
 +                                      action(filename);
 +                              }
 +                      }
 +              }
 +
 +      });
 +
 +      // Sets the select_all checkbox behaviour :
 +      $('#select_all').click(function() {
 +              if($(this).attr('checked')){
 +                      // Check all
 +                      $('td.filename input:checkbox').attr('checked', true);
 +                      $('td.filename input:checkbox').parent().parent().addClass('selected');
 +              }else{
 +                      // Uncheck all
 +                      $('td.filename input:checkbox').attr('checked', false);
 +                      $('td.filename input:checkbox').parent().parent().removeClass('selected');
 +              }
 +              procesSelection();
 +      });
 +
 +      $('td.filename input:checkbox').live('change',function(event) {
 +              if (event.shiftKey) {
 +                      var last = $(lastChecked).parent().parent().prevAll().length;
 +                      var first = $(this).parent().parent().prevAll().length;
 +                      var start = Math.min(first, last);
 +                      var end = Math.max(first, last);
 +                      var rows = $(this).parent().parent().parent().children('tr');
 +                      for (var i = start; i < end; i++) {
 +                              $(rows).each(function(index) {
 +                                      if (index == i) {
 +                                              var checkbox = $(this).children().children('input:checkbox');
 +                                              $(checkbox).attr('checked', 'checked');
 +                                              $(checkbox).parent().parent().addClass('selected');
 +                                      }
 +                              });
 +                      }
 +              }
 +              var selectedCount=$('td.filename input:checkbox:checked').length;
 +              $(this).parent().parent().toggleClass('selected');
 +              if(!$(this).attr('checked')){
 +                      $('#select_all').attr('checked',false);
 +              }else{
 +                      if(selectedCount==$('td.filename input:checkbox').length){
 +                              $('#select_all').attr('checked',true);
 +                      }
 +              }
 +              procesSelection();
 +      });
 +
 +      $('#file_newfolder_name').click(function(){
 +              if($('#file_newfolder_name').val() == 'New Folder'){
 +                      $('#file_newfolder_name').val('');
 +              }
 +      });
 +
 +      $('.download').click('click',function(event) {
 +              var files=getSelectedFiles('name').join(';');
 +              var dir=$('#dir').val()||'/';
 +              $('#notification').text(t('files','generating ZIP-file, it may take some time.'));
 +              $('#notification').fadeIn();
 +              window.location=OC.filePath('files', 'ajax', 'download.php') + '?files='+encodeURIComponent(files)+'&dir='+encodeURIComponent(dir);
 +              return false;
 +      });
 +
 +      $('.delete').click(function(event) {
 +              var files=getSelectedFiles('name');
 +              event.preventDefault();
 +              FileList.do_delete(files);
 +              return false;
 +      });
 +
-                       });
-               }else{
-                       target.load(function(){
-                               var response=jQuery.parseJSON(target.contents().find('body').text());
-                               //set mimetype and if needed filesize
-                               if(response){
-                                       if(response[0] != undefined && response[0].status == 'success'){
-                                               for(var i=0;i<response.length;i++){
-                                                       var file=response[i];
++      // drag&drop support using jquery.fileupload
++      // TODO use OC.dialogs
++      $(document).bind('drop dragover', function (e) {
++                      e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
++      });
++
++      $(function() {
++              $('.file_upload_start').fileupload({
++                      dropZone: $('#content'), // restrict dropZone to content div
++                      add: function(e, data) {
++                              var files = data.files;
++                              var totalSize=0;
++                              if(files){
++                                      for(var i=0;i<files.length;i++){
++                                              totalSize+=files[i].size;
++                                              if(FileList.deleteFiles && FileList.deleteFiles.indexOf(files[i].name)!=-1){//finish delete if we are uploading a deleted file
++                                                      FileList.finishDelete(function(){
++                                                              $('.file_upload_start').change();
++                                                      });
++                                                      return;
++                                              }
 +                                      }
 +                              }
-                                                       if(size=='Pending'){
++                              if(totalSize>$('#max_upload').val()){
++                                      $( '#uploadsize-message' ).dialog({
++                                              modal: true,
++                                              buttons: {
++                                                      Close: function() {
++                                                              $( this ).dialog( 'close' );
++                                                      }
++                                              }
++                                      });
++                              }else{
++                              if($.support.xhrFileUpload) {
++                                      for(var i=0;i<files.length;i++){
++                                              var fileName = files[i].name
++                                              var dropTarget = $(e.originalEvent.target).closest('tr');
++                                              if(dropTarget && dropTarget.attr('data-type') === 'dir') { // drag&drop upload to folder
++                                                      var dirName = dropTarget.attr('data-file')
++                                                      var jqXHR =  $('.file_upload_start').fileupload('send', {files: files[i],
++                                                                      formData: function(form) {
++                                                                              var formArray = form.serializeArray();
++                                                                              formArray[1]['value'] = dirName;
++                                                                              return formArray;
++                                                                      }}).success(function(result, textStatus, jqXHR) {
++                                                                              var response;
++                                                                              response=jQuery.parseJSON(result);
++                                                                              if(response[0] == undefined || response[0].status != 'success') {
++                                                                                      $('#notification').text(t('files', response.data.message));
++                                                                                      $('#notification').fadeIn();
++                                                                              }
++                                                                              var file=response[0];
++                                                                              delete uploadingFiles[dirName][file.name];
++                                                                              var currentUploads = parseInt(uploadtext.attr('currentUploads'));
++                                                                              currentUploads -= 1;
++                                                                              uploadtext.attr('currentUploads', currentUploads);
++                                                                              if(currentUploads === 0) {
++                                                                                      var img = OC.imagePath('core', 'filetypes/folder.png');
++                                                                                      var tr=$('tr').filterAttr('data-file',dirName);
++                                                                                      tr.find('td.filename').attr('style','background-image:url('+img+')');
++                                                                                      uploadtext.text('');
++                                                                                      uploadtext.hide();
++                                                                              } else {
++                                                                                      uploadtext.text(currentUploads + ' files uploading')
++                                                                              }
++                                                                      })
++                                                      .error(function(jqXHR, textStatus, errorThrown) {
++                                                              if(errorThrown === 'abort') {
++                                                                      var currentUploads = parseInt(uploadtext.attr('currentUploads'));
++                                                                      currentUploads -= 1;
++                                                                      uploadtext.attr('currentUploads', currentUploads);
++                                                                      if(currentUploads === 0) {
++                                                                              var img = OC.imagePath('core', 'filetypes/folder.png');
++                                                                              var tr=$('tr').filterAttr('data-file',dirName);
++                                                                              tr.find('td.filename').attr('style','background-image:url('+img+')');
++                                                                              uploadtext.text('');
++                                                                              uploadtext.hide();
++                                                                      } else {
++                                                                              uploadtext.text(currentUploads + ' files uploading')
++                                                                      }
++                                                                      $('#notification').hide();
++                                                                      $('#notification').text(t('files', 'Upload cancelled.'));
++                                                                      $('#notification').fadeIn();
++                                                              }
++                                                      });
++                                                      //TODO test with filenames containing slashes
++                                                      if(uploadingFiles[dirName] === undefined) {
++                                                              uploadingFiles[dirName] = {};
++                                                      }
++                                                      uploadingFiles[dirName][fileName] = jqXHR;
++                                              } else {
++                                                      var jqXHR =  $('.file_upload_start').fileupload('send', {files: files[i]})
++                                                                      .success(function(result, textStatus, jqXHR) {
++                                                                              var response;
++                                                                              response=jQuery.parseJSON(result);
++                                                                              if(response[0] != undefined && response[0].status == 'success') {
++                                                                                      var file=response[0];
++                                                                                      delete uploadingFiles[file.name];
++                                                                                      $('tr').filterAttr('data-file',file.name).data('mime',file.mime);
++                                                                                      var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
++                                                                                      if(size==t('files','Pending')){
++                                                                                              $('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
++                                                                                      }
++                                                                                      FileList.loadingDone(file.name);
++                                                                              } else {
++                                                                                      $('#notification').text(t('files', response.data.message));
++                                                                                      $('#notification').fadeIn();
++                                                                                      $('#fileList > tr').not('[data-mime]').fadeOut();
++                                                                                      $('#fileList > tr').not('[data-mime]').remove();
++                                                                              }
++                                                                      })
++                                                      .error(function(jqXHR, textStatus, errorThrown) {
++                                                              if(errorThrown === 'abort') {
++                                                                      $('#notification').hide();
++                                                                      $('#notification').text(t('files', 'Upload cancelled.'));
++                                                                      $('#notification').fadeIn();
++                                                              }
++                                                      });
++                                                      uploadingFiles[files[i].name] = jqXHR;
++                                              }
++                                      }
++                              }else{
++                                      data.submit().success(function(data, status) {
++                                              response = jQuery.parseJSON(data[0].body.innerText);
++                                              if(response[0] != undefined && response[0].status == 'success') {
++                                                      var file=response[0];
++                                                      delete uploadingFiles[file.name];
 +                                                      $('tr').filterAttr('data-file',file.name).data('mime',file.mime);
-                                       }
-                                       else{
-                                               $('#notification').text(t('files',response.data.message));
-                                               $('#notification').fadeIn();
-                                               $('#fileList > tr').not('[data-mime]').fadeOut();
-                                               $('#fileList > tr').not('[data-mime]').remove();
-                                       }
++                                                      var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
++                                                      if(size==t('files','Pending')){
 +                                                              $('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
 +                                                      }
 +                                                      FileList.loadingDone(file.name);
++                                              } else {
++                                                      $('#notification').text(t('files', response.data.message));
++                                                      $('#notification').fadeIn();
++                                                      $('#fileList > tr').not('[data-mime]').fadeOut();
++                                                      $('#fileList > tr').not('[data-mime]').remove();
 +                                              }
-                       });
-                       form.submit();
-                       var date=new Date();
-                       if(files){
-                               for(var i=0;i<files.length;i++){
-                                       if(files[i].size>0){
-                                               var size=files[i].size;
-                                       }else{
-                                               var size=t('files','Pending');
-                                       }
++                                      });
 +                              }
-                       }else{
-                               var filename=this.value.split('\\').pop(); //ie prepends C:\fakepath\ in front of the filename
-                               FileList.addFile(getUniqueName(filename),'Pending',date,true);
++                                                                      
++                                      var date=new Date();
 +                                      if(files){
++                                              for(var i=0;i<files.length;i++){
++                                                      if(files[i].size>0){
++                                                              var size=files[i].size;
++                                                      }else{
++                                                              var size=t('files','Pending');
++                                                      }
++                                                      if(files && !dirName){
 +                                              FileList.addFile(getUniqueName(files[i].name),size,date,true);
++                                                      } else if(dirName) {
++                                                              var uploadtext = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName).find('.uploadtext')
++                                                              var currentUploads = parseInt(uploadtext.attr('currentUploads'));
++                                                              currentUploads += 1;
++                                                              uploadtext.attr('currentUploads', currentUploads);
++                                                              if(currentUploads === 1) {
++                                                                      var img = OC.imagePath('core', 'loading.gif');
++                                                                      var tr=$('tr').filterAttr('data-file',dirName);
++                                                                      tr.find('td.filename').attr('style','background-image:url('+img+')');
++                                                                      uploadtext.text('1 file uploading');
++                                                                      uploadtext.show();
++                                                              } else {
++                                                                      uploadtext.text(currentUploads + ' files uploading')
++                                                              }
++                                                      }
++                                              }
++                                      }else{
++                                              var filename=this.value.split('\\').pop(); //ie prepends C:\fakepath\ in front of the filename
++                              FileList.addFile(getUniqueName(filename),'Pending',date,true);
 +                                      }
 +                              }
-                       //clone the upload form and hide the new one to allow users to start a new upload while the old one is still uploading
-                       var clone=form.clone();
-                       uploadId++;
-                       clone.attr('data-upload-id',uploadId);
-                       clone.attr('target','file_upload_target_'+uploadId);
-                       clone.children('iframe').attr('name','file_upload_target_'+uploadId)
-                       clone.insertBefore(form);
-                       form.hide();
-               }
++                      },
++                      fail: function(e, data) {
++                              // TODO: cancel upload & display error notification
++                      },
++                      progress: function(e, data) {
++                              // TODO: show nice progress bar in file row
++                      },
++                      progressall: function(e, data) {
++                              var progress = (data.loaded/data.total)*100;
++                              $('#uploadprogressbar').progressbar('value',progress);
++                      },
++                      start: function(e, data) {
++                              $('#uploadprogressbar').progressbar({value:0});
++                              $('#uploadprogressbar').fadeIn();
++                              if(data.dataType != 'iframe ') {
++                                      $('#upload input.stop').show();
++                              }
++                      },
++                      stop: function(e, data) {
++                              if(data.dataType != 'iframe ') {
++                                      $('#upload input.stop').hide();
++                              }       
++                              $('#uploadprogressbar').progressbar('value',100);
++                              $('#uploadprogressbar').fadeOut();
 +                      }
- function scanFiles(force){
++              })
 +      });
 +
 +      //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
 +      if(navigator.userAgent.search(/konqueror/i)==-1){
 +              $('.file_upload_start').attr('multiple','multiple')
 +      }
 +
 +      //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder
 +      var crumb=$('div.crumb').first();
 +      while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){
 +              crumb.children('a').text('...');
 +              crumb=crumb.next('div.crumb');
 +      }
 +      //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent
 +      var crumb=$('div.crumb').first();
 +      var next=crumb.next('div.crumb');
 +      while($('div.controls').height()>40 && next.next('div.crumb').length>0){
 +              crumb.remove();
 +              crumb=next;
 +              next=crumb.next('div.crumb');
 +      }
 +      //still not enough, start shorting down the current folder name
 +      var crumb=$('div.crumb>a').last();
 +      while($('div.controls').height()>40 && crumb.text().length>6){
 +              var text=crumb.text()
 +              text=text.substr(0,text.length-6)+'...';
 +              crumb.text(text);
 +      }
 +
 +      $(window).click(function(){
 +              $('#new>ul').hide();
 +              $('#new').removeClass('active');
 +              $('button.file_upload_filename').removeClass('active');
 +              $('#new li').each(function(i,element){
 +                      if($(element).children('p').length==0){
 +                              $(element).children('input').remove();
 +                              $(element).append('<p>'+$(element).data('text')+'</p>');
 +                      }
 +              });
 +      });
 +      $('#new').click(function(event){
 +              event.stopPropagation();
 +      });
 +      $('#new>a').click(function(){
 +              $('#new>ul').toggle();
 +              $('#new').toggleClass('active');
 +              $('button.file_upload_filename').toggleClass('active');
 +      });
 +      $('#new li').click(function(){
 +              if($(this).children('p').length==0){
 +                      return;
 +              }
 +
 +              $('#new li').each(function(i,element){
 +                      if($(element).children('p').length==0){
 +                              $(element).children('input').remove();
 +                              $(element).append('<p>'+$(element).data('text')+'</p>');
 +                      }
 +              });
 +
 +              var type=$(this).data('type');
 +              var text=$(this).children('p').text();
 +              $(this).data('text',text);
 +              $(this).children('p').remove();
 +              var input=$('<input>');
 +              $(this).append(input);
 +              input.focus();
 +              input.change(function(){
 +                      var name=$(this).val();
 +                      switch(type){
 +                              case 'file':
 +                                      $.post(
 +                                              OC.filePath('files','ajax','newfile.php'),
 +                                              {dir:$('#dir').val(),filename:name,content:" \n"},
 +                                              function(data){
 +                                                      var date=new Date();
 +                                                      FileList.addFile(name,0,date);
 +                                                      var tr=$('tr').filterAttr('data-file',name);
 +                                                      tr.data('mime','text/plain');
 +                                                      getMimeIcon('text/plain',function(path){
 +                                                              tr.find('td.filename').attr('style','background-image:url('+path+')');
 +                                                      });
 +                                              }
 +                                      );
 +                                      break;
 +                              case 'folder':
 +                                      $.post(
 +                                              OC.filePath('files','ajax','newfolder.php'),
 +                                              {dir:$('#dir').val(),foldername:name},
 +                                              function(data){
 +                                                      var date=new Date();
 +                                                      FileList.addDir(name,0,date);
 +                                              }
 +                                      );
 +                                      break;
 +                              case 'web':
 +                                      if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){
 +                                              name='http://'.name;
 +                                      }
 +                                      var localName=name;
 +                                      if(localName.substr(localName.length-1,1)=='/'){//strip /
 +                                              localName=localName.substr(0,localName.length-1)
 +                                      }
 +                                      if(localName.indexOf('/')){//use last part of url
 +                                              localName=localName.split('/').pop();
 +                                      }else{//or the domain
 +                                              localName=(localName.match(/:\/\/(.[^/]+)/)[1]).replace('www.','');
 +                                      }
 +                                      $.post(
 +                                              OC.filePath('files','ajax','newfile.php'),
 +                                              {dir:$('#dir').val(),source:name,filename:localName},
 +                                              function(result){
 +                                                      if(result.status == 'success'){
 +                                                              var date=new Date();
 +                                                              FileList.addFile(localName,0,date);
 +                                                              var tr=$('tr').filterAttr('data-file',localName);
 +                                                              tr.data('mime',result.data.mime);
 +                                                              getMimeIcon(result.data.mime,function(path){
 +                                                                      tr.find('td.filename').attr('style','background-image:url('+path+')');
 +                                                              });
 +                                                      }else{
 +
 +                                                      }
 +                                              }
 +                                      );
 +                                      break;
 +                      }
 +                      var li=$(this).parent();
 +                      $(this).remove();
 +                      li.append('<p>'+li.data('text')+'</p>');
 +                      $('#new>a').click();
 +              });
 +      });
 +
 +      //check if we need to scan the filesystem
 +      $.get(OC.filePath('files','ajax','scan.php'),{checkonly:'true'}, function(response) {
 +              if(response.data.done){
 +                      scanFiles();
 +              }
 +      }, "json");
 +});
 +
-       var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force});
++function scanFiles(force,dir){
++      if(!dir){
++              dir='';
++      }
 +      force=!!force; //cast to bool
 +      scanFiles.scanning=true;
 +      $('#scanning-message').show();
 +      $('#fileList').remove();
++      var scannerEventSource=new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force:force,dir:dir});
 +      scanFiles.cancel=scannerEventSource.close.bind(scannerEventSource);
 +      scannerEventSource.listen('scanning',function(data){
 +              $('#scan-count').text(data.count+' files scanned');
 +              $('#scan-current').text(data.file+'/');
 +      });
 +      scannerEventSource.listen('success',function(success){
 +              scanFiles.scanning=false;
 +              if(success){
 +                      window.location.reload();
 +              }else{
 +                      alert('error while scanning');
 +              }
 +      });
 +}
 +scanFiles.scanning=false;
 +
 +function boolOperationFinished(data, callback) {
 +      result = jQuery.parseJSON(data.responseText);
 +      if(result.status == 'success'){
 +              callback.call();
 +      } else {
 +              alert(result.data.message);
 +      }
 +}
 +
 +function updateBreadcrumb(breadcrumbHtml) {
 +      $('p.nav').empty().html(breadcrumbHtml);
 +}
 +
 +//options for file drag/dropp
 +var dragOptions={
 +      distance: 20, revert: 'invalid', opacity: 0.7,
 +      stop: function(event, ui) {
 +              $('#fileList tr td.filename').addClass('ui-draggable');
 +      }
 +};
 +var folderDropOptions={
 +      drop: function( event, ui ) {
 +              var file=ui.draggable.parent().data('file');
 +              var target=$(this).text().trim();
 +              var dir=$('#dir').val();
 +              $.ajax({
 +                      url: OC.filePath('files', 'ajax', 'move.php'),
 +              data: "dir="+encodeURIComponent(dir)+"&file="+encodeURIComponent(file)+'&target='+encodeURIComponent(dir)+'/'+encodeURIComponent(target),
 +              complete: function(data){boolOperationFinished(data, function(){
 +                      var el = $('#fileList tr').filterAttr('data-file',file).find('td.filename');
 +                      el.draggable('destroy');
 +                      FileList.remove(file);
 +              });}
 +              });
 +      }
 +}
 +var crumbDropOptions={
 +      drop: function( event, ui ) {
 +              var file=ui.draggable.text().trim();
 +              var target=$(this).data('dir');
 +              var dir=$('#dir').val();
 +              while(dir.substr(0,1)=='/'){//remove extra leading /'s
 +                              dir=dir.substr(1);
 +              }
 +              dir='/'+dir;
 +              if(dir.substr(-1,1)!='/'){
 +                      dir=dir+'/';
 +              }
 +              if(target==dir || target+'/'==dir){
 +                      return;
 +              }
 +              $.ajax({
 +                      url: OC.filePath('files', 'ajax', 'move.php'),
 +               data: "dir="+encodeURIComponent(dir)+"&file="+encodeURIComponent(file)+'&target='+encodeURIComponent(target),
 +               complete: function(data){boolOperationFinished(data, function(){
 +                       FileList.remove(file);
 +               });}
 +              });
 +      },
 +      tolerance: 'pointer'
 +}
 +
 +function procesSelection(){
 +      var selected=getSelectedFiles();
 +      var selectedFiles=selected.filter(function(el){return el.type=='file'});
 +      var selectedFolders=selected.filter(function(el){return el.type=='dir'});
 +      if(selectedFiles.length==0 && selectedFolders.length==0){
 +              $('#headerName>span.name').text(t('files','Name'));
 +              $('#headerSize').text(t('files','Size'));
 +              $('#modified').text(t('files','Modified'));
 +              $('th').removeClass('multiselect');
 +              $('.selectedActions').hide();
 +              $('thead').removeClass('fixed');
 +              $('#headerName').css('width','auto');
 +              $('#headerSize').css('width','auto');
 +              $('#headerDate').css('width','auto');
 +              $('table').css('padding-top','0');
 +      }else{
 +              var width={name:$('#headerName').css('width'),size:$('#headerSize').css('width'),date:$('#headerDate').css('width')};
 +              $('#headerName').css('width',width.name);
 +              $('#headerSize').css('width',width.size);
 +              $('#headerDate').css('width',width.date);
 +              $('.selectedActions').show();
 +              var totalSize=0;
 +              for(var i=0;i<selectedFiles.length;i++){
 +                      totalSize+=selectedFiles[i].size;
 +              };
 +              for(var i=0;i<selectedFolders.length;i++){
 +                      totalSize+=selectedFolders[i].size;
 +              };
 +              simpleSize=simpleFileSize(totalSize);
 +              $('#headerSize').text(simpleSize);
 +              $('#headerSize').attr('title',humanFileSize(totalSize));
 +              var selection='';
 +              if(selectedFolders.length>0){
 +                      if(selectedFolders.length==1){
 +                              selection+='1 '+t('files','folder');
 +                      }else{
 +                              selection+=selectedFolders.length+' '+t('files','folders');
 +                      }
 +                      if(selectedFiles.length>0){
 +                              selection+=' & ';
 +                      }
 +              }
 +              if(selectedFiles.length>0){
 +                      if(selectedFiles.length==1){
 +                              selection+='1 '+t('files','file');
 +                      }else{
 +                              selection+=selectedFiles.length+' '+t('files','files');
 +                      }
 +              }
 +              $('#headerName>span.name').text(selection);
 +              $('#modified').text('');
 +              $('th').addClass('multiselect');
 +      }
 +}
 +
 +/**
 + * @brief get a list of selected files
 + * @param string property (option) the property of the file requested
 + * @return array
 + *
 + * possible values for property: name, mime, size and type
 + * if property is set, an array with that property for each file is returnd
 + * if it's ommited an array of objects with all properties is returned
 + */
 +function getSelectedFiles(property){
 +      var elements=$('td.filename input:checkbox:checked').parent().parent();
 +      var files=[];
 +      elements.each(function(i,element){
 +              var file={
 +                      name:$(element).attr('data-file'),
 +                      mime:$(element).data('mime'),
 +                      type:$(element).data('type'),
 +                      size:$(element).data('size'),
 +              };
 +              if(property){
 +                      files.push(file[property]);
 +              }else{
 +                      files.push(file);
 +              }
 +      });
 +      return files;
 +}
 +
 +function relative_modified_date(timestamp) {
 +      var timediff = Math.round((new Date()).getTime() / 1000) - timestamp;
 +      var diffminutes = Math.round(timediff/60);
 +      var diffhours = Math.round(diffminutes/60);
 +      var diffdays = Math.round(diffhours/24);
 +      var diffmonths = Math.round(diffdays/31);
 +      var diffyears = Math.round(diffdays/365);
 +      if(timediff < 60) { return t('files','seconds ago'); }
 +      else if(timediff < 120) { return '1 '+t('files','minute ago'); }
 +      else if(timediff < 3600) { return diffminutes+' '+t('files','minutes ago'); }
 +      //else if($timediff < 7200) { return '1 hour ago'; }
 +      //else if($timediff < 86400) { return $diffhours.' hours ago'; }
 +      else if(timediff < 86400) { return t('files','today'); }
 +      else if(timediff < 172800) { return t('files','yesterday'); }
 +      else if(timediff < 2678400) { return diffdays+' '+t('files','days ago'); }
 +      else if(timediff < 5184000) { return t('files','last month'); }
 +      //else if($timediff < 31556926) { return $diffmonths.' months ago'; }
 +      else if(timediff < 31556926) { return t('files','months ago'); }
 +      else if(timediff < 63113852) { return t('files','last year'); }
 +      else { return diffyears+' '+t('files','years ago'); }
 +}
 +
 +function getMimeIcon(mime, ready){
 +      if(getMimeIcon.cache[mime]){
 +              ready(getMimeIcon.cache[mime]);
 +      }else{
 +              $.get( OC.filePath('files','ajax','mimeicon.php')+'?mime='+mime, function(path){
 +                      getMimeIcon.cache[mime]=path;
 +                      ready(getMimeIcon.cache[mime]);
 +              });
 +      }
 +}
 +getMimeIcon.cache={};
 +
 +function getUniqueName(name){
 +      if($('tr').filterAttr('data-file',name).length>0){
 +              var parts=name.split('.');
 +              var extension=parts.pop();
 +              var base=parts.join('.');
 +              numMatch=base.match(/\((\d+)\)/);
 +              var num=2;
 +              if(numMatch && numMatch.length>0){
 +                      num=parseInt(numMatch[numMatch.length-1])+1;
 +                      base=base.split('(')
 +                      base.pop();
 +                      base=base.join('(').trim();
 +              }
 +              name=base+' ('+num+').'+extension;
 +              return getUniqueName(name);
 +      }
 +      return name;
 +}
index 3571950467e01be19a187d8960705b573ea7a67b,0000000000000000000000000000000000000000..fc385e1ed3ad78083ce970123ce030986186ed47
mode 100644,000000..100644
--- /dev/null
@@@ -1,74 -1,0 +1,79 @@@
 +<!--[if IE 8]><style>input[type="checkbox"]{padding:0;}table td{position:static !important;}</style><![endif]-->
 +<div id="controls">
 +      <?php echo($_['breadcrumb']); ?>
 +      <?php if (!isset($_['readonly']) || !$_['readonly']):?>
 +              <div class="actions <?php if (isset($_['files']) and ! $_['readonly'] and count($_['files'])==0):?>emptyfolder<?php endif; ?>">
 +                      <div id='new' class='button'>
 +                              <a><?php echo $l->t('New');?></a>
 +                              <ul class="popup popupTop">
 +                                      <li style="background-image:url('<?php echo mimetype_icon('text/plain') ?>')" data-type='file'><p><?php echo $l->t('Text file');?></p></li>
 +                                      <li style="background-image:url('<?php echo mimetype_icon('dir') ?>')" data-type='folder'><p><?php echo $l->t('Folder');?></p></li>
 +                                      <li style="background-image:url('<?php echo image_path('core','actions/public.png') ?>')" data-type='web'><p><?php echo $l->t('From url');?></p></li>
 +                              </ul>
 +                      </div>
 +                      <div class="file_upload_wrapper svg">
 +                              <form data-upload-id='1' class="file_upload_form" action="<?php echo OC_Helper::linkto('files', 'ajax/upload.php'); ?>" method="post" enctype="multipart/form-data" target="file_upload_target_1">
 +                                      <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
 +                                      <input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
 +                                      <input type="hidden" name="dir" value="<?php echo htmlentities($_['dir']) ?>" id="dir">
 +                                      <button class="file_upload_filename">&nbsp;<img class='svg action' alt="Upload" src="<?php echo image_path("core", "actions/upload.svg"); ?>" /></button>
 +                                      <input class="file_upload_start" type="file" name='files[]'/>
 +                                              <a href="#" class="file_upload_button_wrapper" onclick="return false;" title="<?php echo $l->t('Upload'); echo  ' max. '.$_['uploadMaxHumanFilesize'] ?>"></a>
 +                                      <iframe name="file_upload_target_1" class='file_upload_target' src=""></iframe>
 +                              </form>
 +                      </div>
++                                      <div id="upload">
++                                              <div id="uploadprogressbar"></div>
++                                              <input type="button" class="stop" style="display:none" value="<?php echo $l->t('Cancel upload');?>" onclick="javascript:Files.cancelUploads();" />
++                                      </div>
++
 +              </div>
 +              <div id="file_action_panel"></div>
 +      <?php else:?>
 +              <input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
 +      <?php endif;?>
 +</div>
 +<div id='notification'></div>
 +
 +<?php if (isset($_['files']) and ! $_['readonly'] and count($_['files'])==0):?>
 +      <div id="emptyfolder"><?php echo $l->t('Nothing in here. Upload something!')?></div>
 +<?php endif; ?>
 +
 +<table>
 +      <thead>
 +              <tr>
 +                      <th id='headerName'>
 +                              <?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" id="select_all" /><?php } ?>
 +                              <span class='name'><?php echo $l->t( 'Name' ); ?></span>
 +                              <span class='selectedActions'>
 +                                      <a href="" class="share"><img class='svg' alt="Share" src="<?php echo image_path("core", "actions/share.svg"); ?>" /> <?php echo $l->t('Share')?></a>
 +                                      <?php if($_['allowZipDownload']) : ?>
 +                                              <a href="" class="download"><img class='svg' alt="Download" src="<?php echo image_path("core", "actions/download.svg"); ?>" /> <?php echo $l->t('Download')?></a>
 +                                      <?php endif; ?>
 +                              </span>
 +                      </th>
 +                      <th id="headerSize"><?php echo $l->t( 'Size' ); ?></th>
 +                      <th id="headerDate"><span id="modified"><?php echo $l->t( 'Modified' ); ?></span><span class="selectedActions"><a href="" class="delete"><?php echo $l->t('Delete all')?> <img class="svg" alt="<?php echo $l->t('Delete')?>" src="<?php echo image_path("core", "actions/delete.svg"); ?>" /></a></span></th>
 +              </tr>
 +      </thead>
 +      <tbody id="fileList" data-readonly="<?php echo $_['readonly'];?>">
 +              <?php echo($_['fileList']); ?>
 +      </tbody>
 +</table>
 +<div id="editor"></div>
 +<div id="uploadsize-message" title="<?php echo $l->t('Upload too large')?>">
 +      <p>
 +              <?php echo $l->t('The files you are trying to upload exceed the maximum size for file uploads on this server.');?>
 +      </p>
 +</div>
 +<div id="scanning-message">
 +      <h3>
 +              <?php echo $l->t('Files are being scanned, please wait.');?> <span id='scan-count'></span>
 +      </h3>
 +      <p>
 +              <?php echo $l->t('Current scanning');?> <span id='scan-current'></span>
 +      </p>
 +</div>
 +
 +<!-- config hints for javascript -->
 +<input type="hidden" name="allowZipDownload" id="allowZipDownload" value="<?php echo $_['allowZipDownload']; ?>" />
index 5a5941fc7ae8f13ec6843c10407a331e64e71913,0000000000000000000000000000000000000000..b2db4cbb8df00127ae7d5e6236500705a6af7e40
mode 100644,000000..100644
--- /dev/null
@@@ -1,29 -1,0 +1,33 @@@
 +              <?php foreach($_['files'] as $file):
 +                      $write = ($file['writable']) ? 'true' : 'false';
 +                      $simple_file_size = simple_file_size($file['size']);
 +                      $simple_size_color = intval(200-$file['size']/(1024*1024)*2); // the bigger the file, the darker the shade of grey; megabytes*2
 +                      if($simple_size_color<0) $simple_size_color = 0;
 +                      $relative_modified_date = relative_modified_date($file['mtime']);
 +                      $relative_date_color = round((time()-$file['mtime'])/60/60/24*14); // the older the file, the brighter the shade of grey; days*14
 +                      if($relative_date_color>200) $relative_date_color = 200;
 +                      $name = str_replace('+','%20',urlencode($file['name']));
 +                      $name = str_replace('%2F','/', $name);
 +                      $directory = str_replace('+','%20',urlencode($file['directory']));
 +                      $directory = str_replace('%2F','/', $directory); ?>
 +                      <tr data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>' data-write='<?php echo $write;?>'>
 +                              <td class="filename svg" style="background-image:url(<?php if($file['type'] == 'dir') echo mimetype_icon('dir'); else echo mimetype_icon($file['mimetype']); ?>)">
 +                                      <?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" /><?php } ?>
 +                                      <a class="name" href="<?php if($file['type'] == 'dir') echo $_['baseURL'].$directory.'/'.$name; else echo $_['downloadURL'].$directory.'/'.$name; ?>" title="">
 +                                      <span class="nametext">
 +                                              <?php if($file['type'] == 'dir'):?>
 +                                                      <?php echo htmlspecialchars($file['name']);?>
 +                                              <?php else:?>
 +                                                      <?php echo htmlspecialchars($file['basename']);?><span class='extension'><?php echo $file['extension'];?></span>
 +                                              <?php endif;?>
 +                                      </span>
++                                      <?php if($file['type'] == 'dir'):?>
++                                              <span class="uploadtext" currentUploads="0">
++                                              </span>
++                                      <?php endif;?>
 +                                      </a>
 +                              </td>
 +                              <td class="filesize" title="<?php echo human_file_size($file['size']); ?>" style="color:rgb(<?php echo $simple_size_color.','.$simple_size_color.','.$simple_size_color ?>)"><?php echo $simple_file_size; ?></td>
 +                              <td class="date"><span class="modified" title="<?php echo $file['date']; ?>" style="color:rgb(<?php echo $relative_date_color.','.$relative_date_color.','.$relative_date_color ?>)"><?php echo $relative_modified_date; ?></span></td>
 +                      </tr>
 +              <?php endforeach; ?>
diff --cc lib/base.php
index 74693641f6e786e059cc97721810c9217e33f01c,5c42000b9e10476e32b877f7ec570e6981e0dd66..fa4c9850a3b1c4e70973e17beee56f24439b2ce3
@@@ -412,26 -374,6 +412,26 @@@ class OC
  
                //make sure temporary files are cleaned up
                register_shutdown_function(array('OC_Helper','cleanTmp'));
-                               //header('HTTP/1.0 404 Not Found');
 +              
 +              self::$REQUESTEDAPP = (isset($_GET['app'])?strip_tags($_GET['app']):'files');
 +              self::$REQUESTEDFILE = (isset($_GET['getfile'])?$_GET['getfile']:null);
 +              if(substr_count(self::$REQUESTEDFILE, '?') != 0){
 +                      $file = substr(self::$REQUESTEDFILE, 0, strpos(self::$REQUESTEDFILE, '?'));
 +                      $param = substr(self::$REQUESTEDFILE, strpos(self::$REQUESTEDFILE, '?') + 1);
 +                      parse_str($param, $get);
 +                      $_GET = array_merge($_GET, $get);
 +                      self::$REQUESTEDFILE = $file;
 +                      $_GET['getfile'] = $file;
 +              }
 +              if(!is_null(self::$REQUESTEDFILE)){
 +                      $subdir = OC::$APPSROOT . '/' . self::$REQUESTEDAPP . '/' . self::$REQUESTEDFILE;
 +                      $parent = OC::$APPSROOT . '/' . self::$REQUESTEDAPP;
 +                      if(!OC_Helper::issubdirectory($subdir, $parent)){
 +                              self::$REQUESTEDFILE = null;
++                              header('HTTP/1.0 404 Not Found');
 +                              exit;
 +                      }
 +              }
        }
  }
  
diff --cc lib/helper.php
index 1d9862bf8b1086173a7764b653a0e223f4a8ae08,beb10280d935996781631c687950046a9dc06515..c5af76dbe525b5007ac663f87ed74fb55e68bbd1
@@@ -551,32 -543,4 +551,40 @@@ class OC_Helper 
  
          return $newpath;
      }
-                       if(substr($sub, 0, strlen($parent)) == $parent){
 +      
 +      /*
 +       * checks if $sub is a subdirectory of $parent
 +       * 
 +       * @param $sub 
 +       * @param $parent
 +       * @return bool
 +       */
 +      public static function issubdirectory($sub, $parent){
 +              if($sub == null || $sub == '' || $parent == null || $parent == ''){
 +                      return false;
 +              }
 +              $realpath_sub = realpath($sub);
 +              $realpath_parent = realpath($parent);
 +              if(($realpath_sub == false && substr_count($realpath_sub, './') != 0) || ($realpath_parent == false && substr_count($realpath_parent, './') != 0)){ //it checks for  both ./ and ../
 +                      return false;
 +              }
 +              if($realpath_sub && $realpath_sub != '' && $realpath_parent && $realpath_parent != ''){
-                       if(substr($realpath_sub, 0, strlen($realpath_parent)) == $realpath_parent){
++                      if(substr($realpath_sub, 0, strlen($realpath_parent)) == $realpath_parent){
 +                              return true;
 +                      }
 +              }else{
++                      if(substr($sub, 0, strlen($parent)) == $parent){
 +                              return true;
 +                      }
 +              }
++              /*
++              echo 'SUB: ' . $sub . "\n";
++              echo 'PAR: ' . $parent . "\n";
++              echo 'REALSUB: ' . $realpath_sub . "\n";
++              echo 'REALPAR: ' . $realpath_parent . "\n";
++              echo substr($realpath_sub, 0, strlen($realpath_parent));
++              exit;
++              */
 +              return false;
 +      }
  }