diff --git a/filemanager/inc/class.uifilemanager.inc.php b/filemanager/inc/class.uifilemanager.inc.php
new file mode 100755
index 0000000000..575d723bdc
--- /dev/null
+++ b/filemanager/inc/class.uifilemanager.inc.php
@@ -0,0 +1,2076 @@
+ True,
+ 'help' => True,
+ 'view' => True,
+ 'history' => True,
+ 'edit' => True,
+ 'download'=>True
+ );
+
+ //keep
+ var $bo;
+ var $t; //template object
+ var $dispath;
+ var $cwd;
+ var $lesspath;
+ var $readable_groups;
+ var $files_array;
+ var $numoffiles;
+ var $dispsep;
+
+ var $target;
+
+ var $prefs;//array
+
+ var $groups_applications;
+
+ //originally post_vars
+ // var $goto;
+ var $goto_x;
+ var $download_x;
+ var $todir;
+ var $changedir; // for switching dir.
+ var $cdtodir; // for switching dir.
+// var $createdir;
+ var $newfile_or_dir;
+ var $newdir_x;
+ var $newfile_x;
+ var $createfile_var;
+ var $delete_x;
+ var $renamefiles;
+ var $rename_x;
+ var $move_to_x;
+ // var $copy_to;
+ var $copy_to_x;
+ var $edit_x;
+ var $edit_comments_x;
+ var $edit_file;
+ var $edit_preview_x;
+ var $edit_save_x;
+ var $edit_save_done_x;
+ var $edit_cancel_x;
+ var $comment_files;
+ var $upload_x;
+ var $uploadprocess;
+
+ // this ones must be checked thorougly;
+ var $fileman = Array();
+ //var $fileman;
+ var $path;
+ var $file; // FIXME WHERE IS THIS FILLED?
+ var $sortby;
+ var $messages = array();
+ var $show_upload_boxes;
+
+ var $debug = false;
+ var $now;
+
+ function uifilemanager()
+ {
+ // error_reporting(8);
+ $GLOBALS['egw']->browser =& CreateObject('phpgwapi.browser');
+
+ $this->dateformat=$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'];
+
+ $this->now = date('Y-m-d');
+
+ $this->bo =& CreateObject('filemanager.bofilemanager');
+
+ $this->t = $GLOBALS['egw']->template;
+
+ // here local vars are created from the HTTP vars
+ @reset($_POST);
+ while(list($name,) = @each($_POST))
+ {
+ $this->$name = $_POST[$name];
+ }
+
+ @reset($_GET);
+ while(list($name,) = @each($_GET))
+ {
+ $$name = $_GET[$name];
+ }
+
+ $to_decode = array
+ (
+ /*
+ Decode
+ 'var' when 'avar' == 'value'
+ or
+ 'var' when 'var' is set
+ */
+ 'op' => array('op' => ''),
+ 'path' => array('path' => ''),
+ 'file' => array('file' => ''),
+ 'sortby' => array('sortby' => ''),
+ // 'fileman' => array('fileman' => ''),
+ 'messages' => array('messages' => ''),
+ // 'help_name' => array('help_name' => ''),
+ // 'renamefiles' => array('renamefiles' => ''),
+ 'comment_files' => array('comment_files' => ''),
+ 'show_upload_boxes' => array('show_upload_boxes' => '')
+ );
+
+ reset($to_decode);
+ while(list($var, $conditions) = each($to_decode))
+ {
+ while(list($condvar, $condvalue) = each($conditions))
+ {
+ if(isset($$condvar) && ($condvar == $var || $$condvar == $condvalue))
+ {
+ if(is_array($$var))
+ {
+ $temp = array();
+ while(list($varkey, $varvalue) = each($$var))
+ {
+ if(is_int($varkey))
+ {
+ $temp[$varkey] = stripslashes(base64_decode(urldecode(($varvalue))));
+ }
+ else
+ {
+ $temp[stripslashes(base64_decode(urldecode(($varkey))))] = $varvalue;
+ }
+ }
+ $this->$var = $temp;
+ }
+ elseif(isset($$var))
+ {
+ $this->$var = stripslashes(base64_decode(urldecode($$var)));
+ }
+ }
+ }
+ }
+
+ // get appl. and user prefs
+ $pref =& CreateObject('phpgwapi.preferences', $this->bo->userinfo['username']);
+ $pref->read_repository();
+ // $GLOBALS['egw']->hooks->single('add_def_pref', $GLOBALS['appname']);
+ $pref->save_repository(True);
+ $pref_array = $pref->read_repository();
+ $this->prefs = $pref_array[$this->bo->appname]; //FIXME check appname var in _debug_array
+
+ //always show name
+
+ $this->prefs['name'] = 1;
+
+ if($this->prefs['viewinnewwin'])
+ {
+ $this->target = '_blank';
+ }
+
+ /*
+ Check for essential directories
+ admin must be able to disable these tests
+ */
+
+ // check if basedir exist
+ $test=$this->bo->vfs->get_real_info(array('string' => $this->bo->basedir, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+ if($test['mime_type'] != 'Directory')
+ {
+ die('Base directory does not exist, Ask adminstrator to check the global configuration.');
+ }
+
+ $test=$this->bo->vfs->get_real_info(array('string' => $this->bo->basedir.$this->bo->fakebase, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+ if($test['mime_type'] != 'Directory')
+ {
+ $this->bo->vfs->override_acl = 1;
+
+ $this->bo->vfs->mkdir(array(
+ 'string' => $this->bo->fakebase,
+ 'relatives' => array(RELATIVE_NONE)
+ ));
+
+ $this->bo->vfs->override_acl = 0;
+
+ //test one more time
+ $test=$this->bo->vfs->get_real_info(array('string' => $this->bo->basedir.$this->bo->fakebase, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+
+ if($test['mime_type']!='Directory')
+ {
+ die('Fake Base directory does not exist and could not be created, please ask the administrator to check the global configuration.');
+ }
+ else
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(
+ lang('Fake Base Dir did not exist, eGroupWare created a new one.')
+ ));
+ }
+ }
+
+// die($this->bo->homedir);
+ $test=$this->bo->vfs->get_real_info(array('string' => $this->bo->basedir.$this->bo->homedir, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+ if($test['mime_type'] != 'Directory')
+ {
+ $this->bo->vfs->override_acl = 1;
+
+ $this->bo->vfs->mkdir(array(
+ 'string' => $this->bo->homedir,
+ 'relatives' => array(RELATIVE_NONE)
+ ));
+
+ $this->bo->vfs->override_acl = 0;
+
+ //test one more time
+ $test=$this->bo->vfs->get_real_info(array('string' => $this->bo->basedir.$this->bo->homedir, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+
+ if($test['mime_type'] != 'Directory')
+ {
+ die('Your Home Dir does not exist and could not be created, please ask the adminstrator to check the global configuration.');
+ }
+ else
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(
+ lang('Your Home Dir did not exist, eGroupWare created a new one.')
+ ));
+ // FIXME we just created a fresh home dir so we know there nothing in it so we have to remove all existing content
+ }
+ }
+ }
+
+ function index()
+ {
+ if($noheader || $nofooter || ($this->download_x && (count($this->fileman) > 0)))
+ {
+ $noheader = True;
+ $nofooter = True;
+ $noappheader= True;
+ $nonavbar= True;
+ }
+ else
+ {
+ $GLOBALS['egw_info']['flags'] = array
+ (
+ 'currentapp' => 'filemanager',
+ 'noheader' => $noheader,
+ 'nonavbar' => $nonavbar,
+ 'nofooter' => $nofooter,
+ 'noappheader' => $noappheader,
+ 'enable_browser_class' => True
+ );
+
+ $GLOBALS['egw']->common->egw_header();
+ }
+
+ # Page to process users
+ # Code is fairly hackish at the beginning, but it gets better
+ # Highly suggest turning wrapping off due to long SQL queries
+
+ ###
+ # Some hacks to set and display directory paths correctly
+ ###
+/*
+ if($this->goto || $this->goto_x)
+ {
+ $this->path = $this->cdtodir;
+ }
+*/
+ // new method for switching to a new dir.
+ if($this->changedir=='true' && $this->cdtodir || $this->goto_x)
+ {
+ $this->path = $this->cdtodir;
+ }
+
+ if(!$this->path)
+ {
+ $this->path = $this->bo->vfs->pwd();
+
+ if(!$this->path || $this->bo->vfs->pwd(array('full' => False)) == '')
+ {
+ $this->path = $this->bo->homedir;
+ }
+ }
+
+ $this->bo->vfs->cd(array('string' => False, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+ $this->bo->vfs->cd(array('string' => $this->path, 'relatives' => array(RELATIVE_NONE), 'relative' => False));
+
+ $pwd = $this->bo->vfs->pwd();
+
+ if(!$this->cwd = substr($this->path, strlen($this->bo->homedir) + 1))
+ {
+ $this->cwd = '/';
+ }
+ else
+ {
+ $this->cwd = substr($pwd, strrpos($pwd, '/') + 1);
+ }
+
+ $this->disppath = $this->path;
+
+ /* This just prevents // in some cases */
+ if($this->path == '/')
+ {
+ $this->dispsep = '';
+ }
+ else
+ {
+ $this->dispsep = '/';
+ }
+
+ if(!($this->lesspath = substr($this->path, 0, strrpos($this->path, '/'))))
+ {
+ $this->lesspath = '/';
+ }
+
+ # Get their readable groups to be used throughout the script
+ $groups = array();
+
+ $groups = $GLOBALS['egw']->accounts->get_list('groups');
+
+ $this->readable_groups = array();
+
+ while(list($num, $account) = each($groups))
+ {
+ if($this->bo->vfs->acl_check(array('owner_id' => $account['account_id'],'operation' => EGW_ACL_READ)))
+ {
+ $this->readable_groups[$account['account_lid']] = Array('account_id' => $account['account_id'], 'account_name' => $account['account_lid']);
+ }
+ }
+
+ $this->groups_applications = array();
+
+ while(list($num, $group_array) = each($this->readable_groups))
+ {
+ $group_id = $GLOBALS['egw']->accounts->name2id($group_array['account_name']);
+
+ $applications =& CreateObject('phpgwapi.applications', $group_id);
+ $this->groups_applications[$group_array['account_name']] = $applications->read_account_specific();
+ }
+
+ # We determine if they're in their home directory or a group's directory,
+ # and set the VFS working_id appropriately
+ if((preg_match('+^'.$this->bo->fakebase.'\/(.*)(\/|$)+U', $this->path, $matches)) && $matches[1] != $this->bo->userinfo['account_lid']) //FIXME matches not defined
+ {
+ $this->bo->vfs->working_id = $GLOBALS['egw']->accounts->name2id($matches[1]);//FIXME matches not defined
+ }
+ else
+ {
+ $this->bo->vfs->working_id = $this->bo->userinfo['username'];
+ }
+
+ # FIXME # comment waht happens here
+ if($this->path != $this->bo->homedir && $this->path != $this->bo->fakebase && $this->path != '/' && !$this->bo->vfs->acl_check(array('string' => $this->path, 'relatives' => array(RELATIVE_NONE),'operation' => EGW_ACL_READ)))
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(lang('You do not have access to %1', $this->path)));
+ $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->homedir, lang('Go to your home directory'));
+
+ $GLOBALS['egw']->common->egw_footer();
+ $GLOBALS['egw']->common->egw_exit();
+ }
+
+ $this->bo->userinfo['working_id'] = $this->bo->vfs->working_id;
+ $this->bo->userinfo['working_lid'] = $GLOBALS['egw']->accounts->id2name($this->bo->userinfo['working_id']);
+
+ # If their home directory doesn't exist, we try to create it
+ # Same for group directories
+
+
+ // Moved to constructor
+ /*
+ if(($this->path == $this->homedir) && !$this->bo->vfs->file_exists($pim_tmp_arr))
+ {
+ $this->bo->vfs->override_acl = 1;
+
+ if(!$this->bo->vfs->mkdir(array(
+ 'string' => $this->bo->homedir,
+ 'relatives' => array(RELATIVE_NONE)
+ )))
+ {
+ $p = $this->bo->vfs->path_parts($pim_tmp_arr);
+
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(
+ lang('Could not create directory %1',
+ $this->bo->homedir . ' (' . $p->real_full_path . ')'
+ )));
+ }
+
+ $this->bo->vfs->override_acl = 0;
+ }
+ */
+
+ # Verify path is real
+ if($this->path != $this->bo->homedir && $this->path != '/' && $this->path != $this->bo->fakebase)
+ {
+ if(!$this->bo->vfs->file_exists(array(
+ 'string' => $this->path,
+ 'relatives' => array(RELATIVE_NONE)
+ )))
+ {
+ $this->messages[] = $GLOBALS['egw']->common->error_list(array(lang('Directory %1 does not exist', $this->path)));
+ $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->bo->homedir, lang('Go to your home directory'));
+
+ $GLOBALS['egw']->common->egw_footer();
+ $GLOBALS['egw']->common->egw_exit();
+ }
+ }
+
+ /* Update if they request it, or one out of 20 page loads */
+ srand((double) microtime() * 1000000);
+ if($_GET['update'] || rand(0, 19) == 4)
+ {
+ $this->bo->vfs->update_real(array(
+ 'string' => $this->path,
+ 'relatives' => array(RELATIVE_NONE)
+ ));
+ }
+
+ # Check available permissions for $this->path, so we can disable unusable operations in user interface
+ if($this->bo->vfs->acl_check(array(
+ 'string' => $this->path,
+ 'relatives' => array(RELATIVE_NONE),
+ 'operation' => EGW_ACL_ADD
+ )))
+ {
+ $this->can_add = True;
+ }
+
+ # Default is to sort by name
+ if(!$this->sortby)
+ {
+ $this->sortby = 'name';
+ }
+
+ if($this->debug)
+ {
+ $this->debug_filemanager();
+ }
+
+ # main action switch
+ // FIXME this will become a switch
+ if($this->newfile_x && $this->newfile_or_dir) // create new textfile
+ {
+ $this->createfile();
+ }
+ elseif($this->newfile_or_dir && $this->newdir_x)
+ {
+ $this->createdir();
+ }
+ elseif($this->uploadprocess)
+ {
+ $this->fileUpload();
+ }
+ elseif($this->upload_x || $this->show_upload_boxes)
+ {
+ $this->showUploadboxes();
+ }
+ elseif($this->copy_to_x)
+ {
+ $this->copyTo();
+ }
+ elseif($this->move_to_x)
+ {
+ $this->moveTo();
+ }
+ elseif($this->download_x)
+ {
+ $this->download();
+ }
+ elseif($this->renamefiles)
+ {
+ $this->rename();
+ }
+ elseif($this->comment_files)
+ {
+ $this->editComment();
+ }
+ elseif($this->edit_cancel_x)
+ {
+ $this->readFilesInfo();
+ $this->fileListing();
+ }
+ elseif($this->edit_x || $this->edit_preview_x || $this->edit_save_x || $this->edit_save_done_x)
+ {
+ $this->edit();
+ }
+ elseif($this->delete_x)
+ {
+ $this->delete();
+ }
+ else
+ {
+ $this->readFilesInfo();
+ $this->fileListing();
+ }
+ }
+
+ function fileListing()
+ {
+ $this->t->set_file(array('filemanager_list_t' => 'filelisting.tpl'));
+ $this->t->set_block('filemanager_list_t','filemanager_header','filemanager_header');
+ $this->t->set_block('filemanager_list_t','column','column');
+ $this->t->set_block('filemanager_list_t','row','row');
+ $this->t->set_block('filemanager_list_t','filemanager_footer','filemanager_footer');
+
+ $vars['form_action']=$this->encode_href('/index.php', 'menuaction=filemanager.uifilemanager.index','path='.$this->path);
+ if($this->numoffiles || $this->cwd)
+ {
+ while(list($num, $name) = each($this->prefs))
+ {
+ if($name)
+ {
+ $columns++;
+ }
+ }
+ $columns++;
+
+ $vars['toolbar0'] = $this->toolbar('location');
+ $vars['toolbar1'] = $this->toolbar('list_nav');
+
+ if(count($this->messages)>0)
+ {
+ foreach($this->messages as $msg)
+ {
+ $messages.='
'.$msg.'
';
+ }
+ }
+
+ $vars['messages'] = $messages;
+
+ $this->t->set_var($vars);
+ $this->t->pparse('out','filemanager_header');
+
+ ###
+ # Start File Table Column Headers
+ # Reads values from $file_attributes array and preferences
+ ###
+ $this->t->set_var('actions',lang('select'));
+
+ reset($this->bo->file_attributes);
+
+ if($this->numoffiles>0)
+ {
+ while(list($internal, $displayed) = each($this->bo->file_attributes))
+ {
+ if($this->prefs[$internal])
+ {
+ $col_data=''.$displayed.' ';
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+ }
+
+ $this->t->set_var('row_tr_color','#dedede');
+
+ //kan dit weg?
+ $this->t->parse('rows','row');
+
+ $this->t->pparse('out','row');
+ }
+ else
+ {
+ $lang_nofiles=lang('No files in this directory.');
+ }
+ $vars['lang_no_files'] = $lang_nofiles;
+
+ if($this->prefs['dotdot'] && $this->prefs['name'] && $this->path != '/')
+ {
+ $this->t->set_var('actions','');
+
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->lesspath);
+
+ $col_data=' ';
+ $col_data.=' .. ';
+
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column');
+
+ if($this->prefs['mime_type'])
+ {
+ $col_data=lang('Directory');
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ $this->t->set_var('row_tr_color',$tr_color);
+ $this->t->parse('rows','row');
+ $this->t->pparse('out','row');
+ }
+
+ # List all of the files, with their attributes
+ @reset($this->files_array);
+ for($i = 0; $i != $this->numoffiles; $i++)
+ {
+ $files = $this->files_array[$i];
+
+ if($this->rename_x || $this->edit_comments_x)
+ {
+ unset($this_selected);
+ unset($renamethis);
+ unset($edit_this_comment);
+
+ for($j = 0; $j != $this->numoffiles; $j++)
+ {
+ if($this->fileman[$j] == $files['name'])
+ {
+ $this_selected = 1;
+ break;
+ }
+ }
+
+ if($this->rename_x && $this_selected)
+ {
+ $renamethis = 1;
+ }
+ elseif($this->edit_comments_x && $this_selected)
+ {
+ $edit_this_comment = 1;
+ }
+ }
+
+ if(!$this->prefs['dotfiles'] && ereg("^\.", $files['name']))
+ {
+ continue;
+ }
+
+ # Checkboxes
+ if(!$this->rename_x && !$this->edit_comments_x && $this->path != $this->bo->fakebase && $this->path != '/')
+ {
+ $cbox=' ';
+ $this->t->set_var('actions',$cbox);
+ }
+ elseif($renamethis)
+ {
+ $cbox=$this->html_form_input('hidden', 'fileman[' . base64_encode($files['name']) . ']', $files['name'], NULL, NULL, 'checked');
+ $this->t->set_var('actions',$cbox);
+ }
+ else
+ {
+ $this->t->set_var('actions','');
+ }
+
+ # File name and icon
+ if($renamethis)
+ {
+ $col_data=$this->mime_icon($files['mime_type']);
+ $col_data.=' ';
+ }
+ else
+ {
+ if($files['mime_type'] == 'Directory')
+ {
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->path.$this->dispsep.$files['name']);
+
+ $icon=$this->mime_icon($files['mime_type']);
+
+ $col_data=''.$icon.' ';
+ $col_data.=''.$files['name'].' ';
+ }
+ else
+ {
+
+ if($this->prefs['viewonserver'] && isset($this->bo->filesdir) && !$files['link_directory'])
+ {
+ #FIXME
+ $clickview = $this->filesdir.$pwd.'/'.$files['name'];
+
+ if($phpwh_debug)
+ {
+ echo 'Setting clickview = '.$clickview.' '."\n";
+ $this->html_link($clickview,'', '',$files['name'], 0, 1, 0, '');
+ }
+ }
+ else
+ {
+ $icon=$this->mime_icon($files['mime_type']);
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.view','file='.$files['name'].'&path='.$this->path);
+
+ $col_data=''.$icon.' '.$files['name'].' ';
+ }
+ }
+ }
+
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column');
+
+ # MIME type
+ if($this->prefs['mime_type'])
+ {
+ $col_data=$files['mime_type'];
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # File size
+ if($this->prefs['size'])
+ {
+ $tmp_arr=array(
+ 'string' => $files['directory'] . '/' . $files['name'],
+ 'relatives' => array(RELATIVE_NONE)
+ );
+ if($files['mime_type'] != 'Directory') $tmp_arr['checksubdirs'] = false;
+
+ $size = $this->bo->vfs->get_size($tmp_arr);
+
+ $col_data=$this->bo->borkb($size);
+
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Date created
+ if($this->prefs['created'])
+ {
+ $col_data=date($this->dateformat,strtotime($files['created']));
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Date modified
+ if($this->prefs['modified'])
+ {
+ if($files['modified'] != '0000-00-00')
+ {
+ $col_data=date($this->dateformat,strtotime($files['modified']));
+ }
+ else
+ {
+ $col_data='';
+ }
+
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Owner name
+ if($this->prefs['owner'])
+ {
+ $this->t->set_var('col_data',$GLOBALS['egw']->accounts->id2name($files['owner_id']));
+ $this->t->parse('columns','column',True);
+ }
+
+ # Creator name
+ if($this->prefs['createdby_id'])
+ {
+ $this->html_table_col_begin();
+ if($files['createdby_id'])
+ {
+ $col_data=$GLOBALS['egw']->accounts->id2name($files['createdby_id']);
+ }
+ else $col_data='';
+
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Modified by name
+ if($this->prefs['modifiedby_id'])
+ {
+ if($files['modifiedby_id'])
+ {
+ $col_data=$GLOBALS['egw']->accounts->id2name($files['modifiedby_id']);
+ }
+ else $col_data='';
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Application
+ if($this->prefs['app'])
+ {
+ $col_data=$files['app'];
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Comment
+ if($this->prefs['comment'])
+ {
+ if($edit_this_comment)
+ {
+ $col_data=' ';
+ }
+ else
+ {
+ $col_data=$files['comment'];
+ }
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ # Version
+ if($this->prefs['version'])
+ {
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.history','file='.$files['name'].'&path='.$this->path);
+ $col_data=''.$files['version'].' ';
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column',True);
+ }
+
+ if($files['mime_type'] == 'Directory')
+ {
+ $usedspace += $fileinfo[0];
+ }
+ else
+ {
+ $usedspace += $files['size'];
+ }
+
+ $this->t->set_var('row_tr_color','');
+ $this->t->parse('rows','row');
+ $this->t->pparse('out','row');
+ }
+
+ // when renaming or changing comments render extra sumbmit button
+ if($this->rename_x || $this->edit_comments_x)
+ {
+ $col_data=' ';
+ $this->t->set_var('col_data',$col_data);
+ $this->t->parse('columns','column');
+ $this->t->set_var('row_tr_color','');
+ $this->t->parse('rows','row');
+ $this->t->pparse('out','row');
+ }
+ }
+
+ // The file and directory information
+ $vars['lang_files_in_this_dir'] = lang('Files in this directory');
+ $vars['files_in_this_dir'] = $this->numoffiles;
+
+ $vars['lang_used_space'] = lang('Used space');
+ $vars['used_space'] = $this->bo->borkb($usedspace, NULL, 1);
+
+ if($this->path == $this->bo->homedir || $this->path == $this->bo->fakebase)
+ {
+ $vars['lang_unused_space'] = lang('Unused space');
+ $vars['unused_space'] = $this->bo->borkb($this->bo->userinfo['hdspace'] - $usedspace, NULL, 1);
+
+ $tmp_arr=array(
+ 'string' => $this->path,
+ 'relatives' => array(RELATIVE_NONE)
+ );
+
+ $ls_array = $this->bo->vfs->ls($tmp_arr);
+
+ $vars['lang_total_files'] = lang('Total Files');
+ $vars['total_files'] = count($ls_array);
+ }
+
+ $this->t->set_var($vars);
+ $this->t->pparse('out','filemanager_footer');
+
+ $GLOBALS['egw']->common->egw_footer();
+ $GLOBALS['egw']->common->egw_exit();
+ }
+
+ function readFilesInfo()
+ {
+ // start files info
+
+ # Read in file info from database to use in the rest of the script
+ # $fakebase is a special directory. In that directory, we list the user's
+ # home directory and the directories for the groups they're in
+ $this->numoffiles = 0;
+ if($this->path == $this->bo->fakebase)
+ {
+ // FIXME this test can be removed
+ if(!$this->bo->vfs->file_exists(array('string' => $this->bo->homedir, 'relatives' => array(RELATIVE_NONE))))
+ {
+ $this->bo->vfs->mkdir(array('string' => $this->bo->homedir, 'relatives' => array(RELATIVE_NONE)));
+ }
+
+ $ls_array = $this->bo->vfs->ls(array(
+ 'string' => $this->bo->homedir,
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => False,
+ 'nofiles' => True
+ ));
+ $this->files_array[] = $ls_array[0];
+ $this->numoffiles++;
+
+ reset($this->readable_groups);
+ while(list($num, $group_array) = each($this->readable_groups))
+ {
+ # If the group doesn't have access to this app, we don't show it
+ if(!$this->groups_applications[$group_array['account_name']][$this->bo->appname]['enabled'])
+ {
+ continue;
+ }
+
+ if(!$this->bo->vfs->file_exists(array('string' => $this->bo->fakebase.'/'.$group_array['account_name'],'relatives' => array(RELATIVE_NONE))))
+ {
+ $this->bo->vfs->override_acl = 1;
+ $this->bo->vfs->mkdir(array(
+ 'string' => $this->bo->fakebase.'/'.$group_array['account_name'],
+ 'relatives' => array(RELATIVE_NONE)
+ ));
+
+ // FIXME we just created a fresh group dir so we know there nothing in it so we have to remove all existing content
+
+ $this->bo->vfs->override_acl = 0;
+
+ $this->bo->vfs->set_attributes(array('string' => $this->bo->fakebase.'/'.$group_array['account_name'],'relatives' => array(RELATIVE_NONE),'attributes' => array('owner_id' => $group_array['account_id'],'createdby_id' => $group_array['account_id'])));
+ }
+
+ $ls_array = $this->bo->vfs->ls(array('string' => $this->bo->fakebase.'/'.$group_array['account_name'],'relatives' => array(RELATIVE_NONE),'checksubdirs' => False,'nofiles' => True));
+
+ $this->files_array[] = $ls_array[0];
+
+ $this->numoffiles++;
+ }
+ }
+ else
+ {
+ $ls_array = $this->bo->vfs->ls(array(
+ 'string' => $this->path,
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => False,
+ 'nofiles' => False,
+ 'orderby' => $this->sortby
+ ));
+
+ if($phpwh_debug)
+ {
+ echo '# of files found in "'.$this->path.'" : '.count($ls_array).' '."\n";
+ }
+
+ while(list($num, $file_array) = each($ls_array))
+ {
+ $this->numoffiles++;
+ $this->files_array[] = $file_array;
+ if($phpwh_debug)
+ {
+ echo 'Filename: '.$file_array['name'].' '."\n";
+ }
+ }
+ }
+
+ if(!is_array($this->files_array))
+ {
+ $this->files_array = array();
+ }
+ // end file count
+ }
+
+ function toolbar($type)
+ {
+ switch($type)
+ {
+ case 'location':
+ $toolbar='
+
+
+
+ ';
+ $toolbar.=' ';
+ $toolbar.='
+ ';
+
+ // go up icon when we're not at the top, dont allow to go outside /home = fakebase
+ if($this->path != '/' && $this->path != $this->bo->fakebase)
+ {
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->lesspath);
+ $toolbar.=$this->buttonImage($link,'up',lang('go up'));
+ }
+
+ // go home icon when we're not home already
+ if($this->path != $this->bo->homedir)
+ {
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->bo->homedir);
+ $toolbar.=$this->buttonImage($link,'home',lang('go home'));
+ }
+
+ // reload button with this url
+ $link=$this->encode_href('/index.php','menuaction=filemanager.uifilemanager.index&update=1','path='.$this->path);
+ $toolbar.=$this->buttonImage($link,'reload',lang('reload'));
+
+ $toolbar.=''.lang('Location').': ';
+ //$toolbar.=' ';
+ $current_option=''.$this->disppath.' ';
+ // selectbox for change/move/and copy to
+ $dirs_options=$this->all_other_directories_options();
+ $toolbar.=''.$current_option.$dirs_options.'
+
+ ';
+ $toolbar.=$this->inputImage('goto','goto',lang('Quick jump to'));
+ // upload button
+ if($this->path != '/' && $this->path != $this->bo->fakebase && $this->can_add)
+ {
+
+ $toolbar.=' ';
+ $toolbar.=' ';
+ $toolbar.=' ';
+
+ // $toolbar.=$this->inputImage('download','download',lang('Download'));
+ // upload button
+ $toolbar.=$this->inputImage('upload','upload',lang('Upload'));
+ }
+ $toolbar.='
';
+ $toolbar.='
';
+ break;
+ case 'list_nav':
+ $toolbar='
+
+ ';
+ // selectbox for change/move/and copy to
+ // submit buttons for
+ if($this->path != '/' && $this->path != $this->bo->fakebase)
+ {
+ $toolbar.=' ';
+ $toolbar.='
+ ';
+
+ if(!$this->rename_x && !$this->edit_comments_x)
+ {
+ // edit text file button
+ $toolbar.=$this->inputImage('edit','edit',lang('edit'));
+ }
+
+ if(!$this->edit_comments_x)
+ {
+ $toolbar.=$this->inputImage('rename','rename',lang('Rename'));
+ }
+
+ if(!$this->rename_x && !$this->edit_comments_x)
+ {
+ $toolbar.=$this->inputImage('delete','delete',lang('Delete'));
+ }
+
+ if(!$this->rename_x)
+ {
+ $toolbar.=$this->inputImage('edit_comments','edit_comments',lang('Edit comments'));
+ }
+ $toolbar.=' ';
+ }
+
+ // $toolbar.='
';
+ if(!$this->rename_x && !$this->edit_comments_x)
+ {
+ // copy and move buttons
+ if($this->path != '/' && $this->path != $this->bo->fakebase)
+ {
+ $toolbar3.=' ';
+ $toolbar3.=' ';
+
+ $dirs_options=$this->all_other_directories_options();
+ $toolbar3.=''.$dirs_options.' ';
+
+ $toolbar3.=$this->inputImage('copy_to','copy_to',lang('Copy to'));
+ $toolbar3.=$this->inputImage('move_to','move_to',lang('Move to'));
+
+ $toolbar3.=' ';
+
+ }
+
+ // create dir and file button
+ if($this->path != '/' && $this->path != $this->bo->fakebase && $this->can_add)
+ {
+ $toolbar3.=' ';
+ $toolbar3.=' ';
+
+ $toolbar3.=' ';
+ $toolbar3.=$this->inputImage('newdir','createdir',lang('Create Folder'));
+ $toolbar3.=$this->inputImage('newfile','createfile',lang('Create File'));
+ }
+
+ if($toolbar3)
+ {
+ $toolbar.=$toolbar3;
+ /* $toolbar.='
+
+ '.$toolbar3;*/
+ }
+ }
+ $toolbar.='
';
+
+ break;
+ default:$x='';
+ }
+
+ if($toolbar)
+ {
+ return $toolbar;
+ }
+ }
+
+ // move to bo
+ # Handle File Uploads
+ function fileUpload()
+ {
+ if($this->path != '/' && $this->path != $this->bo->fakebase)
+ {
+ for($i = 0; $i != $this->show_upload_boxes; $i++)
+ {
+ if($badchar = $this->bo->bad_chars($_FILES['upload_file']['name'][$i], True, True))
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array($this->bo->html_encode(lang('File names cannot contain "%1"', $badchar), 1)));
+
+ continue;
+ }
+
+ # Check to see if the file exists in the database, and get its info at the same time
+ $ls_array = $this->bo->vfs->ls(array(
+ 'string'=> $this->path . '/' . $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => False,
+ 'nofiles' => True
+ ));
+
+ $fileinfo = $ls_array[0];
+
+ if($fileinfo['name'])
+ {
+ if($fileinfo['mime_type'] == 'Directory')
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(lang('Cannot replace %1 because it is a directory', $fileinfo['name'])));
+ continue;
+ }
+ }
+
+ if($_FILES['upload_file']['size'][$i] > 0)
+ {
+ if($fileinfo['name'] && $fileinfo['deleteable'] != 'N')
+ {
+ $tmp_arr=array(
+ 'string'=> $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_ALL),
+ 'attributes' => array(
+ 'owner_id' => $this->bo->userinfo['username'],
+ 'modifiedby_id' => $this->bo->userinfo['username'],
+ 'modified' => $this->now,
+ 'size' => $_FILES['upload_file']['size'][$i],
+ 'mime_type' => $_FILES['upload_file']['type'][$i],
+ 'deleteable' => 'Y',
+ 'comment' => stripslashes($_POST['upload_comment'][$i])
+ )
+ );
+ $this->bo->vfs->set_attributes($tmp_arr);
+
+ $tmp_arr=array(
+ 'from' => $_FILES['upload_file']['tmp_name'][$i],
+ 'to' => $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_NONE|VFS_REAL, RELATIVE_ALL)
+ );
+ $this->bo->vfs->cp($tmp_arr);
+
+ $this->messages[]=lang('Replaced %1', $this->disppath.'/'.$_FILES['upload_file']['name'][$i]);
+ }
+ else
+ {
+ $this->bo->vfs->cp(array(
+ 'from'=> $_FILES['upload_file']['tmp_name'][$i],
+ 'to'=> $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_NONE|VFS_REAL, RELATIVE_ALL)
+ ));
+
+ $this->bo->vfs->set_attributes(array(
+ 'string'=> $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_ALL),
+ 'attributes'=> array(
+ 'mime_type' => $_FILES['upload_file']['type'][$i],
+ 'comment' => stripslashes($_POST['upload_comment'][$i])
+ )
+ ));
+
+ $this->messages[]=lang('Created %1,%2', $this->disppath.'/'.$_FILES['upload_file']['name'][$i], $_FILES['upload_file']['size'][$i]);
+ }
+ }
+ elseif($_FILES['upload_file']['name'][$i])
+ {
+ $this->bo->vfs->touch(array(
+ 'string'=> $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_ALL)
+ ));
+
+ $this->bo->vfs->set_attributes(array(
+ 'string'=> $_FILES['upload_file']['name'][$i],
+ 'relatives' => array(RELATIVE_ALL),
+ 'attributes'=> array(
+ 'mime_type' => $_FILES['upload_file']['type'][$i],
+ 'comment' => stripslashes($_POST['upload_comment'][$i])
+ )
+ ));
+
+ $this->messages[]=lang('Created %1,%2', $this->disppath.'/'.$_FILES['upload_file']['name'][$i], $file_size[$i]);
+ }
+ }
+
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+ }
+
+ # Handle Editing comments
+ function editComment()
+ {
+ while(list($file) = each($this->comment_files))
+ {
+ if($badchar = $this->bo->bad_chars($this->comment_files[$file], False, True))
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array($file . $this->bo->html_encode(': ' . lang('Comments cannot contain "%1"', $badchar), 1)));
+ continue;
+ }
+
+ $this->bo->vfs->set_attributes(array(
+ 'string' => $file,
+ 'relatives' => array(RELATIVE_ALL),
+ 'attributes' => array(
+ 'comment' => stripslashes($this->comment_files[$file])
+ )
+ ));
+
+ $this->messages[]=lang('Updated comment for %1', $this->path.'/'.$file);
+ }
+
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+
+ # Handle Renaming Files and Directories
+ function rename()
+ {
+ while(list($from, $to) = each($this->renamefiles))
+ {
+ if($badchar = $this->bo->bad_chars($to, True, True))
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array($this->bo->html_encode(lang('File names cannot contain "%1"', $badchar), 1)));
+ continue;
+ }
+
+ if(ereg("/", $to) || ereg("\\\\", $to))
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang("File names cannot contain \\ or /")));
+ }
+ elseif(!$this->bo->vfs->mv(array(
+ 'from' => $from,
+ 'to' => $to
+ )))
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(lang('Could not rename %1 to %2', $this->disppath.'/'.$from, $this->disppath.'/'.$to)));
+ }
+ else
+ {
+ $this->messages[]=lang('Renamed %1 to %2', $this->disppath.'/'.$from, $this->disppath.'/'.$to);
+ }
+ }
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+
+ # Handle Moving Files and Directories
+ function moveTo()
+ {
+ if(!$this->todir)
+ {
+ $this->messages[] = $GLOBALS['egw']->common->error_list(array(lang('Could not move file because no destination directory is given ', $this->disppath.'/'.$file)));
+
+ }
+ else
+ {
+
+ while(list($num, $file) = each($this->fileman))
+ {
+ if($this->bo->vfs->mv(array(
+ 'from' => $file,
+ 'to' => $this->todir . '/' . $file,
+ 'relatives' => array(RELATIVE_ALL, RELATIVE_NONE)
+ )))
+ {
+ $moved++;
+ $this->messages[]=lang('Moved %1 to %2', $this->disppath.'/'.$file, $this->todir.'/'.$file);
+ }
+ else
+ {
+ $this->messages[] = $GLOBALS['egw']->common->error_list(array(lang('Could not move %1 to %2', $this->disppath.'/'.$file, $this->todir.'/'.$file)));
+ }
+ }
+ }
+
+ if($moved)
+ {
+ $x=0;
+ }
+
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+
+ // Handle Copying of Files and Directories
+ function copyTo()
+ {
+ if(!$this->todir)
+ {
+ $this->messages[] = $GLOBALS['egw']->common->error_list(array(lang('Could not copy file because no destination directory is given ', $this->disppath.'/'.$file)));
+
+ }
+ else
+ {
+ while(list($num, $file) = each($this->fileman))
+ {
+ if($this->bo->vfs->cp(array(
+ 'from' => $file,
+ 'to' => $this->todir . '/' . $file,
+ 'relatives' => array(RELATIVE_ALL, RELATIVE_NONE)
+ )))
+ {
+ $copied++;
+ $this->message .= lang('Copied %1 to %2', $this->disppath.'/'.$file, $this->todir.'/'.$file);
+ }
+ else
+ {
+ $this->message .= $GLOBALS['egw']->common->error_list(array(lang('Could not copy %1 to %2', $this->disppath.'/'.$file, $this->todir.'/'.$file)));
+ }
+ }
+ }
+ if($copied)
+ {
+ $x=0;
+ }
+
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+
+ function createdir()
+ {
+ if($this->newdir_x && $this->newfile_or_dir)
+ {
+ if($this->bo->badchar = $this->bo->bad_chars($this->newfile_or_dir, True, True))
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array($this->bo->html_encode(lang('Directory names cannot contain "%1"', $badchar), 1)));
+ }
+
+ /* TODO is this right or should it be a single $ ? */
+ if($$this->newfile_or_dir[strlen($this->newfile_or_dir)-1] == ' ' || $this->newfile_or_dir[0] == ' ')
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(lang('Cannot create directory because it begins or ends in a space')));
+ }
+
+ $ls_array = $this->bo->vfs->ls(array(
+ 'string' => $this->path . '/' . $this->newfile_or_dir,
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => False,
+ 'nofiles' => True
+ ));
+
+ $fileinfo = $ls_array[0];
+
+ if($fileinfo['name'])
+ {
+ if($fileinfo['mime_type'] != 'Directory')
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(
+ lang('%1 already exists as a file',
+ $fileinfo['name'])
+ ));
+ }
+ else
+ {
+ $this->messages[]= $GLOBALS['egw']->common->error_list(array(lang('Directory %1 already exists', $fileinfo['name'])));
+ }
+ }
+ else
+ {
+ if($this->bo->vfs->mkdir(array('string' => $this->newfile_or_dir)))
+ {
+ $this->messages[]=lang('Created directory %1', $this->disppath.'/'.$this->newfile_or_dir);
+ }
+ else
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang('Could not create %1', $this->disppath.'/'.$this->newfile_or_dir)));
+ }
+ }
+
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+ }
+
+ function delete()
+ {
+ if( is_array($this->fileman) && count($this->fileman) >= 1)
+ {
+ foreach($this->fileman as $filename)
+ {
+ if($this->bo->vfs->delete(array('string' => $filename)))
+ {
+ $this->messages[]= lang('Deleted %1', $this->disppath.'/'.$filename).' ';
+ }
+ else
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang('Could not delete %1', $this->disppath.'/'.$filename)));
+ }
+ }
+ }
+ else
+ {
+ // make this a javascript func for quicker respons
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang('Please select a file to delete.')));
+ }
+ $this->readFilesInfo();
+ $this->filelisting();
+ }
+
+ function debug_filemanager()
+ {
+ error_reporting(8);
+
+ echo "Filemanager debug:
+ path: {$this->path}
+ disppath: {$this->disppath}
+ cwd: {$this->cwd}
+ lesspath: {$this->lesspath}
+
+ eGroupware debug:
+ real getabsolutepath: " . $this->bo->vfs->getabsolutepath(array('target' => False, 'mask' => False, 'fake' => False)) . "
+ fake getabsolutepath: " . $this->bo->vfs->getabsolutepath(array('target' => False)) . "
+ appsession: " . $GLOBALS['egw']->session->appsession('vfs','') . "
+ pwd: " . $this->bo->vfs->pwd() . " ";
+
+ echo '
';
+ var_dump($this);
+ }
+
+ function showUploadboxes()
+ {
+ $this->t->set_file(array('upload' => 'upload.tpl'));
+ $this->t->set_block('upload','upload_header','upload_header');
+ $this->t->set_block('upload','row','row');
+ $this->t->set_block('upload','upload_footer','upload_footer');
+
+ # Decide how many upload boxes to show
+ if(!$this->show_upload_boxes || $this->show_upload_boxes <= 0)
+ {
+ if(!$this->show_upload_boxes = $this->prefs['show_upload_boxes'])
+ {
+ $this->show_upload_boxes = 1;
+ }
+ }
+
+ # Show file upload boxes. Note the last argument to html(). Repeats $this->show_upload_boxes times
+ if($this->path != '/' && $this->path != $this->bo->fakebase && $this->can_add)
+ {
+ $vars['form_action']=$GLOBALS['egw']->link('/index.php','menuaction=filemanager.uifilemanager.index');
+ $vars['path']=$this->path;
+ $vars['lang_file']=lang('File');
+ $vars['lang_comment']=lang('Comment');
+ $vars['num_upload_boxes']=$this->show_upload_boxes;
+ $this->t->set_var($vars);
+ $this->t->pparse('out','upload_header');
+
+ for($i=0;$i<$this->show_upload_boxes;$i++)
+ {
+ $this->t->set_var('row_tr_color',$tr_color);
+ $this->t->parse('rows','row');
+ $this->t->pparse('out','row');
+ }
+
+ $vars['lang_upload']=lang('Upload files');
+ $vars['change_upload_boxes'].=lang('Show') . ' ';
+ $links.= $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','show_upload_boxes=5', '5');
+ $links.=' ';
+ $links.= $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','show_upload_boxes=10', '10');
+ $links.=' ';
+ $links.= $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','show_upload_boxes=20', '20');
+ $links.=' ';
+ $links.= $this->html_link('/index.php','menuaction=filemanager.uifilemanager.index','show_upload_boxes=50', '50');
+ $links.=' ';
+ $links.= lang('upload fields');
+ $vars['change_upload_boxes'].=$links;
+ $this->t->set_var($vars);
+ $this->t->pparse('out','upload_footer');
+ }
+ }
+
+ /* create textfile */
+ function createfile()
+ {
+ $this->createfile_var=$this->newfile_or_dir;
+ if($this->createfile_var)
+ {
+ if($badchar = $this->bo->bad_chars($this->createfile_var, True, True))
+ {
+ $this->messages[] = $GLOBALS['egw']->common->error_list(array(
+ lang('File names cannot contain "%1"',$badchar),
+ 1)
+ );
+
+ $this->fileListing();
+ }
+
+ if($this->bo->vfs->file_exists(array(
+ 'string'=> $this->createfile_var,
+ 'relatives' => array(RELATIVE_ALL)
+ )))
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang('File %1 already exists. Please edit it or delete it first.', $this->createfile_var)));
+ $this->fileListing();
+ }
+
+ if($this->bo->vfs->touch(array(
+ 'string' => $this->createfile_var,
+ 'relatives' => array(RELATIVE_ALL)
+ )))
+ {
+ $this->fileman = array();
+ $this->fileman[0] = $this->createfile_var;
+ $this->edit = 1;
+ $this->numoffiles++;
+ $this->edit();
+ }
+ else
+ {
+ $this->messages[]=$GLOBALS['egw']->common->error_list(array(lang('File %1 could not be created.', $this->createfile_var)));
+ $this->fileListing();
+ }
+ }
+ }
+
+ # Handle Editing files
+ function edit()
+ {
+ $this->readFilesInfo();
+
+ $this->t->set_file(array('filemanager_edit' => 'edit_file.tpl'));
+ $this->t->set_block('filemanager_edit','row','row');
+
+ $vars['preview_content'] = '';
+ if($this->edit_file)
+ {
+ $this->edit_file_content = stripslashes($this->edit_file_content);
+ }
+
+ if($this->edit_preview_x)
+ {
+ $content = $this->edit_file_content;
+
+ $vars['lang_preview_of'] = lang('Preview of %1', $this->path.'/'.$edit_file);
+
+ $vars['preview_content'] = nl2br($content);
+ }
+ elseif($this->edit_save_x || $this->edit_save_done_x)
+ {
+ $content = $this->edit_file_content;
+ //die( $content);
+ if($this->bo->vfs->write(array(
+ 'string' => $this->edit_file,
+ 'relatives' => array(RELATIVE_ALL),
+ 'content' => $content
+ )))
+ {
+ $this->messages[]=lang('Saved %1', $this->path.'/'.$this->edit_file);
+
+ if($this->edit_save_done_x)
+ {
+ $this->readFilesInfo();
+ $this->fileListing();
+ exit;
+ }
+ }
+ else
+ {
+ $this->messages[]=lang('Could not save %1', $this->path.'/'.$this->edit_file);
+ }
+ }
+
+ # Now we display the edit boxes and forms
+ for($j = 0; $j != $this->numoffiles; $j++)
+ {
+ # If we're in preview or save mode, we only show the file
+ # being previewed or saved
+ if($this->edit_file &&($this->fileman[$j] != $this->edit_file))
+ {
+ continue;
+ }
+
+ if($this->fileman[$j] && $this->bo->vfs->file_exists(array(
+ 'string' => $this->fileman[$j],
+ 'relatives' => array(RELATIVE_ALL)
+ )))
+ {
+ if($this->edit_file)
+ {
+ $content = stripslashes($this->edit_file_content);
+ }
+ else
+ {
+ $content = $this->bo->vfs->read(array('string' => $this->fileman[$j]));
+ }
+
+ $vars['form_action'] = $GLOBALS['egw']->link('/index.php','menuaction=filemanager.uifilemanager.index','path='.$this->path);
+ $vars['edit_file'] = $this->fileman[$j];
+
+ # We need to include all of the fileman entries for each file's form,
+ # so we loop through again
+ for($i = 0; $i != $this->numoffiles; $i++)
+ {
+ if($this->fileman[$i])
+ {
+ $value='value="'.$this->fileman[$i].'"';
+ }
+ $vars['filemans_hidden'] = ' ';
+ }
+
+ $vars['file_content'] = $content;
+
+ $vars['buttonPreview'] = $this->inputImage('edit_preview','edit_preview',lang('Preview %1', $this->bo->html_encode($this->fileman[$j], 1)));
+ $vars['buttonSave'] = $this->inputImage('edit_save','save',lang('Save %1', $this->bo->html_encode($this->fileman[$j], 1)));
+ $vars['buttonDone'] = $this->inputImage('edit_save_done','ok',lang('Save %1, and go back to file listing ', $this->bo->html_encode($this->fileman[$j], 1)));
+ $vars['buttonCancel'] = $this->inputImage('edit_cancel','cancel',lang('Cancel editing %1 without saving', $this->bo->html_encode($this->fileman[$j], 1)));
+ $this->t->set_var($vars);
+ $this->t->parse('rows','row');
+ $this->t->pparse('out','row');
+
+ }
+ }
+ }
+
+ function history()
+ {
+ if($this->file) // FIXME this-file is never defined
+ {
+ $journal_array = $this->bo->vfs->get_journal(array(
+ 'string' => $this->file,//FIXME
+ 'relatives' => array(RELATIVE_ALL)
+ ));
+
+ if(is_array($journal_array))
+ {
+ $this->html_table_begin();
+ $this->html_table_row_begin();
+ $this->html_table_col_begin();
+ echo lang('Date');
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ echo lang('Version');
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ echo lang('Who');
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ echo lang('Operation');
+ $this->html_table_col_end();
+ $this->html_table_row_end();
+
+ while(list($num, $journal_entry) = each($journal_array))
+ {
+ $this->html_table_row_begin();
+ $this->html_table_col_begin();
+ $this->bo->html_text($journal_entry['created'] . ' ');
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ $this->bo->html_text($journal_entry['version'] . ' ' );
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ $this->bo->html_text($GLOBALS['egw']->accounts->id2name($journal_entry['owner_id']) . ' ');
+ $this->html_table_col_end();
+ $this->html_table_col_begin();
+ $this->bo->html_text($journal_entry['comment']);
+ $this->html_table_col_end();
+ }
+
+ $this->html_table_end();
+ $GLOBALS['egw']->common->egw_footer();
+ $GLOBALS['egw']->common->egw_exit();
+ }
+ else
+ {
+ echo lang('No version history for this file/directory');
+ }
+ }
+ }
+
+ function view()
+ {
+ if($this->file) //FIXME
+ {
+ $ls_array = $this->bo->vfs->ls(array(
+ 'string' => $this->path.'/'.$this->file,//FIXME
+ 'relatives' => array(RELATIVE_ALL),
+ 'checksubdirs' => False,
+ 'nofiles' => True
+ ));
+
+ if($ls_array[0]['mime_type'])
+ {
+ $mime_type = $ls_array[0]['mime_type'];
+ }
+ elseif($this->prefs['viewtextplain'])
+ {
+ $mime_type = 'text/plain';
+ }
+ else
+ {
+ list($_first,$_ext) = split("\.",$this->file);
+ $mime_type = ExecMethod('phpgwapi.mime_magic.ext2mime',$_ext);
+ }
+ $viewable = array('','text/plain','text/csv','text/html','text/text');
+
+ if(in_array($mime_type,$viewable) && !$_GET['download'])
+ {
+ header('Content-type: ' . $mime_type);
+ header('Content-disposition: filename="' . $this->file . '"');//FIXME
+ Header("Pragma: public");
+ }
+ else
+ {
+
+ $GLOBALS['egw']->browser->content_header($this->file,$mime_type);//FIXME
+ }
+ echo $this->bo->vfs->read(array(
+ 'string' => $this->path.'/'.$this->file,//FIXME
+ 'relatives' => array(RELATIVE_NONE)
+ ));
+ $GLOBALS['egw']->common->egw_exit();
+ }
+ }
+
+ function download()
+ {
+ for($i = 0; $i != $this->numoffiles; $i++)
+ {
+ if(!$this->fileman[$i])
+ {
+ continue;
+ }
+
+ $download_browser =& CreateObject('phpgwapi.browser');
+ $download_browser->content_header($this->fileman[$i]);
+ echo $this->bo->vfs->read(array('string' => $this->fileman[$i]));
+ $GLOBALS['egw']->common->egw_exit();
+ }
+ }
+
+ //give back an array with all directories except current and dirs that are not accessable
+ function all_other_directories_options()
+ {
+ # First we get the directories in their home directory
+ $dirs = array();
+ $dirs[] = array('directory' => $this->bo->fakebase, 'name' => $this->bo->userinfo['account_lid']);
+
+ $tmp_arr=array(
+ 'string' => $this->bo->homedir,
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => True,
+ 'mime_type' => 'Directory'
+ );
+
+ $ls_array = $this->bo->vfs->ls($tmp_arr);
+
+ while(list($num, $dir) = each($ls_array))
+ {
+ $dirs[] = $dir;
+ }
+
+
+ # Then we get the directories in their readable groups' home directories
+ reset($this->readable_groups);
+ while(list($num, $group_array) = each($this->readable_groups))
+ {
+ # Don't list directories for groups that don't have access
+ if(!$this->groups_applications[$group_array['account_name']][$this->bo->appname]['enabled'])
+ {
+ continue;
+ }
+
+ $dirs[] = array('directory' => $this->bo->fakebase, 'name' => $group_array['account_name']);
+
+ $tmp_arr=array(
+ 'string' => $this->bo->fakebase.'/'.$group_array['account_name'],
+ 'relatives' => array(RELATIVE_NONE),
+ 'checksubdirs' => True,
+ 'mime_type' => 'Directory'
+ );
+
+ $ls_array = $this->bo->vfs->ls($tmp_arr);
+ while(list($num, $dir) = each($ls_array))
+ {
+ $dirs[] = $dir;
+ }
+ }
+
+ reset($dirs);
+ while(list($num, $dir) = each($dirs))
+ {
+ if(!$dir['directory'])
+ {
+ continue;
+ }
+
+ # So we don't display //
+ if($dir['directory'] != '/')
+ {
+ $dir['directory'] .= '/';
+ }
+
+ # No point in displaying the current directory, or a directory that doesn't exist
+ if((($dir['directory'] . $dir['name']) != $this->path) && $this->bo->vfs->file_exists(array('string' => $dir['directory'] . $dir['name'],'relatives' => array(RELATIVE_NONE))))
+ {
+ //FIXME replace the html_form_option function
+ $options .= $this->html_form_option($dir['directory'] . $dir['name'], $dir['directory'] . $dir['name']);
+ }
+ }
+
+ return $options;
+ }
+
+ /* seek icon for mimetype else return an unknown icon */
+ function mime_icon($mime_type, $size=16)
+ {
+ if(!$mime_type)
+ {
+ $mime_type='unknown';
+ }
+
+ $mime_type= str_replace ('/','_',$mime_type);
+
+ $img=$GLOBALS['egw']->common->image('filemanager','mime'.$size.'_'.strtolower($mime_type));
+ if(!$img)
+ {
+ $img = $GLOBALS['egw']->common->image('filemanager','mime'.$size.'_unknown');
+ }
+
+ $icon=' ';
+ return $icon;
+ }
+
+ function buttonImage($link,$img='',$help='')
+ {
+ $image=$GLOBALS['egw']->common->image('filemanager','button_'.strtolower($img));
+
+ if($img)
+ {
+ return '
+
+ ';
+ }
+ }
+
+ function inputImage($name,$img='',$help='')
+ {
+ $image=$GLOBALS['egw']->common->image('filemanager','button_'.strtolower($img));
+
+ if($img)
+ {
+ return '
+
+ ';
+ }
+ }
+
+ function html_form_input($type = NULL, $name = NULL, $value = NULL, $maxlength = NULL, $size = NULL, $checked = NULL, $string = '', $return = 1)
+ {
+ $text = ' ';
+ if($type != NULL && $type)
+ {
+ if($type == 'checkbox')
+ {
+ $value = $this->bo->string_encode($value, 1);
+ }
+ $text .= 'type="'.$type.'" ';
+ }
+ if($name != NULL && $name)
+ {
+ $text .= 'name="'.$name.'" ';
+ }
+ if($value != NULL && $value)
+ {
+ $text .= 'value="'.$value.'" ';
+ }
+ if(is_int($maxlength) && $maxlength >= 0)
+ {
+ $text .= 'maxlength="'.$maxlength.'" ';
+ }
+ if(is_int($size) && $size >= 0)
+ {
+ $text .= 'size="'.$size.'" ';
+ }
+ if($checked != NULL && $checked)
+ {
+ $text .= 'checked ';
+ }
+
+ return ' ';
+ }
+
+ function html_form_option($value = NULL, $displayed = NULL, $selected = NULL, $return = 0)
+ {
+ $text = ' ';
+ if($value != NULL && $value)
+ {
+ $text .= ' value="'.$value.'" ';
+ }
+ if($selected != NULL && $selected)
+ {
+ $text .= ' selected';
+ }
+ return ''.$displayed.' ';
+ }
+
+ function encode_href($href = NULL, $args = NULL , $extra_args)
+ {
+ $href = $this->bo->string_encode($href, 1);
+ $all_args = $args.'&'.$this->bo->string_encode($extra_args, 1);
+
+ $address = $GLOBALS['egw']->link($href, $all_args);
+
+ return $address;
+ }
+
+ function html_link($href = NULL, $args = NULL , $extra_args, $text = NULL, $return = 1, $encode = 1, $linkonly = 0, $target = NULL)
+ {
+ // unset($encode);
+ if($encode)
+ {
+ $href = $this->bo->string_encode($href, 1);
+ $all_args = $args.'&'.$this->bo->string_encode($extra_args, 1);
+ }
+ else
+ {
+ // $href = $this->bo->string_encode($href, 1);
+ $all_args = $args.'&'.$extra_args;
+ }
+ ###
+ # This decodes / back to normal
+ ###
+ // $all_args = preg_replace("/%2F/", "/", $all_args);
+ // $href = preg_replace("/%2F/", "/", $href);
+
+ /* Auto-detect and don't disturb absolute links */
+ if(!preg_match("|^http(.{0,1})://|", $href))
+ {
+ //Only add an extra / if there isn't already one there
+
+ // die(SEP);
+ if(!($href[0] == SEP))
+ {
+ $href = SEP . $href;
+ }
+
+ /* $GLOBALS['egw']->link requires that the extra vars be passed separately */
+ // $link_parts = explode("?", $href);
+ $address = $GLOBALS['egw']->link($href, $all_args);
+ // $address = $GLOBALS['egw']->link($href);
+ }
+ else
+ {
+ $address = $href;
+ }
+
+ /* If $linkonly is set, don't add any HTML */
+ if($linkonly)
+ {
+ $rstring = $address;
+ }
+ else
+ {
+ if($target)
+ {
+ $target = 'target='.$target;
+ }
+
+ $text = trim($text);
+ $rstring = ''.$text.' ';
+ }
+
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_begin($width = NULL, $border = NULL, $cellspacing = NULL, $cellpadding = NULL, $rules = NULL, $string = '', $return = 0)
+ {
+ if($width != NULL && $width)
+ {
+ $width = "width=$width";
+ }
+ if(is_int($border) && $border >= 0)
+ {
+ $border = "border=$border";
+ }
+ if(is_int($cellspacing) && $cellspacing >= 0)
+ {
+ $cellspacing = "cellspacing=$cellspacing";
+ }
+ if(is_int($cellpadding) && $cellpadding >= 0)
+ {
+ $cellpadding = "cellpadding=$cellpadding";
+ }
+ if($rules != NULL && $rules)
+ {
+ $rules = "rules=$rules";
+ }
+
+ $rstring = "";
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_end($return = 0)
+ {
+ $rstring = "
";
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_row_begin($align = NULL, $halign = NULL, $valign = NULL, $bgcolor = NULL, $string = '', $return = 0)
+ {
+ if($align != NULL && $align)
+ {
+ $align = "align=$align";
+ }
+ if($halign != NULL && $halign)
+ {
+ $halign = "halign=$halign";
+ }
+ if($valign != NULL && $valign)
+ {
+ $valign = "valign=$valign";
+ }
+ if($bgcolor != NULL && $bgcolor)
+ {
+ $bgcolor = "bgcolor=$bgcolor";
+ }
+ $rstring = "";
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_row_end($return = 0)
+ {
+ $rstring = " ";
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_col_begin($align = NULL, $halign = NULL, $valign = NULL, $rowspan = NULL, $colspan = NULL, $string = '', $return = 0)
+ {
+ if($align != NULL && $align)
+ {
+ $align = "align=$align";
+ }
+ if($halign != NULL && $halign)
+ {
+ $halign = "halign=$halign";
+ }
+ if($valign != NULL && $valign)
+ {
+ $valign = "valign=$valign";
+ }
+ if(is_int($rowspan) && $rowspan >= 0)
+ {
+ $rowspan = "rowspan=$rowspan";
+ }
+ if(is_int($colspan) && $colspan >= 0)
+ {
+ $colspan = "colspan=$colspan";
+ }
+
+ $rstring = "";
+ return($this->bo->eor($rstring, $return));
+ }
+
+ function html_table_col_end($return = 0)
+ {
+ $rstring = " ";
+ return($this->bo->eor($rstring, $return));
+ }
+ }