.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; }
-
--- /dev/null
- 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();
--- /dev/null
- 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 }
--- /dev/null
+<?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();
+
+?>
--- /dev/null
- 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');
--- /dev/null
+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);
+ });
+});
--- /dev/null
- $('.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;
+}
--- /dev/null
+<!--[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"> <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']; ?>" />
--- /dev/null
+ <?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; ?>
//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;
+ }
+ }
}
}
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;
+ }
}