Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/themes/CleanFS/templates
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-02-01 09:05:48 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-02-01 09:05:48 +0100
commit6854cb3f4d8219cf1829e32122eb2502a916eae9 (patch)
tree350feb504587d932e02837a1442b059759927646 /themes/CleanFS/templates
initial checkin
Diffstat (limited to 'themes/CleanFS/templates')
-rw-r--r--themes/CleanFS/templates/admin.cat.tpl4
-rw-r--r--themes/CleanFS/templates/admin.checks.tpl99
-rw-r--r--themes/CleanFS/templates/admin.editallusers.tpl4
-rw-r--r--themes/CleanFS/templates/admin.editgroup.tpl4
-rw-r--r--themes/CleanFS/templates/admin.groups.tpl147
-rw-r--r--themes/CleanFS/templates/admin.menu.tpl43
-rw-r--r--themes/CleanFS/templates/admin.newgroup.tpl7
-rw-r--r--themes/CleanFS/templates/admin.newproject.tpl58
-rw-r--r--themes/CleanFS/templates/admin.newuser.tpl7
-rw-r--r--themes/CleanFS/templates/admin.newuserbulk.tpl7
-rw-r--r--themes/CleanFS/templates/admin.os.tpl9
-rw-r--r--themes/CleanFS/templates/admin.prefs.tpl529
-rw-r--r--themes/CleanFS/templates/admin.resolution.tpl8
-rw-r--r--themes/CleanFS/templates/admin.status.tpl9
-rw-r--r--themes/CleanFS/templates/admin.tag.tpl10
-rw-r--r--themes/CleanFS/templates/admin.tasktype.tpl8
-rw-r--r--themes/CleanFS/templates/admin.translation.tpl1
-rw-r--r--themes/CleanFS/templates/admin.userrequest.tpl50
-rw-r--r--themes/CleanFS/templates/admin.users.tpl6
-rw-r--r--themes/CleanFS/templates/admin.version.tpl8
-rw-r--r--themes/CleanFS/templates/common.attachments.tpl50
-rw-r--r--themes/CleanFS/templates/common.cat.tpl157
-rw-r--r--themes/CleanFS/templates/common.datepicker.tpl9
-rw-r--r--themes/CleanFS/templates/common.dualselect.tpl15
-rw-r--r--themes/CleanFS/templates/common.editallusers.tpl137
-rw-r--r--themes/CleanFS/templates/common.editattachments.tpl46
-rw-r--r--themes/CleanFS/templates/common.editgroup.tpl233
-rw-r--r--themes/CleanFS/templates/common.editlinks.tpl15
-rw-r--r--themes/CleanFS/templates/common.links.tpl10
-rw-r--r--themes/CleanFS/templates/common.list.tpl226
-rw-r--r--themes/CleanFS/templates/common.multiuserselect.tpl49
-rw-r--r--themes/CleanFS/templates/common.newgroup.tpl169
-rw-r--r--themes/CleanFS/templates/common.newuser.tpl120
-rw-r--r--themes/CleanFS/templates/common.newuserbulk.tpl78
-rw-r--r--themes/CleanFS/templates/common.profile.tpl152
-rw-r--r--themes/CleanFS/templates/common.userselect.tpl6
-rw-r--r--themes/CleanFS/templates/depends.tpl107
-rw-r--r--themes/CleanFS/templates/details.edit.tpl255
-rw-r--r--themes/CleanFS/templates/details.tabs.comment.tpl118
-rw-r--r--themes/CleanFS/templates/details.tabs.efforttracking.tpl52
-rw-r--r--themes/CleanFS/templates/details.tabs.history.callback.tpl32
-rw-r--r--themes/CleanFS/templates/details.tabs.history.tpl3
-rw-r--r--themes/CleanFS/templates/details.tabs.notifs.tpl30
-rw-r--r--themes/CleanFS/templates/details.tabs.related.tpl65
-rw-r--r--themes/CleanFS/templates/details.tabs.remind.tpl76
-rw-r--r--themes/CleanFS/templates/details.tabs.tpl39
-rw-r--r--themes/CleanFS/templates/details.view.tpl882
-rw-r--r--themes/CleanFS/templates/editcomment.tpl83
-rw-r--r--themes/CleanFS/templates/feed.atom.tpl73
-rw-r--r--themes/CleanFS/templates/feed.rss1.tpl70
-rw-r--r--themes/CleanFS/templates/feed.rss2.tpl65
-rw-r--r--themes/CleanFS/templates/footer.tpl10
-rw-r--r--themes/CleanFS/templates/header.tpl131
-rw-r--r--themes/CleanFS/templates/index.tpl623
-rw-r--r--themes/CleanFS/templates/links.searches.tpl15
-rw-r--r--themes/CleanFS/templates/links.tpl148
-rw-r--r--themes/CleanFS/templates/loginbox.tpl45
-rw-r--r--themes/CleanFS/templates/lostpw.step1.tpl11
-rw-r--r--themes/CleanFS/templates/lostpw.step2.tpl23
-rw-r--r--themes/CleanFS/templates/myprofile.tpl40
-rw-r--r--themes/CleanFS/templates/newmultitasks.tpl261
-rw-r--r--themes/CleanFS/templates/newtask.tpl268
-rw-r--r--themes/CleanFS/templates/permicons.tpl30
-rw-r--r--themes/CleanFS/templates/pm.cat.tpl5
-rw-r--r--themes/CleanFS/templates/pm.editgroup.tpl4
-rw-r--r--themes/CleanFS/templates/pm.groups.tpl138
-rw-r--r--themes/CleanFS/templates/pm.menu.tpl34
-rw-r--r--themes/CleanFS/templates/pm.newgroup.tpl7
-rw-r--r--themes/CleanFS/templates/pm.os.tpl12
-rw-r--r--themes/CleanFS/templates/pm.pendingreq.tpl79
-rw-r--r--themes/CleanFS/templates/pm.prefs.tpl370
-rw-r--r--themes/CleanFS/templates/pm.resolution.tpl12
-rw-r--r--themes/CleanFS/templates/pm.status.tpl12
-rw-r--r--themes/CleanFS/templates/pm.tag.tpl14
-rw-r--r--themes/CleanFS/templates/pm.tasktype.tpl12
-rw-r--r--themes/CleanFS/templates/pm.version.tpl12
-rw-r--r--themes/CleanFS/templates/profile.tpl70
-rw-r--r--themes/CleanFS/templates/register.magic.tpl31
-rw-r--r--themes/CleanFS/templates/register.no-magic.tpl78
-rw-r--r--themes/CleanFS/templates/register.oauth.tpl15
-rw-r--r--themes/CleanFS/templates/register.ok.tpl4
-rw-r--r--themes/CleanFS/templates/reports.tpl120
-rw-r--r--themes/CleanFS/templates/roadmap.text.tpl51
-rw-r--r--themes/CleanFS/templates/roadmap.tpl116
-rw-r--r--themes/CleanFS/templates/shortcuts.tpl31
-rw-r--r--themes/CleanFS/templates/toplevel.tpl169
86 files changed, 7441 insertions, 0 deletions
diff --git a/themes/CleanFS/templates/admin.cat.tpl b/themes/CleanFS/templates/admin.cat.tpl
new file mode 100644
index 0000000..02492b4
--- /dev/null
+++ b/themes/CleanFS/templates/admin.cat.tpl
@@ -0,0 +1,4 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('categorylist')); ?></h3>
+ <?php $this->display('common.cat.tpl'); ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.checks.tpl b/themes/CleanFS/templates/admin.checks.tpl
new file mode 100644
index 0000000..37ebc30
--- /dev/null
+++ b/themes/CleanFS/templates/admin.checks.tpl
@@ -0,0 +1,99 @@
+<div id="toolbox">
+<div>PHP version: <?php echo PHP_VERSION; ?></div>
+<?php if(isset($utf8mb4upgradable)) { echo '<div class="error">'.Filters::noXSS($utf8mb4upgradable).'</div>'; } ?>
+<?php if(isset($oldmysqlversion)) { echo '<div class="error">'.Filters::noXSS($oldmysqlversion).'</div>'; } ?>
+<div>ADOdb version: <?php if(isset($adodbversion)) { echo Filters::noXSS($adodbversion); } ?></div>
+<div>HTMLPurifier version: <?php if(isset($htmlpurifierversion)) { echo Filters::noXSS($htmlpurifierversion); } ?></div>
+<div>passwdcrypt: <?php echo Filters::noXSS($passwdcrypt); ?></div>
+<?php if(isset($hashlengths)) { echo '<div>password hash lengths: '.$hashlengths.'</div>'; } ?>
+
+<?php if(isset($registrations)): ?>
+<h4><?= $regcount ?> unfinished registrations</h4>
+<table>
+<thead>
+<tr>
+<th>reg_time</th>
+<th>user_name</th>
+<th>email_address</th>
+</tr>
+</thead>
+<tbody>
+<?php foreach($registrations as $reg): ?>
+<tr>
+<td><?= formatDate($reg['reg_time']) ?></td>
+<td><?= Filters::noXSS($reg['user_name']) ?></td>
+<td><?= Filters::noXSS($reg['email_address']) ?></td>
+</tr>
+<?php endforeach; ?>
+<?php endif; ?>
+</tbody>
+</table>
+
+<?php if(isset($fstables)): ?>
+<style>
+.dbtable{ background-color:#ccc;}
+.dbtable td {border-bottom:1px solid #999;}
+.dbfield{ background-color:#eee;}
+#togglefields { display:none; }
+#togglefields ~ label:after { content:'Hide Fields'; }
+#togglefields:checked ~ label:after { content:'Show Fields'; }
+#togglefields:checked ~ #dbtables .dbfield { display:none; }
+</style>
+<div>
+<div>default_character_set_name: <?=$fsdb['default_character_set_name'] ?></div>
+<div>default_collation_name: <?=$fsdb['default_collation_name'] ?></div>
+</div>
+<input type="checkbox" id="togglefields" name="togglefields" checked="checked" />
+<label for="togglefields" class="button"></label>
+<table id="dbtables">
+<thead>
+<tr class="dbtable">
+<th>tabl_name</th>
+<th>table_type</th>
+<th></th>
+<th>default collation</th>
+<th>comment</th>
+</tr>
+<tr class="dbfield">
+<th>column_name</th>
+<th>data_type</th>
+<th>character_set_name</th>
+<th>collation_name</th>
+<th>comment</th>
+</tr>
+</thead>
+<tbody>
+<?php
+$lasttable='';
+$ti=-1; # $fstables index
+foreach($fsfields as $f):
+ # Show table info row if not yet for that field
+ # This logic fails if there exists a table within $fstables without fields in $fsfields
+ # But for our usecase this should be ok.
+ if ($lasttable != $f['table_name']):
+ $ti++;
+ ?>
+ <tr class="dbtable">
+ <td><?= Filters::noXSS($fstables[$ti]['table_name']) ?></td>
+ <td><?= $fstables[$ti]['table_type'] ?></td>
+ <td></td>
+ <td><?= $fstables[$ti]['table_collation'] ?></td>
+ <td><?= Filters::noXSS($fstables[$ti]['table_comment']) ?></td>
+ </tr>
+ <?php endif; ?>
+<tr class="dbfield">
+<td><?= Filters::noXSS($f['column_name']) ?></td>
+<td><?= $f['column_type'] ?></td>
+<td><?= $f['character_set_name'] ?></td>
+<td><?= $f['collation_name'] ?></td>
+<td><?= Filters::noXSS($f['column_comment']) ?></td>
+</tr>
+<?php
+$lasttable=$f['table_name'];
+endforeach;
+?>
+</tbody>
+</table>
+<?php endif; ?>
+
+</div>
diff --git a/themes/CleanFS/templates/admin.editallusers.tpl b/themes/CleanFS/templates/admin.editallusers.tpl
new file mode 100644
index 0000000..e78edec
--- /dev/null
+++ b/themes/CleanFS/templates/admin.editallusers.tpl
@@ -0,0 +1,4 @@
+<div id="toolbox">
+ <h3><?= eL('admintoolbox') ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?= eL('editallusers') ?></h3>
+ <?php $this->display('common.editallusers.tpl'); ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.editgroup.tpl b/themes/CleanFS/templates/admin.editgroup.tpl
new file mode 100644
index 0000000..6bfbca8
--- /dev/null
+++ b/themes/CleanFS/templates/admin.editgroup.tpl
@@ -0,0 +1,4 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolboxlong')); ?> :: <?php echo Filters::noXSS(L('editgroup')); ?></h3>
+ <?php $this->display('common.editgroup.tpl'); ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.groups.tpl b/themes/CleanFS/templates/admin.groups.tpl
new file mode 100644
index 0000000..0d66177
--- /dev/null
+++ b/themes/CleanFS/templates/admin.groups.tpl
@@ -0,0 +1,147 @@
+<div id="toolbox">
+ <ul id="submenu">
+ <li><a href="#users_tab"><?php echo Filters::noXSS(L('users')); ?></a></li>
+ <li><a href="#groups_tab"><?php echo Filters::noXSS(L('globalgroups')); ?></a></li>
+ </ul>
+ <div id="users_tab" class="tab">
+ <a class="button" href="<?php echo Filters::noXSS(CreateURL('admin', 'newuser', $proj->id)); ?>"><i class="good fa fa-user-plus fa-lg fa-fw"></i><?php echo L('newuser'); ?></a>
+ <a class="button" href="<?php echo Filters::noXSS(CreateURL('admin', 'newuserbulk', $proj->id)); ?>"><i class="good fa fa-user-times fa-lg fa-fw"></i><?php echo L('newuserbulk'); ?></a>
+ <a class="button" href="<?php echo Filters::noXSS(CreateURL('admin', 'editallusers', $proj->id)); ?>"><i class="fa fa-group fa-lg fa-fw"></i><?php echo L('editallusers'); ?></a>
+ <div class="groupedit">
+<!--
+ <form action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+ <label for="selectgroup"><?php echo Filters::noXSS(L('editgroup')); ?></label>
+ <select name="id" id="selectgroup"><?php echo tpl_options(Flyspray::ListGroups()); ?></select>
+ <button type="submit"><?php echo Filters::noXSS(L('edit')); ?></button>
+ <input type="hidden" name="do" value="admin" />
+ <input type="hidden" name="area" value="editgroup" />
+ <input type="hidden" name="project" value="<?php echo $proj->id; ?>" />
+ </form>
+-->
+ <form action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+ <label for="edit_user"><?php echo Filters::noXSS(L('edituser')); ?></label>
+ <?php echo tpl_userselect('user_name', '', 'edit_user'); ?>
+ <button type="submit"><?php echo Filters::noXSS(L('edit')); ?></button>
+ <input type="hidden" name="do" value="admin" />
+ <input type="hidden" name="area" value="users" />
+ <input type="hidden" name="project" value="<?php echo $proj->id; ?>" />
+ </form>
+ </div>
+ </div>
+ <div id="groups_tab" class="tab">
+<div><a class="button" href="<?php echo Filters::noXSS(CreateURL('admin', 'newgroup', $proj->id)); ?>"><i class="fa fa-group fa-lg fa-fw"></i><?php echo Filters::noXSS(L('newgroup')); ?></a></div>
+
+<?php
+$perm_fields = array(
+'group_open',
+'is_admin',
+'manage_project',
+'view_tasks',
+'view_groups_tasks', # TODO: What is the definition of "group's task" and how does it effect project views?
+'view_own_tasks', # TODO: What is the definition of "own task" and how does it effect project views?
+'open_new_tasks',
+'add_multiple_tasks',
+'modify_own_tasks',
+'modify_all_tasks',
+'create_attachments',
+'delete_attachments',
+'assign_to_self',
+'assign_others_to_self',
+'edit_assignments',
+'close_own_tasks',
+'close_other_tasks',
+'view_roadmap',
+'view_history',
+'view_reports',
+'add_votes',
+'view_comments',
+'add_comments',
+'edit_comments',
+'edit_own_comments',
+'delete_comments',
+'view_estimated_effort',
+'view_current_effort_done',
+'track_effort'
+);
+
+$yesno = array(
+ '<td style="color:#ccc" title="'.eL('no').'">-</td>',
+ '<td title="'.eL('yes').'"><i class="good fa fa-check fa-lg"></i></td>'
+);
+
+$perms=array();
+$gmembers='';
+$gnames='';
+$gdesc='';
+$cols='';
+foreach ($groups as $group){
+ $cols.='<col class="group g'.$group['group_id'].($group['group_open']==0?' inactive':'').'"></col>';
+ $gmembers.='<td>'.$group['users'].'</td>';
+ $gnames .='<td><a class="button" title="'.eL('editgroup').'" href="'.( Filters::noXSS(CreateURL('editgroup', $group['group_id'], 'admin'))).'">'
+ .Filters::noXSS($group['group_name'])
+ .'<i class="fa fa-pencil fa-lg fa-fw"></i></a></td>';
+ $gdesc .='<td>'.Filters::noXSS($group['group_desc']).'</td>';
+ foreach ($group as $key => $val) {
+ if (!is_numeric($key) && in_array($key, $perm_fields)) {
+ $perms[$key][]=$val;
+ }
+ }
+}
+?>
+<style>
+.perms {border-collapse:collapse;}
+.perms tbody tr:hover {background-color:#eee;}
+.perms td, .perms th{border:1px solid #999;}
+.perms thead th, .perms thead td {text-align:center;}
+.perms tbody th{text-align:right;}
+.perms tbody td{width:100px;text-align:center;}
+.perms tbody span i:first-child {color: #090;}
+</style>
+<table class="perms">
+<colgroup>
+<col></col>
+<?php echo $cols; ?>
+</colgroup>
+<thead>
+<tr>
+<th><?php echo L('groupmembers'); ?></th>
+<?php echo $gmembers; ?>
+</tr>
+<tr>
+<th><?php echo L('group'); ?></th>
+<?php echo $gnames; ?>
+</tr>
+<tr>
+<th><?php echo L('description'); ?></th>
+<?php echo $gdesc; ?>
+</tr>
+</thead>
+<tbody>
+<?php foreach ($perm_fields as $p): ?>
+<tr>
+ <th><?php echo eL(str_replace('_', '', $p)); ?></th>
+<?php
+require_once('permicons.tpl');
+$i=0;
+# TODO: make it visible that a granted 'view_tasks' overrules 'view_groups_tasks' and 'own_tasks'. (like is_admin)
+foreach($perms[$p] as $val){
+ if ($perms['is_admin'][$i]==1 && $val == 0){
+ if(isset($permicons[$p])){
+ echo '<td title="'.eL('yes').' - Permission granted because of is_admin">( '.$permicons[$p].' )</td>';
+ }else{
+ echo $yesno[1];
+ }
+ } elseif($val==1 && isset($permicons[$p])){
+ echo '<td>'.$permicons[$p].'</td>';
+ } else{
+ echo $yesno[$val];
+ }
+ $i++;
+}
+?>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+</div>
+</div>
diff --git a/themes/CleanFS/templates/admin.menu.tpl b/themes/CleanFS/templates/admin.menu.tpl
new file mode 100644
index 0000000..789a280
--- /dev/null
+++ b/themes/CleanFS/templates/admin.menu.tpl
@@ -0,0 +1,43 @@
+<?php $activeclass = ' class="active" '; ?>
+
+<div id="toolboxmenu">
+ <a id="globprefslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'prefs') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'prefs')); ?>"><?php echo Filters::noXSS(L('preferences')); ?></a>
+ <a id="globuglink"
+ <?php if(isset($_GET['area']) and in_array($_GET['area'], array('groups','newuser', 'newuserbulk', 'newgroup','editgroup', 'users', 'editallusers'))) echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'groups')); ?>"><?php echo Filters::noXSS(L('usersandgroups')); ?></a>
+ <a id="globttlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'tasktype') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'tasktype')); ?>"><?php echo Filters::noXSS(L('tasktypes') ); ?></a>
+ <a id="globcatlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'cat') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'cat')); ?>"><?php echo Filters::noXSS(L('categories') ); ?></a>
+ <a id="globtglink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'tag') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'tag')); ?>"><i class="fa fa-tag"></i> <?php echo Filters::noXSS(L('tags') ); ?></a>
+ <a id="globstatuslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'status') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'status')); ?>"><?php echo Filters::noXSS(L('taskstatuses') ); ?></a>
+ <a id="globreslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'resolution') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'resolution')); ?>"><?php echo Filters::noXSS(L('resolutions') ); ?></a>
+ <a id="globverlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'version') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'version')); ?>"><?php echo Filters::noXSS(L('versions') ); ?></a>
+ <a id="globoslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'os') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'os')); ?>"><i class="fa fa-linux"></i><i class="fa fa-windows"></i><i class="fa fa-apple"></i> <?php echo Filters::noXSS(L('operatingsystems')); ?></a>
+ <a id="globnewprojlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'newproject') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'newproject')); ?>"><?php echo Filters::noXSS(L('newproject')); ?></a>
+ <a id="userrequestlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'userrequest') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'userrequest')); ?>"><?php echo Filters::noXSS(L('pendingnewuserrequest')); ?></a>
+ <a id="translationslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'translations') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'translations')); ?>"><?php echo Filters::noXSS(L('translations')); ?></a>
+ <a id="checkslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'checks') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'checks')); ?>"><?php echo Filters::noXSS(L('adminchecks')); ?></a>
+</div>
diff --git a/themes/CleanFS/templates/admin.newgroup.tpl b/themes/CleanFS/templates/admin.newgroup.tpl
new file mode 100644
index 0000000..af4a758
--- /dev/null
+++ b/themes/CleanFS/templates/admin.newgroup.tpl
@@ -0,0 +1,7 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolbox')); ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('createnewgroup')); ?></h3>
+
+ <?php
+ $this->display('common.newgroup.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.newproject.tpl b/themes/CleanFS/templates/admin.newproject.tpl
new file mode 100644
index 0000000..db6c36f
--- /dev/null
+++ b/themes/CleanFS/templates/admin.newproject.tpl
@@ -0,0 +1,58 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('createnewproject')); ?></h3>
+ <?php echo tpl_form(CreateURL('admin', 'newproject')); ?>
+ <div>
+ <input type="hidden" name="action" value="admin.newproject" />
+ <input type="hidden" name="area" value="newproject" />
+ </div>
+ <ul class="form_elements">
+ <li>
+ <label for="projecttitle"><?php echo Filters::noXSS(L('projecttitle')); ?></label>
+ <input id="projecttitle" name="project_title" value="<?php echo Filters::noXSS(Req::val('project_title')); ?>" type="text" class="required text" size="40" maxlength="100" />
+ </li>
+ <li>
+ <label for="themestyle"><?php echo Filters::noXSS(L('themestyle')); ?></label>
+ <select id="themestyle" name="theme_style">
+ <?php echo tpl_options(Flyspray::listThemes(), Req::val('theme_style', $proj->prefs['theme_style']), true); ?>
+
+ </select>
+ </li>
+ <li>
+ <label for="langcode"><?php echo Filters::noXSS(L('language')); ?></label>
+ <select id="langcode" name="lang_code">
+ <?php echo tpl_options(Flyspray::listLangs(), Req::val('lang_code', $fs->prefs['lang_code']), true); ?>
+ </select>
+ </li>
+ <li>
+ <label for="intromesg"><?php echo Filters::noXSS(L('intromessage')); ?></label>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('intro_message', 8, 70, array('accesskey' => 'r', 'tabindex' => 8, 'id' => 'intromesg'), Req::val('intro_message', $proj->prefs['intro_message'])); ?>
+ <br />
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <button tabindex="9" type="button" onclick="showPreview('intromesg', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ </li>
+ <li>
+ <label for="othersview"><?php echo Filters::noXSS(L('othersview')); ?></label>
+ <?php echo tpl_checkbox('others_view', Req::val('others_view', 0), 'othersview'); ?>
+ </li>
+ <li>
+ <label for="othersviewroadmap"><?php echo Filters::noXSS(L('othersviewroadmap')); ?></label>
+ <?php echo tpl_checkbox('others_viewroadmap', Req::val('others_viewroadmap', 0), 'othersviewroadmap'); ?>
+ </li>
+ <li>
+ <label for="anonopen"><?php echo Filters::noXSS(L('allowanonopentask')); ?></label>
+ <?php echo tpl_checkbox('anon_open', Req::val('anon_open'), 'anonopen'); ?>
+ </li>
+ <li>
+ <label for="disp_intro"><?php echo Filters::noXSS(L('dispintro')); ?></label>
+ <?php echo tpl_checkbox('disp_intro', Req::val('disp_intro', 0), 'disp_intro'); ?>
+ </li>
+ <li>
+ <td class="buttons" colspan="2"><button type="submit" class="positive"><?php echo Filters::noXSS(L('createthisproject')); ?></button></td>
+ </li>
+ </ul>
+ </form>
+</div>
diff --git a/themes/CleanFS/templates/admin.newuser.tpl b/themes/CleanFS/templates/admin.newuser.tpl
new file mode 100644
index 0000000..825ab82
--- /dev/null
+++ b/themes/CleanFS/templates/admin.newuser.tpl
@@ -0,0 +1,7 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolbox')); ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('newuser')); ?></h3>
+
+ <?php
+ $this->display('common.newuser.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.newuserbulk.tpl b/themes/CleanFS/templates/admin.newuserbulk.tpl
new file mode 100644
index 0000000..189e04f
--- /dev/null
+++ b/themes/CleanFS/templates/admin.newuserbulk.tpl
@@ -0,0 +1,7 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolbox')); ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('newuserbulk')); ?></h3>
+
+ <?php
+ $this->display('common.newuserbulk.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.os.tpl b/themes/CleanFS/templates/admin.os.tpl
new file mode 100644
index 0000000..4bbe0da
--- /dev/null
+++ b/themes/CleanFS/templates/admin.os.tpl
@@ -0,0 +1,9 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('oslist')); ?></h3>
+
+ <?php
+ $this->assign('list_type', 'os');
+ $this->assign('rows', $proj->listOs(true));
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.prefs.tpl b/themes/CleanFS/templates/admin.prefs.tpl
new file mode 100644
index 0000000..97d7e6a
--- /dev/null
+++ b/themes/CleanFS/templates/admin.prefs.tpl
@@ -0,0 +1,529 @@
+<script type="text/javascript">
+function ShowHidePassword(id) {
+ if(document.getElementById(id).type=="text") {
+ document.getElementById(id).type="password";
+ } else {
+ document.getElementById(id).type="text";
+ }
+}
+</script>
+<script>
+ /*
+ * Second argument is always the parent calling to deactivate not needed childs
+ * Next args are all childsto be deactivated
+ */
+ function check_change(inverted)
+ {
+ var i;
+ var parent = arguments[1];
+
+ if(document.getElementById(parent).checked)
+ {
+ for (i = 2; i < arguments.length; i++)
+ {
+ if (inverted) {
+ document.getElementById(arguments[i]).checked = false;
+ document.getElementById(arguments[i]).disabled = true;
+ }
+ else {
+ document.getElementById(arguments[i]).checked = true;
+ document.getElementById(arguments[i]).disabled = false;
+ }
+ }
+ }
+ else
+ {
+ for (i = 2; i < arguments.length; i++)
+ {
+ if (inverted) {
+ document.getElementById(arguments[i]).disabled = false;
+ }
+ else {
+ document.getElementById(arguments[i]).disabled = true;
+ }
+ }
+ }
+ }
+</script>
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolboxlong')); ?> :: <?php echo Filters::noXSS(L('preferences')); ?></h3>
+ <?php echo tpl_form(CreateURL('admin', 'prefs')); ?>
+ <ul id="submenu">
+ <li><a href="#general"><?php echo Filters::noXSS(L('general')); ?></a></li>
+ <li><a href="#lookandfeel"><?php echo Filters::noXSS(L('lookandfeel')); ?></a></li>
+ <li><a href="#userregistration"><?php echo Filters::noXSS(L('userregistration')); ?></a></li>
+ <li><a href="#notifications"><?php echo Filters::noXSS(L('notifications')); ?></a></li>
+ <li><a href="#antispam"><?php echo Filters::noXSS(L('antispam')); ?></a></li>
+ </ul>
+
+ <div id="general" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="pagetitle"><?php echo Filters::noXSS(L('pagetitle')); ?></label>
+ <input id="pagetitle" name="page_title" type="text" class="text" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['page_title']); ?>" />
+ </li>
+
+ <li>
+ <label for="defaultproject"><?php echo Filters::noXSS(L('defaultproject')); ?></label>
+ <select id="defaultproject" name="default_project">
+ <?php echo tpl_options(array_merge(array(0 => L('allprojects')), Flyspray::listProjects()), $fs->prefs['default_project']); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="langcode"><?php echo Filters::noXSS(L('language')); ?></label>
+ <select id="langcode" name="lang_code">
+ <?php echo tpl_options(Flyspray::listLangs(), $fs->prefs['lang_code'], true); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="urlrewriting"><?php echo Filters::noXSS(L('urlrewriting')); ?></label>
+ <select id="urlrewriting" name="url_rewriting">
+ <?php echo tpl_options(array('1' => L('on'), '0' => L('off')), $fs->prefs['url_rewriting'], false); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="emailNoHTML"><?php echo Filters::noXSS(L('emailNoHTML')); ?></label>
+ <?php echo tpl_checkbox('emailNoHTML', $fs->prefs['emailNoHTML'], 'emailNoHTML'); ?>
+ </li>
+
+ <li>
+ <?php
+ // TODO WTF?? Isn't that an old temp fix?
+ if (!array_key_exists('logo', $fs->prefs)) {
+ $fs->prefs['logo'] = '';
+ }
+ ?>
+
+ <label for="logo"><?php echo Filters::noXSS(L('showlogo')); ?></label>
+ <?php if ($fs->prefs['logo']):?>
+ <img src="<?php echo Filters::noXSS($baseurl.'/'.$fs->prefs['logo']); ?>">
+ <?php endif ?>
+ </li>
+
+ <li>
+ <label for="logo_input">&nbsp;</label>
+ <input id="logo_input" name="logo" type="file" accept="image/*" value="<?php echo Filters::noXSS($fs->prefs['logo']); ?>" />
+ </li>
+ <li>
+ <label for="massops"><?php echo Filters::noXSS(L('massopsenable')); ?></label>
+ <?php echo tpl_checkbox('massops', $fs->prefs['massops'], 'massops'); ?>
+ </li>
+ <li>
+ <label for="enable_avatars"><?php echo Filters::noXSS(L('enableavatars')); ?></label>
+ <?php echo tpl_checkbox('enable_avatars', $fs->prefs['enable_avatars'], 'enable_avatars', 1, array('onclick'=>'check_change(false, "enable_avatars", "gravatars", "max_avatar_size")')); ?>
+ </li>
+
+ <li>
+ <label for="gravatars"><?php echo Filters::noXSS(L('showgravatars')); ?></label>
+ <?php echo tpl_checkbox('gravatars', $fs->prefs['gravatars'], 'gravatars'); ?>
+ </li>
+
+ <li>
+ <label for="max_avatar_size"><?php echo Filters::noXSS(L('maxavatarsize')); ?></label>
+ <input id="max_avatar_size" name="max_avatar_size" type="text" class="text" size="3" maxlength="3" value="<?php echo Filters::noXSS($fs->prefs['max_avatar_size']); ?>" />
+ </li>
+
+ <li>
+ <label for="hide_emails"><?php echo Filters::noXSS(L('hideemails')); ?></label>
+ <?php echo tpl_checkbox('hide_emails', $fs->prefs['hide_emails'], 'hide_emails'); ?>
+ </li>
+
+ <li>
+ <label for="dateformat"><?php echo Filters::noXSS(L('dateformat')); ?></label>
+ <select id="dateformat" name="dateformat">
+ <?php echo tpl_date_formats($fs->prefs['dateformat']); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="dateformat_extended"><?php echo Filters::noXSS(L('dateformat_extended')); ?></label>
+ <select id="dateformat_extended" name="dateformat_extended">
+ <?php echo tpl_date_formats($fs->prefs['dateformat_extended'], true); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="cache_feeds"><?php echo Filters::noXSS(L('cache_feeds')); ?></label>
+ <select id="cache_feeds" name="cache_feeds">
+ <?php echo tpl_options(array('0' => L('no_cache'), '1' => L('cache_disk'), '2' => L('cache_db')), $fs->prefs['cache_feeds']); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="disable_lostpw"><?php echo Filters::noXSS(L('disable_lostpw')); ?></label>
+ <?php echo tpl_checkbox('disable_lostpw', $fs->prefs['disable_lostpw'], 'disable_lostpw'); ?>
+
+ </li>
+
+ <li>
+ <label for="disablechangepw"><?php echo Filters::noXSS(L('disable_changepw')); ?></label>
+ <?php echo tpl_checkbox('disable_changepw', $fs->prefs['disable_changepw'], 'disablechangepw'); ?>
+ </li>
+
+ <li>
+ <label for="days_before_alert"><?php echo Filters::noXSS(L('daysbeforealert')); ?></label>
+ <input id="days_before_alert" name="days_before_alert" type="text" class="text" size="3" maxlength="3" value="<?php echo Filters::noXSS($fs->prefs['days_before_alert']); ?>" />
+ </li>
+
+ <li>
+ <label for="max_vote_per_day"><?php echo Filters::noXSS(L('maxvoteperday')); ?></label>
+ <input id="max_vote_per_day" name="max_vote_per_day" type="text" class="text" size="3" maxlength="3" value="<?php echo Filters::noXSS($fs->prefs['max_vote_per_day']); ?>" />
+ </li>
+
+ <li>
+ <label for="votes_per_project"><?php echo Filters::noXSS(L('votesperproject')); ?></label>
+ <input id="votes_per_project" name="votes_per_project" type="text" class="text" size="3" maxlength="3" value="<?php echo Filters::noXSS($fs->prefs['votes_per_project']); ?>" />
+ </li>
+
+ <li>
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('pageswelcomemsg')); ?></label>
+ <?php
+ $pages = array(
+ 'index' => L('tasklist'),
+ 'toplevel' => L('toplevel'),
+ 'reports' => L('reports'));
+ $selectedPages = explode(' ', $fs->prefs['pages_welcome_msg']);
+ echo tpl_double_select('pages_welcome_msg', $pages, $selectedPages, false, false);
+ ?>
+ </li>
+
+ <li>
+ <label class="labeltextarea" for="intromesg"><?php echo Filters::noXSS(L('mainmessage')); ?></label>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <button tabindex="9" type="button" onclick="showPreview('intromesg', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('intro_message', 8, 70, array('accesskey' => 'r', 'tabindex' => 8, 'id' => 'intromesg'), Post::val('intro_message', $fs->prefs['intro_message'])); ?>
+ </li>
+ </ul>
+ </div>
+
+ <div id="userregistration" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="allowusersignups"><?php echo Filters::noXSS(L('anonreg')); ?></label>
+ <?php echo tpl_checkbox('anon_reg', $fs->prefs['anon_reg'], 'allowusersignups'); ?>
+ </li>
+
+ <li>
+ <label for="onlyoauthreg"><?php echo Filters::noXSS(L('onlyoauthreg')); ?></label>
+ <?php echo tpl_checkbox('only_oauth_reg', $fs->prefs['only_oauth_reg'], 'onlyoauthreg', 1, array('onclick'=>'check_change(true, "onlyoauthreg", "needapproval", "spamproof")')); ?>
+ </li>
+
+ <li>
+ <label for="needapproval"><?php echo Filters::noXSS(L('regapprovedbyadmin')); ?></label>
+ <?php echo tpl_checkbox('need_approval', $fs->prefs['need_approval'], 'needapproval', 1, ($fs->prefs['only_oauth_reg']) ? array('disabled' => 'disabled', 'onclick' => 'check_change(true, "needapproval", "spamproof")') : array('onclick' => 'check_change("needapproval", "spamproof")')); ?>
+ </li>
+
+ <li><?php /* TODO rename misleading 'spamproof' pref to something like email_verify */ ?>
+ <label for="spamproof"><?php echo Filters::noXSS(L('spamproof')); ?></label>
+ <?php echo tpl_checkbox('spam_proof', $fs->prefs['spam_proof'], 'spamproof', 1, ($fs->prefs['need_approval'] || $fs->prefs['only_oauth_reg'] ) ? array('disabled' => 'true') : ''); ?>
+ </li>
+
+ <li>
+ <label for="repeat_password"><?php echo Filters::noXSS(L('repeatpassword')); ?></label>
+ <?php echo tpl_checkbox('repeat_password', $fs->prefs['repeat_password'], 'repeat_password'); ?>
+ </li>
+
+ <li>
+ <label for="repeat_emailaddress"><?php echo Filters::noXSS(L('repeatemailaddress')); ?></label>
+ <?php echo tpl_checkbox('repeat_emailaddress', $fs->prefs['repeat_emailaddress'], 'repeat_emailaddress'); ?>
+ </li>
+
+ <li>
+ <label for="notify_registration"><?php echo Filters::noXSS(L('notify_registration')); ?></label>
+ <?php echo tpl_checkbox('notify_registration', $fs->prefs['notify_registration'], 'notify_registration'); ?>
+ </li>
+
+ <li>
+ <label for="defaultglobalgroup"><?php echo Filters::noXSS(L('defaultglobalgroup')); ?></label>
+ <select id="defaultglobalgroup" name="anon_group">
+ <?php echo tpl_options(Flyspray::listGroups(), $fs->prefs['anon_group']); ?>
+ </select>
+ </li>
+
+ <li>
+ <label><?php echo Filters::noXSS(L('activeoauths')); ?></label>
+ <?php
+ $oauths = array('github', 'google', 'facebook', 'microsoft'/*, 'instagram', 'eventbrite', 'linkedin', 'vkontakte'*/); //TODO try the commented out for FS 1.1
+ $selectedOauths = explode(' ', $fs->prefs['active_oauths']);
+ echo tpl_double_select('active_oauths', $oauths, $selectedOauths, true, false);
+ ?>
+ </li>
+
+ </ul>
+ </div>
+
+<div id="antispam" class="tab">
+ <h2><?php echo Filters::noXSS(L('antispam')); ?></h2>
+ <p><?php echo Filters::noXSS(L('antispamprefsinfo')); ?></p>
+
+ <h3>Securimage</h3>
+ <p><?php echo Filters::noXSS(L('securimageprefsinfo')); ?></p>
+ <ul class="form_elements">
+ <li>
+ <label for="captcha_securimage"><?php echo Filters::noXSS(L('securimageenable')); ?></label>
+ <?php echo tpl_checkbox('captcha_securimage', isset($fs->prefs['captcha_securimage'])?$fs->prefs['captcha_securimage']:false, 'captcha_securimage'); ?>
+ </li>
+ </ul>
+
+ <h3>Google reCaptcha</h3>
+ <p><?php echo Filters::noXSS(L('recaptchaprefsinfo')); ?></p>
+ <ul class="form_elements">
+ <li>
+ <label for="captcha_recaptcha"><?php echo Filters::noXSS(L('recaptchaenable')); ?></label>
+ <?php echo tpl_checkbox('captcha_recaptcha', isset($fs->prefs['captcha_recaptcha'])?$fs->prefs['captcha_recaptcha']:false, 'captcha_recaptcha'); ?>
+ </li>
+ <li class="recaptchaconf">
+ <label for="captcha_recaptcha_sitekey">sitekey</label>
+ <input id="captcha_recaptcha_sitekey" class="text" type="text" name="captcha_recaptcha_sitekey" value="<?php echo Filters::noXSS(isset($fs->prefs['captcha_recaptcha_sitekey']) ? $fs->prefs['captcha_recaptcha_sitekey']:''); ?>" />
+ </li>
+ <li class="recaptchaconf">
+ <label for="captcha_recaptcha_secret">secret</label>
+ <input id="captcha_recaptcha_secret" class="text" type="text" name="captcha_recaptcha_secret" value="<?php echo Filters::noXSS(isset($fs->prefs['captcha_recaptcha_secret']) ? $fs->prefs['captcha_recaptcha_secret']:''); ?>" />
+ </li>
+ </ul>
+</div>
+
+ <div id="notifications" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="usernotify"><?php echo Filters::noXSS(L('forcenotify')); ?></label>
+ <select id="usernotify" name="user_notify">
+ <?php echo tpl_options(array(L('neversend'), L('userchoose'), L('email'), L('jabber')), $fs->prefs['user_notify']); ?>
+ </select>
+ </li>
+ </ul>
+
+ <fieldset><legend><?php echo Filters::noXSS(L('emailnotify')); ?></legend>
+ <ul class="form_elements">
+ <li>
+ <label for="adminemail"><?php echo Filters::noXSS(L('fromaddress')); ?></label>
+ <input id="adminemail" name="admin_email" class="text" type="text" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['admin_email']); ?>" />
+ </li>
+
+ <li>
+ <label for="smtpserv"><?php echo Filters::noXSS(L('smtpserver')); ?></label>
+ <input id="smtpserv" name="smtp_server" class="text" type="text" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['smtp_server']); ?>" />
+ <?php if (extension_loaded('openssl')) : ?>
+ <?php echo tpl_checkbox('email_ssl', $fs->prefs['email_ssl'], 'email_ssl'); ?> <label class="inline" for="email_ssl"><?php echo Filters::noXSS(L('ssl')); ?></label>
+ <?php echo tpl_checkbox('email_tls', $fs->prefs['email_tls'], 'email_tls'); ?> <label class="inline" for="email_tls"><?php echo Filters::noXSS(L('tls')); ?></label>
+ <?php endif; ?>
+ </li>
+
+ <li>
+ <label for="smtpuser"><?php echo Filters::noXSS(L('smtpuser')); ?></label>
+ <input id="smtpuser" name="smtp_user" class="text" type="text" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['smtp_user']); ?>" />
+ </li>
+
+ <li>
+ <label for="smtppass"><?php echo Filters::noXSS(L('smtppass')); ?></label>
+ <input id="smtppass" name="smtp_pass" class="text" type="password" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['smtp_pass']); ?>" />
+ </li>
+ <li>
+ <label for="showsmtppass"><?php echo Filters::noXSS(L('showpass')); ?></label>
+ <input id="showsmtppass" name="show_smtp_pass" class="text" type="checkbox" onclick="ShowHidePassword('smtppass')"/>
+ </li>
+ </ul>
+ <?php echo Filters::noXSS(L('testmailsettings')); ?>: <button onclick="testEmail();return false;"><?php echo Filters::noXSS(L('test')); ?></button><div id="emailresult" style="display:inline-block;"></div> <?php echo Filters::noXSS(L('testmailsettingsnotice')); ?>.
+<script>
+function testEmail(){
+ var xmlHttp = new XMLHttpRequest();
+
+ xmlHttp.onreadystatechange = function(){
+ if(xmlHttp.readyState == 4){
+ var target = document.getElementById('emailresult');
+ if(xmlHttp.status == 200){
+ if(xmlHttp.responseText=='ok'){
+ target.style["background-color"]='#66ff00';
+ target.innerHTML = '<i class="fa fa-check fa-2x"></i> '+xmlHttp.responseText;
+ } else{
+ target.innerHTML = '<i class="fa fa-warning fa-2x" style="color:#ff0"></i>' + xmlHttp.responseText;
+ target.style["background-color"]='#ff6600';
+ }
+ } else{
+ target.innerHTML = '<i class="fa fa-warning fa-2x" style="color:#ff0"></i>' + xmlHttp.responseText;
+ target.style["background-color"]='#ff6600';
+ }
+ }
+ }
+ xmlHttp.open("POST", "<?php echo Filters::noXSS($baseurl); ?>js/callbacks/testemail.php", true);
+ xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
+ xmlHttp.send("name=email&csrftoken=<?php echo $_SESSION['csrftoken'] ?>");
+}
+</script>
+ </fieldset>
+
+ <fieldset><legend><?php echo Filters::noXSS(L('jabbernotify')); ?></legend>
+ <ul class="form_elements">
+ <li>
+ <label for="jabberserver"><?php echo Filters::noXSS(L('jabberserver')); ?></label>
+ <input id="jabberserver" class="text" type="text" name="jabber_server" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['jabber_server']); ?>" />
+ <?php if(extension_loaded('openssl')) : ?>
+ <select id="jabber_ssl" name="jabber_ssl">
+ <?php echo tpl_options(array('0' => L('none'), '1' => L('ssl'), '2' => L('tls')), $fs->prefs['jabber_ssl']); ?>
+ </select>
+ <label class="inline" for="jabber_ssl"><?php echo Filters::noXSS(L('ssl')); ?> / <?php echo Filters::noXSS(L('tls')); ?></label>
+ <?php endif; ?>
+ </li>
+
+ <li>
+ <label for="jabberport"><?php echo Filters::noXSS(L('jabberport')); ?></label>
+ <input id="jabberport" class="text" type="text" name="jabber_port" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['jabber_port']); ?>" />
+ </li>
+
+ <li>
+ <label for="jabberusername"><?php echo Filters::noXSS(L('jabberuser')); ?></label>
+ <input id="jabberusername" class="text" type="text" name="jabber_username" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['jabber_username']); ?>" />
+ </li>
+
+ <li>
+ <label for="jabberpassword"><?php echo Filters::noXSS(L('jabberpass')); ?></label>
+ <input id="jabberpassword" name="jabber_password" class="text" type="password" maxlength="100" value="<?php echo Filters::noXSS($fs->prefs['jabber_password']); ?>" />
+ </li>
+
+ <li>
+ <label for="showjabberpass"><?php echo Filters::noXSS(L('showpass')); ?></label>
+ <input id="showjabberpass" name="show_jabber_pass" class="text" type="checkbox" onclick="ShowHidePassword('jabberpassword')"/>
+ </li>
+
+ </ul>
+ </fieldset>
+ </div>
+
+<div id="lookandfeel" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="globaltheme"><?php echo Filters::noXSS(L('globaltheme')); ?></label>
+ <select id="globaltheme" name="global_theme">
+ <?php echo tpl_options(Flyspray::listThemes(), $fs->prefs['global_theme'], true); ?>
+ </select>
+ <label for="customstyle" style="width:auto"><?php echo Filters::noXSS(L('customstyle')); ?></label>
+ <select id="customstyle" name="custom_style">
+ <?php
+ $customs[]=array('', L('no'));
+ $customstyles=glob_compat(BASEDIR ."/themes/".($proj->prefs['theme_style'])."/custom_*.css");
+ foreach ($customstyles as $cs){
+ $customs[]=array($cs,$cs);
+ }
+ echo tpl_options($customs, $proj->prefs['custom_style']);
+ ?>
+ </select>
+ </li>
+ <li>
+ <label for="default_entry"><?php echo Filters::noXSS(L('defaultentry')); ?></label>
+ <select id="default_entry" name="default_entry">
+ <?php echo tpl_options(array('index' => L('tasklist'),'toplevel' => L('toplevel')), Post::val('default_entry', $proj->prefs['default_entry'])); ?>
+ </select>
+ </li>
+
+ <?php // Set the selectable column names
+ // Do NOT use real database column name here and in the next list,
+ // but a term from translation table entries instead, because it's
+ // also used elsewhere to draw a localized version of the name.
+ // Look also at the end of function
+ // tpl_draw_cell in scripts/index.php for further explanation.
+ $columnnames = array(
+ 'id' => L('id'),
+ 'project' => L('project'),
+ 'parent' => L('parent'),
+ 'tasktype' => L('tasktype'),
+ 'category' => L('category'),
+ 'severity' => L('severity'),
+ 'priority' => L('priority'),
+ 'summary' => L('summary'),
+ 'dateopened' => L('dateopened'),
+ 'status' => L('status'),
+ 'openedby' => L('openedby'),
+ 'private' => L('private'),
+ 'assignedto' => L('assignedto'),
+ 'lastedit' => L('lastedit'),
+ 'editedby' => L('editedby'),
+ 'reportedin' => L('reportedin'),
+ 'dueversion' => L('dueversion'),
+ 'duedate' => L('duedate'),
+ 'comments' => L('comments'),
+ 'attachments' => L('attachments'),
+ 'progress' => L('progress'),
+ 'dateclosed' => L('dateclosed'),
+ 'closedby' => L('closedby'),
+ 'os' => L('os'),
+ 'votes' => L('votes'),
+ 'estimatedeffort' => L('estimatedeffort'),
+ 'effort' => L('effort'));
+ $selectedcolumns = explode(' ', Post::val('visible_columns', $fs->prefs['visible_columns']));
+ ?>
+
+ <li>
+ <label for="default_order_by"><?php echo Filters::noXSS(L('defaultorderby')); ?></label>
+ <select id="default_order_by" name="default_order_by">
+ <?php echo tpl_options($columnnames, $proj->prefs['sorting'][0]['field'], false); ?>
+ </select>
+ <select id="default_order_by_dir" name="default_order_by_dir">
+ <?php echo tpl_options(array('asc' => L('ascending'), 'desc' => L('descending')), $proj->prefs['sorting'][0]['dir'], false); ?>
+ </select>
+ </li>
+ <li>
+ <label for="default_order_by2"><?php echo Filters::noXSS(L('defaultorderby2')); ?></label>
+ <select id="default_order_by2" name="default_order_by2">
+ <?php echo tpl_options($columnnames, $proj->prefs['sorting'][1]['field'], false); ?>
+ </select>
+ <select id="default_order_by_dir2" name="default_order_by_dir2">
+ <?php echo tpl_options(array('asc' => L('ascending'), 'desc' => L('descending')), $proj->prefs['sorting'][1]['dir'], false); ?>
+ </select>
+ </li>
+
+ <li>
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('visiblecolumns')); ?></label>
+ <?php echo tpl_double_select('visible_columns', $columnnames, $selectedcolumns, false); ?>
+ </li>
+
+ <li>
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('visiblefields')); ?></label>
+ <?php // Set the selectable field names
+ $fieldnames = array(
+ 'parent' => L('parent'),
+ 'tasktype' => L('tasktype'),
+ 'category' => L('category'),
+ 'severity' => L('severity'),
+ 'priority' => L('priority'),
+ 'status' => L('status'),
+ 'private' => L('private'),
+ 'assignedto' => L('assignedto'),
+ 'reportedin' => L('reportedin'),
+ 'dueversion' => L('dueversion'),
+ 'duedate' => L('duedate'),
+ 'progress' => L('progress'),
+ 'os' => L('os'),
+ 'votes' => L('votes'));
+ $selectedfields = explode(' ', Post::val('visible_fields', $fs->prefs['visible_fields']));
+ echo tpl_double_select('visible_fields', $fieldnames, $selectedfields, false);
+ ?>
+ </li>
+
+ <?php if(isset($fs->prefs['general_integration'])): ?>
+ <li>
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('generalintegration')); ?></label>
+ <?php echo TextFormatter::textarea('general_integration', 8, 70, array('id'=>'general_integration'), Post::val('general_integration', $fs->prefs['general_integration'])); ?>
+ </li>
+ <?php endif; ?>
+
+ <?php if(isset($fs->prefs['footer_integration'])): ?>
+ <li>
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('footerintegration')); ?></label>
+ <?php echo TextFormatter::textarea('footer_integration', 8, 70, array('id'=>'footer_integration'), Post::val('footer_integration', $fs->prefs['footer_integration'])); ?>
+ </li>
+ <?php endif; ?>
+
+ </ul>
+ </div>
+ <div class="tbuttons">
+ <input type="hidden" name="action" value="globaloptions" />
+ <button type="submit" class="positive"><?php echo Filters::noXSS(L('saveoptions')); ?></button>
+ <button type="reset"><?php echo Filters::noXSS(L('resetoptions')); ?></button>
+ </div>
+ </form>
+</div>
diff --git a/themes/CleanFS/templates/admin.resolution.tpl b/themes/CleanFS/templates/admin.resolution.tpl
new file mode 100644
index 0000000..e8b78dc
--- /dev/null
+++ b/themes/CleanFS/templates/admin.resolution.tpl
@@ -0,0 +1,8 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('resolutionlist')); ?></h3>
+ <?php
+ $this->assign('list_type', 'resolution');
+ $this->assign('rows', $proj->listResolutions(true));
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.status.tpl b/themes/CleanFS/templates/admin.status.tpl
new file mode 100644
index 0000000..c38e6a9
--- /dev/null
+++ b/themes/CleanFS/templates/admin.status.tpl
@@ -0,0 +1,9 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('taskstatuses')); ?></h3>
+
+ <?php
+ $this->assign('list_type', 'status');
+ $this->assign('rows', $proj->listTaskStatuses(true));
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.tag.tpl b/themes/CleanFS/templates/admin.tag.tpl
new file mode 100644
index 0000000..2b5afd1
--- /dev/null
+++ b/themes/CleanFS/templates/admin.tag.tpl
@@ -0,0 +1,10 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('tags')); ?></h3>
+ <p>Tag management is in development.</p>
+ <p>Please see <a href="https://bugs.flyspray.org/2012" target="_blank">bugs.flyspray.org/2012</a> for status of <b>Tags</b> feature.</p>
+<?php
+ $this->assign('list_type', 'tag');
+ $this->assign('rows', $proj->listTags(true));
+ $this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/admin.tasktype.tpl b/themes/CleanFS/templates/admin.tasktype.tpl
new file mode 100644
index 0000000..0ceff33
--- /dev/null
+++ b/themes/CleanFS/templates/admin.tasktype.tpl
@@ -0,0 +1,8 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('tasktypes')); ?></h3>
+ <?php
+ $this->assign('list_type', 'tasktype');
+ $this->assign('rows', $proj->listTaskTypes(true));
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.translation.tpl b/themes/CleanFS/templates/admin.translation.tpl
new file mode 100644
index 0000000..f0b575c
--- /dev/null
+++ b/themes/CleanFS/templates/admin.translation.tpl
@@ -0,0 +1 @@
+<?php echo $content; ?>
diff --git a/themes/CleanFS/templates/admin.userrequest.tpl b/themes/CleanFS/templates/admin.userrequest.tpl
new file mode 100644
index 0000000..badc98b
--- /dev/null
+++ b/themes/CleanFS/templates/admin.userrequest.tpl
@@ -0,0 +1,50 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('pendingrequests')); ?></h3>
+
+ <?php if (!count($pendings)): ?>
+ <?php echo Filters::noXSS(L('nopendingreq')); ?>
+
+ <?php else: ?>
+ <table class="requests">
+ <tr>
+ <th><?php echo Filters::noXSS(L('eventdesc')); ?></th>
+ <th><?php echo Filters::noXSS(L('requestedby')); ?></th>
+ <th><?php echo Filters::noXSS(L('daterequested')); ?></th>
+ <th><?php echo Filters::noXSS(L('emailaddress')); ?></th>
+ <th class="pm-buttons"> </th>
+ </tr>
+ <?php foreach ($pendings as $req): ?>
+ <tr>
+ <td>
+ New User Request
+ </td>
+ <td><?php echo tpl_userlink($req['submitted_by']); ?></td>
+ <td><?php echo Filters::noXSS(formatDate($req['time_submitted'], true)); ?></td>
+ <td><?php echo Filters::noXSS($req['reason_given']); ?></td>
+ <td>
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('edituser', $req['submitted_by'])), null, null, null, 'style="display:inline"'); ?>
+ <input type="submit" value="<?php echo Filters::noXSS(L('accept')); ?>">
+ <input type="hidden" name="action" value="approve.user"/>
+ <input type="hidden" name="user_id" value="<?php echo $req['submitted_by']; ?>"/>
+ <input type="hidden" name="account_enabled" value="1"/>
+ </form>
+
+ <button class="submit" onclick="showhidestuff('denyform<?php echo Filters::noXSS($req['request_id']); ?>');"><?php echo Filters::noXSS(L('deny')); ?></button>
+ <div id="denyform<?php echo Filters::noXSS($req['request_id']); ?>" class="denyform">
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('admin','userrequest'))); ?>
+ <div>
+ <input type="hidden" name="action" value="denyuserreq" />
+ <input type="hidden" name="req_id" value="<?php echo Filters::noXSS($req['request_id']); ?>" />
+ <label for="deny_reason<?php echo Filters::noXSS($req['request_id']); ?>" class="inline"><?php echo Filters::noXSS(L('reasonfordeinal')); ?></label><br />
+ <textarea cols="40" rows="5" name="deny_reason" id="deny_reason<?php echo Filters::noXSS($req['request_id']); ?>"></textarea>
+ <br />
+ <button type="submit"><?php echo Filters::noXSS(L('deny')); ?></button>
+ </div>
+ </form>
+ </div>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ <?php endif; ?>
+</div>
diff --git a/themes/CleanFS/templates/admin.users.tpl b/themes/CleanFS/templates/admin.users.tpl
new file mode 100644
index 0000000..25e89ad
--- /dev/null
+++ b/themes/CleanFS/templates/admin.users.tpl
@@ -0,0 +1,6 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('admintoolboxlong')); ?> :: <?php echo Filters::noXSS(L('edituser')); ?> : <?php echo Filters::noXSS($theuser->infos['user_name']); ?></h3>
+ <fieldset><legend><?php echo Filters::noXSS(L('edituser')); ?></legend>
+ <?php $this->display('common.profile.tpl'); ?>
+ </fieldset>
+</div>
diff --git a/themes/CleanFS/templates/admin.version.tpl b/themes/CleanFS/templates/admin.version.tpl
new file mode 100644
index 0000000..196fac9
--- /dev/null
+++ b/themes/CleanFS/templates/admin.version.tpl
@@ -0,0 +1,8 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('versionlist')); ?></h3>
+ <?php
+ $this->assign('list_type', 'version');
+ $this->assign('rows', $proj->listVersions(true));
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/common.attachments.tpl b/themes/CleanFS/templates/common.attachments.tpl
new file mode 100644
index 0000000..ee0898b
--- /dev/null
+++ b/themes/CleanFS/templates/common.attachments.tpl
@@ -0,0 +1,50 @@
+ <?php
+ if ($attachments && $user->can_view_task($task_details)): ?>
+ <div class="attachments">
+ <?php foreach ($attachments as $attachment): ?>
+ <?php if (file_exists(BASEDIR . '/attachments/' . $attachment['file_name'])): ?>
+ <a title="<?php echo Filters::noXSS($attachment['orig_name']); ?>" href="?getfile=<?php echo Filters::noXSS($attachment['attachment_id']); ?>" <?php if (substr($attachment['file_type'], 0, 5) == 'image'): ?>rel="lightbox[bug]"<?php endif; ?>>
+ <?php else: ?>
+ <del>
+ <?php endif; ?>
+ <?php
+ // Strip the mimetype to get the icon image name
+ list($main) = explode('/', $attachment['file_type']);
+ $imgdir = BASEDIR . "/themes/".Filters::noXSS($proj->prefs['theme_style'])."/mime/";
+ $imgpath = Filters::noXSS($baseurl)."themes/".Filters::noXSS($proj->prefs['theme_style'])."/mime/";
+ if (file_exists($imgdir.$attachment['file_type'] . '.png')):
+ ?>
+ <img src="<?php echo Filters::noXSS($imgpath); ?><?php echo Filters::noXSS($attachment['file_type']); ?>.png" alt="(<?php echo Filters::noXSS($attachment['file_type']); ?>)" title="<?php echo Filters::noXSS($attachment['file_type']); ?>" />
+ <?php else: ?>
+ <img src="<?php echo Filters::noXSS($imgpath); ?><?php echo Filters::noXSS($main); ?>.png" alt="" title="<?php echo Filters::noXSS($attachment['file_type']); ?>" />
+ <?php endif; ?>
+ &nbsp;&nbsp;
+ <?php if (utf8_strlen($attachment['orig_name']) > 30): ?>
+ <?php echo Filters::noXSS(utf8_substr($attachment['orig_name'], 0, 29)); ?>...
+ <?php else: ?>
+ <?php echo Filters::noXSS($attachment['orig_name']); ?>
+
+ <?php endif; ?>
+ <?php if (file_exists(BASEDIR . '/attachments/' . $attachment['file_name'])): ?>
+ </a>
+ <?php else: ?>
+ </del>
+ <?php endif; ?>
+ <?php if ($attachment['file_size'] < 1000000): ?>
+ (<?php echo Filters::noXSS(round($attachment['file_size']/1024,1)); ?> <?php echo Filters::noXSS(L('KiB')); ?>)
+ <?php else: ?>
+ (<?php echo Filters::noXSS(round($attachment['file_size']/1024/1024,2)); ?> <?php echo Filters::noXSS(L('MiB')); ?>)
+ <?php endif; ?>
+ <?php
+ # showing additional download links for images is a temporary fix, because the lightbox plugin used in <=FS1.0 (a lightbox version from 2008!) catches also right mouse clicks :-(.
+ # So you cannot just choose 'Save as..' context menu option.
+ # When the javascript based features of Flyspray (a big task, planned ~FS1.1) moved complete to (probably) jquery (used also by dokuwiki so prefered) and a jquery based lightbox/fancybox is used, this can be removed.
+ if(file_exists(BASEDIR . '/attachments/' . $attachment['file_name']) && substr($attachment['file_type'], 0, 5) == 'image' ): ?>
+ <a class="fa fa-download" title="Download <?php echo Filters::noXSS($attachment['orig_name']); ?>" href="?getfile=<?php echo Filters::noXSS($attachment['attachment_id']); ?>&amp;dl"></a>
+ <?php endif; ?>
+ <br />
+ <?php endforeach; ?>
+ </div>
+ <?php elseif (count($attachments)): ?>
+ <div class="attachments"><?php echo Filters::noXSS(L('attachnoperms')); ?></div>
+ <?php endif; ?>
diff --git a/themes/CleanFS/templates/common.cat.tpl b/themes/CleanFS/templates/common.cat.tpl
new file mode 100644
index 0000000..fb0e613
--- /dev/null
+++ b/themes/CleanFS/templates/common.cat.tpl
@@ -0,0 +1,157 @@
+<p><?php echo Filters::noXSS(L('listnote')); ?></p>
+<?php if ($do=='pm'): ?>
+<h3><?php echo Filters::noXSS(L('categoriesglobal')); ?></h3>
+<table class="list" id="idtablesys">
+<colgroup>
+ <col class="cname" />
+ <col class="cowner" />
+ <col class="cshow" />
+ <col class="cdelete" />
+ <col class="cusage" />
+</colgroup>
+<thead>
+<tr>
+ <th><?php echo Filters::noXSS(L('name')); ?></th>
+ <th><?php echo Filters::noXSS(L('owner')); ?></th>
+ <th><?php echo Filters::noXSS(L('show')); ?></th>
+ <th>&nbsp;</th>
+ <th><?php echo Filters::noXSS(L('usedintasks')); ?></th>
+</tr>
+</thead>
+<tbody>
+<?php if (isset($sysrows) && count($sysrows)): ?>
+<?php
+$syscountlines=-1;
+foreach ($sysrows as $row):
+$syscountlines++;
+?>
+<tr>
+ <td class="first"><span class="depthmark"><?php echo str_repeat('&rarr;', $row['depth']); ?></span><?php echo Filters::noXSS($row['category_name']); ?></td>
+ <td><?php echo ($row['category_owner']==0)? '': Filters::noXSS($row['category_owner']); ?></td>
+ <td title="<?php echo Filters::noXSS(L('showtip')); ?>"><?php echo $row['show_in_list']; ?></td>
+ <td>&nbsp;</td>
+ <td><?php echo $row['used_in_tasks'] >0 ? $row['used_in_tasks']:''; ?></td>
+</tr>
+<?php endforeach; ?>
+<?php else: ?>
+<tr><td colspan="5"><?php echo Filters::noXSS(L('novalues')); ?></td></tr>
+<?php endif; ?>
+</tbody>
+</table>
+<?php endif; ?>
+<h3><?php echo $do=='pm' ? Filters::noXSS(L('categoriesproject')) : Filters::noXSS(L('categoriesglobal')); ?></h3>
+<?php
+$countlines = -1;
+$categories = $proj->listCategories($proj->id, false, false, false);
+if ( count($categories) ){
+ $root = $categories[0];
+ unset($categories[0]);
+} else{
+ $root=array();
+}
+
+if (count($categories)) : ?>
+<div id="controlBox">
+ <div class="grip"></div>
+ <div class="inner">
+ <a style="display:block;text-align:center;" href="#" onclick="TableControl.up('catTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/up.png" alt="Up" /></a>
+ <a href="#" onclick="TableControl.shallower('catTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/left.png" alt="Left" /></a>
+ <a href="#" onclick="TableControl.deeper('catTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/right.png" alt="Right" /></a>
+ <a style="display:block;text-align:center;" href="#" onclick="TableControl.down('catTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/down.png" alt="Down" /></a>
+</div>
+</div>
+<?php endif; ?>
+<?php echo tpl_form(Filters::noXSS(CreateURL($do, 'cat', $proj->id))); ?>
+ <table class="list" id="catTable">
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('name')); ?></th>
+ <th><?php echo Filters::noXSS(L('owner')); ?></th>
+ <th><?php echo Filters::noXSS(L('show')); ?></th>
+ <th><?php echo Filters::noXSS(L('delete')); ?></th>
+ <th><?php echo Filters::noXSS(L('usedintasks')); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach ($categories as $row):
+ $countlines++;
+ ?>
+ <tr class="depth<?php echo Filters::noXSS($row['depth']); ?>">
+ <td class="first">
+ <input type="hidden" name="lft[<?php echo Filters::noXSS($row['category_id']); ?>]" value="<?php echo Filters::noXSS($row['lft']); ?>" />
+ <input type="hidden" name="rgt[<?php echo Filters::noXSS($row['category_id']); ?>]" value="<?php echo Filters::noXSS($row['rgt']); ?>" />
+ <span class="depthmark"><?php echo str_repeat('&rarr;', intval($row['depth'])); ?></span>
+ <input id="categoryname<?php echo Filters::noXSS($countlines); ?>" class="text" type="text" maxlength="40" name="list_name[<?php echo Filters::noXSS($row['category_id']); ?>]" value="<?php echo Filters::noXSS($row['category_name']); ?>" />
+ </td>
+ <td title="<?php echo Filters::noXSS(L('categoryownertip')); ?>">
+ <?php echo tpl_userselect('category_owner[' . $row['category_id'] . ']' . $countlines, $row['category_owner'], 'categoryowner' . $countlines); ?>
+
+ </td>
+ <td title="<?php echo Filters::noXSS(L('listshowtip')); ?>">
+ <?php echo tpl_checkbox('show_in_list[' . $row['category_id'] . ']', $row['show_in_list'], 'showinlist'.$countlines); ?>
+
+ </td>
+ <td title="<?php echo Filters::noXSS(L('listdeletetip')); ?>">
+ <input id="delete<?php echo Filters::noXSS($row['category_id']); ?>" type="checkbox"
+ <?php if ($row['used_in_tasks']): ?>disabled="disabled"<?php endif; ?>
+ name="delete[<?php echo Filters::noXSS($row['category_id']); ?>]" value="1" />
+ </td>
+ <td><?php echo $row['used_in_tasks'] >0 ? $row['used_in_tasks']:''; ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ <?php if($countlines > -1): ?>
+ <tr>
+ <td colspan="4"></td>
+ <td class="buttons">
+ <input type="hidden" name="action" value="update_category" />
+ <input type="hidden" name="list_type" value="category" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('update')); ?></button>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ <?php if (count($categories)): ?>
+ <script type="text/javascript">
+ <?php
+ echo 'TableControl.create("catTable",{
+ controlBox: "controlBox",
+ tree: true,
+ spreadActiveClass: true
+ });';
+ echo 'new Draggable("controlBox",{
+ handle: "grip"
+ });';
+ ?>
+ </script>
+ <?php endif; ?>
+</form>
+<hr />
+<?php echo tpl_form(Filters::noXSS(CreateURL($do, 'cat', $proj->id))); ?>
+ <table class="list">
+ <tr>
+ <td>
+ <input id="listnamenew" class="text" type="text" maxlength="40" name="list_name" autofocus />
+ </td>
+ <td title="<?php echo Filters::noXSS(L('categoryownertip')); ?>">
+ <?php echo tpl_userselect('category_owner', Req::val('category_owner'), 'categoryownernew'); ?>
+
+ </td>
+ <td title="<?php echo Filters::noXSS(L('categoryparenttip')); ?>">
+ <label for="parent_id"><?php echo Filters::noXSS(L('parent')); ?></label>
+ <select id="parent_id" name="parent_id">
+ <option value="<?php echo Filters::noXSS($root['category_id']); ?>"><?php echo Filters::noXSS(L('notsubcategory')); ?></option>
+ <?php echo tpl_options($proj->listCategories($proj->id, false), Req::val('parent_id')); ?>
+ </select>
+ </td>
+ <td class="buttons">
+ <input type="hidden" name="action" value="<?php echo Filters::noXSS($do); ?>.add_category" />
+ <input type="hidden" name="area" value="<?php echo Filters::noXSS(Req::val('area')); ?>" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('addnew')); ?></button>
+ </td>
+ </tr>
+ </table>
+</form>
diff --git a/themes/CleanFS/templates/common.datepicker.tpl b/themes/CleanFS/templates/common.datepicker.tpl
new file mode 100644
index 0000000..48a11e0
--- /dev/null
+++ b/themes/CleanFS/templates/common.datepicker.tpl
@@ -0,0 +1,9 @@
+<?php if ($label): ?>
+<label for="<?php echo Filters::noXSS($name); ?>"><?php echo Filters::noXSS($label); ?></label>
+<?php endif; ?>
+<input id="<?php echo Filters::noXSS($name); ?>" type="text" class="text" size="10" name="<?php echo Filters::noXSS($name); ?>" placeholder=" " value="<?php echo Filters::noXSS($date); ?>" />
+
+<a class="datelink" href="#" id="<?php echo Filters::noXSS($name); ?>dateview">
+ <!--<img src="<?php echo Filters::noXSS($this->get_image('x-office-calendar')); ?>" alt="<?php echo Filters::noXSS(L('selectdate')); ?>" />-->
+</a>
+<script type="text/javascript">Calendar.setup({daFormat: '<?php echo Filters::noJsXSS($dateformat); ?>',inputField: "<?php echo Filters::noXSS($name); ?>", button: "<?php echo Filters::noXSS($name); ?>dateview"});</script>
diff --git a/themes/CleanFS/templates/common.dualselect.tpl b/themes/CleanFS/templates/common.dualselect.tpl
new file mode 100644
index 0000000..f207aa7
--- /dev/null
+++ b/themes/CleanFS/templates/common.dualselect.tpl
@@ -0,0 +1,15 @@
+<div class="double_select">
+ <select class="dualselect_selectable" id="l<?php echo Filters::noXSS($id); ?>" multiple="multiple"
+ ondblclick="dualSelect(this, 'r', '<?php echo Filters::noJsXSS($id); ?>')">%s</select>
+ <div class="dualselect_buttons">
+ <button type="button" onmouseup="dualSelect('l', 'r', '<?php echo Filters::noJsXSS($id); ?>')"><?php echo eL('add'); ?> &#x25b6;</button>
+ <button type="button" onmouseup="dualSelect('r', 'l', '<?php echo Filters::noJsXSS($id); ?>')">&#x25c0; <?php echo eL('remove'); ?></button>
+ </div>
+ <div class="dualselect_selected">
+ <?php if($updown): ?><button type="button" onmouseup="selectMove('<?php echo Filters::noJsXSS($id); ?>', -1)">&#x25b2;</button><br /><?php endif; ?>
+ <select id="r<?php echo Filters::noXSS($id); ?>" multiple="multiple"
+ ondblclick="dualSelect(this, 'l', '<?php echo Filters::noJsXSS($id); ?>')">%s</select>
+ <?php if($updown): ?><button type="button" onmouseup="selectMove('<?php echo Filters::noJsXSS($id); ?>', 1)">&#x25bc;</button><?php endif; ?>
+ <input type="hidden" value="<?php echo Filters::noXSS(join(' ', $selected)); ?>" id="v<?php echo Filters::noXSS($id); ?>" name="<?php echo Filters::noXSS($name); ?>" />
+ </div>
+</div>
diff --git a/themes/CleanFS/templates/common.editallusers.tpl b/themes/CleanFS/templates/common.editallusers.tpl
new file mode 100644
index 0000000..4a49d81
--- /dev/null
+++ b/themes/CleanFS/templates/common.editallusers.tpl
@@ -0,0 +1,137 @@
+<script>
+function toggleCheckbox(id)
+{
+ var el = document.getElementById(id);
+ if (el != null) {
+ if (el.checked) {
+ el.checked = false;
+ } else {
+ el.checked = true;
+ }
+ }
+}
+</script>
+<?php
+ $showstats=(isset($_GET['showfields']) && in_array('stats',$_GET['showfields'])) ? 1 : 0;
+ $showltf= (isset($_GET['showfields']) && in_array('ltf', $_GET['showfields'])) ? 1 : 0;
+ ?>
+<form action="<?php echo Filters::noXSS(createURL($do, 'editallusers'));?>" method="get">
+<input type="hidden" name="do" value="admin" />
+<input type="hidden" name="area" value="editallusers" />
+<div style="background-color:#ff9">Note: Choosing the "statistics" option here can result in a slow SQL query depending on your amount of existing tasks and users! The other options are fast.</div>
+<select name="showfields[]" multiple="multiple" size="3">
+<option value="-">---basic---</option>
+<option value="stats"<?php echo $showstats? ' selected="selected"':'';?>>statistics</option>
+<option value="ltf"<?php echo $showltf? ' selected="selected"':'';?>>language, timezone, dateformat</option>
+</select>
+<button type="submit">Show selected fields</button>
+</form>
+<?php
+if ($do == 'admin'): echo tpl_form(Filters::noXSS(createURL($do, 'editallusers')), null, null, null, 'id="editallusers"');
+ else: echo tpl_form(Filters::noXSS($_SERVER['SCRIPT_NAME']), null, null, null, 'id="editallusers"');
+endif;
+if ($do == 'admin'): ?>
+ <input type="hidden" name="action" value="admin.editallusers" />
+ <input type="hidden" name="do" value="admin" />
+ <input type="hidden" name="area" value="editallusers" />
+<?php endif; ?>
+<style>.bulkedituser td.inactive{color:#999;}</style>
+<table class="bulkedituser">
+ <thead>
+ <tr class="account_header">
+ <th></th>
+ <th><?= eL('realname') ?></th>
+ <th><?= eL('username') ?></th>
+ <th><?= eL('emailaddress') ?></th>
+ <th><?= eL('jabberid') ?></th>
+ <th><?= eL('regdate') ?></th>
+ <th><?= eL('lastlogin') ?></th>
+<?php if($showstats): ?>
+ <th>opened_by</th>
+ <th>closed_by</th>
+ <th>last_edited_by</th>
+ <th>assigned</th>
+ <th>comments</th>
+ <th>votes</th>
+<?php endif; ?>
+<?php if($showltf): ?>
+ <th><?= eL('language') ?></th>
+ <th><?= eL('timezone') ?></th>
+ <th><?= eL('dateformat') ?></th>
+ <th><?= eL('dateformat_extended') ?></th>
+<?php endif; ?>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+$listopts=null;
+if($showstats){ $listopts['stats']=1; }
+foreach (Flyspray::listUsers($listopts) as $usr): ?>
+<tr class="<?php echo ($usr['account_enabled']) ? 'account_enabled':'account_disabled'; ?>" onclick="toggleCheckbox('<?php echo $usr['user_id']; ?>')">
+ <td><input id="<?php echo $usr['user_id'] ?>" onclick="event.stopPropagation()" type="checkbox" name="checkedUsers[]" value="<?php echo $usr['user_id']; ?>"></td>
+ <td><a href="<?php echo createURL('edituser', $usr['user_id'] ); ?>"><?php echo Filters::noXSS($usr['real_name']); ?></a></td>
+ <td><?php echo $usr['user_name']; ?></td>
+ <td<?= ($usr['notify_type']==0 || $usr['notify_type']==2) ? ' class="inactive"':''; ?>><?php echo Filters::noXSS($usr['email_address']); ?></td>
+ <td<?= ($usr['notify_type']==0 || $usr['notify_type']==1) ? ' class="inactive"':''; ?>><?php echo Filters::noXSS($usr['jabber_id']); ?></td>
+ <td><?php echo formatDate($usr['register_date']); ?></td>
+ <td><?php echo formatDate($usr['last_login']); ?></td>
+<?php if($showstats): ?>
+ <td><?php echo $usr['countopen']>0 ? $usr['countopen']:''; ?></td>
+ <td><?php echo $usr['countclose']>0 ? $usr['countclose']:''; ?></td>
+ <td><?php echo $usr['countlastedit']>0 ? $usr['countlastedit']:''; ?></td>
+ <td><?php echo $usr['countassign']>0 ? $usr['countassign']:''; ?></td>
+ <td><?php echo $usr['countcomments']>0 ? $usr['countcomments']:''; ?></td>
+ <td><?php echo $usr['countvotes']>0 ? $usr['countvotes']:''; ?></td>
+<?php endif; ?>
+<?php if($showltf): ?>
+ <td><?php echo Filters::noXSS($usr['lang_code']); ?></td>
+ <td><?php echo Filters::noXSS($usr['time_zone']); ?></td>
+ <td><?php echo Filters::noXSS($usr['dateformat']); ?></td>
+ <td><?php echo Filters::noXSS($usr['dateformat_extended']); ?></td>
+<?php endif; ?>
+ </tr>
+<?php endforeach; ?>
+ </tbody>
+</table>
+
+<button type="submit" id="buSubmit" name="enable"><?= eL('enableaccounts') ?></button>
+<button type="submit" id="buSubmit" name="disable"><?= eL('disableaccounts') ?></button>
+<button type="submit" id="buSubmit" name="delete"><?= eL('deleteaccounts') ?></button>
+
+<!-- TODO Should still add these to bulk edit, but hasn't been done yet
+<ul class="form_elements">
+<li class="required">
+ <label for="notify_type"><?= eL('notifications') ?></label>
+ <select id="notify_type" name="notify_type">
+ <?php echo tpl_options($fs->getNotificationOptions(), Req::val('notify_type')); ?>
+
+ </select>
+</li>
+<li>
+ <label for="time_zone"><?= eL('timezone') ?></label>
+ <select id="time_zone" name="time_zone">
+ <?php
+ $times = array();
+ for ($i = -12; $i <= 13; $i++) {
+ $times[$i] = L('GMT') . (($i == 0) ? ' ' : (($i > 0) ? '+' . $i : $i));
+ }
+ ?>
+ <?php echo tpl_options($times, Req::val('time_zone', 0)); ?>
+
+ </select>
+</li>
+
+ <?php if (isset($groups)): ?>
+ <li>
+ <label for="groupin"><?= eL('globalgroup') ?></label>
+ <select id="groupin" class="adminlist" name="group_in">
+ <?php echo tpl_options($groups, Req::val('group_in')); ?>
+
+ </select>
+ </li>
+ <?php endif; ?>
+
+ </ul>
+ <p><button type="submit" id="buSubmit"><?= eL('updateaccounts') ?></button></p>
+-->
+</form>
diff --git a/themes/CleanFS/templates/common.editattachments.tpl b/themes/CleanFS/templates/common.editattachments.tpl
new file mode 100644
index 0000000..5cff7d2
--- /dev/null
+++ b/themes/CleanFS/templates/common.editattachments.tpl
@@ -0,0 +1,46 @@
+ <?php if ($attachments): ?>
+ <table class="attachments">
+ <thead><tr><th><?php echo Filters::noXSS(L('file')); ?></th><th<?php echo $user->perms('delete_attachments') ? '':' style="color:#999"'; ?>><?php echo Filters::noXSS(L('size')); ?></th><th><?php echo Filters::noXSS(L('delete')); ?></th></tr></thead>
+ <?php foreach ($attachments as $attachment): ?>
+ <tr>
+ <td>
+ <?php if (file_exists(BASEDIR . '/attachments/' . $attachment['file_name'])): ?>
+ <a href="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?getfile=<?php echo Filters::noXSS($attachment['attachment_id']); ?>" title="<?php echo Filters::noXSS($attachment['file_type']); ?>">
+ <?php else: ?>
+ <del>
+ <?php endif; ?>
+ <?php
+ // Strip the mimetype to get the icon image name
+ list($main) = explode('/', $attachment['file_type']);
+ $imgdir = BASEDIR . "/themes/".Filters::noXSS($proj->prefs['theme_style'])."/mime/";
+ $imgpath = Filters::noXSS($baseurl)."themes/".Filters::noXSS($proj->prefs['theme_style'])."/mime/";
+ if (file_exists($imgdir.$attachment['file_type'] . '.png')):
+ ?>
+ <img src="<?php echo Filters::noXSS($imgpath); ?><?php echo Filters::noXSS($attachment['file_type']); ?>.png" alt="(<?php echo Filters::noXSS($attachment['file_type']); ?>)" title="<?php echo Filters::noXSS($attachment['file_type']); ?>" />
+ <?php else: ?>
+ <img src="<?php echo Filters::noXSS($imgpath); ?><?php echo Filters::noXSS($main); ?>.png" alt="" title="<?php echo Filters::noXSS($attachment['file_type']); ?>" />
+ <?php endif; ?>
+ &nbsp;&nbsp;<?php echo Filters::noXSS($attachment['orig_name']); ?>
+
+ <?php if (file_exists(BASEDIR . '/attachments/' . $attachment['file_name'])): ?>
+ </a>
+ <?php else: ?>
+ </del>
+ <?php endif; ?>
+ </td>
+ <td>
+ <?php if ($attachment['file_size'] < 1000000): ?>
+ <?php echo Filters::noXSS(round($attachment['file_size']/1024,1)); ?> <?php echo Filters::noXSS(L('KiB')); ?>
+
+ <?php else: ?>
+ <?php echo Filters::noXSS(round($attachment['file_size']/1024/1024,2)); ?> <?php echo Filters::noXSS(L('MiB')); ?>
+
+ <?php endif; ?>
+ </td>
+ <td>
+ <input type="checkbox" <?php echo tpl_disableif(!$user->perms('delete_attachments')); ?> name="delete_att[]" value="<?php echo Filters::noXSS($attachment['attachment_id']); ?>" />
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ <?php endif; ?>
diff --git a/themes/CleanFS/templates/common.editgroup.tpl b/themes/CleanFS/templates/common.editgroup.tpl
new file mode 100644
index 0000000..28ef9f6
--- /dev/null
+++ b/themes/CleanFS/templates/common.editgroup.tpl
@@ -0,0 +1,233 @@
+ <form action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get" id="groupselect">
+ <div>
+ <label for="selectgroup"><?php echo Filters::noXSS(L('editgroup')); ?></label>
+ <select name="id" id="selectgroup"><?php echo tpl_options(Flyspray::ListGroups($proj->id), Req::num('id')); ?></select>
+ <button type="submit"><?php echo Filters::noXSS(L('edit')); ?></button>
+ <input type="hidden" name="do" value="<?php echo Filters::noXSS(Req::val('do')); ?>" />
+ <input type="hidden" name="area" value="editgroup" />
+ </div>
+ </form>
+
+<?php echo tpl_form(Filters::noXSS(CreateURL('editgroup', Req::num('id'), $do)), null, null, null, 'id="editgroup"'); ?>
+<fieldset class="box"> <legend><?php echo Filters::noXSS(L('editgroup')); ?> <?php echo Filters::noXSS(Req::val('group_name', $group_details['group_name'])); ?></legend>
+<table class="box">
+ <tr>
+ <td>
+ <label for="groupname"><?php echo Filters::noXSS(L('groupname')); ?></label>
+ </td>
+ <td><input id="groupname" class="text" type="text" name="group_name" size="20" maxlength="20" value="<?php echo Filters::noXSS(Req::val('group_name', $group_details['group_name'])); ?>" /></td>
+ </tr>
+ <tr>
+ <td><label for="groupdesc"><?php echo Filters::noXSS(L('description')); ?></label></td>
+ <td><input id="groupdesc" class="text" type="text" name="group_desc" size="50" maxlength="100" value="<?php echo Filters::noXSS(Req::val('group_desc', $group_details['group_desc'])); ?>" /></td>
+ </tr>
+ <?php if ($group_details['group_id'] == 1): ?>
+ <tr>
+ <td colspan="2"><?php echo Filters::noXSS(L('notshownforadmin')); ?></td>
+ </tr>
+ <?php else: ?>
+ <tr>
+ <td><label for="projectmanager"><?php echo Filters::noXSS(L('projectmanager')); ?></label></td>
+ <td><?php echo tpl_checkbox('manage_project', Req::val('manage_project', !Req::val('action') && $group_details['manage_project']), 'projectmanager'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewtasks"><?php echo Filters::noXSS(L('viewtasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_tasks', Req::val('view_tasks', !Req::val('action') && $group_details['view_tasks']), 'viewtasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewowntasks"><?php echo Filters::noXSS(L('viewowntasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_own_tasks', Req::val('view_own_tasks', !Req::val('action') && $group_details['view_own_tasks']), 'viewowntasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewgroupstasks"><?php echo Filters::noXSS(L('viewgroupstasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_groups_tasks', Req::val('view_groups_tasks', !Req::val('action') && $group_details['view_groups_tasks']), 'viewgroupstasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="canopenjobs"><?php echo Filters::noXSS(L('opennewtasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('open_new_tasks', Req::val('open_new_tasks', !Req::val('action') && $group_details['open_new_tasks']), 'canopenjobs'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="canopenmultipletasks"><?php echo Filters::noXSS(L('addmultipletasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('add_multiple_tasks', Req::val('add_multiple_tasks', !Req::val('action') && $group_details['add_multiple_tasks']), 'canopenmultipletasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="modifyowntasks"><?php echo Filters::noXSS(L('modifyowntasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('modify_own_tasks', Req::val('modify_own_tasks', !Req::val('action') && $group_details['modify_own_tasks']), 'modifyowntasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="modifyalltasks"><?php echo Filters::noXSS(L('modifyalltasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('modify_all_tasks', Req::val('modify_all_tasks', !Req::val('action') && $group_details['modify_all_tasks']), 'modifyalltasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewcomments"><?php echo Filters::noXSS(L('viewcomments')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_comments', Req::val('view_comments', !Req::val('action') && $group_details['view_comments']), 'viewcomments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="canaddcomments"><?php echo Filters::noXSS(L('addcomments')); ?></label></td>
+ <td><?php echo tpl_checkbox('add_comments', Req::val('add_comments', !Req::val('action') && $group_details['add_comments']), 'canaddcomments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="editowncomments"><?php echo Filters::noXSS(L('editowncomments')); ?></label></td>
+ <td><?php echo tpl_checkbox('edit_own_comments', Req::val('edit_own_comments', !Req::val('action') && $group_details['edit_own_comments']), 'editowncomments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="editcomments"><?php echo Filters::noXSS(L('editcomments')); ?></label></td>
+ <td><?php echo tpl_checkbox('edit_comments', Req::val('edit_comments', !Req::val('action') && $group_details['edit_comments']), 'editcomments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="deletecomments"><?php echo Filters::noXSS(L('deletecomments')); ?></label></td>
+ <td><?php echo tpl_checkbox('delete_comments', Req::val('delete_comments', !Req::val('action') && $group_details['delete_comments']), 'deletecomments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="createattachments"><?php echo Filters::noXSS(L('createattachments')); ?></label></td>
+ <td><?php echo tpl_checkbox('create_attachments', Req::val('create_attachments', !Req::val('action') && $group_details['create_attachments']), 'createattachments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="deleteattachments"><?php echo Filters::noXSS(L('deleteattachments')); ?></label></td>
+ <td><?php echo tpl_checkbox('delete_attachments', Req::val('delete_attachments', !Req::val('action') && $group_details['delete_attachments']), 'deleteattachments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewhistory"><?php echo Filters::noXSS(L('viewhistory')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_history', Req::val('view_history', !Req::val('action') && $group_details['view_history']), 'viewhistory'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="canviewroadmap"><?php echo Filters::noXSS(L('canviewroadmap')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_roadmap', Req::val('view_roadmap', !Req::val('action') && $group_details['view_roadmap']), 'canviewroadmap'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="closeowntasks"><?php echo Filters::noXSS(L('closeowntasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('close_own_tasks', Req::val('close_own_tasks', !Req::val('action') && $group_details['close_own_tasks']), 'closeowntasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="closeothertasks"><?php echo Filters::noXSS(L('closeothertasks')); ?></label></td>
+ <td><?php echo tpl_checkbox('close_other_tasks', Req::val('close_other_tasks', !Req::val('action') && $group_details['close_other_tasks']), 'closeothertasks'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="assigntoself"><?php echo Filters::noXSS(L('assigntoself')); ?></label></td>
+ <td><?php echo tpl_checkbox('assign_to_self', Req::val('assign_to_self', !Req::val('action') && $group_details['assign_to_self']), 'assigntoself'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="assignotherstoself"><?php echo Filters::noXSS(L('assignotherstoself')); ?></label></td>
+ <td><?php echo tpl_checkbox('assign_others_to_self', Req::val('assign_others_to_self', !Req::val('action') && $group_details['assign_others_to_self']), 'assignotherstoself'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="addtoassignees"><?php echo Filters::noXSS(L('addtoassignees')); ?></label></td>
+ <td><?php echo tpl_checkbox('add_to_assignees', Req::val('add_to_assignees', !Req::val('action') && $group_details['add_to_assignees']), 'addtoassignees'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewreports"><?php echo Filters::noXSS(L('viewreports')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_reports', Req::val('view_reports', !Req::val('action') && $group_details['view_reports']), 'viewreports'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="canvote"><?php echo Filters::noXSS(L('canvote')); ?></label></td>
+ <td><?php echo tpl_checkbox('add_votes', Req::val('add_votes', !Req::val('action') && $group_details['add_votes']), 'canvote'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="editassignments"><?php echo Filters::noXSS(L('editassignments')); ?></label></td>
+ <td><?php echo tpl_checkbox('edit_assignments', Req::val('edit_assignments', !Req::val('action') && $group_details['edit_assignments']), 'editassignments'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="show_as_assignees"><?php echo Filters::noXSS(L('showasassignees')); ?></label></td>
+ <td><?php echo tpl_checkbox('show_as_assignees', Req::val('show_as_assignees', !Req::val('action') && $group_details['show_as_assignees']), 'show_as_assignees'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewestimatedeffort"><?php echo Filters::noXSS(L('viewestimatedeffort')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_estimated_effort', Req::val('view_estimated_effort', !Req::val('action') && $group_details['view_estimated_effort']), 'viewestimatedeffort'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="viewcurrenteffortdone"><?php echo Filters::noXSS(L('viewcurrenteffortdone')); ?></label></td>
+ <td><?php echo tpl_checkbox('view_current_effort_done', Req::val('view_current_effort_done', !Req::val('action') && $group_details['view_current_effort_done']), 'viewactualeffort'); ?></td>
+ </tr>
+ <tr>
+ <td><label for="trackeffort"><?php echo Filters::noXSS(L('trackeffort')); ?></label></td>
+ <td><?php echo tpl_checkbox('track_effort', Req::val('track_effort', !Req::val('action') && $group_details['track_effort']), 'trackeffort'); ?></td>
+ </tr>
+
+ <?php if (!$proj->id): ?>
+ <tr>
+ <td><label for="groupopen"><?php echo Filters::noXSS(L('groupenabled')); ?></label></td>
+ <td><?php echo tpl_checkbox('group_open', Req::val('group_open', !Req::val('action') && $group_details['group_open']), 'groupopen'); ?></td>
+ </tr>
+ <?php endif; ?>
+ <?php endif; ?>
+ <?php if ($group_details['group_id'] != '1'): ?>
+ <tr>
+ <td><label><input type="checkbox" name="delete_group" /> <?php echo Filters::noXSS(L('deletegroup')); ?></label></td>
+ <td><select name="move_to">
+ <?php echo tpl_options( array_merge( ($proj->id) ? array(L('nogroup')) : array(), Flyspray::listGroups($proj->id)), null, false, null, $group_details['group_id']); ?>
+ </select>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td><label for="add_user"><i class="fa fa-user"></i> <?php echo Filters::noXSS(L('addusergroup')); ?></label></td>
+ <td>
+ <?php echo tpl_userselect('uid', '', 'add_user'); ?>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="buttons">
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <input type="hidden" name="action" value="<?php echo Filters::noXSS(Req::val('action', $do.'.editgroup')); ?>" />
+ <input type="hidden" name="area" value="editgroup" />
+ <input type="hidden" name="group_id" value="<?php echo Filters::noXSS($group_details['group_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('updatedetails')); ?></button>
+ </td>
+ </tr>
+ </table>
+</fieldset>
+</form>
+
+<?php echo tpl_form(Filters::noXSS(CreateURL('editgroup', Req::num('id'), $do)), null, null, null, 'id="userlist"'); ?>
+<fieldset>
+ <h3><?php echo Filters::noXSS(L('groupmembers')); ?></h3>
+ <table id="manage_users_in_groups" class="userlist">
+ <thead>
+ <tr>
+ <th>
+ <a href="javascript:ToggleSelected('manage_users_in_groups')">
+ <img title="<?php echo Filters::noXSS(L('toggleselected')); ?>" alt="<?php echo Filters::noXSS(L('toggleselected')); ?>" src="<?php echo Filters::noXSS($this->get_image('kaboodleloop')); ?>" width="16" height="16" />
+ </a>
+ </th>
+ <th><?php echo Filters::noXSS(L('username')); ?></th>
+ <th><?php echo Filters::noXSS(L('realname')); ?></th>
+ <th><?php echo Filters::noXSS(L('accountenabled')); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach(Project::listUsersIn($group_details['group_id']) as $usr): ?>
+ <tr>
+ <td class="ttcolumn"><?php echo tpl_checkbox('users['.$usr['user_id'].']'); ?></td>
+ <td><a href="<?php echo Filters::noXSS(CreateURL('edituser', $usr['user_id'])); ?>"><?php echo Filters::noXSS($usr['user_name']); ?></a></td>
+ <td><?php echo Filters::noXSS($usr['real_name']); ?></td>
+ <?php if ($usr['account_enabled']) : ?>
+ <td class="imgcol"><i class="fa fa-check" style="color:#090" title="<?php echo L('yes'); ?>"></i></td>
+ <?php else: ?>
+ <td class="imgcol"><i class="fa fa-ban" style="color:#900" title="<?php echo L('no'); ?>"></i></td>
+ <?php endif; ?>
+ </tr>
+ <?php
+ $users_in[] = $usr['user_id'];
+ endforeach;
+ ?>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td colspan="4">
+ <button type="submit"><?php echo Filters::noXSS(L('moveuserstogroup')); ?></button>
+ <select class="adminlist" name="switch_to_group">
+ <?php if ($proj->id): ?>
+ <option value="0"><?php echo Filters::noXSS(L('nogroup')); ?></option>
+ <?php endif; ?>
+ <?php echo tpl_options(Flyspray::listGroups($proj->id), null, false, null, $group_details['group_id']); ?>
+ </select>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <input type="hidden" name="action" value="movetogroup" />
+ <input type="hidden" name="old_group" value="<?php echo Filters::noXSS($group_details['group_id']); ?>" />
+ </fieldset>
+ </form>
diff --git a/themes/CleanFS/templates/common.editlinks.tpl b/themes/CleanFS/templates/common.editlinks.tpl
new file mode 100644
index 0000000..395d388
--- /dev/null
+++ b/themes/CleanFS/templates/common.editlinks.tpl
@@ -0,0 +1,15 @@
+<?php if($links): ?>
+<table class="links">
+<thead>
+ <tr><th><?php echo Filters::noXSS(L('link')); ?></th><th<?php echo $user->perms('delete_attachments') ? '' : ' style="color:#999"'; ?>><?php echo Filters::noXSS(L('delete')); ?></th></tr>
+</thead>
+<tbody>
+<?php foreach ($links as $link): ?>
+ <tr>
+ <td><a href="<?php echo Filters::noXSS($link['url']); ?>"><?php echo Filters::noXSS($link['url']); ?></a></td>
+ <td><input type="checkbox" <?php echo Filters::noXSS(tpl_disableif(!$user->perms('delete_attachments'))); ?> name="delete_link[]" value="<?php echo $link['link_id']; ?>" /></td>
+ </tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+<?php endif; ?>
diff --git a/themes/CleanFS/templates/common.links.tpl b/themes/CleanFS/templates/common.links.tpl
new file mode 100644
index 0000000..146bf67
--- /dev/null
+++ b/themes/CleanFS/templates/common.links.tpl
@@ -0,0 +1,10 @@
+<?php if ($links && $user->can_view_task($task_details)): ?>
+ <div class="links">
+ <?php echo Filters::noXSS(L('referencelinks')); ?><br>
+ <?php foreach ($links as $link): ?>
+ <a href="<?php echo Filters::noXSS($link['url']); ?>"><?php echo Filters::noXSS($link['url']); ?></a><br>
+ <?php endforeach; ?>
+ </div>
+<?php elseif (count($links)): ?>
+ <div class="links"><?php echo Filters::noXSS(L('linknoperms')); ?></div>
+<?php endif; ?>
diff --git a/themes/CleanFS/templates/common.list.tpl b/themes/CleanFS/templates/common.list.tpl
new file mode 100644
index 0000000..0ae9483
--- /dev/null
+++ b/themes/CleanFS/templates/common.list.tpl
@@ -0,0 +1,226 @@
+<p><?= eL('listnote') ?></p>
+<?php
+$tcols=5;
+if($list_type == 'version') {
+ $tcols++;
+}
+if($list_type == 'tag') {
+ $tcols=$tcols+2;
+}
+?>
+<?php if (count($rows)): ?>
+<div id="controlBox">
+ <div class="grip"></div>
+ <div class="inner">
+ <a style="display:block;" href="#" onclick="TableControl.up('listTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/up.png" alt="Up" /></a>
+ <a style="display:block;" href="#" onclick="TableControl.down('listTable'); return false;"><img src="<?php echo Filters::noXSS($this->themeUrl()); ?>/down.png" alt="Down" /></a>
+ </div>
+</div>
+<?php endif; ?>
+<?php echo tpl_form(Filters::noXSS(createURL($do, $list_type, $proj->id))); ?>
+<table class="list" id="listTable">
+<colgroup>
+ <?php if ($list_type == 'tag'): ?><col class="ctag" /><?php endif; ?>
+ <col class="cname" />
+ <?php if ($list_type == 'tag'): ?><col class="cclasses" /><?php endif; ?>
+ <col class="corder" />
+ <col class="cshow" />
+ <?php if ($list_type == 'version'): ?><col class="ctense" /><?php endif; ?>
+ <col class="cdelete" />
+ <col class="cusage" />
+</colgroup>
+<?php if ($do=='pm'): ?>
+<thead>
+<tr><th colspan="<?= $tcols ?>"><?= eL('systemvalues') ?></th></tr>
+</thead>
+<thead>
+<tr>
+ <?php if ($list_type == 'tag'): ?><th>ID</th><?php endif; ?>
+ <th><?= eL('name') ?></th>
+ <?php if ($list_type == 'tag'): ?><th>CSS Classes</th><?php endif; ?>
+ <th><?= eL('order') ?></th>
+ <th><?= eL('show') ?></th>
+ <?php if ($list_type == 'version'): ?><th><?= eL('tense') ?></th><?php endif; ?>
+ <th>&nbsp;</th>
+ <th><?= eL('usedintasks') ?></th>
+</tr>
+</thead>
+<thead id="globalentries">
+<?php if (isset($sysrows) && count($sysrows)): ?>
+<?php
+$syscountlines=-1;
+foreach ($sysrows as $row):
+$syscountlines++;
+$classtype=''; $class='';
+switch ($list_type){
+ case 'tag':
+ $classtype='tag';
+ $class='t';
+ break;
+ case 'tasktype':
+ $classtype='task_tasktype';
+ $class='typ'.$row[$list_type.'_id'];
+ break;
+ case 'status':
+ $classtype='task_status';
+ $class='sta'.$row[$list_type.'_id'];
+ break;
+ default:
+ $classtype='task_'.$list_type;
+ $class=substr($list_type, 0, 3).$row[$list_type.'_id'];
+}
+?>
+<tr>
+ <?php if ($list_type == 'tag'): ?><td><?php echo tpl_tag($row['tag_id'], $row['tag_id'], $row['class']); ?></td><?php endif; ?>
+ <td<?= ($list_type!='tag') ? ' class="'.$classtype.' '.$class.'"':'' ?>><?= ($list_type=='tag') ? tpl_tag($row['tag_id']) : Filters::noXSS($row[$list_type.'_name']); ?></td>
+ <?php if ($list_type == 'tag'): ?><td><?php echo Filters::noXSS($row['class']); ?></td><?php endif; ?>
+ <td title="<?= eL('ordertip') ?>"><?php echo Filters::noXSS($row['list_position']); ?></td>
+ <td title="<?= eL('showtip') ?>"><?php echo $row['show_in_list']; ?></td>
+ <?php if ($list_type == 'version'): ?><td title="<?= eL('listtensetip') ?>"><?php echo $row[$list_type.'_tense']; ?></td><?php endif; ?>
+ <td>&nbsp;</td>
+ <td><?php echo $row['used_in_tasks'] >0 ? $row['used_in_tasks']:''; ?></td>
+</tr>
+<?php endforeach; ?>
+<?php else: ?>
+<tr><td colspan="<?= $tcols ?>"><?= eL('novalues') ?></td></tr>
+<?php endif; ?>
+</thead>
+<?php endif; ?>
+<thead>
+<tr><th colspan="<?= $tcols ?>"><?= $do=='pm' ? eL('projectvalues') : eL('systemvalues') ?></th></tr>
+</thead>
+<thead>
+<tr>
+ <?php if ($list_type == 'tag'): ?><th>ID</th><?php endif; ?>
+ <th><?= eL('name') ?></th>
+ <?php if ($list_type == 'tag'): ?><th title="CSS Classes or a #rgb or #rrggbb color. For instance #c00 for a red background">CSS Classes or #rgb</th><?php endif; ?>
+ <th><?= eL('order') ?></th>
+ <th><?= eL('show') ?></th>
+ <?php if ($list_type == 'version'): ?><th><?= eL('tense') ?></th><?php endif; ?>
+ <th><?= eL('delete') ?></th>
+ <th><?= eL('usedintasks') ?></th>
+</tr>
+</thead>
+<tbody>
+<?php
+ $countlines = -1;
+ foreach ($rows as $row):
+ $countlines++;
+?>
+<tr<?= ($list_type == 'resolution' && $row[$list_type.'_id'] == RESOLUTION_DUPLICATE ) ? ' class="nodelete" title="fixed duplicate resolution status"':'' ?>>
+ <?php if ($list_type == 'tag'): ?><td><?php echo tpl_tag($row['tag_id'], $row['tag_id'], $row['class']); ?></td><?php endif; ?>
+ <td>
+ <input id="listname<?php echo Filters::noXSS($countlines); ?>" class="text" type="text" maxlength="40" name="list_name[<?php echo Filters::noXSS($row[$list_type.'_id']); ?>]"
+ value="<?php echo Filters::noXSS($row[$list_type.'_name']); ?>" />
+ </td>
+ <?php if ($list_type == 'tag'): ?>
+ <td>
+ <input id="listclass<?php echo Filters::noXSS($countlines); ?>" class="text" type="text" maxlength="40" name="list_class[<?php echo Filters::noXSS($row['tag_id']); ?>]"
+ value="<?php echo Filters::noXSS($row['class']); ?>" />
+ </td>
+ <?php endif; ?>
+ <td title="<?= eL('ordertip') ?>">
+ <input id="listposition<?php echo Filters::noXSS($countlines); ?>" class="text" type="text" maxlength="3" name="list_position[<?php echo Filters::noXSS($row[$list_type.'_id']); ?>]" value="<?php echo Filters::noXSS($row['list_position']); ?>" />
+ </td>
+ <td title="<?= eL('showtip') ?>">
+ <?php echo tpl_checkbox('show_in_list[' . $row[$list_type.'_id'] . ']', $row['show_in_list'], 'showinlist'.$countlines); ?>
+
+ </td>
+ <?php if ($list_type == 'version'): ?>
+ <td title="<?= eL('listtensetip') ?>">
+ <select id="tense<?php echo Filters::noXSS($countlines); ?>" name="<?php echo Filters::noXSS($list_type); ?>_tense[<?php echo Filters::noXSS($row[$list_type.'_id']); ?>]">
+ <?php echo tpl_options(array(1=>L('past'), 2=>L('present'), 3=>L('future')), $row[$list_type.'_tense']); ?>
+ </select>
+ </td>
+ <?php endif; ?>
+
+ <?php if ($row['used_in_tasks'] || ($list_type == 'status' && $row[$list_type.'_id'] < 7) || ($list_type == 'resolution' && $row[$list_type.'_id'] == RESOLUTION_DUPLICATE ) ): ?>
+ <td title="<?= eL('nodeletetip') ?>"></td>
+ <?php else: ?>
+ <td title="<?= eL('deletetip') ?>"><input id="delete<?php echo Filters::noXSS($row[$list_type.'_id']); ?>" type="checkbox" name="delete[<?php echo Filters::noXSS($row[$list_type.'_id']); ?>]" value="1" /></td>
+ <?php endif; ?>
+
+ <td><?php echo $row['used_in_tasks'] >0 ? $row['used_in_tasks']:''; ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ <?php if(count($rows)): ?>
+ <tfoot>
+ <tr>
+ <td colspan="<?= ($tcols-2) ?>"></td>
+ <td colspan="2" class="buttons">
+ <?php if ($list_type == 'version'): ?>
+ <input type="hidden" name="action" value="update_version_list" />
+ <?php else: ?>
+ <input type="hidden" name="action" value="update_list" />
+ <?php endif; ?>
+ <input type="hidden" name="list_type" value="<?php echo Filters::noXSS($list_type); ?>" />
+ <input type="hidden" name="project" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <button type="submit"><?= eL('update') ?></button>
+ </td>
+ </tr>
+ </tfoot>
+ <?php endif; ?>
+ </table>
+ <?php if (count($rows)): ?>
+ <script type="text/javascript">
+ <?php
+ echo 'TableControl.create("listTable",{
+ controlBox: "controlBox",
+ tree: false
+ });';
+ echo 'new Draggable("controlBox",{
+ handle: "grip"
+ });';
+ ?>
+ </script>
+ <?php endif; ?>
+</form>
+<hr />
+<?php echo tpl_form(Filters::noXSS(createURL($do, $list_type, $proj->id))); ?>
+<table class="list">
+<colgroup>
+ <col class="cname" />
+ <col class="corder" />
+ <col class="cshow" />
+ <?php if ($list_type == 'version'): ?><col class="ctense" /><?php endif; ?>
+ <col class="cdelete" />
+</colgroup>
+<tbody>
+<tr>
+ <td>
+ <?php if ($list_type == 'version'): ?>
+ <input type="hidden" name="action" value="<?php echo Filters::noXSS($do); ?>.add_to_version_list" />
+ <?php else: ?>
+ <input type="hidden" name="action" value="<?php echo Filters::noXSS($do); ?>.add_to_list" />
+ <?php endif; ?>
+ <input type="hidden" name="list_type" value="<?php echo Filters::noXSS($list_type); ?>" />
+ <?php if ($proj->id): ?>
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <?php endif; ?>
+ <input type="hidden" name="area" value="<?php echo Filters::noXSS(Req::val('area')); ?>" />
+ <input type="hidden" name="do" value="<?php echo Filters::noXSS($do); ?>" />
+ <input id="listnamenew" placeholder="<?= eL('name') ?>" class="text" type="text" maxlength="40" value="<?php echo Filters::noXSS(Req::val('list_name')); ?>" name="list_name" autofocus />
+ </td>
+ <td>
+ <input id="listpositionnew" placeholder="<?= eL('order') ?>" class="text" type="text" maxlength="3" value="<?php echo Filters::noXSS(Req::val('list_position')); ?>" name="list_position" />
+ </td>
+ <td>
+ <input id="showinlistnew" type="checkbox" name="show_in_list" checked="checked" disabled="disabled" />
+ </td>
+ <?php if ($list_type == 'version'): ?>
+ <td title="<?php echo Filters::noXSS(L('listtensetip')); ?>">
+ <select id="tensenew" name="<?php echo Filters::noXSS($list_type); ?>_tense">
+ <?php echo tpl_options(array(1=>L('past'), 2=>L('present'), 3=>L('future')), 2); ?>
+
+ </select>
+ </td>
+ <?php endif; ?>
+ <td class="buttons">
+ <input type="hidden" name="project" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <button type="submit" class="positive"><?= eL('addnew') ?></button>
+ </td>
+ </tr>
+</tbody>
+</table>
+</form>
diff --git a/themes/CleanFS/templates/common.multiuserselect.tpl b/themes/CleanFS/templates/common.multiuserselect.tpl
new file mode 100644
index 0000000..0692148
--- /dev/null
+++ b/themes/CleanFS/templates/common.multiuserselect.tpl
@@ -0,0 +1,49 @@
+<div class="userSelectWidget">
+<label for="find_user" class="inline"><?php echo Filters::noXSS(L('find')); ?>:</label>
+<input placeholder="<?php echo Filters::noXSS(L('user')); ?>" type="text" class="text" value="<?php echo Filters::noXSS(Post::val('find_user')); ?>" name="find_user" id="find_user" onkeyup="return entercheck(event)" />
+<a class="button" href="javascript:unselectAll()"><?php echo Filters::noXSS(L('noone')); ?></a>
+<br />
+<select size="8" name="rassigned_to[]" id="rassigned_to" multiple="multiple">
+<?php foreach ($userlist as $group => $users): ?>
+ <optgroup <?php echo ($users[0][2]==0 ? 'class="globalgroup" title="'.(Filters::noXSS(L('globalgroup'))).'" ':''); ?>label="<?php echo Filters::noXSS($users[0][3]); ?>">
+ <?php foreach ($users as $info): ?>
+ <option value="<?php echo Filters::noXSS($info[0]); ?>" <?php if (in_array($info[0], $assignees)): ?>selected="selected"<?php endif; ?>><?php echo Filters::noXSS($info[1]); ?></option>
+ <?php endforeach; ?>
+ </optgroup>
+<?php endforeach; ?>
+</select>
+</div>
+<script type="text/javascript">
+resetOption = null;
+
+function entercheck(e){
+ // Find user and select it
+ if ($('find_user').value.length < 1) {
+ if (resetOption != null) {
+ resetOption.selected = false;
+ }
+ } else {
+ var options = $('rassigned_to').options;
+ for (var i = 0; i < options.length; i++) {
+ if (options[i].text.toLowerCase().indexOf($('find_user').value.toLowerCase()) >= 0) {
+ if (resetOption != null) {
+ resetOption.selected = false;
+ }
+ if (options[i].selected == false) {
+ resetOption = options[i];
+ }
+ options[i].selected=false; // focus
+ options[i].selected=true;
+ return true;
+ }
+ }
+ }
+}
+
+function unselectAll(){
+ var options = $('rassigned_to').options;
+ for (var i = 0; i < options.length; i++) {
+ options[i].selected=false;
+ }
+}
+</script>
diff --git a/themes/CleanFS/templates/common.newgroup.tpl b/themes/CleanFS/templates/common.newgroup.tpl
new file mode 100644
index 0000000..09cb737
--- /dev/null
+++ b/themes/CleanFS/templates/common.newgroup.tpl
@@ -0,0 +1,169 @@
+<?php echo tpl_form(Filters::noXSS(CreateUrl($do,'newgroup',$proj->id)),null,null,null,'id="newgroup"'); ?>
+ <ul class="form_elements">
+ <li class="required">
+ <label for="groupname"><?php echo Filters::noXSS(L('groupname')); ?> *</label>
+ <input id="groupname" class="required text" type="text" value="<?php echo Filters::noXSS(Req::val('group_name')); ?>" name="group_name" size="20" maxlength="20" />
+ </li>
+
+ <li>
+ <label for="groupdesc"><?php echo Filters::noXSS(L('description')); ?></label>
+ <input id="groupdesc" class="text" type="text" value="<?php echo Filters::noXSS(Req::val('group_desc')); ?>" name="group_desc" size="50" maxlength="100" />
+ </li>
+
+ <li>
+ <label for="manageproject"><?php echo Filters::noXSS(L('projectmanager')); ?></label>
+ <?php echo tpl_checkbox('manage_project', Req::val('manage_project'), 'manageproject'); ?>
+ </li>
+
+ <li>
+ <label for="viewtasks"><?php echo Filters::noXSS(L('viewtasks')); ?></label>
+ <?php echo tpl_checkbox('view_tasks', Req::val('view_tasks'), 'viewtasks'); ?>
+ </li>
+
+ <li>
+ <label for="viewowntasks"><?php echo Filters::noXSS(L('viewowntasks')); ?></label>
+ <?php echo tpl_checkbox('view_own_tasks', Req::val('view_own_tasks'), 'viewowntasks'); ?>
+ </li>
+
+ <li>
+ <label for="viewgroupstasks"><?php echo Filters::noXSS(L('viewgroupstasks')); ?></label>
+ <?php echo tpl_checkbox('view_groups_tasks', Req::val('view_groups_tasks'), 'viewgroupstasks'); ?>
+ </li>
+
+ <li>
+ <label for="opennewtasks"><?php echo Filters::noXSS(L('opennewtasks')); ?></label>
+ <?php echo tpl_checkbox('open_new_tasks', Req::val('open_new_tasks'), 'opennewtasks'); ?>
+ </li>
+
+ <li>
+ <label for="canopenmultipletasks"><?php echo Filters::noXSS(L('addmultipletasks')); ?></label>
+ <?php echo tpl_checkbox('add_multiple_tasks', Req::val('add_multiple_tasks'), 'canopenmultipletasks'); ?>
+ </li>
+
+ <li>
+ <label for="modifyowntasks"><?php echo Filters::noXSS(L('modifyowntasks')); ?></label>
+ <?php echo tpl_checkbox('modify_own_tasks', Req::val('modify_own_tasks'), 'modifyowntasks'); ?>
+ </li>
+
+ <li>
+ <label for="modifyalltasks"><?php echo Filters::noXSS(L('modifyalltasks')); ?></label>
+ <?php echo tpl_checkbox('modify_all_tasks', Req::val('modify_all_tasks'), 'modifyalltasks'); ?>
+ </li>
+
+ <li>
+ <label for="viewcomments"><?php echo Filters::noXSS(L('viewcomments')); ?></label>
+ <?php echo tpl_checkbox('view_comments', Req::val('view_comments'), 'viewcomments'); ?>
+ </li>
+
+ <li>
+ <label for="addcomments"><?php echo Filters::noXSS(L('addcomments')); ?></label>
+ <?php echo tpl_checkbox('add_comments', Req::val('add_comments'), 'addcomments'); ?>
+ </li>
+
+ <li>
+ <label for="editowncomments"><?php echo Filters::noXSS(L('editowncomments')); ?></label>
+ <?php echo tpl_checkbox('edit_own_comments', Req::val('edit_own_comments'), 'editowncomments'); ?>
+ </li>
+
+ <li>
+ <label for="editcomments"><?php echo Filters::noXSS(L('editcomments')); ?></label>
+ <?php echo tpl_checkbox('edit_comments', Req::val('edit_comments'), 'editcomments'); ?>
+ </li>
+
+ <li>
+ <label for="deletecomments"><?php echo Filters::noXSS(L('deletecomments')); ?></label>
+ <?php echo tpl_checkbox('delete_comments', Req::val('delete_comments'), 'deletecomments'); ?>
+ </li>
+
+ <li>
+ <label for="createattachments"><?php echo Filters::noXSS(L('createattachments')); ?></label>
+ <?php echo tpl_checkbox('create_attachments', Req::val('create_attachments'), 'createattachments'); ?>
+ </li>
+
+ <li>
+ <label for="deleteattachments"><?php echo Filters::noXSS(L('deleteattachments')); ?></label>
+ <?php echo tpl_checkbox('delete_attachments', Req::val('delete_attachments'), 'deleteattachments'); ?>
+ </li>
+
+ <li>
+ <label for="viewhistory"><?php echo Filters::noXSS(L('viewhistory')); ?></label>
+ <?php echo tpl_checkbox('view_history', Req::val('view_history'), 'viewhistory'); ?>
+ </li>
+
+ <li>
+ <label for="canviewroadmap"><?php echo Filters::noXSS(L('canviewroadmap')); ?></label>
+ <?php echo tpl_checkbox('view_roadmap', Req::val('view_roadmap', !Req::val('action')), 'canviewroadmap'); ?>
+ </li>
+
+ <li>
+ <label for="closeowntasks"><?php echo Filters::noXSS(L('closeowntasks')); ?></label>
+ <?php echo tpl_checkbox('close_own_tasks', Req::val('close_own_tasks'), 'closeowntasks'); ?>
+ </li>
+
+ <li>
+ <label for="closeothertasks"><?php echo Filters::noXSS(L('closeothertasks')); ?></label>
+ <?php echo tpl_checkbox('close_other_tasks', Req::val('close_other_tasks'), 'closeothertasks'); ?>
+ </li>
+
+ <li>
+ <label for="assigntoself"><?php echo Filters::noXSS(L('assigntoself')); ?></label>
+ <?php echo tpl_checkbox('assign_to_self', Req::val('assign_to_self'), 'assigntoself'); ?>
+ </li>
+
+ <li>
+ <label for="assignotherstoself"><?php echo Filters::noXSS(L('assignotherstoself')); ?></label>
+ <?php echo tpl_checkbox('assign_others_to_self', Req::val('assign_others_to_self'), 'assignotherstoself'); ?>
+ </li>
+
+ <li>
+ <label for="addtoassignees"><?php echo Filters::noXSS(L('addtoassignees')); ?></label>
+ <?php echo tpl_checkbox('add_to_assignees', Req::val('add_to_assignees'), 'addtoassignees'); ?>
+ </li>
+
+ <li>
+ <label for="viewreports"><?php echo Filters::noXSS(L('viewreports')); ?></label>
+ <?php echo tpl_checkbox('view_reports', Req::val('view_reports'), 'viewreports'); ?>
+ </li>
+
+ <li>
+ <label for="canvote"><?php echo Filters::noXSS(L('canvote')); ?></label>
+ <?php echo tpl_checkbox('add_votes', Req::val('add_votes'), 'canvote'); ?>
+ </li>
+
+ <li>
+ <label for="editassignments"><?php echo Filters::noXSS(L('editassignments')); ?></label>
+ <?php echo tpl_checkbox('edit_assignments', Req::val('edit_assignments'), 'editassignments'); ?>
+ </li>
+
+ <li>
+ <label for="show_as_assignees"><?php echo Filters::noXSS(L('showasassignees')); ?></label>
+ <?php echo tpl_checkbox('show_as_assignees', Req::val('show_as_assignees'), 'show_as_assignees'); ?>
+ </li>
+
+ <li>
+ <label for="viewestimatedeffort"><?php echo Filters::noXSS(L('viewestimatedeffort')); ?></label>
+ <?php echo tpl_checkbox('view_estimated_effort', Req::val('view_estimated_effort'), 'viewestimatedeffort'); ?>
+ </li>
+
+ <li>
+ <label for="viewcurrenteffortdone"><?php echo Filters::noXSS(L('viewcurrenteffortdone')); ?></label>
+ <?php echo tpl_checkbox('view_current_effort_done', Req::val('view_current_effort_done'), 'viewcurrenteffortdone'); ?>
+ </li>
+
+ <li>
+ <label for="trackeffort"><?php echo Filters::noXSS(L('trackeffort')); ?></label>
+ <?php echo tpl_checkbox('track_effort', Req::val('track_effort'), 'trackeffort'); ?>
+ </li>
+
+ <?php if (!$proj->id): ?>
+ <li>
+ <label for="groupopen"><?php echo Filters::noXSS(L('groupenabled')); ?></label>
+ <?php echo tpl_checkbox('group_open', Req::val('group_open'), 'groupopen'); ?>
+ </li>
+ <?php endif; ?>
+ </ul>
+
+ <input type="hidden" name="action" value="<?php if ($proj->id): ?>pm<?php else: ?>admin<?php endif; ?>.newgroup" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS(Req::val('project')); ?>" />
+ <button type="submit" class="positive"><?php echo Filters::noXSS(L('addthisgroup')); ?></button>
+</form>
diff --git a/themes/CleanFS/templates/common.newuser.tpl b/themes/CleanFS/templates/common.newuser.tpl
new file mode 100644
index 0000000..539e307
--- /dev/null
+++ b/themes/CleanFS/templates/common.newuser.tpl
@@ -0,0 +1,120 @@
+<?php
+/* Note: This template file is currently in dual use for one of two guest register configurations
+and also in admin area for admins.
+May change in future because this sharing adds more complexity compared to little gain.
+*/
+if ($do === 'admin'): echo tpl_form(Filters::noXSS(createURL($do, 'newuser')),null,null,null,'id="registernewuser"');
+ else: echo tpl_form(Filters::noXSS(createURL($do, 'newuser')),null,null,null,'id="registernewuser"');
+endif; ?>
+<ul class="form_elements">
+ <li class="required">
+ <?php if ($do === 'admin'): ?>
+ <input type="hidden" name="action" value="admin.newuser" />
+ <input type="hidden" name="do" value="admin" />
+ <input type="hidden" name="area" value="newuser" />
+ <?php else: ?>
+ <input type="hidden" name="action" value="register.newuser" />
+ <?php endif; ?>
+ <label for="username"><?= eL('username') ?></label>
+ <input id="username" name="user_name" value="<?php echo Filters::noXSS(Req::val('user_name')); ?>" required="required" type="text" size="20" maxlength="32" onblur="checkname(this.value);" />
+ <br /><span id="errormessage"></span>
+ </li>
+
+ <?php if (!$fs->prefs['disable_changepw']): ?>
+ <li>
+ <label for="userpass"><?= eL('password') ?></label>
+ <input id="userpass" class="password" name="user_pass" value="<?php echo Filters::noXSS(Req::val('user_pass')); ?>" type="password" size="20" maxlength="100" /> <em><?php echo Filters::noXSS(L('minpwsize')); ?></em>
+ <span class="note"><?= eL('leaveemptyauto') ?></span>
+ </li>
+ <?php if( $do==='register' && $fs->prefs['repeat_password'] ): ?>
+ <li>
+ <label for="userpass2"><?= eL('confirmpass') ?></label>
+ <input id="userpass2" class="password" name="user_pass2" value="<?php echo Filters::noXSS(Req::val('user_pass2')); ?>" type="password" size="20" maxlength="100" /><br />
+ </li>
+ <?php endif; ?>
+ <?php endif; ?>
+
+ <li class="required">
+ <label for="realname"><?= eL('realname') ?></label>
+ <input id="realname" name="real_name" required="required" value="<?php echo Filters::noXSS(Req::val('real_name')); ?>" type="text" size="20" maxlength="100" />
+ </li>
+
+ <li class="required">
+ <label for="emailaddress"><?= eL('emailaddress') ?></label>
+ <input id="emailaddress" name="email_address" required="required" value="<?php echo Filters::noXSS(Req::val('email_address')); ?>" type="text" size="20" maxlength="100" />
+ <!-- <em><?= eL('validemail') ?></em> -->
+ </li>
+
+ <?php if( $do==='register' && $fs->prefs['repeat_emailaddress'] ): ?>
+ <li>
+ <label for="verifyemailaddress"><?= eL('verifyemailaddress') ?></label>
+ <input id="verifyemailaddress" value="<?php echo Filters::noXSS(Req::val('verify_email_address')); ?>" name="verify_email_address" required="required" type="text" size="20" maxlength="100" />
+ </li>
+ <?php endif; ?>
+
+ <?php if (!empty($fs->prefs['jabber_server'])): ?>
+ <li>
+ <label for="jabberid"><?= eL('jabberid') ?></label>
+ <input id="jabberid" name="jabber_id" type="text" value="<?php echo Filters::noXSS(Req::val('jabber_id')); ?>" size="20" maxlength="100" />
+ </li>
+ <?php endif ?>
+
+ <?php if ($fs->prefs['enable_avatars']): ?>
+ <li>
+ <label for="profileimage"><?= eL('profileimage') ?></label>
+ <input id="profileimage" name="profile_image" type="file" value="<?php echo Filters::noXSS(Req::val('profile_image')); ?>"/>
+ </li>
+ <?php endif ?>
+
+ <li>
+ <label for="notify_type"><?= eL('notifications') ?></label>
+ <select id="notify_type" name="notify_type">
+ <?php echo tpl_options($fs->getNotificationOptions(), Req::val('notify_type')); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="time_zone"><?= eL('timezone') ?></label>
+ <select id="time_zone" name="time_zone">
+ <?php
+ $times = array();
+ for ($i = -12; $i <= 13; $i++) {
+ $times[$i] = L('GMT') . (($i == 0) ? ' ' : (($i > 0) ? '+' . $i : $i));
+ }
+ ?>
+ <?php echo tpl_options($times, Req::val('time_zone', 0)); ?>
+ </select>
+ </li>
+
+ <?php if (isset($groups)): ?>
+ <li>
+ <label for="groupin"><?= eL('globalgroup') ?></label>
+ <select id="groupin" class="adminlist" name="group_in">
+ <?php echo tpl_options($groups, Req::val('group_in', $fs->prefs['anon_group'])); ?>
+ </select>
+ </li>
+ <?php endif; ?>
+
+ <?php if($do==='register' && $fs->prefs['captcha_securimage']) : ?>
+ <li class="captchali">
+ <style>
+ #captcha_code{width:100px;}
+ .captchali .securimage label{width:auto;}
+ .captchali .securimage {display:inline-block; width:300px;}
+ </style>
+ <label for="captcha_code"><?= eL('registercaptcha') ?></label>
+ <div class="securimage"><?php echo $captcha_securimage_html; ?></div>
+ </li>
+ <?php endif; ?>
+ </ul>
+ <?php
+ /* only guests need captcha, not admins that currently this template file to add a user too. */
+ if( $do==='register'
+ && isset($fs->prefs['captcha_recaptcha']) && $fs->prefs['captcha_recaptcha']
+ && isset($fs->prefs['captcha_recaptcha_sitekey']) && $fs->prefs['captcha_recaptcha_sitekey']
+ && isset($fs->prefs['captcha_recaptcha_secret']) && $fs->prefs['captcha_recaptcha_secret']): ?>
+ <div class="g-recaptcha" data-sitekey="<?php echo Filters::noXSS($fs->prefs['captcha_recaptcha_sitekey']); ?>"></div>
+ <noscript>Javascript is required for this Google reCAPTCHA.</noscript>
+ <?php endif; ?>
+ <p><button type="submit" id="buSubmit"><?= eL('registeraccount') ?></button></p>
+</form>
diff --git a/themes/CleanFS/templates/common.newuserbulk.tpl b/themes/CleanFS/templates/common.newuserbulk.tpl
new file mode 100644
index 0000000..f9724b6
--- /dev/null
+++ b/themes/CleanFS/templates/common.newuserbulk.tpl
@@ -0,0 +1,78 @@
+<?php if ($do == 'admin'): echo tpl_form(Filters::noXSS(CreateURL($do, 'newuserbulk')),null,null,null,'id="registernewuser"');
+ else: echo tpl_form(Filters::noXSS($_SERVER['SCRIPT_NAME']), null,null,null,'id="registernewuser"');
+endif; ?>
+ <ul class="form_elements">
+ <li class="required">
+ <?php if ($do == 'admin'): ?>
+ <input type="hidden" name="action" value="admin.newuserbulk" />
+ <input type="hidden" name="do" value="admin" />
+ <input type="hidden" name="area" value="newuserbulk" />
+ <?php else: ?>
+ <input type="hidden" name="action" value="register.newuserbulk" />
+ <?php endif; ?>
+ </li>
+
+ <!-- Header -->
+ <li>
+ <b><?php echo Filters::noXSS(L('bulkuserstoadd')); ?>:</b>
+ </li>
+ <table class="bulkuser">
+ <tr>
+ <td><label for="realname"><?php echo Filters::noXSS(L('realname')); ?></label></td>
+ <td><label for="username"><?php echo Filters::noXSS(L('username')); ?></label></td>
+ <td><label for="emailaddress"><?php echo Filters::noXSS(L('emailaddress')); ?></label></td>
+ </tr>
+ <br />
+
+
+<?php for ($i = 0 ; $i < 10 ; $i++) { ?>
+ <!-- User <?php echo Filters::noXSS($i); ?> -->
+ <tr>
+ <td><input id="realname" name="real_name<?php echo Filters::noXSS($i); ?>" class="text" value="<?php echo Filters::noXSS(Req::val('real_name')); ?>" type="text" size="20" maxlength="100" onblur="this.form.elements['user_name<?php echo Filters::noXSS($i); ?>'].value = this.form.elements['real_name<?php echo Filters::noXSS($i); ?>'].value.replace(/ /g,'');"/></td>
+ <td><input id="username" name="user_name<?php echo Filters::noXSS($i); ?>" value="<?php echo Filters::noXSS(Req::val('user_name')); ?>" class="text" type="text" size="20" maxlength="32" onblur="checkname(this.value); "/></td>
+ <td><input id="emailaddress" name="email_address<?php echo Filters::noXSS($i); ?>" class="text" value="<?php echo Filters::noXSS(Req::val('email_address')); ?>" type="text" size="20" maxlength="100" /></td>
+ <tr>
+ <tr></tr>
+<?php } ?>
+ </table>
+
+
+ <br />
+
+ <li>
+ <b><?php echo Filters::noXSS(L('optionsforallusers')); ?>:</b>
+ </li>
+ <li>
+ <label for="notify_type"><?php echo Filters::noXSS(L('notifications')); ?></label>
+ <select id="notify_type" name="notify_type">
+ <?php echo tpl_options($fs->GetNotificationOptions(), Req::val('notify_type')); ?>
+
+ </select>
+ </li>
+
+ <li>
+ <label for="time_zone"><?php echo Filters::noXSS(L('timezone')); ?></label>
+ <select id="time_zone" name="time_zone">
+ <?php
+ $times = array();
+ for ($i = -12; $i <= 13; $i++) {
+ $times[$i] = L('GMT') . (($i == 0) ? ' ' : (($i > 0) ? '+' . $i : $i));
+ }
+ ?>
+ <?php echo tpl_options($times, Req::val('time_zone', 0)); ?>
+
+ </select>
+ </li>
+
+ <?php if (isset($groups)): ?>
+ <li>
+ <label for="groupin"><?php echo Filters::noXSS(L('globalgroup')); ?></label>
+ <select id="groupin" class="adminlist" name="group_in">
+ <?php echo tpl_options($groups, Req::val('group_in', $fs->prefs['anon_group'])); ?>
+ </select>
+ </li>
+ <?php endif; ?>
+
+ </ul>
+ <p><button type="submit" id="buSubmit"><?php echo Filters::noXSS(L('registerbulkaccount')); ?></button></p>
+</form>
diff --git a/themes/CleanFS/templates/common.profile.tpl b/themes/CleanFS/templates/common.profile.tpl
new file mode 100644
index 0000000..97920f4
--- /dev/null
+++ b/themes/CleanFS/templates/common.profile.tpl
@@ -0,0 +1,152 @@
+<?php echo tpl_form( $do=='myprofile' ? Filters::noXSS(createUrl('myprofile')) : Filters::noXSS(createUrl('edituser', $theuser->id))); ?>
+ <ul class="form_elements">
+ <li>
+ <label for="realname"><?= eL('realname') ?></label>
+ <input id="realname" type="text" name="real_name" maxlength="100"
+ value="<?php echo Filters::noXSS(Req::val('real_name', $theuser->infos['real_name'])); ?>" />
+ </li>
+ <li>
+ <label for="emailaddress"><?= eL('emailaddress') ?></label>
+ <input id="emailaddress" type="text" name="email_address" maxlength="100"
+ value="<?php echo Filters::noXSS(Req::val('email_address', $theuser->infos['email_address'])); ?>" />
+ </li>
+ <li>
+ <label for="hide_my_email"><?= eL('hidemyemail') ?></label>
+ <?php echo tpl_checkbox('hide_my_email', Req::val('hide_my_email', !Post::val('action') && $theuser->infos['hide_my_email']), 'hide_my_email', 1, ($fs->prefs['hide_emails'] ) ? array('checked' => 'true', 'disabled' => 'true') : ''); ?>
+ </li>
+ <?php if (!empty($fs->prefs['jabber_server'])):?>
+ <li>
+ <label for="jabberid"><?= eL('jabberid') ?></label>
+ <input id="jabberid" type="text" name="jabber_id" maxlength="100"
+ value="<?php echo Filters::noXSS(Req::val('jabber_id', $theuser->infos['jabber_id'])); ?>" />
+ <input type="hidden" name="old_jabber_id" value="<?php echo Filters::noXSS($theuser->infos['jabber_id']); ?>" />
+ </li>
+ <?php endif ?>
+ <?php if ($fs->prefs['enable_avatars']): ?>
+ <li>
+ <label for="profileimage"><?= eL('profileimage') ?></label>
+ <?php echo tpl_userlinkavatar($theuser->id, $fs->prefs['max_avatar_size'], 'av_comment'); ?>
+ </li>
+ <li>
+ <label for="profileimage_input">&nbsp;</label>
+ <input id="profileimage_input" name="profile_image" type="file" value="<?php echo Filters::noXSS(Req::val('profile_image')); ?>"/>
+ </li>
+ <?php endif ?>
+ <li>
+ <label for="notifytype"><?= eL('notifytype') ?></label>
+ <select id="notifytype" name="notify_type">
+ <?php echo tpl_options($fs->getNotificationOptions(), Req::val('notify_type', $theuser->infos['notify_type'])); ?>
+ </select>
+ </li>
+ <li>
+ <label for="notify_own"><?= eL('notifyown') ?></label>
+ <?php echo tpl_checkbox('notify_own', Req::val('notify_own', !Post::val('action') && $theuser->infos['notify_own']), 'notify_own'); ?>
+ </li>
+ <!--<li>
+ <label for="notify_online"><?= eL('notifyonline') ?></label>
+ <?php echo tpl_checkbox('notify_online', Req::val('notify_online', !Post::val('action') && $theuser->infos['notify_online']), 'notify_online'); ?>
+ </li>-->
+ <li>
+ <label for="dateformat"><?= eL('dateformat') ?></label>
+ <select id="dateformat" name="dateformat">
+ <?php echo tpl_date_formats($theuser->infos['dateformat']); ?>
+ </select>
+ </li>
+ <li>
+ <label for="dateformat_extended"><?= eL('dateformat_extended') ?></label>
+ <select id="dateformat_extended" name="dateformat_extended">
+ <?php echo tpl_date_formats($theuser->infos['dateformat_extended'], true); ?>
+ </select>
+ </li>
+ <li>
+ <label for="tasks_perpage"><?= eL('tasksperpage') ?></label>
+ <select name="tasks_perpage" id="tasks_perpage">
+ <?php echo tpl_options(array(10, 25, 50, 100, 250), Req::val('tasks_perpage', $theuser->infos['tasks_perpage']), true); ?>
+ </select>
+ </li>
+ <li>
+ <label for="time_zone"><?= eL('timezone') ?></label>
+ <select id="time_zone" name="time_zone">
+ <?php
+ $times = array();
+ for ($i = -12; $i <= 13; $i++) {
+ $times[$i] = L('GMT') . (($i == 0) ? ' ' : (($i > 0) ? '+' . $i : $i));
+ }
+ ?>
+ <?php echo tpl_options($times, Req::val('time_zone', $theuser->infos['time_zone'])); ?>
+ </select>
+ </li>
+ <li>
+ <label for="langcode"><?= eL('language') ?></label>
+ <select id="langcode" name="lang_code">
+ <?php
+ #echo tpl_options(array_merge(array('browser', 'project'), Flyspray::listLangs()), Req::val('lang_code', $theuser->infos['lang_code']), true);
+ echo tpl_options( Flyspray::listLangs(), Req::val('lang_code', $theuser->infos['lang_code']), true);
+ ?>
+ </select>
+ </li>
+ <li>
+ <hr />
+ </li>
+ <?php if ($user->perms('is_admin')): ?>
+ <li>
+ <label for="accountenabled"><?= eL('accountenabled') ?></label>
+ <?php echo tpl_checkbox('account_enabled', Req::val('account_enabled', !Post::val('action') && $theuser->infos['account_enabled']), 'accountenabled'); ?>
+ </li>
+ <li>
+ <label for="delete_user"><?= eL('deleteuser') ?></label>
+ <?php echo tpl_checkbox('delete_user', false, 'delete_user'); ?>
+ </li>
+ <?php endif; ?>
+ <li>
+ <label for="groupin"><?= eL('globalgroup') ?></label>
+ <select id="groupin" class="adminlist" name="group_in" <?php echo tpl_disableif(!$user->perms('is_admin')); ?>>
+ <?php echo tpl_options($groups, Req::val('group_in', $theuser->infos['global_group'])); ?>
+ </select>
+ <input type="hidden" name="old_global_id" value="<?php echo Filters::noXSS($theuser->infos['global_group']); ?>" />
+ </li>
+
+ <?php if ($proj->id): ?>
+ <li>
+ <label for="projectgroupin"><?= eL('projectgroup') ?></label>
+ <select id="projectgroupin" class="adminlist" name="project_group_in" <?php echo tpl_disableif(!$user->perms('manage_project')); ?>>
+ <?php echo tpl_options(array_merge($project_groups, array(0 => array('group_name' => L('none'), 0 => 0, 'group_id' => 0, 1 => L('none')))), Req::val('project_group_in', $theuser->perms('project_group'))); ?>
+ </select>
+ <input type="hidden" name="old_group_id" value="<?php echo Filters::noXSS($theuser->perms('project_group')); ?>" />
+ <input type="hidden" name="project_id" value="<?php echo $proj->id; ?>" />
+ </li>
+ <?php endif; ?>
+ <li>
+ <hr />
+ </li>
+
+ <?php if (!$theuser->infos['oauth_uid']): ?>
+ <?php if ($user->perms('is_admin') || $user->id == $theuser->id): ?>
+ <?php if (!$fs->prefs['disable_changepw']): ?>
+ <?php if (!$user->perms('is_admin')): ?>
+ <li>
+ <label for="oldpass"><?= eL('oldpass') ?></label>
+ <input id="oldpass" type="password" name="oldpass" value="<?php echo Filters::noXSS(Req::val('oldpass')); ?>" maxlength="100" />
+ </li>
+ <?php endif; ?>
+ <li>
+ <label for="changepass"><?= eL('changepass') ?></label>
+ <input id="changepass" type="password" name="changepass" value="<?php echo Filters::noXSS(Req::val('changepass')); ?>" maxlength="100" />
+ </li>
+ <?php if ($fs->prefs['repeat_password']): ?>
+ <li>
+ <label for="confirmpass"><?= eL('confirmpass') ?></label>
+ <input id="confirmpass" type="password" name="confirmpass" value="<?php echo Filters::noXSS(Req::val('confirmpass')); ?>" maxlength="100" />
+ </li>
+ <?php endif; ?>
+ <?php endif; ?>
+ <?php endif; ?>
+ <?php endif; ?>
+ <li>
+ <input type="hidden" name="action" value="<?php echo Filters::noXSS(Req::val('action', $do . '.edituser')); ?>" />
+ <?php if (Req::val('area') || $do == 'admin'): ?><input type="hidden" name="area" value="users" /><?php endif; ?>
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($theuser->id); ?>" />
+ <button type="submit"><?= eL('updatedetails') ?></button>
+ </li>
+ </ul>
+ </form>
diff --git a/themes/CleanFS/templates/common.userselect.tpl b/themes/CleanFS/templates/common.userselect.tpl
new file mode 100644
index 0000000..dd58eab
--- /dev/null
+++ b/themes/CleanFS/templates/common.userselect.tpl
@@ -0,0 +1,6 @@
+<input class="users text" <?php echo join_attrs($attrs); ?> type="text" name="<?php echo Filters::noXSS($name); ?>" <?php if ($id): ?>id="<?php echo Filters::noXSS($id); ?>"<?php endif; ?> value="<?php echo Filters::noXSS($value); ?>" />
+<span class="autocomplete" id="<?php echo Filters::noXSS($name); ?>_complete"></span>
+<script type="text/javascript">
+ showstuff('<?php echo Filters::noJsXSS($name); ?>_complete');
+ new Ajax.Autocompleter('<?php echo Filters::noJsXSS($id); ?>', '<?php echo Filters::noJsXSS($name); ?>_complete', '<?php echo Filters::noXSS($baseurl); ?>js/callbacks/usersearch.php', {})
+</script>
diff --git a/themes/CleanFS/templates/depends.tpl b/themes/CleanFS/templates/depends.tpl
new file mode 100644
index 0000000..64b2047
--- /dev/null
+++ b/themes/CleanFS/templates/depends.tpl
@@ -0,0 +1,107 @@
+<div style="text-align:center;" class="box">
+ <p><b><?php echo Filters::noXSS(L('pruninglevel')); ?>: </b><?php echo implode(" &nbsp;|&nbsp; \n", $strlist); ?></p>
+ <h2><a href="<?php echo Filters::noXSS(CreateUrl('details', $task_id)); ?>">FS#<?php echo $task_id; ?></a>: <?php echo Filters::noXSS(L('dependencygraph')); ?></h2>
+
+<div id="infovis" style="width:90%;height:50em"></div>
+
+<script type="text/javascript">
+ // init data
+ var json = <?php echo $jasonData; ?>;
+
+ // init ForceDirected
+ var fd = new $jit.ForceDirected({
+ //id of the visualization container
+ injectInto: 'infovis',
+ //Enable zooming and panning
+ //by scrolling and DnD
+ Navigation: {
+ enable: true,
+ //Enable panning events only if we're dragging the empty
+ //canvas (and not a node).
+ zooming: 50 //zoom speed. higher is more sensible
+ },
+ // Change node and edge styles such as
+ // color and width.
+ // These properties are also set per node
+ // with dollar prefixed data-properties in the
+ // JSON structure.
+ Node: {
+ overridable: true,
+ },
+ Edge: {
+ overridable: false,
+ color: '#555555',
+ type: 'arrow',
+ dim: 25,
+ lineWidth: 1
+ },
+ //Native canvas text styling
+ Label: {
+ type: 'HTML', //Native or HTML
+ size: 10,
+ style: 'bold',
+ },
+ //Add Tips
+ Tips: {
+ enable: true,
+ onShow: function(tip, node) {
+ // Count connections
+ var count = 0;
+ node.eachAdjacency(function(adj) {
+ count++;
+ });
+
+ // Display node info in tooltip
+ tip.innerHTML = "<div class=\"popup\" style=\"width:200px\">" + node.name
+ + "<div><b><?php echo Filters::noXSS(L('connectedtasks')); ?></b> " + count + "</div></div>";
+ }
+ },
+ // Add node events
+ Events: {
+ enable: true,
+ type: 'Native'
+ },
+ //Number of iterations for the FD algorithm
+ iterations: 50,
+ //Edge length
+ levelDistance: 130,
+ // Add text to the labels. This method is only triggered
+ // on label creation and only for DOM labels (not native canvas ones).
+ onCreateLabel: function(domElement, node){
+ domElement.innerHTML = node.name;
+ var style = domElement.style;
+ style.fontSize = "1em";
+ style.color = "#ddd";
+ },
+ // Change node styles when DOM labels are placed
+ // or moved.
+ onPlaceLabel: function(domElement, node){
+ var style = domElement.style;
+ var left = parseInt(style.left);
+ var top = parseInt(style.top);
+ var w = domElement.offsetWidth;
+ style.left = (left - w / 2) + 'px';
+ style.top = top + 'px';
+ style.padding = 25 + 'px';
+ style.display = '';
+ }
+ });
+ // load JSON data.
+ fd.loadJSON(json);
+ // compute positions incrementally and animate.
+ fd.computeIncremental({
+ iter: 40,
+ property: 'end',
+ onComplete: function(){
+ fd.animate({
+ modes: ['linear'],
+ transition: $jit.Trans.Elastic.easeOut,
+ duration: 1500
+ });
+ }
+ });
+ // end
+
+</script>
+
+</div> \ No newline at end of file
diff --git a/themes/CleanFS/templates/details.edit.tpl b/themes/CleanFS/templates/details.edit.tpl
new file mode 100644
index 0000000..d56bd56
--- /dev/null
+++ b/themes/CleanFS/templates/details.edit.tpl
@@ -0,0 +1,255 @@
+<?php echo tpl_form(Filters::noXSS(createUrl('details', $task_details['task_id'])),null,null,null,'id="taskeditform"'); ?>
+<!-- Grab fields wanted for this project so we can only show those we want -->
+<?php $fields = explode( ' ', $proj->prefs['visible_fields'] );
+# FIXME The template should respect the ordering of 'visible_fields', aren't they?
+# Maybe define a 'put visible_fields in default ordering'-button in project settings to let them make consistent with other projects and a no-brainer.
+# But let also project managers have the choice to sort to the order they want it.
+
+# FIXME If user wants a task to be moved to other project and a hidden list value (not in visible_fields) would be not legal in the target project:
+# Should we show that dropdown-list even if the field is not in the $fields-array to give the user the chance to resolve the issue?
+# The field list dropdown is not a secret for webtech-people, it is just not visible by css display:none;
+?>
+<style>
+/* can be moved to default theme.css later, when the multiple errors/messages-feature is matured. currently used only here. */
+.errorinput{color:#c00 !important;}
+li.errorinput{background-color:#fc9;}
+.errorinput::before{display:block;content: attr(title);}
+</style>
+<div id="taskdetails">
+ <input type="hidden" name="action" value="details.update" />
+ <input type="hidden" name="edit" value="1" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="edit_start_time" value="<?php echo Filters::noXSS(Req::val('edit_start_time', time())); ?>" />
+ <div id="taskfields">
+ <ul class="form_elements slim">
+ <!-- Status -->
+ <li<?php
+ # show the tasktype if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invalidstatus']) ? ' class="errorinput"' : (in_array('status', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidstatus']) ? '<span class="errorinput" style="display:block;">'.eL('invalidstatus').'</span>' : ''; ?>
+ <label for="status"><?= eL('status') ?></label>
+ <?php echo tpl_select($statusselect); ?>
+ </li>
+ <!-- Progress -->
+ <li<?php echo in_array('progress', $fields) ? '' : ' style="display:none"'; ?>>
+ <label for="percent"<?php echo isset($_SESSION['ERRORS']['invalidprogress']) ? ' class="errorinput" title="'.eL('invalidprogress').'"':''; ?>><?php echo Filters::noXSS(L('percentcomplete')); ?></label>
+ <select id="percent" name="percent_complete" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')) ?>>
+ <?php $arr = array(); for ($i = 0; $i<=100; $i+=10) $arr[$i] = $i.'%'; ?>
+ <?php echo tpl_options($arr, Req::val('percent_complete', $task_details['percent_complete'])); ?>
+ </select>
+ </li>
+ <!-- Task Type -->
+ <li<?php
+ # show the tasktype if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invalidtasktype']) ? ' class="errorinput"' : (in_array('tasktype', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidtasktype']) ? '<span class="errorinput" style="display:block;">'.eL('invalidtasktype').'</span>' : ''; ?>
+ <label for="tasktype"><?= eL('tasktype') ?></label>
+ <?php echo tpl_select($tasktypeselect); ?>
+ </li>
+ <!-- Category -->
+ <li<?php
+ # show the category if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invalidcategory']) ? ' class="errorinput"' : (in_array('category', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidcategory']) ? '<span class="errorinput" style="display:block;">'.eL('invalidcategory').'</span>' : ''; ?>
+ <label for="category"><?= eL('category') ?></label>
+ <?php echo tpl_select($catselect); ?>
+ </li>
+ <!-- Assigned To -->
+ <li<?php echo in_array('assignedto', $fields) ? '' : ' style="display:none"'; ?>>
+ <label><?= eL('assignedto') ?></label>
+ <?php if ($user->perms('edit_assignments')): ?>
+ <input type="hidden" name="old_assigned" value="<?php echo Filters::noXSS($old_assigned); ?>" />
+ <?php $this->display('common.multiuserselect.tpl'); ?>
+ <?php else: ?>
+ <?php if (empty($assigned_users)): ?>
+ <?= eL('noone') ?>
+ <?php else:
+ foreach ($assigned_users as $userid): ?>
+ <?php echo tpl_userlink($userid); ?><br />
+ <?php endforeach;
+ endif;
+ endif; ?>
+ </li>
+ <!-- OS -->
+ <li<?php
+ # show the os if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invalidos']) ? ' class="errorinput"' : (in_array('os', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidos']) ? '<span class="errorinput" style="display:block;">'.eL('invalidos').'</span>' : ''; ?>
+ <label for="os"><?= eL('operatingsystem') ?></label>
+ <?php echo tpl_select($osselect); ?>
+ </li>
+ <!-- Severity -->
+ <li<?php echo in_array('severity', $fields) ? '' : ' style="display:none"'; ?>>
+ <label for="severity"<?php echo isset($_SESSION['ERRORS']['invalidseverity']) ? ' class="errorinput" title="'.eL('invalidseverity').'"':''; ?>><?php echo Filters::noXSS(L('severity')); ?></label>
+ <select id="severity" name="task_severity">
+ <?php echo tpl_options($fs->severities, Req::val('task_severity', $task_details['task_severity'])); ?>
+ </select>
+ </li>
+ <!-- Priority -->
+ <li<?php echo in_array('priority', $fields) ? '' : ' style="display:none"'; ?>>
+ <label for="priority"<?php echo isset($_SESSION['ERRORS']['invalidpriority']) ? ' class="errorinput" title="'.eL('invalidpriority').'"':''; ?>><?php echo Filters::noXSS(L('priority')); ?></label>
+ <select id="priority" name="task_priority" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')) ?>>
+ <?php echo tpl_options($fs->priorities, Req::val('task_priority', $task_details['task_priority'])); ?>
+ </select>
+ </li>
+ <!-- Reported In -->
+ <li<?php
+ # show the reportedversion if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invalidreportedversion']) ? ' class="errorinput"' : (in_array('reportedin', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidreportedversion']) ? '<span class="errorinput" style="display:block;">'.eL('invalidreportedversion').'</span>' : ''; ?>
+ <label for="reportedver"><?= eL('reportedversion') ?></label>
+ <?php echo tpl_select($reportedversionselect); ?>
+ </li>
+ <!-- Due Version -->
+ <li<?php
+ # show the dueversion if invalid when moving tasks - even if not in the visible list.
+ echo isset($_SESSION['ERRORS']['invaliddueversion']) ? ' class="errorinput"' : (in_array('dueversion', $fields) ? '' : ' style="display:none"'); ?>>
+ <?php echo isset($_SESSION['ERRORS']['invaliddueversion']) ? '<span class="errorinput" style="display:block;">'.eL('invaliddueversion').'</span>' : ''; ?>
+ <label for="dueversion"><?= eL('dueinversion') ?></label>
+ <?php echo tpl_select($dueversionselect); ?>
+ </li>
+ <!-- Due Date -->
+ <li<?php echo (in_array('duedate', $fields) && $user->perms('modify_all_tasks')) ? '' : ' style="display:none"'; ?>>
+ <label for="due_date"><?= eL('duedate') ?></label>
+ <?php echo tpl_datepicker('due_date', '', Req::val('due_date', $task_details['due_date'])); ?>
+ </li>
+ <!-- Private -->
+ <?php if ($user->can_change_private($task_details)): ?>
+ <li<?php echo in_array('private', $fields) ? '' : ' style="display:none"'; ?>>
+ <label for="private"><?= eL('private') ?></label>
+ <?php echo tpl_checkbox('mark_private', Req::val('mark_private', $task_details['mark_private']), 'private'); ?>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($proj->prefs['use_effort_tracking'] && $user->perms('view_estimated_effort')): ?>
+ <li>
+ <label for="estimated_effort"><?= eL('estimatedeffort') ?></label>
+ <input id="estimated_effort" name="estimated_effort" class="text" type="text" size="5" maxlength="10" value="<?php echo Filters::noXSS(effort::secondsToEditString($task_details['estimated_effort'], $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format'])); ?>" />
+ <?= eL('hours') ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- If no currently selected project is not there, push it on there so don't have to change things -->
+ <?php
+ $id = Req::val('project_id', $proj->id);
+ $selected = false;
+ foreach ($fs->projects as $value => $label) {
+ if ($label[0] == $id) {
+ $selected = true;
+ break;
+ }
+ }
+
+ if (! $selected) {
+ $title = '---';
+ $foo = array( $id, $title, 'project_id' => $id, 'project_title' => $title);
+ array_unshift( $fs->projects, $foo);
+ }
+
+ ?>
+
+ <!-- If there is only one choice of projects, then don't bother showing it -->
+ <li<?php
+ # show the targetproject selector if invalid when moving tasks
+ echo isset($_SESSION['ERRORS']['invalidtargetproject']) ? ' class="errorinput"' : ''; ?>>
+ <?php echo isset($_SESSION['ERRORS']['invalidtargetproject']) ? '<span class="errorinput" style="display:block;">'.eL('invalidtargetproject').'</span>' : ''; ?>
+ <label for="project_id"><?= eL('attachedtoproject') ?></label>
+ <select name="project_id" id="project_id">
+ <?php echo tpl_options($fs->projects, Req::val('project_id', $proj->id)); ?>
+ </select>
+ </li>
+ </ul>
+ <div id="fineprint">
+ <?= eL('openedby') ?> <?php echo tpl_userlink($task_details['opened_by']); ?>
+ - <span title="<?php echo formatDate($task_details['date_opened'], true); ?>"><?php echo formatDate($task_details['date_opened'], false); ?></span>
+ <?php if ($task_details['last_edited_by']): ?>
+ <br />
+ <?= eL('editedby') ?> <?php echo tpl_userlink($task_details['last_edited_by']); ?>
+ - <span title="<?php echo Filters::noXSS(formatDate($task_details['last_edited_time'], true)); ?>"><?php echo Filters::noXSS(formatDate($task_details['last_edited_time'], false)); ?></span>
+ <?php endif; ?>
+ </div>
+</div>
+<div id="taskdetailsfull">
+ <label for="itemsummary"<?php echo isset($_SESSION['ERRORS']['summaryrequired']) ? ' class="summary errorinput" title="'.eL('summaryrequired').'"':' class="summary"'; ?>>FS#<?php echo Filters::noXSS($task_details['task_id']); ?> <?php echo Filters::noXSS(L('summary')); ?>:
+ <input placeholder="<?= eL('summary') ?>" type="text" name="item_summary" id="itemsummary" maxlength="100" value="<?php echo Filters::noXSS(Req::val('item_summary', $task_details['item_summary'])); ?>" />
+ </label>
+ <?php
+ foreach($tags as $tag): $tagnames[]= Filters::noXSS($tag['tag']); endforeach;
+ isset($tagnames) ? $tagstring=implode(';',$tagnames) : $tagstring='';
+ ?>
+ <label style="display:block;" for="tags" title="<?= eL('tagsinfo') ?>"><?= eL('tags') ?>:
+ <input title="<?= eL('tagsinfo') ?>" placeholder="<?= eL('tags') ?>" type="text" name="tags" id="tags" maxlength="100" value="<?php echo Filters::noXSS(Req::val('tags', $tagstring)); ?>" />
+ </label>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <button tabindex="9" type="button" onclick="showPreview('details', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('detailed_desc', 15, 70, array('id' => 'details'), Req::val('detailed_desc', $task_details['detailed_desc'])); ?>
+ <br />
+ <button type="reset"><?php echo Filters::noXSS(L('reset')); ?></button>
+ <br />
+
+ <div id="addlinkbox">
+ <?php
+ $links = $proj->listTaskLinks($task_details['task_id']);
+ $this->display('common.editlinks.tpl', 'links', $links); ?>
+ <?php if ($user->perms('create_attachments')): ?>
+ <input id="link1" tabindex="8" class="text" type="text" maxlength="100" name="userlink[]" />
+ <script>
+ // hide the fallback input field if javascript is enabled
+ document.getElementById("link1").style.display='none';
+ </script>
+ <button id="addlinkbox_addalink" tabindex="10" type="button" onclick="addLinkField('addlinkbox')"><?php echo Filters::noXSS(L('addalink')); ?></button>
+ <button id="addlinkbox_addanotherlink" tabindex="10" style="display: none" type="button" onclick="addLinkField('addlinkbox')"><?php echo Filters::noXSS(L('addalink')); ?></button>
+ <br />
+ <span style="display: none"><?php /* this span is shown/copied by javascript when adding links */ ?>
+ <input tabindex="8" class="text" type="text" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" class="button fa fa-remove fa-lg" title="<?= eL('remove') ?>" onclick="removeLinkField(this, 'addlinkbox');"></a><br />
+ </span>
+ <?php endif; ?>
+ </div>
+ <div id="uploadfilebox">
+ <?php
+ $attachments = $proj->listTaskAttachments($task_details['task_id']);
+ $this->display('common.editattachments.tpl', 'attachments', $attachments);
+ if ($user->perms('create_attachments')): ?>
+ <input id="file1" tabindex="5" class="file" type="file" size="55" name="usertaskfile[]" />
+ <script>
+ // hide the fallback input field if javascript is enabled
+ document.getElementById("file1").style.display='none';
+ </script>
+ <button id="uploadfilebox_attachafile" tabindex="7" type="button" onclick="addUploadFields()">
+ <?= eL('uploadafile') ?> (<?= eL('max') ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?= eL('MiB') ?>)
+ </button>
+ <button id="uploadfilebox_attachanotherfile" tabindex="7" style="display: none" type="button" onclick="addUploadFields()">
+ <?= eL('attachanotherfile') ?> (<?= eL('max') ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?= eL('MiB') ?>)
+ </button>
+ <br />
+ <span style="display: none"><?php /* this span is shown/copied by javascript when adding files */ ?>
+ <input tabindex="5" class="file" type="file" size="55" name="usertaskfile[]" />
+ <a href="javascript://" tabindex="6" class="button fa fa-remove fa-lg" title="<?= eL('remove') ?>" onclick="removeUploadField(this);"></a><br />
+ </span>
+ <?php endif; ?>
+ </div>
+ <div class="buttons">
+ <?php if ($user->perms('add_comments') && (!$task_details['is_closed'] || $proj->prefs['comment_closed'])): ?>
+ <input type="checkbox" id="s_addcomment" />
+ <label for="s_addcomment" title="<?= eL('addcomment') ?>">
+ <span class="fa-stack">
+ <i class="fa fa-comment-o fa-stack-2x"></i>
+ <i class="fa fa-plus fa-stack-1x"></i>
+ </span>
+ </label>
+ <div id="edit_add_comment">
+ <label for="comment_text"><?php echo Filters::noXSS(L('comment')); ?></label>
+ <textarea accesskey="r" tabindex="8" id="comment_text" name="comment_text" cols="50" rows="2"></textarea>
+ </div>
+ <br />
+ <?php endif; ?>
+ <button type="submit" class="positive" accesskey="s" onclick="return checkok('<?php echo Filters::noJsXSS($baseurl); ?>js/callbacks/checksave.php?time=<?php echo Filters::noXSS(time()); ?>&amp;task_id=<?php echo Filters::noXSS($task_details['task_id']); ?>', '<?php echo Filters::noJsXSS(L('alreadyedited')); ?>', 'taskeditform')"><?php echo Filters::noXSS(L('savedetails')); ?></button>
+ <a class="button" href="<?php echo Filters::noXSS(createUrl('details', $task_details['task_id'])); ?>"><?= eL('canceledit') ?></a>
+ </div>
+</div>
+<div class="clear"></div>
+</div>
+</form>
diff --git a/themes/CleanFS/templates/details.tabs.comment.tpl b/themes/CleanFS/templates/details.tabs.comment.tpl
new file mode 100644
index 0000000..a2ded4f
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.comment.tpl
@@ -0,0 +1,118 @@
+<?php /* preset 'active' class, so browsers with disabled javascript see the comments tab content. */ ?>
+<div id="comments" class="tab active">
+ <?php foreach($comments as $comment): ?>
+ <div class="comment_container" id="<?php echo 'comment' . $comment['comment_id']; ?>">
+ <div class="comment_avatar"><?php echo tpl_userlinkavatar($comment['user_id'], $fs->prefs['max_avatar_size'], 'av_comment'); ?></div>
+ <div class="comment">
+ <div class="comment_header">
+ <div class="comment_header_actions">
+ <?php echo tpl_form(CreateUrl('details', $task_details['task_id'])); ?>
+ <?php
+ $theuser = new User($comment['user_id']);
+ if (!$theuser->isAnon()) {
+ if ($theuser->perms('is_admin')) {
+ $rank = 'Admin';
+ }
+ else if ($theuser->perms('manage_project')) {
+ $rank = 'Project Manager';
+ }
+ else {
+ $rank = '';
+ }
+
+ if (!empty($rank)) {
+ echo '<span class="comment_header_usertype">'.Filters::noXSS($rank).'</span>';
+ }
+ }
+ ?>
+ <?php if ($user->perms('edit_comments') || ($user->perms('edit_own_comments') && $comment['user_id'] == $user->id)): ?>
+ <a href="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?do=editcomment&amp;task_id=<?php echo Filters::noXSS($task_details['task_id']); ?>&amp;id=<?php echo Filters::noXSS($comment['comment_id']); ?>" title="<?php echo Filters::noXSS(L('edit')); ?>"><span class="fa fa-pencil fa-lg" style="margin-right: 10px;"></span></a>
+ <?php endif; ?>
+ <?php if ($user->perms('delete_comments')): ?>
+ <input type="hidden" name="action" value="details.deletecomment"/>
+ <input type="hidden" name="comment_id" value="<?php echo $comment['comment_id']; ?>"/>
+ <?php $confirm = (isset($comment_attachments[$comment['comment_id']])) ? sprintf(L('confirmdeletecomment'), L('attachementswilldeleted')) : sprintf(L('confirmdeletecomment'), '') ?>
+ <button type="submit" class="fakelinkbutton" onclick="return confirm('<?php echo Filters::noJsXSS($confirm); ?>');" title="<?php echo Filters::noXSS(L('delete')); ?>"><span class="fa fa-remove fa-lg"></span></button>
+ <?php endif; ?>
+ </form>
+ </div>
+ <div class="comment_header_infos"><?php echo tpl_userlink($comment['user_id']); ?> <?php echo Filters::noXSS(L('commentedon')); ?> <?php echo Filters::noXSS(formatDate($comment['date_added'], true)); ?></div>
+ </div>
+ <div class="commenttext">
+ <?php echo TextFormatter::render($comment['comment_text'], 'comm', $comment['comment_id'], $comment['content']); ?>
+ <?php if (isset($comment_links[$comment['comment_id']])) {
+ $this->display('common.links.tpl', 'links', $comment_links[$comment['comment_id']]);
+ }?>
+ <?php if (isset($comment_attachments[$comment['comment_id']])) {
+ $this->display('common.attachments.tpl', 'attachments', $comment_attachments[$comment['comment_id']]);
+ }?>
+ </div>
+ </div>
+ </div>
+ <?php endforeach; ?>
+ <?php if ($user->perms('add_comments') && (!$task_details['is_closed'] || $proj->prefs['comment_closed'])): ?>
+ <div class="comment_container">
+ <div class="comment_avatar"><?php echo tpl_userlinkavatar($user->id, $fs->prefs['max_avatar_size'], 'av_comment'); ?></div>
+ <div class="comment">
+ <div class="comment_header">
+ <?php echo Filters::noXSS(L('addcomment')); ?>
+ </div>
+ <div class="commenttext">
+ <?php echo tpl_form(CreateUrl('details', $task_details['task_id']), 'comment', 'post', 'multipart/form-data'); ?>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <?php endif; ?>
+ <input type="hidden" name="action" value="details.addcomment" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS(Req::val('task_id', $task_details['task_id'])); ?>" />
+ <?php if (!$watched): ?>
+ <?php echo tpl_checkbox('notifyme', Req::val('notifyme', !(Req::val('action') == 'details.addcomment')), 'notifyme'); ?> <label class="left" for="notifyme"><?php echo Filters::noXSS(L('notifyme')); ?></label>
+ <?php endif; ?>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <button tabindex="9" type="button" onclick="showPreview('comment_text', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('comment_text', 10, 72, array('accesskey' => 'r', 'tabindex' => 8, 'id' => 'comment_text')); ?>
+ <div id="addlinkbox">
+ <button id="addlinkbox_addalink" tabindex="10" type="button" onclick="addLinkField('addlinkbox')">
+ <?php echo Filters::noXSS(L('addalink')); ?>
+ </button>
+ <button id="addlinkbox_addanotherlink" tabindex="10" style="display: none" type="button" onclick="addLinkField('addlinkbox')">
+ <?php echo Filters::noXSS(L('addanotherlink')); ?>
+ </button>
+ <span style="display: none">
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" onclick="removeLinkField(this, 'addlinkbox');"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ <noscript>
+ <span>
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" onclick="removeLinkField(this, 'addlinkbox');"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ </noscript>
+ </div>
+ <?php if ($user->perms('create_attachments')): ?>
+ <div id="uploadfilebox">
+ <button id="uploadfilebox_attachafile" tabindex="7" type="button" onclick="addUploadFields()">
+ <?php echo Filters::noXSS(L('uploadafile')); ?> (<?php echo Filters::noXSS(L('max')); ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?php echo Filters::noXSS(L('MiB')); ?>)
+ </button>
+ <button id="uploadfilebox_attachanotherfile" tabindex="7" style="display: none" type="button" onclick="addUploadFields()">
+ <?php echo Filters::noXSS(L('attachanotherfile')); ?> (<?php echo Filters::noXSS(L('max')); ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?php echo Filters::noXSS(L('MiB')); ?>)
+ </button>
+ <span style="display: none;"><!-- this span is shown/copied in javascript when adding files -->
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ <a href="javascript://" tabindex="6" onclick="removeUploadField(this);"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ <noscript>
+ <span>
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ <a href="javascript://" tabindex="6" onclick="removeUploadField(this);"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ </noscript>
+ </div>
+ <?php endif; ?>
+ <button class="button positive" accesskey="s" tabindex="9" type="submit"><?php echo Filters::noXSS(L('addcomment')); ?></button>
+ </form>
+ </div>
+ </div>
+ </div>
+ <?php endif; ?>
+</div>
diff --git a/themes/CleanFS/templates/details.tabs.efforttracking.tpl b/themes/CleanFS/templates/details.tabs.efforttracking.tpl
new file mode 100644
index 0000000..7cd6a9b
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.efforttracking.tpl
@@ -0,0 +1,52 @@
+<div id="effort" class="tab">
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('details', $task_details['task_id'])).'#effort'); ?>
+ <?php if ($user->perms('track_effort')) { ?>
+ <input type="hidden" name="action" value="details.efforttracking"/>
+ <button type="submit" name="start_tracking" value="true"><?php echo Filters::noXSS(L('starteffort')); ?></button>
+ <br />
+ <label for="effort_to_add"><?php echo Filters::noXSS(L('manualeffort')); ?></label>
+ <input id="effort_to_add" name="effort_to_add" class="text" type="text" size="5" maxlength="100" value='00:00'/>
+ <button type="submit" name="manual_effort" value="true"><?php echo Filters::noXSS(L('addeffort')); ?></button>
+ <?php } ?>
+ <table class="userlist history">
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('date')); ?></th>
+ <th><?php echo Filters::noXSS(L('user')); ?></th>
+ <th><?php echo Filters::noXSS(L('effort')); ?> (H:M)</th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach($effort->details as $details){
+ ?>
+ <tr>
+ <td><?php echo Filters::noXSS(formatDate($details['date_added'], true)); ?></td>
+ <td><?php echo tpl_userlink($details['user_id']); ?></td>
+ <td><?php
+ if($details['effort'] == 0 && $details['end_timestamp']==false)
+ { ?>
+ <?php echo Filters::noXSS(L('trackinginprogress')); ?> (<?php
+
+ echo effort::SecondsToString(time()-$details['start_timestamp'], $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']);
+
+ ?>)
+ <?php }
+ else
+ {
+ echo effort::SecondsToString($details['effort'], $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']);
+ } ?>
+ </td>
+ <td>
+ <?php if($user->id == $details['user_id'] & is_null($details['end_timestamp'])){ ?>
+ <button type="submit" name="stop_tracking" value="true"><?php echo Filters::noXSS(L('endeffort')); ?></button>
+ <button type="submit" name="cancel_tracking" value="true"><?php echo Filters::noXSS(L('cleareffort')); ?></button>
+ <?php } ?>
+ </td>
+ </tr>
+ <?php } ?>
+ </tbody>
+ </table>
+ </form>
+</div>
diff --git a/themes/CleanFS/templates/details.tabs.history.callback.tpl b/themes/CleanFS/templates/details.tabs.history.callback.tpl
new file mode 100644
index 0000000..07eefd5
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.history.callback.tpl
@@ -0,0 +1,32 @@
+<?php if ($details && count($histories)): ?>
+<table class="userlist history">
+ <tr>
+ <th><?php echo Filters::noXSS(L('previousvalue')); ?></th>
+ <th><?php echo Filters::noXSS(L('newvalue')); ?></th>
+ </tr>
+ <tr>
+ <td><?php echo $details_previous; ?></td>
+ <td><?php echo $details_new; ?></td>
+ </tr>
+</table>
+<?php else: ?>
+<table class="userlist history">
+ <tr>
+ <th><?php echo Filters::noXSS(L('eventdate')); ?></th>
+ <th><?php echo Filters::noXSS(L('user')); ?></th>
+ <th><?php echo Filters::noXSS(L('event')); ?></th>
+ </tr>
+
+ <?php foreach($histories as $history): ?>
+ <tr>
+ <td><?php echo Filters::noXSS(formatDate($history['event_date'], false)); ?></td>
+ <?php if($fs->prefs['enable_avatars'] == 1) { ?>
+ <td><?php echo tpl_userlinkavatar($history['user_id'], $fs->prefs['max_avatar_size'] / 2, 'left', '0px 5px 0px 0px'); ?> <?php echo tpl_userlink($history['user_id']); ?></td>
+ <?php } else { ?>
+ <td><?php echo tpl_userlink($history['user_id']); ?></td>
+ <?php } ?>
+ <td><?php echo event_description($history); ?></td>
+ </tr>
+ <?php endforeach; ?>
+</table>
+<?php endif; ?>
diff --git a/themes/CleanFS/templates/details.tabs.history.tpl b/themes/CleanFS/templates/details.tabs.history.tpl
new file mode 100644
index 0000000..69d7d79
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.history.tpl
@@ -0,0 +1,3 @@
+<div id="history" class="tab">
+ <h3><?php echo Filters::noXSS(L('loading')); ?></h3>
+</div>
diff --git a/themes/CleanFS/templates/details.tabs.notifs.tpl b/themes/CleanFS/templates/details.tabs.notifs.tpl
new file mode 100644
index 0000000..cebad39
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.notifs.tpl
@@ -0,0 +1,30 @@
+<div id="notify" class="tab">
+ <p><em><?php echo Filters::noXSS(L('theseusersnotify')); ?></em></p>
+ <?php foreach ($notifications as $row): ?>
+ <div>
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('details', $task_details['task_id'])).'#notify',null,null,null,'style="display:inline"'); ?>
+ <input type="hidden" name="action" value="remove_notification" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($row['user_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('remove')); ?></button>
+ <?php echo tpl_userlink($row['user_id']); ?>
+ </form>
+ <!--
+ <a href="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?do=details&amp;action=remove_notification&amp;task_id=<?php echo Filters::noXSS($task_details['task_id']); ?>&amp;ids=<?php echo Filters::noXSS($task_details['task_id']); ?>&amp;user_id=<?php echo Filters::noXSS($row['user_id']); ?>#notify"><?php echo Filters::noXSS(L('remove')); ?></a>
+ -->
+ </div>
+ <?php endforeach; ?>
+
+ <?php if ($user->perms('manage_project')): ?>
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('details', $task_details['task_id'])).'#notify'); ?>
+ <div>
+ <label class="default multisel" for="notif_user_id"><?php echo Filters::noXSS(L('addusertolist')); ?>: </label>
+ <?php echo tpl_userselect('user_name', Req::val('user_name'), 'notif_user_id'); ?>
+ <button type="submit"><?php echo Filters::noXSS(L('add')); ?></button>
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS(Req::num('ids', $task_details['task_id'])); ?>" />
+ <input type="hidden" name="action" value="details.add_notification" />
+ </div>
+ </form>
+ <?php endif; ?>
+</div>
+
diff --git a/themes/CleanFS/templates/details.tabs.related.tpl b/themes/CleanFS/templates/details.tabs.related.tpl
new file mode 100644
index 0000000..543f7d2
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.related.tpl
@@ -0,0 +1,65 @@
+<div id="related" class="tab">
+
+ <div class="related">
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])).'#related');?>
+ <table id="tasks_related" class="userlist">
+ <thead>
+ <tr>
+ <th>
+ <a class="toggle_selected" href="javascript:ToggleSelected('tasks_related')">
+ <!--<img title="<?php echo Filters::noXSS(L('toggleselected')); ?>" alt="<?php echo Filters::noXSS(L('toggleselected')); ?>" src="<?php echo Filters::noXSS($this->get_image('kaboodleloop')); ?>" width="16" height="16" />-->
+ </a>
+ </th>
+ <th><?php echo Filters::noXSS(L('tasksrelated')); ?> (<?php echo Filters::noXSS(count($related)); ?>)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach ($related as $row):
+ ?>
+ <tr>
+ <td class="ttcolumn">
+ <input type="checkbox" name="related_id[]" <?php echo tpl_disableif(!$user->can_edit_task($task_details)); ?> value="<?php echo Filters::noXSS($row['related_id']); ?>" /></td>
+ <td><?php echo tpl_tasklink($row); ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td colspan="2">
+ <input type="hidden" name="action" value="remove_related" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('remove')); ?></button>
+ </td>
+ </tr>
+ </tfoot>
+ </table>
+ </form>
+ </div>
+
+ <div class="related">
+ <table id="duplicate_tasks" class="userlist">
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('duplicatetasks')); ?> (<?php echo Filters::noXSS(count($duplicates)); ?>)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($duplicates as $row): ?>
+ <tr><td><?php echo tpl_tasklink($row); ?></td></tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ </div>
+
+ <?php if ($user->can_edit_task($task_details) && !$task_details['is_closed']): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])).'#related',null,null,null,'class="clear" id="formaddrelatedtask"'); ?>
+ <div>
+ <input type="hidden" name="action" value="details.add_related" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <label><?php echo Filters::noXSS(L('addnewrelated')); ?> FS#<input name="related_task" id="related_task_input" type="text" class="text" size="10" maxlength="10" /></label>
+ <button type="submit" onclick="return checkok('<?php echo Filters::noJsXSS($baseurl); ?>js/callbacks/checkrelated.php?related_task=' + $('related_task_input').value + '&amp;project=<?php echo Filters::noXSS($proj->id); ?>', '<?php echo Filters::noJsXSS(L('relatedproject')); ?>', 'formaddrelatedtask')"><?php echo Filters::noXSS(L('add')); ?></button>
+ </div>
+ </form>
+ <?php endif; ?>
+</div>
diff --git a/themes/CleanFS/templates/details.tabs.remind.tpl b/themes/CleanFS/templates/details.tabs.remind.tpl
new file mode 100644
index 0000000..3332304
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.remind.tpl
@@ -0,0 +1,76 @@
+<?php if (!$task_details['is_closed']): ?>
+ <div id="remind" class="tab">
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('details', $task_details['task_id'])).'#remind'); ?>
+ <?php if (count($reminders)): ?>
+ <table id="reminders" class="userlist">
+ <thead>
+ <tr>
+ <th>
+ <a class="toggle_selected" title="<?php echo Filters::noXSS(L('toggleselected')); ?>"
+ href="javascript:ToggleSelected('reminders')"></a>
+ </th>
+ <th><?php echo Filters::noXSS(L('user')); ?></th>
+ <th><?php echo Filters::noXSS(L('startat')); ?></th>
+ <th><?php echo Filters::noXSS(L('frequency')); ?></th>
+ <th><?php echo Filters::noXSS(L('message')); ?></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($reminders as $row): ?>
+ <tr>
+ <td class="ttcolumn">
+ <input type="checkbox" name="reminder_id[]" <?php echo tpl_disableif(!$user->can_edit_task($task_details)); ?> value="<?php echo Filters::noXSS($row['reminder_id']); ?>" />
+ </td>
+ <td><?php echo tpl_userlink($row['user_id']); ?></td>
+ <td><?php echo Filters::noXSS(formatDate($row['start_time'])); ?></td>
+ <?php
+ // Work out the unit of time to display
+ if ($row['how_often'] < 86400) {
+ $how_often = $row['how_often'] / 3600 . ' ' . L('hours');
+ } elseif ($row['how_often'] < 604800) {
+ $how_often = $row['how_often'] / 86400 . ' ' . L('days');
+ } else {
+ $how_often = $row['how_often'] / 604800 . ' ' . L('weeks');
+ }
+ ?>
+ <td><?php echo Filters::noXSS($how_often); ?></td>
+ <td><?php echo TextFormatter::render($row['reminder_message']); ?></td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ <tfoot>
+ <tr><td colspan="5">
+ <input type="hidden" name="action" value="deletereminder" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('remove')); ?></button></td>
+ </tr>
+ </tfoot>
+ </table>
+ <?php endif; ?>
+ </form>
+
+ <fieldset><legend><?php echo Filters::noXSS(L('addreminder')); ?></legend>
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('details', $task_details['task_id'])).'#remind',null,null,null,'id="formaddreminder"'); ?>
+ <div>
+ <input type="hidden" name="action" value="details.addreminder" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <label class="default multisel" for="to_user_id"><?php echo Filters::noXSS(L('remindthisuser')); ?></label>
+ <?php echo tpl_userselect('to_user_id', Req::val('to_user_id'), 'to_user_id'); ?>
+ <br />
+ <label for="timeamount1"><?php echo Filters::noXSS(L('thisoften')); ?></label>
+ <input class="text" type="text" value="<?php echo Filters::noXSS(Req::val('timeamount1')); ?>" id="timeamount1" name="timeamount1" size="3" maxlength="3" />
+ <select class="adminlist" name="timetype1">
+ <?php echo tpl_options(array(3600 => L('hours'), 86400 => L('days'), 604800 => L('weeks')), Req::val('timetype1')); ?>
+ </select>
+ <br />
+ <?php echo tpl_datepicker('timeamount2', L('startat'), Req::val('timeamount2', formatDate(time()))); ?>
+ <br />
+ <textarea class="text" name="reminder_message"
+ rows="10" cols="72"><?php echo Filters::noXSS(Req::val('reminder_message', L('defaultreminder') . "\n\n" . CreateURL('details', $task_details['task_id']))); ?></textarea>
+ <br />
+ <button type="submit"><?php echo Filters::noXSS(L('addreminder')); ?></button>
+ </div>
+ </form>
+ </fieldset>
+</div>
+<?php endif; ?>
diff --git a/themes/CleanFS/templates/details.tabs.tpl b/themes/CleanFS/templates/details.tabs.tpl
new file mode 100644
index 0000000..b1aad8b
--- /dev/null
+++ b/themes/CleanFS/templates/details.tabs.tpl
@@ -0,0 +1,39 @@
+<ul id="submenu">
+ <?php if ($user->perms('view_comments') || $proj->prefs['others_view'] || ($user->isAnon() && $task_details['task_token'] && Get::val('task_token') == $task_details['task_token'])): ?>
+ <li id="commentstab">
+ <a href="#comments"><?php echo Filters::noXSS(L('comments')); ?> (<?php echo count($comments); ?>)</a>
+ </li>
+ <?php endif; ?>
+
+ <li id="relatedtab">
+ <a href="#related"><?php echo Filters::noXSS(L('relatedtasks')); ?> (<?php echo count($related); ?>/<?php echo count($duplicates); ?>)</a>
+ </li>
+
+ <?php if ($user->perms('manage_project')): ?>
+ <li id="notifytab">
+ <a href="#notify"><?php echo Filters::noXSS(L('notifications')); ?> (<?php echo count($notifications); ?>)</a>
+ </li>
+ <?php if (!$task_details['is_closed']): ?>
+ <li id="remindtab">
+ <a href="#remind"><?php echo Filters::noXSS(L('reminders')); ?> (<?php echo count($reminders); ?>)</a>
+ </li>
+ <?php endif; ?>
+ <?php endif; ?>
+
+ <?php if ($user->perms('view_history')): ?>
+ <li id="historytab">
+ <a id="historytaba" onmousedown="getHistory('<?php echo Filters::noXSS($task_details['task_id']); ?>', '<?php echo Filters::noJsXSS($baseurl); ?>', 'history', '<?php echo Filters::noXSS(Get::num('details')); ?>');"
+ href="<?php echo Filters::noXSS(CreateURL('details', $task_details['task_id'], null)); ?>#history"><?php echo Filters::noXSS(L('history')); ?></a>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($proj->prefs['use_effort_tracking']){ ?>
+ <?php if ($user->perms('view_current_effort_done')){ ?>
+ <li id="efforttab">
+ <a href="#effort"><?php echo Filters::noXSS(L('efforttracking')); ?></a>
+ </li>
+
+ <?php
+ }
+ } ?>
+</ul>
diff --git a/themes/CleanFS/templates/details.view.tpl b/themes/CleanFS/templates/details.view.tpl
new file mode 100644
index 0000000..abbcfc1
--- /dev/null
+++ b/themes/CleanFS/templates/details.view.tpl
@@ -0,0 +1,882 @@
+<div id="actionbar">
+<?php if ($task_details['is_closed']): //if task is closed ?>
+ <?php if ($user->can_close_task($task_details)):
+ echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="reopen" />
+ <button><?php echo L('reopenthistask'); ?></button>
+ </form>
+ <?php elseif (!$user->isAnon() && !Flyspray::adminRequestCheck(2, $task_details['task_id'])): ?>
+
+<button class="submit main" onclick="showhidestuff('requestreopen');"><?php echo Filters::noXSS(L('reopenrequest')); ?></button>
+<div id="requestreopen" class="popup hide">
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),'form3',null,null,'id="formclosetask"'); ?>
+ <input type="hidden" name="action" value="requestreopen" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <label for="reason"><?php echo Filters::noXSS(L('reasonforreq')); ?></label>
+ <textarea id="reason" name="reason_given"></textarea><br/>
+ <button type="submit"><?php echo Filters::noXSS(L('submitreq')); ?></button>
+ </form>
+ </div>
+ <?php endif; ?>
+<?php else: //if task is open ?>
+ <?php if ($user->can_close_task($task_details) && !$d_open): ?>
+ <a href="<?php echo Filters::noXSS(createURL('details', $task_details['task_id'], null, array('showclose' => !Req::val('showclose')))); ?>"
+ id="closetask" class="button main" accesskey="y"
+ onclick="showhidestuff('closeform');return false;"> <?php echo Filters::noXSS(L('closetask')); ?></a>
+
+ <div id="closeform" class="<?php if (Req::val('action') != 'details.close' && !Req::val('showclose')): ?>hide <?php endif; ?>popup">
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'id="formclosetask"'); ?>
+ <input type="hidden" name="action" value="details.close"/>
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>"/>
+ <select class="adminlist" name="resolution_reason" onmouseup="event.stopPropagation();">
+ <option value="0"><?php echo Filters::noXSS(L('selectareason')); ?></option>
+ <?php echo tpl_options($proj->listResolutions(), Req::val('resolution_reason')); ?>
+ </select>
+ <button type="submit"><?php echo Filters::noXSS(L('closetask')); ?></button>
+ <br/>
+ <label class="default text" for="closure_comment"><?php echo Filters::noXSS(L('closurecomment')); ?></label>
+ <textarea class="text" id="closure_comment" name="closure_comment" rows="3" cols="25"><?php echo Filters::noXSS(Req::val('closure_comment')); ?></textarea>
+ <?php if($task_details['percent_complete'] != '100'): ?>
+ <label><?php echo tpl_checkbox('mark100', Req::val('mark100', !(Req::val('action') == 'details.close'))); ?>&nbsp;&nbsp;<?php echo Filters::noXSS(L('mark100')); ?></label>
+ <?php endif; ?>
+ </form>
+ </div>
+
+ <?php elseif (!$d_open && !$user->isAnon() && !Flyspray::AdminRequestCheck(1, $task_details['task_id'])): ?>
+ <a href="#close" id="reqclose" class="button main" onclick="showhidestuff('closeform');"><?php echo Filters::noXSS(L('requestclose')); ?></a>
+ <div id="closeform" class="popup hide">
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),'form3',null,null,'id="formclosetask"'); ?>
+ <input type="hidden" name="action" value="requestclose"/>
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>"/>
+ <label for="reason"><?php echo Filters::noXSS(L('reasonforreq')); ?></label>
+ <textarea id="reason" name="reason_given"></textarea><br/>
+ <button type="submit"><?php echo Filters::noXSS(L('submitreq')); ?></button>
+ </form>
+ </div>
+
+ <?php elseif(!$user->isAnon()): ?>
+ <a href="#closedisabled" id="reqclose" class="tooltip button disabled main"><?php echo Filters::noXSS(L('closetask')); ?>
+
+ <span class="custom info">
+ <em><?php echo Filters::noXSS(L('information')); ?></em>
+ <br>
+ <?php echo Filters::noXSS(L('taskclosedisabled')); ?>
+ <br>
+ <?php
+ foreach ($deps as $dependency){
+ echo "FS#".$dependency['task_id']." : ".$dependency['item_summary']."</br>";
+ }
+ ?>
+ </span>
+ </a>
+ <?php endif; ?>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <a id="edittask" class="button" accesskey="e"
+ href="<?php echo Filters::noXSS(createURL('edittask', $task_details['task_id'])); ?>"> <?php echo Filters::noXSS(L('edittask')); ?></a>
+ <?php endif; ?>
+
+ <?php if ($user->can_take_ownership($task_details)): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'style="display:inline"'); ?>
+ <input type="hidden" name="action" value="takeownership" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit" id="own"><?php echo Filters::noXSS(L('assigntome')); ?></button>
+ </form>
+ <?php endif; ?>
+
+ <?php if ($user->can_add_to_assignees($task_details) && !empty($task_details['assigned_to'])): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'style="display:inline"'); ?>
+ <input type="hidden" name="action" value="addtoassignees" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit" id="own_add"><?php echo Filters::noXSS(L('addmetoassignees')); ?></button>
+ </form>
+ <?php endif; ?>
+ <input type="checkbox" id="s_quickactions" />
+ <label class="button main" id="actions" for="s_quickactions"><?php echo Filters::noXSS(L('quickaction')); ?></label>
+ <div id="actionsform">
+ <ul>
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <li>
+ <a accesskey="e" href="<?php echo Filters::noXSS(createURL('edittask', $task_details['task_id'])); ?>"> <?php echo Filters::noXSS(L('edittask')); ?></a>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($user->can_set_task_parent($task_details)): ?>
+ <li><input type="checkbox" id="s_parent" /><label for="s_parent"><?php echo Filters::noXSS(L('setparent')); ?></label>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'id="setparentform"'); ?>
+ <?php echo Filters::noXSS(L('parenttaskid')); ?>
+ <input type="hidden" name="action" value="details.setparent" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input class="text" type="text" value="" id="supertask_id" name="supertask_id" size="5" maxlength="10" />
+ <button type="submit" name="submit"><?php echo Filters::noXSS(L('set')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+ <?php if ($user->can_associate_task($task_details)): ?>
+ <li><input type="checkbox" id="s_associate"/><label for="s_associate"><?php echo Filters::noXSS(L('associatesubtask')); ?></label>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'id="associateform"'); ?>
+ <?php echo Filters::noXSS(L('associatetaskid')); ?>
+ <input type="hidden" name="action" value="details.associatesubtask"/>
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>"/>
+ <input class="text" type="text" value="" id="associate_subtask_id" name="associate_subtask_id" size="5" maxlength="10"/>
+ <button type="submit" name="submit"><?php echo Filters::noXSS(L('set')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+ <li>
+ <a href="<?php echo Filters::noXSS(createURL('depends', $task_details['task_id'])); ?>"><?php echo Filters::noXSS(L('depgraph')); ?></a>
+ </li>
+ <?php if ($user->can_add_task_dependency($task_details)): ?>
+ <li><input type="checkbox" id="s_adddependent"/><label for="s_adddependent"><?php echo Filters::noXSS(L('adddependenttask')); ?></label>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'id="adddepform"'); ?>
+ <input type="hidden" name="action" value="details.newdep" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <label for="dep_task_id"><?php echo Filters::noXSS(L('newdependency')); ?></label>
+ FS# <input class="text" type="text" value="<?php echo Filters::noXSS(Req::val('dep_task_id')); ?>" id="dep_task_id" name="dep_task_id" size="5" maxlength="10" />
+ <button type="submit" name="submit"><?php echo Filters::noXSS(L('add')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($proj->id && $user->perms('open_new_tasks')): ?>
+ <li>
+ <a href="<?php echo Filters::noXSS(createURL('newtask', $proj->id, $task_details['task_id'])); ?>"><?php echo Filters::noXSS(L('addnewsubtask')); ?></a>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($user->can_take_ownership($task_details)): ?>
+ <li><?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="takeownership" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('assigntome')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($user->can_add_to_assignees($task_details) && !empty($task_details['assigned_to'])): ?>
+ <li>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="addtoassignees" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('addmetoassignees')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($user->can_vote($task_details) > 0): ?>
+ <li>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="details.addvote" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('voteforthistask')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+
+ <?php if (!$user->isAnon() && !$watched): ?>
+ <li>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="details.add_notification" />
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($user->id); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('watchthistask')); ?></button>
+ </form>
+ </li>
+ <?php endif; ?>
+
+ <?php if ($user->can_change_private($task_details)): ?>
+ <li>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <?php if ($task_details['mark_private']): ?>
+ <input type="hidden" name="action" value="makepublic"/>
+ <button><?php echo eL('makepublic'); ?></button>
+ <?php elseif (!$task_details['mark_private']): ?>
+ <input type="hidden" name="action" value="makeprivate"/>
+ <button><?php echo eL('privatethistask'); ?></button>
+ <?php endif; ?>
+ </form>
+ </li>
+ <?php endif; ?>
+ </ul>
+ </div>
+<?php endif; ?>
+</div>
+
+<script type="text/javascript">
+function show_hide(elem, flag)
+{
+ elem.style.display = "none";
+ if(flag)
+ elem.nextElementSibling.style.display = "block";
+ else
+ elem.previousElementSibling.style.display = "block";
+}
+function quick_edit(elem, id)
+{
+ var e = document.getElementById(id);
+ var name = e.name;
+ var value = e.value;
+ var text;
+ if(e.selectedIndex != null)
+ text = e.options[e.selectedIndex].text;
+ else
+ text = document.getElementById(id).value; // for due date and estimated effort
+ var xmlHttp = new XMLHttpRequest();
+
+ xmlHttp.onreadystatechange = function(){
+ if(xmlHttp.readyState == 4){
+ var target = elem.previousElementSibling;
+ if(xmlHttp.status == 200){
+ if(target.getElementsByTagName("span").length > 0)//for progress
+ {
+ target.getElementsByTagName("span")[0].innerHTML = text;
+ target.getElementsByClassName("progress_bar")[0].style.width = text;
+ }else{
+ target.innerHTML = text;
+ }
+ target.className='fa fa-check';
+ elem.className='fa fa-check';
+ show_hide(elem, false);
+ }else{
+ // TODO show error message returned from the server and let quickedit form open
+ target.className='fa fa-warning';
+ elem.className='fa fa-warning';
+ }
+ }
+ }
+ xmlHttp.open("POST", "<?php echo Filters::noXSS($baseurl); ?>js/callbacks/quickedit.php", true);
+ xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
+ xmlHttp.send("name=" + name + "&value=" + value + "&task_id=<?php echo Filters::noXSS($task_details['task_id']); ?>&csrftoken=<?php echo $_SESSION['csrftoken'] ?>");
+}
+</script>
+
+<!-- Grab fields wanted for this project so we can only show those we want -->
+<?php $fields = explode( ' ', $proj->prefs['visible_fields'] ); ?>
+
+<div id="taskdetails">
+ <span id="navigation"> <?php if ($prev_id): ?>
+ <?php echo tpl_tasklink($prev_id, L('previoustask'), false, array('id'=>'prev', 'accesskey' => 'p')); ?>
+
+ <?php endif; ?>
+ <?php if ($prev_id): ?> | <?php endif; ?>
+ <?php
+ if(isset($_COOKIE['tasklist_type']) && $_COOKIE['tasklist_type'] == 'project'):
+ $params = $_GET; unset($params['do'], $params['action'], $params['task_id'], $params['switch'], $params['project']);
+ ?>
+ <a href="<?php echo Filters::noXSS(createURL('project', $proj->id, null, array('do' => 'index') + $params)); ?>"><?php echo Filters::noXSS(L('tasklist')); ?></a>
+ <?php endif;
+ if ($next_id): ?>
+ <?php echo tpl_tasklink($next_id, L('nexttask'), false, array('id'=>'next', 'accesskey' => 'n')); ?>
+
+ <?php endif; ?>
+ </span>
+
+ <div id="taskfields">
+<?php if($user->can_edit_task($task_details)) : ?><div id="intromessage" align="center"><?php echo Filters::noXSS(L('clicktoedit')); ?></div><?php endif; ?>
+ <ul class="fieldslist">
+ <!-- Status -->
+ <?php if (in_array('status', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('status')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value">
+ <?php if ($task_details['is_closed']): ?>
+ <?php echo Filters::noXSS(L('closed')); ?>
+
+ <?php else: ?>
+ <?php echo Filters::noXSS($task_details['status_name']); ?>
+
+ <?php if ($reopened): ?>
+ &nbsp; <strong class="reopened"><?php echo Filters::noXSS(L('reopened')); ?></strong>
+ <?php endif; ?>
+ <?php endif; ?>
+ </span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="status" name="item_status">
+ <?php echo tpl_options($proj->listTaskStatuses(), Req::val('item_status', $task_details['item_status'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'status')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a onclick="show_hide(this.parentNode.parentNode, false)" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+
+ </li>
+ <?php endif; ?>
+
+ <!-- Progress -->
+ <?php if (in_array('progress', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('percentcomplete')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value">
+ <div class="progress_bar_container" style="width: 90px">
+ <span><?php echo Filters::noXSS($task_details['percent_complete']); ?>%</span>
+
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($task_details['percent_complete']); ?>%"></div>
+ </div>
+ </span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="percent" name="percent_complete">
+ <?php $arr = array(); for ($i = 0; $i<=100; $i+=10) $arr[$i] = $i.'%'; ?>
+ <?php echo tpl_options($arr, Req::val('percent_complete', $task_details['percent_complete'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'percent')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+
+ </li>
+ <?php endif; ?>
+ <!-- Task Type-->
+ <?php if (in_array('tasktype', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('tasktype')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php echo Filters::noXSS($task_details['tasktype_name']); ?></span>
+ <?php if ($user->can_edit_task($task_details)):?>
+ <span style="display:none;">
+ <div style="float:right">
+ <select id="tasktype" name="task_type">
+ <?php echo tpl_options($proj->listTaskTypes(), Req::val('task_type', $task_details['task_type'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'tasktype')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a></span>
+ </div>
+ </span>
+ <?php endif; ?></li>
+ <?php endif; ?>
+
+ <!-- Category -->
+ <?php if (in_array('category', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('category')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value">
+ <?php foreach ($parent as $cat): ?>
+ <?php echo Filters::noXSS($cat['category_name']); ?> &#8594;
+ <?php endforeach; ?>
+ <?php echo Filters::noXSS($task_details['category_name']); ?>
+
+ </span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="category" name="product_category">
+ <?php echo tpl_options($proj->listCategories(), Req::val('product_category', $task_details['product_category'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'category')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- Assigned To-->
+ <?php if (in_array('assignedto', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('assignedto')); ?></span>
+ <span class="value assignedto">
+ <?php if (empty($assigned_users)): ?>
+ <?php echo Filters::noXSS(L('noone')); ?>
+
+ <?php else: ?>
+ <table class="assignedto">
+ <?php
+ foreach ($assigned_users as $userid):
+ ?>
+ <?php if($fs->prefs['enable_avatars'] == 1) { ?>
+ <tr><td><?php echo tpl_userlinkavatar($userid, $fs->prefs['max_avatar_size'] / 2); ?></td><td><?php echo tpl_userlink($userid); ?></td></tr>
+ <?php } else { ?>
+ <tr>
+ <td class="assignedto_name"><?php echo tpl_userlink($userid); ?></td>
+ </tr>
+ <?php } ?>
+ <?php endforeach;
+ ?>
+ </table>
+ <?php
+ endif; ?>
+ </span>
+ </li>
+ <?php endif; ?>
+
+ <!-- OS -->
+ <?php if (in_array('os', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('operatingsystem')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php echo Filters::noXSS($task_details['os_name']); ?></span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="os" name="operating_system">
+ <?php echo tpl_options($proj->listOs(), Req::val('operating_system', $task_details['operating_system'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'os')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- Severity -->
+ <?php if (in_array('severity', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('severity')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php echo Filters::noXSS($task_details['severity_name']); ?></span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="severity" name="task_severity">
+ <?php echo tpl_options($fs->severities, Req::val('task_severity', $task_details['task_severity'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'severity')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a></div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- Priority -->
+ <?php if (in_array('priority', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('priority')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php echo Filters::noXSS($task_details['priority_name']); ?></span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="priority" name="task_priority">
+ <?php echo tpl_options($fs->priorities, Req::val('task_priority', $task_details['task_priority'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'priority')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- Reported In -->
+ <?php if (in_array('reportedin', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('reportedversion')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php echo Filters::noXSS($task_details['reported_version_name']); ?></span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="reportedver" name="product_version">
+ <?php echo tpl_options($proj->listVersions(false, 2, $task_details['product_version']), Req::val('reportedver', $task_details['product_version'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'reportedver')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- Due -->
+ <?php if (in_array('dueversion', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('dueinversion')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value"><?php if ($task_details['due_in_version_name']): ?>
+ <?php echo Filters::noXSS($task_details['due_in_version_name']); ?>
+
+ <?php else: ?>
+ <?php echo Filters::noXSS(L('undecided')); ?>
+
+ <?php endif; ?>
+ </span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <select id="dueversion" name="closedby_version">
+ <option value="0"><?php echo Filters::noXSS(L('undecided')); ?></option>
+ <?php echo tpl_options($proj->listVersions(false, 3), Req::val('closedby_version', $task_details['closedby_version'])); ?>
+ </select>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'dueversion')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+
+ </li>
+ <?php endif; ?>
+
+ <!-- Due Date -->
+ <?php if (in_array('duedate', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('duedate')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value">
+ <?php echo Filters::noXSS(formatDate($task_details['due_date'], false, L('undecided'))); ?><br><?php
+ $days = floor((strtotime(date('c', $task_details['due_date'])) - strtotime(date("Y-m-d"))) / (60 * 60 * 24));
+ if($task_details['due_date'] > 0)
+ {
+ if($days <$fs->prefs['days_before_alert'] && $days > 0)
+ {
+ echo "<font style='color: red; font-weight: bold'>".$days." ".L('daysleft')."</font>";
+ }
+ elseif($days < 0)
+ {
+ echo "<font style='color: red; font-weight: bold'>".str_replace('-', '', $days)."
+ ".L('dayoverdue')."</font>";
+ }
+ elseif($days == 0)
+ {
+ echo "<font style='color: red; font-weight: bold'>".L('duetoday')."</font>";
+ }
+ else
+ {
+ echo $days." ".L('daysleft');
+ }
+ }
+ ?>
+ </span>
+
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <?php echo tpl_datepicker('due_date', '', Req::val('due_date', $task_details['due_date'])); ?>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'due_date')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a><a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+
+ </li>
+ <?php endif; ?>
+ <?php if($proj->prefs['use_effort_tracking']) {
+ if ($user->perms('view_estimated_effort')) {
+ ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('estimatedeffort')); ?></span>
+ <span <?php if ($user->can_edit_task($task_details)): ?>onclick="show_hide(this, true)"<?php endif;?> class="value">
+ <?php
+ $displayedeffort = effort::secondsToString($task_details['estimated_effort'], $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);
+ if (empty($displayedeffort)) {
+ $displayedeffort = Filters::noXSS(L('undecided'));
+ }
+ echo $displayedeffort;
+ ?>
+ </span>
+ <?php if ($user->can_edit_task($task_details)): ?>
+ <span style="display:none">
+ <div style="float:right">
+ <input type="text" size="15" id="estimatedeffort" name="estimated_effort" value="<?php echo effort::SecondsToEditString($task_details['estimated_effort'], $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']); ?>"/>
+ <br/><a onclick="quick_edit(this.parentNode.parentNode, 'estimatedeffort')" href="javascript:void(0)" class="button"><?php echo Filters::noXSS(L('confirmedit')); ?></a> <a href="javascript:void(0)" onclick="show_hide(this.parentNode.parentNode, false)" class="button"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </div>
+ </span>
+ <?php endif; ?>
+ </li>
+ <?php }
+ if ($user->perms('view_current_effort_done')) {
+ ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('currenteffortdone')); ?></span>
+ <?php
+ $total_effort = 0;
+ foreach($effort->details as $details){
+ $total_effort += $details['effort'];
+ }
+ ?>
+ <span class="value"><?php echo effort::secondsToString($total_effort, $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']); ?> </span>
+ </li>
+ <?php }
+ } ?>
+ <!-- Votes-->
+ <?php if (in_array('votes', $fields)): ?>
+ <li class="votes">
+ <span class="label"><?php echo Filters::noXSS(L('votes')); ?></span>
+ <span class="value">
+ <?php if (count($votes)): ?>
+ <a href="javascript:showhidestuff('showvotes')"><?php echo Filters::noXSS(count($votes)); ?> </a>
+ <div id="showvotes" class="hide">
+ <ul class="reports">
+ <?php foreach ($votes as $vote): ?>
+ <li><?php echo tpl_userlink($vote); ?> (<?php echo Filters::noXSS(formatDate($vote['date_time'])); ?>)</li>
+ <?php endforeach; ?>
+ </ul>
+ </div>
+ <?php endif; ?>
+ <?php if ($user->can_vote($task_details) > 0): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])),null,null,null,'style="display:inline"'); ?>
+ <input type="hidden" name="action" value="details.addvote" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <button class="fakelinkbutton" type="submit" title="<?php echo Filters::noXSS(L('addvote')); ?>">+1</button>
+ </form>
+ <?php elseif ($user->can_vote($task_details) == -2): ?> (<?php echo Filters::noXSS(L('alreadyvotedthistask')); ?>)
+ <?php elseif ($user->can_vote($task_details) == -3): ?> (<?php echo Filters::noXSS(L('alreadyvotedthisday')); ?>)
+ <?php elseif ($user->can_vote($task_details) == -4): ?> (<?php echo Filters::noXSS(L('votelimitreached')); ?>)
+ <?php endif; ?>
+ </span>
+ </li>
+ <?php endif; ?>
+
+ <!-- Private -->
+ <?php if (in_array('private', $fields)): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('private')); ?></span>
+ <span class="value">
+ <?php if ($user->can_change_private($task_details) && $task_details['mark_private']): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="makepublic"/>
+ <button type="submit" class="fakelinkbutton"><?php echo ucfirst(eL('makepublic')); ?></button>
+ </form>
+ <?php elseif ($user->can_change_private($task_details) && !$task_details['mark_private']): ?>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="action" value="makeprivate"/>
+ <button type="submit" class="fakelinkbutton"><?php echo ucfirst(eL('makeprivate')); ?></button>
+ </form>
+ <?php endif; ?>
+ </span>
+ </li>
+ <?php endif; ?>
+
+ <!-- Watching -->
+ <?php if (!$user->isAnon()): ?>
+ <li>
+ <span class="label"><?php echo Filters::noXSS(L('watching')); ?></span>
+ <span class="value">
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="ids" value="<?php echo Filters::noXSS($task_details['task_id']); ?>"/>
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($user->id); ?>"/>
+ <?php if (!$watched): ?>
+ <input type="hidden" name="action" value="details.add_notification"/>
+ <button type="submit" accesskey="w" class="fakelinkbutton"><?php echo ucfirst(eL('watchtask')); ?></button>
+ <?php else: ?>
+ <input type="hidden" name="action" value="remove_notification"/>
+ <button type="submit" accesskey="w" class="fakelinkbutton"><?php echo ucfirst(eL('stopwatching')); ?></button>
+ <?php endif; ?>
+ </form>
+ </span>
+ </li>
+ <?php endif; ?>
+ </ul>
+
+ <div id="fineprint">
+ <?php echo Filters::noXSS(L('attachedtoproject')); ?>: <a
+ href="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?project=<?php echo Filters::noXSS($task_details['project_id']); ?>"><?php echo Filters::noXSS($task_details['project_title']); ?></a>
+ <br/>
+ <?php echo Filters::noXSS(L('openedby')); ?> <?php echo tpl_userlink($task_details['opened_by']); ?>
+
+ <?php if ($task_details['anon_email'] && $user->perms('view_tasks')): ?>
+ (<?php echo Filters::noXSS($task_details['anon_email']); ?>)
+ <?php endif; ?>
+ -
+ <span title="<?php echo Filters::noXSS(formatDate($task_details['date_opened'], true)); ?>"><?php echo Filters::noXSS(formatDate($task_details['date_opened'], false)); ?></span>
+ <?php if ($task_details['last_edited_by']): ?>
+ <br/>
+ <?php echo Filters::noXSS(L('editedby')); ?> <?php echo tpl_userlink($task_details['last_edited_by']); ?>
+
+ -
+ <span title="<?php echo Filters::noXSS(formatDate($task_details['last_edited_time'], true)); ?>"><?php echo Filters::noXSS(formatDate($task_details['last_edited_time'], false)); ?></span>
+ <?php endif; ?>
+ </div>
+
+ </div>
+
+
+<div id="taskdetailsfull">
+ <h2 class="summary severity<?php echo Filters::noXSS($task_details['task_severity']); ?>">
+ FS#<?php echo Filters::noXSS($task_details['task_id']); ?> - <?php echo Filters::noXSS($task_details['item_summary']); ?>
+ </h2>
+ <span class="tags"><?php
+ foreach($tags as $tag):
+ echo tpl_tag($tag['tag_id']);
+ endforeach; ?></span>
+ <div id="taskdetailstext"><?php echo $task_text; ?></div>
+
+ <?php $attachments = $proj->listTaskAttachments($task_details['task_id']);
+ $this->display('common.attachments.tpl', 'attachments', $attachments); ?>
+
+ <?php $links = $proj->listTaskLinks($task_details['task_id']);
+ $this->display('common.links.tpl', 'links', $links); ?>
+</div>
+
+<div id="taskinfo">
+ <?php if(!count($deps)==0): ?>
+ <table id="dependency_table" class="table" width="100%">
+ <caption><?php echo (count($deps)==1) ? eL('taskdependsontask') : eL('taskdependsontasks'); ?></caption>
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('id')); ?></th>
+ <th><?php echo Filters::noXSS(L('project')); ?></th>
+ <th><?php echo Filters::noXSS(L('summary')); ?></th>
+ <th><?php echo Filters::noXSS(L('priority')); ?></th>
+ <th><?php echo Filters::noXSS(L('severity')); ?></th>
+ <th><?php echo Filters::noXSS(L('assignedto')); ?></th>
+ <th><?php echo Filters::noXSS(L('progress')); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($deps as $dependency): ?>
+ <tr>
+ <td><?php echo $dependency['task_id'] ?></td>
+ <td><?php echo $dependency['project_title'] ?></td>
+ <td><?php echo tpl_tasklink($dependency['task_id']); ?></td>
+ <td><?php echo $fs->priorities[$dependency['task_priority']] ?></td>
+ <td class="severity<?php echo Filters::noXSS($dependency['task_severity']); ?>"><?php echo $fs->
+ severities[$dependency['task_severity']] ?>
+ </td>
+ <td> <?php for ($i=0;$i<count($dependency['assigned_to']);$i++){ if ($i>0) echo ", "; echo $dependency['assigned_to'][$i];} ?></td>
+ <td class="task_progress">
+ <div class="progress_bar_container">
+ <span><?php echo Filters::noXSS($dependency['percent_complete']); ?>%</span>
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($dependency['percent_complete']); ?>%"></div>
+ </div>
+ </td>
+ <td>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id']))); ?>
+ <input type="hidden" name="depend_id" value="<?php echo Filters::noXSS($dependency['depend_id']); ?>" />
+ <input type="hidden" name="return_task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="action" value="removedep" />
+ <button type="submit" title="<?php echo Filters::noXSS(L('remove')); ?>" class="fa fa-unlink fa-lg"></button>
+ </form>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <?php endif; ?>
+
+ <!-- This task blocks the following tasks: -->
+ <?php if(!count($blocks)==0): ?>
+ <table id="blocking_table" class="table" width="100%">
+ <caption><?php echo (count($blocks)==1) ? eL('taskblock') : eL('taskblocks'); ?></caption>
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('id')); ?></th>
+ <th><?php echo Filters::noXSS(L('project')); ?></th>
+ <th><?php echo Filters::noXSS(L('summary')); ?></th>
+ <th><?php echo Filters::noXSS(L('priority')); ?></th>
+ <th><?php echo Filters::noXSS(L('severity')); ?></th>
+ <th><?php echo Filters::noXSS(L('assignedto')); ?></th>
+ <th><?php echo Filters::noXSS(L('progress')); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($blocks as $dependency): ?>
+ <tr>
+ <td><?php echo $dependency['task_id'] ?></td>
+ <td><?php echo $dependency['project_title'] ?></td>
+ <td><?php echo tpl_tasklink($dependency['task_id']); ?></td>
+ <td><?php echo $fs->priorities[$dependency['task_priority']] ?></td>
+ <td class="severity<?php echo Filters::noXSS($dependency['task_severity']); ?>"><?php echo $fs->
+ severities[$dependency['task_severity']] ?>
+ </td>
+ <td> <?php for ($i=0;$i<count($dependency['assigned_to']);$i++){ if ($i>0) echo ", "; echo $dependency['assigned_to'][$i];} ?></td>
+ <td class="task_progress">
+ <div class="progress_bar_container">
+ <span><?php echo Filters::noXSS($dependency['percent_complete']); ?>%</span>
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($dependency['percent_complete']); ?>%"></div>
+ </div>
+ </td>
+ <td>
+ <?php echo tpl_form(Filters::noXSS(createURL('details', $dependency['task_id']))); ?>
+ <input type="hidden" name="depend_id" value="<?php echo Filters::noXSS($dependency['depend_id']); ?>" />
+ <input type="hidden" name="return_task_id" value="<?php echo Filters::noXSS($task_details['task_id']); ?>" />
+ <input type="hidden" name="action" value="removedep" />
+ <button type="submit" title="<?php echo Filters::noXSS(L('remove')); ?>" class="fa fa-unlink fa-lg"></button>
+ </form>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <?php endif; ?>
+
+ <?php
+ if (!$task_details['supertask_id'] == 0) {
+ $supertask = Flyspray::getTaskDetails($task_details['supertask_id'], true);
+ if ($user->can_view_task($supertask)) {
+ echo eL('taskissubtaskof').' '.tpl_tasklink($supertask);
+ }
+ }
+ ?>
+ <?php if(!count($subtasks)==0): ?>
+ <table id="subtask_table" class="table" width="100%">
+ <caption><?php echo (count($subtasks)==1) ? eL('taskhassubtask') : eL('taskhassubtasks'); ?></caption>
+ <thead>
+ <tr>
+ <th><?php echo Filters::noXSS(L('id')); ?></th>
+ <th><?php echo Filters::noXSS(L('project')); ?></th>
+ <th><?php echo Filters::noXSS(L('summary')); ?></th>
+ <th><?php echo Filters::noXSS(L('priority')); ?></th>
+ <th><?php echo Filters::noXSS(L('severity')); ?></th>
+ <th><?php echo Filters::noXSS(L('assignedto')); ?></th>
+ <th><?php echo Filters::noXSS(L('progress')); ?></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php foreach ($subtasks as $subtaskOrgin): ?>
+ <?php $subtask = $fs->getTaskDetails($subtaskOrgin['task_id']); ?>
+ <tr id="task<?php echo $subtask['task_id']; ?>" class="severity<?php echo Filters::noXSS($subtask['task_severity']); ?>">
+ <td><?php echo $subtask['task_id'] ?></td>
+ <td><?php echo $subtask['project_title'] ?></td>
+ <td><?php echo tpl_tasklink($subtask['task_id']); ?></td>
+ <td><?php echo $fs->priorities[$subtask['task_priority']] ?></td>
+ <td class="severity<?php echo Filters::noXSS($subtask['task_severity']); ?>"><?php echo $fs->severities[$subtask['task_severity']]
+ ?>
+ </td>
+ <td> <?php for ($i=0;$i<count($subtaskOrgin['assigned_to']);$i++){ if ($i>0) echo ", "; echo $subtaskOrgin['assigned_to'][$i];} ?></td>
+ <td class="task_progress">
+ <div class="progress_bar_container">
+ <span><?php echo Filters::noXSS($subtask['percent_complete']); ?>%</span>
+
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($subtask['percent_complete']); ?>%"></div>
+ </div>
+ </td>
+ <td>
+ <?php
+ echo tpl_form(Filters::noXSS(createURL('details', $task_details['task_id'])));
+ ?>
+ <input type="hidden" name="subtaskid" value="<?php echo Filters::noXSS($subtask['task_id']); ?>" />
+ <input type="hidden" name="action" value="removesubtask" />
+ <button type="submit" title="<?php echo Filters::noXSS(L('remove')); ?>" class="fa fa-unlink fa-lg"></button>
+ </form>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </tbody>
+ </table>
+ <?php endif; ?>
+ </div>
+</div>
+
+<?php if ($task_details['is_closed']): ?>
+<div id="taskclosed">
+ <?php echo Filters::noXSS(L('closedby')); ?>&nbsp;&nbsp;<?php echo tpl_userlink($task_details['closed_by']); ?><br/>
+ <?php echo Filters::noXSS(formatDate($task_details['date_closed'], true)); ?><br/>
+ <strong><?php echo Filters::noXSS(L('reasonforclosing')); ?></strong> &nbsp;<?php echo Filters::noXSS($task_details['resolution_name']); ?><br/>
+ <?php if ($task_details['closure_comment']): ?>
+ <strong><?php echo Filters::noXSS(L('closurecomment')); ?></strong>
+ &nbsp;<?php echo wordwrap(TextFormatter::render($task_details['closure_comment']), 40, "\n", true); ?>
+
+ <?php endif; ?>
+</div>
+<?php endif; ?>
+
+<div id="actionbuttons">
+
+ <?php if (count($penreqs)): ?>
+ <div class="pendingreq"><strong><?php echo Filters::noXSS(formatDate($penreqs[0]['time_submitted'])); ?>
+
+ : <?php echo Filters::noXSS(L('request'.$penreqs[0]['request_type'])); ?></strong>
+ <?php if ($penreqs[0]['reason_given']): ?>
+ <?php echo Filters::noXSS(L('reasonforreq')); ?>: <?php echo Filters::noXSS($penreqs[0]['reason_given']); ?>
+
+ <?php endif; ?>
+ </div>
+ <?php endif; ?>
+</div>
+
+<div class="clear"></div>
+</div>
diff --git a/themes/CleanFS/templates/editcomment.tpl b/themes/CleanFS/templates/editcomment.tpl
new file mode 100644
index 0000000..e27c6eb
--- /dev/null
+++ b/themes/CleanFS/templates/editcomment.tpl
@@ -0,0 +1,83 @@
+<div class="box">
+ <div class="comment_container">
+ <div class="comment_avatar"><?php echo tpl_userlinkavatar($user->id, $fs->prefs['max_avatar_size'], 'av_comment'); ?></div>
+ <div class="comment">
+ <div class="comment_header">
+ <div class="comment_header_actions">
+ <?php
+ $theuser = new User($comment['user_id']);
+ if (!$theuser->isAnon()) {
+ if ($theuser->perms('is_admin')) {
+ $rank = 'Admin';
+ }
+ else if ($theuser->perms('manage_project')) {
+ $rank = 'Project Manager';
+ }
+ else {
+ $rank = '';
+ }
+
+ if (!empty($rank)) {
+ echo '<span class="comment_header_usertype">'.Filters::noXSS($rank).'</span>';
+ }
+ }
+ ?>
+ </div>
+ <div class="comment_header_infos"><?php echo tpl_userlink($comment['user_id']); ?> <?php echo Filters::noXSS(L('commentedon')); ?> <?php echo Filters::noXSS(formatDate($comment['date_added'], true)); ?></div>
+ </div>
+ <div class="commenttext">
+ <?php echo tpl_form(CreateUrl('details', $comment['task_id'], 'multipart/form-data')); ?>
+ <input type="hidden" name="action" value="editcomment" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($comment['task_id']); ?>" />
+ <input type="hidden" name="comment_id" value="<?php echo Filters::noXSS($comment['comment_id']); ?>" />
+ <input type="hidden" name="previous_text" value="<?php echo Filters::noXSS($comment['comment_text']); ?>" />
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <button tabindex="9" type="button" onclick="showPreview('comment_text', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('comment_text', 10, 72, array('id' => 'comment_text'), $comment['comment_text']); ?>
+ <div id="addlinkbox">
+ <?php $links = $proj->listLinks($comment['comment_id'], $comment['task_id']);
+ $this->display('common.editlinks.tpl', 'links', $links); ?>
+ <?php if ($user->perms('create_attachments')): ?>
+ <button id="addlinkbox_addalink" tabindex="10" type="button" onclick="addLinkField('addlinkbox')">
+ <?php echo Filters::noXSS(L('addalink')); ?>
+ </button>
+ <button id="addlinkbox_addanotherlink" tabindex="10" style="display: none" type="button" onclick="addLinkField('addlinkbox')">
+ <?php echo Filters::noXSS(L('addanotherlink')); ?>
+ </button>
+ <span style="display: none">
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" onclick="removeLinkField(this, 'addlinkbox');"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ <noscript>
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ </noscript>
+ <?php endif; ?>
+ </div>
+ <div id="uploadfilebox">
+ <?php $attachments = $proj->listAttachments($comment['comment_id'], $comment['task_id']);
+ $this->display('common.editattachments.tpl', 'attachments', $attachments); ?>
+ <?php if ($user->perms('create_attachments')): ?>
+ <button id="uploadfilebox_attachafile" tabindex="7" type="button" onclick="addUploadFields()">
+ <?php echo Filters::noXSS(L('uploadafile')); ?> (<?php echo Filters::noXSS(L('max')); ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?php echo Filters::noXSS(L('MiB')); ?>)
+ </button>
+ <button id="uploadfilebox_attachanotherfile" tabindex="7" style="display: none" type="button" onclick="addUploadFields()">
+ <?php echo Filters::noXSS(L('attachanotherfile')); ?> (<?php echo Filters::noXSS(L('max')); ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?php echo Filters::noXSS(L('MiB')); ?>)
+ </button>
+ <span style="display: none;"><!-- this span is shown/copied in javascript when adding files -->
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ <a href="javascript://" tabindex="6" onclick="removeUploadField(this);"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ <noscript>
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ </noscript>
+ <?php endif; ?>
+ </div>
+ <button accesskey="s" tabindex="9" type="submit" class="positive"><?php echo Filters::noXSS(L('saveeditedcomment')); ?></button>
+ <a class="button" href="<?php echo Filters::noXSS(CreateUrl('details', $comment['task_id'])); ?>"><?php echo Filters::noXSS(L('canceledit')); ?></a>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/themes/CleanFS/templates/feed.atom.tpl b/themes/CleanFS/templates/feed.atom.tpl
new file mode 100644
index 0000000..e63eb4a
--- /dev/null
+++ b/themes/CleanFS/templates/feed.atom.tpl
@@ -0,0 +1,73 @@
+<?php echo '<?xml version="1.0" ?>'; ?>
+
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title type="text"><?php echo Filters::noXSS($fs->prefs['page_title']); ?></title>
+ <subtitle type="text">
+ <?php echo Filters::noXSS($feed_description); ?>
+
+ </subtitle>
+ <id><?php echo Filters::noXSS($baseurl); ?></id>
+ <?php if($feed_image): ?>
+ <icon><?php echo Filters::noXSS($feed_image); ?></icon>
+ <?php endif; ?>
+ <updated><?php echo Filters::noXSS(date('Y-m-d\TH:i:s\Z',$most_recent)); ?></updated>
+ <link rel="self" type="text/xml" href="feed.php?feed_type=atom"/>
+ <link rel="alternate" type="text/html" hreflang="en" href="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>"/>
+ <?php foreach ($task_details as $row): ?>
+ <entry>
+ <title>FS#<?php echo Filters::noXSS($row['task_id']); ?>: <?php echo Filters::noXSS($row['item_summary']); ?></title>
+ <link href="<?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?>" />
+ <updated><?php echo Filters::noXSS(date('Y-m-d\TH:i:s\Z',intval($row['last_edited_time']))); ?></updated>
+ <published><?php echo Filters::noXSS(date('Y-m-d\TH:i:s\Z',intval($row['date_opened']))); ?></published>
+ <content type="xhtml" xml:lang="en" xml:base="http://diveintomark.org/">
+ <div xmlns="http://www.w3.org/1999/xhtml"> <?php
+ $data = $row['detailed_desc'];
+
+ if ($conf['general']['syntax_plugin'] == 'dokuwiki') {
+ $data = TextFormatter::render($data);
+ // Convert most common html- but not xml-entities.
+ $data = preg_replace('/&lsquo;/', '&#8216;', $data);
+ $data = preg_replace('/&rsquo;/', '&#8217;', $data);
+ $data = preg_replace('/&ldquo;/', '&#8220;', $data);
+ $data = preg_replace('/&rdquo;/', '&#8221;', $data);
+ echo $data;
+ }
+ else {
+ if (preg_match('/^</', $data) === 0) {
+ // Assume an old entry. Just can't rely on any tags to be valid.
+ $data = strip_tags($data);
+ $data = preg_replace('/&/', '&amp;', $data);
+ $data = preg_replace('/</', '&lt;', $data);
+ $data = preg_replace('/>/', '&gt;', $data);
+ $data = preg_replace('/"/', '&quot;', $data);
+ $data = '<p>' . nl2br($data) . '</p>';
+ }
+ else {
+ // Assume a new entry. Problem cases when an old entry started with
+ // < are just not handled well. Must draw the line somewhere, even if the
+ // browser will not show it or has an error. Those cases should be quite few.
+ }
+
+ // Chrome complained loudly about this one. Firefox just didn't show anything...
+ // Any more html entities produced by ckeditor that should be turned into
+ // a numeric character reference? Add when found. Or check if we already have
+ // somewhere an existing function to do that.
+ $data = preg_replace('/&nbsp;/', '&#160;', $data);
+
+ // Single case. Old entry that started with <. Can contain &'s too.
+ // Convert to entity, without touching already existing entities.
+ $data = preg_replace('/&(?!([a-z]+|#[0-9]+);)/', '&amp;', $data);
+
+ // Still double quotes there? Convert any not appearing inside tags.
+ // Not sure if ckeditor makes that kind of entries.
+ $data = preg_replace('/"(?=[^>]*(<|$))/', '&quot;', $data);
+
+ // Best alternative, although will strip some odd custom data from old entries.
+ echo TextFormatter::render($data);
+ } ?></div>
+ </content>
+ <author><name><?php echo Filters::noXSS($row['real_name']); ?></name></author>
+ <id><?php echo Filters::noXSS($baseurl); ?>:<?php echo Filters::noXSS($row['task_id']); ?></id>
+ </entry>
+ <?php endforeach; ?>
+</feed>
diff --git a/themes/CleanFS/templates/feed.rss1.tpl b/themes/CleanFS/templates/feed.rss1.tpl
new file mode 100644
index 0000000..4b37832
--- /dev/null
+++ b/themes/CleanFS/templates/feed.rss1.tpl
@@ -0,0 +1,70 @@
+<?php echo '<?xml version="1.0" ?>'; ?>
+
+<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns="http://purl.org/rss/1.0/"
+ xmlns:content="http://purl.org/rss/1.0/modules/content/">
+ <channel rdf:about="<?php echo Filters::noXSS($baseurl); ?>">
+ <title><?php echo Filters::noXSS($fs->prefs['page_title']); ?></title>
+ <link><?php echo Filters::noXSS($baseurl); ?></link>
+ <description><?php echo Filters::noXSS($feed_description); ?></description>
+ <dc:date><?php echo Filters::noXSS(date('Y-m-d\TH:i:s\Z',$most_recent)); ?></dc:date>
+ <items>
+ <rdf:Seq>
+ <?php foreach($task_details as $row): ?>
+ <rdf:li rdf:resource="<?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?>" />
+ <?php endforeach; ?>
+ </rdf:Seq>
+ </items>
+ <?php if($feed_image): ?>
+ <image rdf:resource="<?php echo Filters::noXSS($feed_image); ?>" />
+ <?php endif; ?>
+ </channel>
+ <?php foreach($task_details as $row): ?>
+ <item rdf:about="<?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?>">
+ <title>FS#<?php echo Filters::noXSS($row['task_id']); ?>: <?php echo Filters::noXSS($row['item_summary']); ?></title>
+ <link><?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?></link>
+ <dc:date><?php echo Filters::noXSS(date('Y-m-d\TH:i:s\Z',intval($row['last_edited_time']))); ?></dc:date>
+ <dc:creator><?php echo Filters::noXSS($row['real_name']); ?></dc:creator>
+ <?php
+ $data = $row['detailed_desc'];
+
+ if ($conf['general']['syntax_plugin'] == 'dokuwiki') {
+ $data = TextFormatter::render($data);
+ // Convert most common html- but not xml-entities.
+ $data = preg_replace('/&lsquo;/', '&#8216;', $data);
+ $data = preg_replace('/&rsquo;/', '&#8217;', $data);
+ $data = preg_replace('/&ldquo;/', '&#8220;', $data);
+ $data = preg_replace('/&rdquo;/', '&#8221;', $data);
+ }
+ else {
+ if (preg_match('/^</', $data) === 0) {
+ // Assume an old entry. Just can't rely on any tags to be valid.
+ $data = strip_tags($data);
+ $data = preg_replace('/&/', '&amp;', $data);
+ $data = preg_replace('/</', '&lt;', $data);
+ $data = preg_replace('/>/', '&gt;', $data);
+ $data = preg_replace('/"/', '&quot;', $data);
+ $data = nl2br($data);
+ }
+ else {
+ // Assume a new entry. Problem cases when old entry started with
+ // < are just not handled. Must draw the line somewhere, even if the
+ // browser will not show it or has an error. Those cases should be quite few.
+ }
+
+ // Single case. Old entry that started with <. Can contain &'s too.
+ // Convert to entity, without touching already existing entities.
+ $data = preg_replace('/&(?!([a-z]+|#[0-9]+);)/', '&amp;', $data);
+
+ // Still double quotes there? Convert any not appearing inside tags.
+ // Not sure if ckeditor makes that kind of entries.
+ $data = preg_replace('/"(?=[^>]*(<|$))/', '&quot;', $data);
+ $data = TextFormatter::render($data);
+ }
+ ?>
+ <description><?php echo Filters::noXSS(strip_tags($data)); ?></description>
+ <content:encoded><![CDATA[<?php echo $data; ?>]]></content:encoded>
+ </item>
+ <?php endforeach; ?>
+</rdf:RDF>
diff --git a/themes/CleanFS/templates/feed.rss2.tpl b/themes/CleanFS/templates/feed.rss2.tpl
new file mode 100644
index 0000000..e4e653c
--- /dev/null
+++ b/themes/CleanFS/templates/feed.rss2.tpl
@@ -0,0 +1,65 @@
+<?php echo '<?xml version="1.0" ?>'; ?>
+
+<rss version="2.0">
+ <channel>
+ <title><?php echo Filters::noXSS($fs->prefs['page_title']); ?></title>
+ <lastBuildDate><?php echo Filters::noXSS(date('r',$most_recent)); ?></lastBuildDate>
+ <description><?php echo Filters::noXSS($feed_description); ?></description>
+ <link><?php echo Filters::noXSS($baseurl); ?></link>
+ <?php if($feed_image): ?>
+ <image>
+ <url><?php echo Filters::noXSS($feed_image); ?></url>
+ <link><?php echo Filters::noXSS($baseurl); ?></link>
+ <title>[Logo]</title>
+ </image>
+ <?php endif;
+ foreach($task_details as $row):?>
+ <item>
+ <title>FS#<?php echo Filters::noXSS($row['task_id']); ?>: <?php echo Filters::noXSS($row['item_summary']); ?></title>
+ <author><?php echo Filters::noXSS($row['real_name']); ?></author>
+ <pubDate><?php echo Filters::noXSS(date('r',intval($row['date_opened']))); ?></pubDate>
+ <description><![CDATA[<?php
+ $data = $row['detailed_desc'];
+
+ if ($conf['general']['syntax_plugin'] == 'dokuwiki') {
+ $data = TextFormatter::render($data);
+ // Convert most common html- but not xml-entities.
+ $data = preg_replace('/&lsquo;/', '&#8216;', $data);
+ $data = preg_replace('/&rsquo;/', '&#8217;', $data);
+ $data = preg_replace('/&ldquo;/', '&#8220;', $data);
+ $data = preg_replace('/&rdquo;/', '&#8221;', $data);
+ echo $data;
+ }
+ else {
+ if (preg_match('/^</', $data) === 0) {
+ // Assume an old entry. Just can't rely on any tags to be valid.
+ $data = strip_tags($data);
+ $data = preg_replace('/&/', '&amp;', $data);
+ $data = preg_replace('/</', '&lt;', $data);
+ $data = preg_replace('/>/', '&gt;', $data);
+ $data = preg_replace('/"/', '&quot;', $data);
+ $data = nl2br($data);
+ }
+ else {
+ // Assume a new entry. Problem cases when old entry started with
+ // < are just not handled. Must draw the line somewhere, even if the
+ // browser will not show it or has an error. Those cases should be quite few.
+ }
+
+ // Single case. Old entry that started with <. Can contain &'s too.
+ // Convert to entity, without touching already existing entities.
+ $data = preg_replace('/&(?!([a-z]+|#[0-9]+);)/', '&amp;', $data);
+
+ // Still double quotes there? Convert any not appearing inside tags.
+ // Not sure if ckeditor makes that kind of entries.
+ $data = preg_replace('/"(?=[^>]*(<|$))/', '&quot;', $data);
+ // Best alternative, although will strip some odd custom data from old entries.
+ echo TextFormatter::render($data);
+ }
+ ?>]]></description>
+ <link><?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?></link>
+ <guid><?php echo Filters::noXSS(CreateURL('details', $row['task_id'])); ?></guid>
+ </item>
+ <?php endforeach; ?>
+ </channel>
+</rss>
diff --git a/themes/CleanFS/templates/footer.tpl b/themes/CleanFS/templates/footer.tpl
new file mode 100644
index 0000000..3c2a17c
--- /dev/null
+++ b/themes/CleanFS/templates/footer.tpl
@@ -0,0 +1,10 @@
+<?php $this->display('shortcuts.tpl'); ?>
+</div>
+<?php if(isset($general_integration)): echo $general_integration; endif; ?>
+<div id="footer">
+ <?php if(isset($footer_integration)): echo $footer_integration; endif; ?>
+ <!-- Please don't remove this line - it helps promote Flyspray -->
+ <a href="http://flyspray.org/" class="offsite"><?php echo Filters::noXSS(L('poweredby')); ?><?php if ($user->perms('is_admin')): ?> <?php echo Filters::noXSS($fs->version); ?> <?php endif; ?></a>
+</div>
+</body>
+</html>
diff --git a/themes/CleanFS/templates/header.tpl b/themes/CleanFS/templates/header.tpl
new file mode 100644
index 0000000..ac360b4
--- /dev/null
+++ b/themes/CleanFS/templates/header.tpl
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="<?= eL('locale') ?>" xml:lang="<?= eL('locale') ?>">
+<head>
+<title><?php echo Filters::noXSS($this->_title); ?></title>
+<meta name="description" content="Flyspray, a Bug Tracking System written in PHP." />
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Script-Type" content="text/javascript" />
+<meta http-equiv="Content-Style-Type" content="text/css" />
+<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+<?php if ($fs->prefs['url_rewriting']): ?>
+<base href="<?php echo Filters::noXSS($baseurl); ?>" />
+<?php endif; ?>
+<?php if(trim($this->get_image('favicon'))): ?>
+<link rel="icon" type="image/png" href="<?php echo Filters::noXSS($this->get_image('favicon')); ?>" />
+<?php endif; ?>
+<link rel="index" id="indexlink" type="text/html" href="<?php echo Filters::noXSS($baseurl); ?>" />
+<?php foreach ($fs->projects as $project): ?>
+<link rel="section" type="text/html" href="<?php echo Filters::noXSS($baseurl); ?>?project=<?php echo Filters::noXSS($project[0]); ?>" />
+<?php endforeach; ?>
+<link media="screen" href="<?php echo (is_readable(BASEDIR . '/themes/'.$this->_theme.'theme.css')) ? Filters::noXSS($this->themeUrl()) : Filters::noXSS($baseurl).'themes/CleanFS/' ; ?>theme.css" rel="stylesheet" type="text/css" />
+<?php
+# css hack to fix css3only state switches with ~ in older android browser <4.3 TODO: find webkit version when that issue was fixed.
+if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match( '/Android [23]\.\d|Android 4\.[012]/' , $_SERVER['HTTP_USER_AGENT'])):?>
+<link rel="stylesheet" type="text/css" media="screen" href="<?php echo Filters::noXSS($this->themeUrl()); ?>oldwebkitsiblingfix.css'; ?>" />
+<?php endif; ?>
+<link media="print" href="<?php echo Filters::noXSS($this->themeUrl()); ?>theme_print.css" rel="stylesheet" type="text/css" />
+<link href="<?php echo Filters::noXSS($this->themeUrl()); ?>font-awesome.min.css" rel="stylesheet" type="text/css" />
+<?php
+# include an optional, customized css file for tag styling (all projects, loads even for guests)
+if(is_readable(BASEDIR.'/themes/'.$this->_theme.'tags.css')): ?>
+<link href="<?php echo Filters::noXSS($this->themeUrl()); ?>tags.css" rel="stylesheet" type="text/css" />
+<?php endif; ?>
+<?php if($proj->prefs['custom_style'] !=''): ?>
+<link media="screen" href="<?php echo Filters::noXSS($this->themeUrl()).$proj->prefs['custom_style']; ?>" rel="stylesheet" type="text/css" />
+<?php endif; ?>
+<link rel="alternate" type="application/rss+xml" title="Flyspray RSS 1.0 Feed"
+ href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss1&amp;project=<?php echo Filters::noXSS($proj->id); ?>" />
+<link rel="alternate" type="application/rss+xml" title="Flyspray RSS 2.0 Feed"
+ href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss2&amp;project=<?php echo Filters::noXSS($proj->id); ?>" />
+<link rel="alternate" type="application/atom+xml" title="Flyspray Atom 0.3 Feed"
+ href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=atom&amp;project=<?php echo Filters::noXSS($proj->id); ?>" />
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/prototype/prototype.js"></script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/script.aculo.us/scriptaculous.js"></script>
+<?php if ('index' == $do): ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/index.js"></script>
+<?php endif; ?>
+<?php if ('details' == $do && $user->can_view_project($proj->id)): ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/details.js"></script>
+<?php endif; ?>
+<?php if ( $do == 'pm' || $do == 'admin'): ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/tablecontrol.js"></script>
+<?php endif; ?>
+<?php if ( $do == 'depends'): ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/jit/jit.js"></script>
+<?php endif; ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/tabs.js"></script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/functions.js"></script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/jscalendar/calendar_stripped.js"></script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/jscalendar/calendar-setup_stripped.js"> </script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/jscalendar/lang/calendar-<?php echo Filters::noXSS(substr(L('locale'), 0, 2)); ?>.js"></script>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/lightbox/js/lightbox.js"></script>
+<?php if(isset($conf['general']['syntax_plugin']) && $conf['general']['syntax_plugin'] !='dokuwiki'): ?><script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>js/ckeditor/ckeditor.js"></script><?php endif; ?>
+<link rel="stylesheet" href="<?php echo Filters::noXSS($baseurl); ?>js/lightbox/css/lightbox.css" type="text/css" media="screen" />
+<?php foreach(TextFormatter::get_javascript() as $file): ?>
+<script type="text/javascript" src="<?php echo Filters::noXSS($baseurl); ?>plugins/<?php echo Filters::noXSS($file); ?>"></script>
+<?php endforeach; ?>
+<?php if(isset($fs->prefs['captcha_recaptcha']) && $fs->prefs['captcha_recaptcha']
+ && isset($fs->prefs['captcha_recaptcha_sitekey']) && $fs->prefs['captcha_recaptcha_sitekey']!=''
+ && isset($fs->prefs['captcha_recaptcha_secret']) && $fs->prefs['captcha_recaptcha_secret']!=''
+): ?>
+ <?php
+ if (
+ ($do=='register')
+ || ($do=='newtask' && $user->isAnon())
+ ): ?>
+ <script src='https://www.google.com/recaptcha/api.js'></script>
+ <?php endif; ?>
+<?php endif; ?>
+</head>
+<body onload="<?php
+ if (isset($_SESSION['SUCCESS']) || isset($_SESSION['ERROR']) || isset($_SESSION['ERRORS'])):
+ ?>/* window.setTimeout('Effect.Fade(\'successanderrors\', {duration:.3})', 10000); */
+ <?php endif ?>" class="<?php echo (isset($do) ? Filters::noXSS($do) : 'index').' p'.$proj->id; ?>">
+
+<div id="archnavbar" class="anb-forum">
+ <a href="https://www.archlinux32.org">
+ <div id="archnavbarlogo">
+ <?php if($fs->prefs['logo']) { ?><img src="<?php echo Filters::noXSS($baseurl.'/'.$fs->prefs['logo']); ?>" /><?php } ?>
+ </div>
+ </a>
+ <div id="archnavbarmenu">
+ <ul id="archnavbarlist">
+ <li id="anb-home"><a href="http://archlinux32.org/">Home</a></li>
+ <li id="anb-packages"><a href="https://packages.archlinux32.org/">Packages</a></li>
+ <li id="anb-forums"><a href="https://bbs.archlinux32.org/">Forums</a></li>
+ <li id="anb-bugs"><a href="https://bugs.archlinux32.org/">Bugs</a></li>
+ <li id="anb-mailing list"><a href="https://lists.archlinux.org/listinfo/arch-ports">Mailing List</a></li>
+ <li id="anb-download"><a href="https://archlinux32.org/download/">Download</a></li>
+ <li id="anb-arch linux official"><a href="https://www.archlinux.org/">Arch Linux Official</a></li>
+ </ul>
+ </div>
+</div>
+ <?php $this->display('links.tpl'); ?>
+
+ <?php if (isset($_SESSION['SUCCESS']) || isset($_SESSION['ERROR']) || isset($_SESSION['ERRORS'])): ?>
+ <div id="successanderrors" onclick="this.style.display='none'">
+ <?php endif; ?>
+ <?php if(isset($_SESSION['SUCCESS'])): ?><div class="success"><i class="fa fa-check" aria-hidden="true"></i> <?php echo Filters::noXSS($_SESSION['SUCCESS']); ?></div><?php endif; ?>
+ <?php if(isset($_SESSION['ERROR'])): ?><div class="error"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> <?php echo Filters::noXSS($_SESSION['ERROR']); ?></div><?php endif; ?>
+ <?php if(isset($_SESSION['ERRORS'])): ?>
+ <?php
+ foreach(array_keys($_SESSION['ERRORS']) as $e){
+ echo '<div class="error"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> '.eL($e).'</div>';
+ }
+ ?>
+ <?php endif; ?>
+ <?php if(isset($_SESSION['SUCCESS']) || isset($_SESSION['ERROR']) || isset($_SESSION['ERRORS'])): ?>
+ </div>
+ <?php endif;?>
+
+<div id="content">
+ <div class="clear"></div>
+ <?php $show_message = explode(' ', $fs->prefs['pages_welcome_msg']);
+ if ($fs->prefs['intro_message'] && ($proj->id == 0 || $proj->prefs['disp_intro']) && (in_array($do, $show_message)) ):?>
+ <div id="intromessage"><?php echo TextFormatter::render($fs->prefs['intro_message'], 'msg', $proj->id); ?></div>
+ <?php endif; ?>
+ <?php if ($proj->id > 0):
+ $show_message = explode(' ', $proj->prefs['pages_intro_msg']);
+ if ($proj->prefs['intro_message'] && (in_array($do, $show_message))): ?>
+ <div id="intromessage"><?php echo TextFormatter::render($proj->prefs['intro_message'], 'msg', $proj->id, ($proj->prefs['last_updated'] < $proj->prefs['cache_update']) ? $proj->prefs['pm_instructions'] : ''); ?></div>
+ <?php endif; endif; ?>
diff --git a/themes/CleanFS/templates/index.tpl b/themes/CleanFS/templates/index.tpl
new file mode 100644
index 0000000..a918b78
--- /dev/null
+++ b/themes/CleanFS/templates/index.tpl
@@ -0,0 +1,623 @@
+<script type="text/javascript">
+ //Used for dynamically displaying the bulk edit pane, when Checkboxes are >1
+ function BulkEditCheck()
+ {
+ var form = document.getElementById('massops');
+ var count = 0;
+ for(var n=0;n < form.length;n++){
+ if(form[n].name == 'ids[]' && form[n].checked){
+ count++;
+ }
+ }
+
+ if(count == 0)
+ {
+ Effect.Fade('bulk_edit_selectedItems',{ duration: 0.2 });
+ }
+ if(count == 1)
+ {
+ Effect.Appear('bulk_edit_selectedItems',{ duration: 0.2 });
+ }
+ }
+
+ function massSelectBulkEditCheck()
+ {
+ var form = document.getElementById('massops');
+ var check_count = 0, uncheck_count;
+ for(var n=0;n < form.length;n++){
+ if(form[n].name == 'ids[]'){
+ if(form[n].checked)
+ check_count++;
+ else
+ uncheck_count++;
+ }
+ }
+
+ if(check_count == 0)
+ {
+ Effect.Appear('bulk_edit_selectedItems',{ duration: 0.2 });
+ }
+
+ if(uncheck_count == 0)
+ {
+ Effect.Fade('bulk_edit_selectedItems',{ duration: 0.2 });
+ }
+ }
+
+ function ClearAssignments()
+ {
+ document.getElementById('bulk_assignment').options.length = 0;
+ }
+</script>
+
+<?php if(isset($update_error)): ?>
+<div id="updatemsg">
+ <span class="bad"> <?= eL('updatewrong') ?></span>
+ <a href="?hideupdatemsg=yep"><?= eL('hidemessage') ?></a>
+</div>
+<?php endif; ?>
+
+<?php if(isset($updatemsg)): ?>
+<div id="updatemsg">
+ <a href="http://flyspray.org/"><?= eL('updatefs') ?></a> <?= eL('currentversion') ?>
+
+ <span class="bad"><?php echo Filters::noXSS($fs->version); ?></span> <?= eL('latestversion') ?> <span class="good"><?php echo Filters::noXSS($_SESSION['latest_version']); ?></span>.
+ <a href="?hideupdatemsg=yep"><?= eL('hidemessage') ?></a>
+</div>
+<?php endif; ?>
+
+<?php if (!($user->isAnon() && (count($fs->projects) == 0 || ($proj->id >0 && !$user->can_view_project($proj->id)))) ): ?>
+<?php $filter = false; if($proj->id > 0) { $filter = true; $fields = explode( ' ', $proj->prefs['visible_fields'] );} ?>
+<form id="search" action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+ <button id="searchthisproject" type="submit"><?= eL('searchthisproject') ?></button>
+ <input class="text" id="searchtext" name="string" type="text" size="20" placeholder=" "
+ maxlength="100" value="<?php echo Filters::noXSS(Get::val('string')); ?>" accesskey="q"/>
+ <input type="hidden" name="project" value="<?php echo Filters::noXSS(Get::num('project', $proj->id)); ?>"/>
+ <input type="hidden" name="do" value="index"/>
+ <button type="submit" name="export_list" value="1" id="exporttasklist" title="<?= eL('exporttasklist') ?>"><i class="fa fa-download"></i></button>
+<style>
+#sc2,#s_searchstate{display:none;}
+#searchstateactions{color:#999;display:block;cursor:pointer;}
+#s_searchstate:checked ~ #sc2 {display:block;}
+#s_searchstate ~ label::before { content: "\25bc";}
+#s_searchstate:checked ~ label::before { content: "\25b2";}
+</style>
+<input id="s_searchstate" type="checkbox" name="advancedsearch"<?php if(Req::val('advancedsearch')): ?> checked="checked"<?php endif; ?>/>
+<label id="searchstateactions" for="s_searchstate"><?= eL('advanced') ?></label>
+<div id="sc2" class="switchcontent">
+<?php if (!$user->isAnon()): ?>
+<fieldset>
+ <div class="save_search"><label for="save_search" id="lblsaveas"><?= eL('saveas') ?></label>
+ <input class="text" type="text" value="<?php echo Filters::noXSS(Get::val('search_name')); ?>" id="save_search" name="search_name" size="15"/> <button onclick="savesearch('<?php echo Filters::escapeqs($_SERVER['QUERY_STRING']); ?>', '<?php echo Filters::noJsXSS($baseurl); ?>', '<?= eL('saving') ?>', '<?php echo Filters::noJsXSS($_SESSION['csrftoken']); ?>')" type="button"><?= eL('OK') ?></button>
+ </div>
+</fieldset>
+<?php endif; ?>
+<fieldset class="advsearch_misc">
+ <legend><?= eL('miscellaneous') ?></legend>
+ <?php echo tpl_checkbox('search_in_comments', Get::has('search_in_comments'), 'sic'); ?>
+ <label class="left" for="sic"><?= eL('searchcomments') ?></label>
+
+ <?php echo tpl_checkbox('search_in_details', Get::has('search_in_details'), 'search_in_details'); ?>
+ <label class="left" for="search_in_details"><?= eL('searchindetails') ?></label>
+
+ <?php echo tpl_checkbox('search_for_all', Get::has('search_for_all'), 'sfa'); ?>
+ <label class="left" for="sfa"><?= eL('searchforall') ?></label>
+
+ <?php echo tpl_checkbox('only_watched', Get::has('only_watched'), 'only_watched'); ?>
+ <label class="left" for="only_watched"><?= eL('taskswatched') ?></label>
+
+ <?php echo tpl_checkbox('only_primary', Get::has('only_primary'), 'only_primary'); ?>
+ <label class="left" for="only_primary"><?= eL('onlyprimary') ?></label>
+
+ <?php echo tpl_checkbox('only_blocker', Get::has('only_blocker'), 'only_blocker'); ?>
+ <label class="left" for="only_blocker" id="blockerlabel"><?= eL('onlyblocker') ?></label>
+ <span id="blockerornoblocker"><?= eL('blockerornoblocker') ?></span>
+ <style>
+ #blockerornoblocker {display:none;color:#c00;}
+ #only_primary:checked ~ #only_blocker:checked ~ #blockerornoblocker {display:inline;}
+ </style>
+
+ <?php echo tpl_checkbox('has_attachment', Get::has('has_attachment'), 'has_attachment'); ?>
+ <label class="left" for="has_attachment"><?= eL('hasattachment') ?></label>
+
+ <?php echo tpl_checkbox('hide_subtasks', Get::has('hide_subtasks'), 'hide_subtasks'); ?>
+ <label class="left" for="hide_subtasks"><?= eL('hidesubtasks') ?></label>
+ </fieldset>
+
+ <fieldset class="advsearch_task">
+ <legend><?= eL('taskproperties') ?></legend>
+ <!-- Task Type -->
+ <?php if (!$filter || in_array('tasktype', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="type"><?= eL('tasktype') ?></label>
+ <select name="type[]" id="type" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('alltasktypes')) + $proj->listTaskTypes(), Get::val('type', '')); ?>
+ </select>
+ </div>
+
+ <!-- Severity -->
+ <?php if (!$filter || in_array('severity', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="sev"><?= eL('severity') ?></label>
+ <select name="sev[]" id="sev" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('allseverities')) + $fs->severities, Get::val('sev', '')); ?>
+ </select>
+ </div>
+
+ <!-- Priority -->
+ <?php if (!$filter || in_array('priority', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="pri"><?= eL('priority') ?></label>
+ <select name="pri[]" id="pri" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('allpriorities')) + $fs->priorities, Get::val('pri', '')); ?>
+ </select>
+ </div>
+
+ <!-- Due Version -->
+ <?php if (!$filter || in_array('dueversion', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="due"><?= eL('dueversion') ?></label>
+ <select name="due[]" id="due" multiple="multiple" size="8">
+ <?php echo tpl_options(array_merge(array('' => L('dueanyversion'), 0 => L('unassigned')), $proj->listVersions(false)), Get::val('due', '')); ?>
+ </select>
+ </div>
+
+ <!-- Reportedin -->
+ <?php if (!$filter || in_array('reportedin', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="reported"><?= eL('reportedversion') ?></label>
+ <select name="reported[]" id="reported" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('anyversion')) + $proj->listVersions(false), Get::val('reported', '')); ?>
+ </select>
+ </div>
+
+ <!-- Category -->
+ <?php if (!$filter || in_array('category', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="cat"><?= eL('category') ?></label>
+ <select name="cat[]" id="cat" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('allcategories')) + $proj->listCategories(), Get::val('cat', '')); ?>
+ </select>
+ </div>
+
+ <!-- Status -->
+ <?php if (!$filter || in_array('status', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="status"><?= eL('status') ?></label>
+ <select name="status[]" id="status" multiple="multiple" size="8">
+ <?php echo tpl_options(array('' => L('allstatuses')) +
+ array('open' => L('allopentasks')) +
+ array('closed' => L('allclosedtasks')) +
+ $proj->listTaskStatuses(), Get::val('status', 'open')); ?>
+ </select>
+ </div>
+
+ <!-- Progress -->
+ <?php if (!$filter || in_array('progress', $fields)) { ?>
+ <div class="search_select">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <label class="default multisel" for="percent"><?= eL('percentcomplete') ?></label>
+ <!-- legacy: tpl_options()
+ <select name="percent[]" id="percent" multiple="multiple" size="12">
+ <?php $percentages = array(); for ($i = 0; $i <= 100; $i += 10) $percentages[$i] = $i; ?>
+ <?php echo tpl_options(array('' => L('anyprogress')) + $percentages, Get::val('percent', '')); ?>
+ </select>
+ -->
+<?php
+# new: use of tpl_select() which provides much more control
+# maybe move some of the php code from here to scripts/index.php ...
+$selected=Get::val('percent', '');
+$selected = is_array($selected) ? $selected : (array) $selected;
+$percentages = array();
+$percentages[]=array('value'=>'', 'label'=>L('anyprogress') );
+if(in_array('', $selected, true)){
+ $percentages[0]['attr']['selected']='selected';
+}
+for($i = 0; $i <= 100; $i += 10){
+ $opt = array();
+ $opt['value'] = $i;
+ $opt['label'] = $i;
+ # goes to theme.css ..
+ # styling of html select options probably works only in a few browsers (at least firefox), but where it works it can be an added value.
+ $opt['attr']=array('style'=>'background:linear-gradient(90deg,#0c0 0%,#0c0 '.$i.'%, #fff '.$i.'%, #fff 100%)');
+ $opt['attr']=array('class'=>'percent'.$i);
+ if(in_array("$i", $selected)){
+ $opt['attr']['selected']='selected';
+ }
+ $percentages[]=$opt;
+}
+echo tpl_select(
+ array(
+ 'name'=>'percent[]',
+ 'attr'=>array(
+ 'id'=>'percent',
+ 'multiple'=>'multiple',
+ 'size'=>12
+ ),
+ 'options'=>$percentages
+ )
+);
+?>
+ </div>
+ <div class="clear"></div>
+ </fieldset>
+
+ <fieldset class="advsearch_users">
+ <legend><?= eL('users') ?></legend>
+ <label class="default multisel" for="opened"><?= eL('openedby') ?></label>
+ <?php echo tpl_userselect('opened', Get::val('opened'), 'opened', array('placeholder'=>' ')); ?>
+
+ <?php if (!$filter || in_array('assignedto', $fields)) { ?>
+ <label class="default multisel" for="dev"><?= eL('assignedto') ?></label>
+ <?php echo tpl_userselect('dev', Get::val('dev'), 'dev', array('placeholder'=>' ')); } ?>
+ <label class="default multisel" for="closed"><?= eL('closedby') ?></label>
+ <?php echo tpl_userselect('closed', Get::val('closed'), 'closed', array('placeholder'=>' ')); ?>
+ </fieldset>
+
+ <fieldset class="advsearch_dates">
+ <legend><?= eL('dates') ?></legend>
+ <!-- Due Date -->
+ <?php if (!$filter || in_array('duedate', $fields)) { ?>
+ <div class="dateselect">
+ <?php } else { ?>
+ <div style="display:none">
+ <?php } ?>
+ <?php echo tpl_datepicker('duedatefrom', L('selectduedatefrom')); ?>
+ <?php echo tpl_datepicker('duedateto', L('selectduedateto')); ?>
+ </div>
+ <div class="dateselect">
+ <?php echo tpl_datepicker('changedfrom', L('selectsincedatefrom')); ?>
+ <?php echo tpl_datepicker('changedto', L('selectsincedateto')); ?>
+ </div>
+ <div class="dateselect">
+ <?php echo tpl_datepicker('openedfrom', L('selectopenedfrom')); ?>
+ <?php echo tpl_datepicker('openedto', L('selectopenedto')); ?>
+ </div>
+ <div class="dateselect">
+ <?php echo tpl_datepicker('closedfrom', L('selectclosedfrom')); ?>
+ <?php echo tpl_datepicker('closedto', L('selectclosedto')); ?>
+ </div>
+ </fieldset>
+ </div>
+</form>
+<?php endif; ?>
+<?php if (isset($_GET['string']) || $total): ?>
+<div id="tasklist">
+<?php echo tpl_form(Filters::noXSS(createURL('project', $proj->id, null, $_GET)),'massops',null,null,'id="massops"'); ?>
+<div>
+<script type="text/javascript">
+ var cX = 0; var cY = 0; var rX = 0; var rY = 0;
+ function UpdateCursorPosition(e){ cX = e.pageX; cY = e.pageY;}
+ function UpdateCursorPositionDocAll(e){ cX = e.clientX; cY = e.clientY;}
+ if(document.all) { document.onmousemove = UpdateCursorPositionDocAll; }
+ else { document.onmousemove = UpdateCursorPosition; }
+ function AssignPosition(d) {
+ if (self.pageYOffset) {
+ rX = self.pageXOffset;
+ rY = self.pageYOffset;
+ } else if(document.documentElement && document.documentElement.scrollTop) {
+ rX = document.documentElement.scrollLeft;
+ rY = document.documentElement.scrollTop;
+ } else if(document.body) {
+ rX = document.body.scrollLeft;
+ rY = document.body.scrollTop;
+ }
+ if (document.all) {
+ cX += rX;
+ cY += rY;
+ }
+ d.style.left = (cX+10) + "px";
+ d.style.top = (cY+10) + "px";
+ }
+ function Show(elem, id) {
+ if(cY == 0) return;
+ var div = document.getElementById("desc_"+id);
+ AssignPosition(div);
+ div.style.display = "block";
+ }
+ function Hide(elem, id) {
+ document.getElementById("desc_"+id).style.display = "none";
+ }
+</script>
+<table id="tasklist_table">
+<colgroup>
+ <col class="caret" />
+ <?php if (!$user->isAnon() && $proj->id !=0 && $total): ?><col class="toggle" /><?php endif; ?>
+ <?php foreach ($visible as $col): ?>
+ <col class="<?php echo $col; ?>" />
+ <?php endforeach; ?>
+</colgroup>
+<thead>
+<tr>
+ <th class="caret"></th>
+ <?php if (!$user->isAnon() && $proj->id !=0 && $total): ?>
+ <th class="ttcolumn"><a title="<?= eL('toggleselected') ?>" href="javascript:ToggleSelected('massops')" onclick="massSelectBulkEditCheck();"></a></th>
+ <?php
+ endif;
+ foreach ($visible as $col):
+ echo tpl_list_heading($col, "<th%s>%s</th>");
+ endforeach;
+ ?>
+</tr>
+</thead>
+<tbody>
+<?php foreach ($tasks as $task):?>
+<tr id="task<?php echo $task['task_id']; ?>" class="severity<?php echo $task['task_severity']; echo $task['is_closed'] ==1 ? ' closed': '';?>">
+ <td class="caret"></td>
+ <?php if (!$user->isAnon() && $proj->id !=0): ?>
+ <td class="ttcolumn"><input class="ticktask" type="checkbox" name="ids[]" onclick="BulkEditCheck()" value="<?php echo $task['task_id']; ?>"/></td>
+ <?php
+ endif;
+ foreach ($visible as $col):
+ if($col == 'progress'):?>
+ <td class="task_progress"><div class="progress_bar_container"><span><?php echo $task['percent_complete']; ?>%</span><div class="progress_bar" style="width:<?php echo $task['percent_complete']; ?>%"></div></div></td>
+ <?php elseif ($col == 'summary'):
+ echo tpl_draw_cell($task, $col, "<td class='%s' onmouseover=\"Show(this," . $task['task_id'] . ")\" onmouseout=\"Hide(this, " . $task['task_id'] . ")\">%s</td>");
+ else:
+ echo tpl_draw_cell($task, $col);
+ endif;
+ endforeach;
+ ?>
+ <td id="desc_<?php echo $task['task_id']; ?>" class="descbox box">
+ <b><?php echo L('taskdescription'); ?></b>
+ <?php echo $task['detailed_desc'] ? TextFormatter::render($task['detailed_desc'], 'task', $task['task_id'], $task['desccache']) : '<p>'.L('notaskdescription').'</p>'; ?>
+ </td>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+<table id="pagenumbers">
+<tr>
+<?php if ($total): ?>
+ <td id="taskrange"><?php echo sprintf(L('taskrange'), $offset + 1, ($offset + $perpage > $total ? $total : $offset + $perpage), $total); ?></td>
+ <td id="numbers"><?php echo pagenums($pagenum, $perpage, $total); ?></td>
+<?php else: ?>
+ <td id="taskrange"><strong><?= eL('noresults') ?></strong></td>
+<?php endif; ?>
+</tr>
+</table>
+
+<!-- Bulk editing Tasks -->
+<?php if (!$user->isAnon() && $proj->id !=0 && $total): ?>
+<!-- Grab fields wanted for this project so we only show those specified in the settings -->
+<div id="bulk_edit_selectedItems" style="display:none">
+ <fieldset>
+ <legend><b><?= eL('updateselectedtasks') ?></b></legend>
+ <ul class="form_elements slim">
+ <input type="hidden" name="action" value="task.bulkupdate" />
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($user->id); ?>"/>
+ <!-- Quick Actions -->
+ <li>
+ <label for="bulk_quick_action"><?= eL('quickaction') ?></label>
+ <select name="bulk_quick_action" id="bulk_quick_action">
+ <option value="0"><?= eL('notspecified') ?></option>
+ <option value="bulk_start_watching"><?= eL('watchtasks') ?></option>
+ <option value="bulk_stop_watching"><?= eL('stopwatchingtasks') ?></option>
+ <option value="bulk_take_ownership"><?= eL('assigntaskstome') ?></option>
+ </select>
+ </li>
+ <!-- Status -->
+ <?php if (in_array('status', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+
+ <label for="bulk_status"><?= eL('status') ?></label>
+ <select id="bulk_status" name="bulk_status">
+ <?php $statusList = $proj->listTaskStatuses(); ?>
+ <?php array_unshift($statusList,L('notspecified')); ?>
+ <?php echo tpl_options($statusList); ?>
+
+ </select>
+ </li>
+
+ <!-- Progress -->
+ <?php if (in_array('progress', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="bulk_percent"><?= eL('percentcomplete') ?></label>
+ <select id="bulk_percent" name="bulk_percent_complete">
+ <?php $percentCompleteList = array();$percentCompleteList[0]=L('notspecified'); for ($i = 1; $i<=101; $i+=10) $percentCompleteList[$i-1] =''.($i-1).'%'; ?>
+ <?php echo tpl_options($percentCompleteList); ?>
+
+ </select>
+ </li>
+
+ <!-- Task Type-->
+ <?php if (in_array('tasktype', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $taskTypeList = $proj->listTaskTypes(); ?>
+ <?php array_unshift($taskTypeList,L('notspecified')); ?>
+ <label for="bulk_tasktype"><?= eL('tasktype') ?></label>
+ <select id="bulk_tasktype" name="bulk_task_type">
+ <?php echo tpl_options($taskTypeList); ?>
+ </select>
+
+ </li>
+
+ <!-- Category -->
+ <?php if (in_array('category', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $categoryTypeList = $proj->listCategories(); ?>
+ <?php array_unshift($categoryTypeList,L('notspecified')); ?>
+ <label for="bulk_category"><?php echo Filters::noXSS(L('category')); ?></label>
+ <select id="bulk_category" name="bulk_category">
+ <?php echo tpl_options($categoryTypeList); ?>
+ </select>
+
+ </li>
+
+ <!-- Assigned To-->
+ <li>
+ <?php if ($user->perms('edit_assignments')): ?>
+ <label for="bulk_assignment"><?= eL('assignedto') ?></label>
+ <?php
+ //insert a noone into the list in order to bulk de-assign tasks
+ $noone[0]=array(0,L('noone'));
+ array_unshift($userlist, $noone);
+ ?>
+ <select size="8" style="height: 200px;" name="bulk_assignment[]" id="bulk_assignment" multiple>
+ <?php foreach ($userlist as $group => $users): ?>
+ <optgroup <?php if($group == '0'){ ?> label='<?= eL('pleaseselect') ?> ... ' <?php } else { ?> label='<?php echo Filters::noXSS($group); ?>' <?php } ?> >
+ <?php foreach ($users as $info): ?>
+ <option value="<?php echo Filters::noXSS($info[0]); ?>"><?php echo Filters::noXSS($info[1]); ?></option>
+ <?php endforeach; ?>
+ </optgroup>
+ <?php endforeach; ?>
+ </select>
+ <?php endif; ?>
+ </li>
+
+ <!-- OS -->
+ <?php if (in_array('os', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $osTypeList = $proj->listOs(); ?>
+ <?php array_unshift($osTypeList,L('notspecified')); ?>
+ <label for="bulk_os"><?= eL('operatingsystem') ?></label>
+ <select id="bulk_os" name="bulk_os">
+ <?php echo tpl_options($osTypeList); ?>
+ </select>
+ </li>
+
+ <!-- Severity -->
+ <?php if (in_array('severity', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $severityTypeList = array_reverse($fs->severities); ?>
+ <?php array_unshift($severityTypeList,L('notspecified')); ?>
+ <label for="bulk_severity"><?= eL('severity') ?></label>
+ <select id="bulk_severity" name="bulk_severity">
+ <?php echo tpl_options($severityTypeList); ?>
+ </select>
+ </li>
+
+ <!-- Priority -->
+ <?php if (in_array('priority', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+
+ <?php $priorityTypeList = array_reverse($fs->priorities); ?>
+ <?php array_unshift($priorityTypeList,L('notspecified')); ?>
+ <label for="bulk_priority"><?= eL('priority') ?></label>
+ <select id="bulk_priority" name="bulk_priority">
+ <?php echo tpl_options($priorityTypeList); ?>
+ </select>
+ </li>
+
+ <!-- Reported In -->
+ <?php if (in_array('reportedin', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $reportedVerList = $proj->listVersions(); ?>
+ <?php array_unshift($reportedVerList,L('notspecified')); ?>
+ <label for="bulk_reportedver"><?= eL('reportedversion') ?></label>
+ <select id="bulk_reportedver" name="bulk_reportedver">
+ <?php echo tpl_options($reportedVerList); ?>
+ </select>
+ </li>
+
+ <!-- Due -->
+ <?php if (in_array('dueversion', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $dueInVerList = $proj->listVersions(); ?>
+ <?php array_unshift($dueInVerList,L('undecided')); ?>
+ <?php array_unshift($dueInVerList,L('notspecified')); ?>
+ <label for="bulk_dueversion"><?= eL('dueinversion') ?></label>
+ <select id="bulk_dueversion" name="bulk_due_version">
+ <?php echo tpl_options($dueInVerList); ?>
+ </select>
+ </li>
+
+ <!-- Due Date -->
+ <?php if (in_array('duedate', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="bulk_due_date"><?= eL('duedate') ?></label>
+ <?php echo tpl_datepicker('bulk_due_date'); ?>
+ </li>
+
+ <!-- Projects -->
+ <!-- If there is only one choice of project, then don't bother showing it -->
+ <?php if (count($fs->projects) > 1) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <?php $projectsList = $fs->listProjects(); ?>
+ <?php array_unshift($projectsList,L('notspecified')); ?>
+ <label for="bulk_projects"><?= eL('attachedtoproject') ?></label>
+ <select id="bulk_projects" name="bulk_projects">
+ <?php echo tpl_options($projectsList); ?>
+ </select>
+ </li>
+ </ul>
+ <button type="submit" name="updateselectedtasks" value="true"><?= eL('updateselectedtasks') ?></button>
+ </fieldset>
+ <fieldset>
+ <legend><b><?php echo L('closeselectedtasks'); ?></b></legend>
+ <div>
+ <select class="adminlist" name="resolution_reason" onmouseup="event.stopPropagation();">
+ <option value="0"><?= eL('selectareason') ?></option>
+ <?php echo tpl_options($proj->listResolutions(), Req::val('resolution_reason')); ?>
+ </select>
+ <button type="submit" name="updateselectedtasks" value="false"><?php echo L('closetasks'); ?></button>
+ <br/>
+ <label class="default text" for="closure_comment"><?= eL('closurecomment') ?></label>
+ <textarea class="text" id="closure_comment" name="closure_comment" rows="3"
+ cols="25"><?php echo Filters::noXSS(Req::val('closure_comment')); ?></textarea>
+ <label><?php echo tpl_checkbox('mark100', Req::val('mark100', !(Req::val('action') == 'details.close'))); ?>&nbsp;&nbsp;<?php echo Filters::noXSS(L('mark100')); ?></label>
+ </div>
+ </fieldset>
+
+</div>
+<?php endif; /* !$user->isAnon() && $proj-> !=0 && $total */ ?>
+</div>
+</form>
+</div>
+<?php endif; /* isset($_GET['string'] || $total */ ?>
diff --git a/themes/CleanFS/templates/links.searches.tpl b/themes/CleanFS/templates/links.searches.tpl
new file mode 100644
index 0000000..9347cd4
--- /dev/null
+++ b/themes/CleanFS/templates/links.searches.tpl
@@ -0,0 +1,15 @@
+ <strong id="nosearches" <?php if(count($user->searches)): ?>class="hide"<?php endif; ?>><?php echo Filters::noXSS(L('nosearches')); ?></strong>
+ <?php if(count($user->searches)): ?>
+ <input type="hidden" name="csrftoken" id="deletesearchtoken" value="<?php echo $_SESSION['csrftoken']; ?>">
+ <table id="mysearchestable">
+ <?php foreach ($user->searches as $search): ?>
+ <tr id="rs<?php echo Filters::noXSS($search['id']); ?>" <?php if($search == end($user->searches)): ?>class="last"<?php endif; ?>>
+ <td><a href="<?php echo Filters::noXSS($baseurl); ?>?do=index&amp;<?php echo http_build_query(unserialize($search['search_string']), '', '&amp;'); ?>"><?php echo Filters::noXSS($search['name']); ?></a></td>
+ <td class="searches_delete">
+ <a href="javascript:deletesearch('<?php echo Filters::noXSS($search['id']); ?>','<?php echo Filters::noJsXSS($baseurl); ?>')">
+ <i title="<?php echo Filters::noXSS(L('delete')); ?>" class="fa fa-trash fa-lg"></i></a>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ <?php endif; ?>
diff --git a/themes/CleanFS/templates/links.tpl b/themes/CleanFS/templates/links.tpl
new file mode 100644
index 0000000..f793a2b
--- /dev/null
+++ b/themes/CleanFS/templates/links.tpl
@@ -0,0 +1,148 @@
+<input id="menu1" type="checkbox">
+<label id="labelmenu1" for="menu1"></label>
+<div id="menu"><ul id="menu-list"><?php
+if ($user->isAnon()):
+ # 20150211 peterdd: pure css toggle using checked status, no js needed
+ ?><li class="first">
+ <input type="checkbox" id="s_loginbox" />
+ <label for="s_loginbox" id="show_loginbox" accesskey="l"><?php echo Filters::noXSS(L('login')); ?></label>
+ <div id="loginbox" class="popup"><?php $this->display('loginbox.tpl'); ?></div>
+ </li><?php
+else: ?><li>
+ <a id="profilelink" <?php if($do == 'myprofile'): ?> class="active"<?php endif; ?> href="<?php echo Filters::noXSS(CreateURL('myprofile')); ?>" title="<?php echo Filters::noXSS(L('editmydetails')); ?> <?php echo Filters::noXSS($user->infos['real_name']); ?> (<?php echo Filters::noXSS($user->infos['user_name']); ?>)"><i class="fa fa-user fa-lg"></i></a>
+ </li><li>
+ <a id="lastsearchlink" href="#" accesskey="m" onclick="showhidestuff('mysearches');return false;" class="inactive"><?php echo Filters::noXSS(L('mysearch')); ?></a>
+ <div id="mysearches"><?php $this->display('links.searches.tpl'); ?></div>
+ </li><?php
+ if ($user->perms('is_admin')):
+ ?><li>
+ <a id="optionslink"<?php if ($do=='admin'): ?> class="active"<?php endif; ?> href="<?php echo Filters::noXSS(CreateURL('admin', 'prefs')); ?>" title="<?php echo Filters::noXSS(L('admintoolbox')); ?>"><i class="fa fa-gears fa-lg"></i></a>
+ </li><?php
+ endif;
+ ?><li>
+ <a id="logoutlink" href="<?php echo Filters::noXSS(CreateURL('logout', null)); ?>"
+ accesskey="l" title="<?php echo Filters::noXSS(L('logout')); ?>"><i class="fa fa-power-off fa-lg"></i></a>
+ </li><?php
+ if (isset($_SESSION['was_locked'])):
+ ?><li>
+ <span id="locked"><?php echo Filters::noXSS(L('accountwaslocked')); ?></span>
+ </li><?php
+ elseif (isset($_SESSION['login_attempts']) && $_SESSION['login_attempts'] > 0):
+ ?><li>
+ <span id="locked"><?php echo Filters::noXSS(sprintf(L('failedattempts'), $_SESSION['login_attempts'])); ?></span>
+ </li><?php
+ endif;
+ unset($_SESSION['login_attempts'], $_SESSION['was_locked']);
+
+endif; ?>
+</ul>
+</div><div id="pm-menu">
+ <input id="pmmenu" type="checkbox">
+ <label id="labelpmmenu" for="pmmenu"></label>
+ <ul id="pm-menu-list"><?php
+ if ( count($fs->projects) && $user->can_select_project($proj->id) ) {
+ ?><li class="first">
+ <a id="toplevellink"
+ <?php if($do == 'toplevel'): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('toplevel', $proj->id)); ?>"><?php echo Filters::noXSS(L('overview')); ?></a>
+ </li><?php
+ }
+ if( (!$user->isAnon() && $user->perms('view_tasks')) || ($user->isAnon() && $proj->id >0 && $proj->prefs['others_view'])):
+ ?><li>
+ <a id="homelink"
+ <?php if($do == 'index' && !(isset($_GET['dev']) && !$user->isAnon() && $_GET['dev'] == $user->id)): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('tasklist', $proj->id)); ?>"><?php echo Filters::noXSS(L('tasklist')); ?></a>
+ </li><?php
+ endif;
+ if($proj->id && $user->perms('open_new_tasks')):
+ ?><li>
+ <a id="newtasklink" href="<?php echo Filters::noXSS(CreateURL('newtask', $proj->id)); ?>"
+ <?php if($do == 'newtask'): ?> class="active" <?php endif; ?>
+ accesskey="a"><?php echo Filters::noXSS(L('addnewtask')); ?></a>
+ </li><?php
+ if($proj->id && $user->perms('add_multiple_tasks')) :
+ ?><li>
+ <a id="newmultitaskslink" href="<?php echo Filters::noXSS(CreateURL('newmultitasks', $proj->id)); ?>"
+ <?php if($do == 'newmultitasks'): ?> class="active"<?php endif; ?>><?php echo Filters::noXSS(L('addmultipletasks')); ?></a>
+ </li><?php
+ endif;
+ elseif ($proj->id && $user->isAnon() && $proj->prefs['anon_open'] && $proj->prefs['project_is_active']): ?><li>
+ <a id="anonopen"
+ <?php if($do == 'newtask'): ?> class="active" <?php endif; ?>
+ href="?do=newtask&amp;project=<?php echo Filters::noXSS($proj->id); ?>"><?php echo Filters::noXSS(L('opentaskanon')); ?></a>
+ </li><?php
+ endif;
+ if(!$user->isAnon()): ?><li>
+ <a id="mytaskslink"
+ <?php if($do == 'index' && isset($_GET['dev']) && $_GET['dev'] == $user->id): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('mytasks', $proj->id, $user->id, null)); ?>"><?php echo Filters::noXSS(L('myassignedtasks')); ?></a>
+ </li><?php
+ endif;
+ if($user->perms('view_reports')): ?><li>
+ <a id="reportslink"
+ <?php if( $do == 'reports'): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('reports', $proj->id)); ?>"><?php echo Filters::noXSS(L('reports')); ?></a>
+ </li><?php
+ endif;
+ if($proj->id && ($user->perms('view_roadmap') || ($user->isAnon() && $proj->prefs['others_viewroadmap'])) ): ?><li>
+ <a id="roadmaplink"
+ <?php if($do == 'roadmap'): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('roadmap', $proj->id)); ?>"><?php echo Filters::noXSS(L('roadmap')); ?></a>
+ </li><?php
+ endif;
+ if(file_exists(BASEDIR . '/scripts/gantt.php') && $proj->id && $user->perms('view_roadmap')): ?><li>
+ <a id="gantt"
+ <?php if($do == 'gantt'): ?> class="active" <?php endif; ?>
+ href="<?php echo Filters::noXSS(CreateURL('gantt', $proj->id)); ?>" title="Gantt chart"><i class="fa fa-tasks fa-lg"></i></a>
+ </li><?php
+ endif;
+ if ($proj->id && $user->perms('manage_project')): ?><li>
+ <a id="projectslink"<?php if($do=='pm'): ?> class="active"<?php endif; ?> href="<?php echo Filters::noXSS(CreateURL('pm', 'prefs', $proj->id)); ?>"><?php echo Filters::noXSS(L('manageproject')); ?></a>
+ </li><?php
+ endif;
+ if ($proj->id && isset($pm_pendingreq_num) && $pm_pendingreq_num):
+ ?><li>
+ <a class="pendingreq attention"
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'pendingreq', $proj->id)); ?>"><?php echo Filters::noXSS($pm_pendingreq_num); ?> <?php echo Filters::noXSS(L('pendingreq')); ?></a>
+ </li><?php
+ endif;
+ if ($user->perms('is_admin') && isset($admin_pendingreq_num) && $admin_pendingreq_num):
+ ?><li>
+ <a class="pendingreq attention"
+ href="<?php echo Filters::noXSS(CreateURL('admin', 'userrequest')); ?>"><?php echo Filters::noXSS($admin_pendingreq_num); ?> <?php echo Filters::noXSS(L('adminrequestswaiting')); ?></a>
+ </li><?php
+ endif; ?>
+ </ul>
+ <div id="pmcontrol">
+ <div id="projectselector"><?php
+ # $fs->projects is filtered with can_select_project() for the current user/guest in index.php
+ if(count($fs->projects)>0): ?>
+ <form id="projectselectorform" action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+ <select name="project" onchange="document.getElementById('projectselectorform').submit()">
+ <?php echo tpl_options(array_merge(array(0 => L('allprojects')), $fs->projects), $proj->id); ?>
+ </select>
+ <noscript><button type="submit"><?php echo Filters::noXSS(L('switch')); ?></button></noscript>
+ <input type="hidden" name="do" value="<?php echo Filters::noXSS($do); ?>" />
+ <input type="hidden" value="1" name="switch" />
+ <?php $check = array('area', 'id');
+ if ($do == 'reports') {
+ $check = array_merge($check, array('open', 'close', 'edit', 'assign', 'repdate', 'comments', 'attachments',
+ 'related', 'notifications', 'reminders', 'within', 'duein', 'fromdate', 'todate'));
+ }
+ foreach ($check as $key):
+ if (Get::has($key)): ?>
+ <input type="hidden" name="<?php echo Filters::noXSS($key); ?>" value="<?php echo Filters::noXSS(Get::val($key)); ?>" />
+ <?php endif;
+ endforeach; ?>
+ </form>
+ <?php endif; ?></div>
+ <div id="showtask"><?php
+ # $fs->projects is filtered with can_select_project() for the current user/guest in index.php
+ if(count($fs->projects)>0): ?>
+ <form action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+ <noscript><button type="submit"><?php echo Filters::noXSS(L('showtask')); ?> #</button></noscript>
+ <input id="task_id" name="show_task" class="text" type="text" size="10" accesskey="t" placeholder="<?php echo Filters::noXSS(L('showtask')); ?> #" />
+ </form>
+ <?php endif; ?></div>
+ </div>
+</div>
diff --git a/themes/CleanFS/templates/loginbox.tpl b/themes/CleanFS/templates/loginbox.tpl
new file mode 100644
index 0000000..e6df4fb
--- /dev/null
+++ b/themes/CleanFS/templates/loginbox.tpl
@@ -0,0 +1,45 @@
+<form id="login" action="<?php echo Filters::noXSS($baseurl); ?>index.php?do=authenticate" method="post">
+<div id="login_input">
+ <input placeholder="<?php echo Filters::noXSS(L('username')); ?>" class="text" type="text" id="lbl_user_name" name="user_name" size="17" maxlength="32" />
+ <input placeholder="<?php echo Filters::noXSS(L('password')); ?>" class="password" type="password" id="lbl_password" name="password" size="17" maxlength="100" />
+ <label for="lbl_remember"><?php echo Filters::noXSS(L('rememberme')); ?></label>
+ <input type="checkbox" id="lbl_remember" name="remember_login" />
+ <input type="hidden" name="return_to" value="<?php echo Filters::noXSS($_SERVER['REQUEST_URI']); ?>" />
+ <input type="submit" value="<?php echo Filters::noXSS(L('login')); ?>" name="login" id="login_button" />
+</div>
+<div id="login_links">
+ <?php $activeclass = ' class="active" '; ?>
+ <?php if ($user->isAnon() && $fs->prefs['anon_reg'] && !$fs->prefs['only_oauth_reg']): ?>
+ <a id="registerlink"
+ <?php if(isset($_GET['do']) and $_GET['do'] == 'register') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('register','')); ?>"><?php echo Filters::noXSS(L('register')); ?></a>
+ <?php endif; ?>
+ <?php if ($user->isAnon() && !$fs->prefs['disable_lostpw']): ?>
+ <?php if ($user->isAnon() && $fs->prefs['user_notify']): ?>
+ <a id="forgotlink"
+ <?php if(isset($_GET['do']) and $_GET['do'] == 'lostpw') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('lostpw','')); ?>"><?php echo Filters::noXSS(L('lostpassword')); ?></a>
+ <?php else: ?>
+ <a id="forgotlink" href="mailto:<?php echo Filters::noXSS(implode(',', $admin_emails)); ?>?subject=<?php echo Filters::noXSS(rawurlencode(L('lostpwforfs'))); ?>&amp;body=<?php echo Filters::noXSS(rawurlencode(L('lostpwmsg1'))); ?><?php echo Filters::noXSS($baseurl); ?><?php echo Filters::noXSS(rawurlencode(L('lostpwmsg2'))); ?><?php
+ if(isset($_SESSION['failed_login'])):
+ ?><?php echo Filters::noXSS(rawurlencode($_SESSION['failed_login'])); ?><?php
+ else:
+ ?>&lt;<?php echo Filters::noXSS(rawurlencode(L('yourusername'))); ?>&gt;<?php
+ endif;
+ ?><?php echo Filters::noXSS(rawurlencode(L('regards'))); ?>"><?php echo Filters::noXSS(L('lostpassword')); ?></a>
+ <script type="text/javascript">var link = document.getElementById('forgotlink');link.href=link.href.replace(/#/g,"@");</script>
+ <?php endif; ?>
+ <?php endif; ?>
+</div>
+<?php $return = '&return_to=' . base64_encode($_SERVER['REQUEST_URI']);?>
+<div id="login_oauth">
+ <?php
+ if ($fs->prefs['active_oauths']):
+ $providers = explode(' ', $fs->prefs['active_oauths']);
+ foreach($providers as $provider): ?>
+ <a class="btn-<?php echo $provider; ?>" href="index.php?do=oauth&provider=<?php echo $provider . $return; ?>">
+ <i class="fa fa-<?php echo $provider; ?>"></i> <?php echo Filters::noXSS(sprintf(L('signinwith'), ucfirst($provider))); ?>
+ </a>
+ <?php endforeach; endif;?>
+</div>
+</form>
diff --git a/themes/CleanFS/templates/lostpw.step1.tpl b/themes/CleanFS/templates/lostpw.step1.tpl
new file mode 100644
index 0000000..cbc35a2
--- /dev/null
+++ b/themes/CleanFS/templates/lostpw.step1.tpl
@@ -0,0 +1,11 @@
+<h3><?php echo Filters::noXSS(L('lostpw')); ?></h3>
+<div class="box">
+ <p><?php echo Filters::noXSS(L('lostpwexplain')); ?></p>
+ <?php echo tpl_form(Filters::noXSS(createUrl('lostpw'))); ?>
+ <p><b><?php echo Filters::noXSS(L('username')); ?></b>
+ <input type="hidden" name="action" value="lostpw.sendmagic" />
+ <input class="text" type="text" value="<?php echo Filters::noXSS(Req::val('user_name')); ?>" name="user_name" size="20" maxlength="32" />
+ <button type="submit"><?php echo Filters::noXSS(L('sendlink')); ?></button>
+ </p>
+ </form>
+</div>
diff --git a/themes/CleanFS/templates/lostpw.step2.tpl b/themes/CleanFS/templates/lostpw.step2.tpl
new file mode 100644
index 0000000..2495747
--- /dev/null
+++ b/themes/CleanFS/templates/lostpw.step2.tpl
@@ -0,0 +1,23 @@
+<h3><?php echo Filters::noXSS(L('changepass')); ?></h3>
+<div class="box">
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('lostpw'))); ?>
+ <ul class="form_elements wide">
+ <li>
+ <label for="pass1"><?php echo Filters::noXSS(L('changepass')); ?></label>
+ <input class="password" id="pass1" type="password" value="<?php echo Filters::noXSS(Req::val('pass1')); ?>" name="pass1" size="20" />
+ </li>
+<?php if($fs->prefs['repeat_password']): ?>
+ <li>
+ <label for="pass2"><?php echo Filters::noXSS(L('confirmpass')); ?></label>
+ <input class="password" id="pass2" type="password" value="<?php echo Filters::noXSS(Req::val('pass2')); ?>" name="pass2" size="20" />
+ </li>
+ </ul>
+<?php endif;?>
+ <div>
+ <input type="hidden" name="action" value="lostpw.chpass" />
+ <input type="hidden" name="magic_url" value="<?php echo Filters::noXSS(Req::val('magic_url')); ?>" />
+ <button type="submit"><?php echo Filters::noXSS(L('savenewpass')); ?></button>
+ </div>
+ </form>
+</div>
+
diff --git a/themes/CleanFS/templates/myprofile.tpl b/themes/CleanFS/templates/myprofile.tpl
new file mode 100644
index 0000000..5118dcb
--- /dev/null
+++ b/themes/CleanFS/templates/myprofile.tpl
@@ -0,0 +1,40 @@
+<div class="box"><h3><?= eL('editmydetails') ?></h3>
+<ul class="form_elements">
+<li title="<?= eL('usernamenotchangeable') ?>">
+<label><?= eL('username') ?></label>
+<input type="text" style="border:none;background:none;width:auto;" disabled="disabled" value="<?= $user->infos['user_name'] ?>" />
+</li>
+</ul>
+<?php $this->display('common.profile.tpl'); ?>
+</div>
+<div class="box"><h3><?= L('myvotes') ?></h3>
+<?php if(count($votes)>0): ?>
+<table id="myvotes">
+<thead>
+<tr>
+<th><?= eL('project') ?></th>
+<th><?= eL('task') ?></th>
+<th><?= eL('removevote') ?></th>
+</tr>
+</thead>
+<tbody>
+<?php foreach($votes as $vote): ?>
+<tr<?php echo $vote['is_closed'] ? ' class="closed"':''; ?>>
+<td><?php echo $vote['project_title']; ?></td>
+<td><?php echo tpl_tasklink($vote); ?></td>
+<td><?php echo tpl_form(Filters::noXSS(createURL('myprofile', $vote['task_id'])));?>
+<input type="hidden" name="action" value="removevote" />
+<input type="hidden" name="task_id" value="<?php echo $vote['task_id']?>" />
+<button type="submit" title="<?php echo eL('removevote'); ?>"><span class="fa fa-trash"></span></button>
+</form></td>
+<td></td>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+<?php else:
+ echo eL('novotes');
+endif; ?>
+</div>
+<div class="box"><h3><?php echo eL('permissionsforproject').' '.$proj->prefs['project_title']; ?></h3><?php echo tpl_draw_perms($user->perms); ?></div>
+<div class="clear"></div>
diff --git a/themes/CleanFS/templates/newmultitasks.tpl b/themes/CleanFS/templates/newmultitasks.tpl
new file mode 100644
index 0000000..d8126f5
--- /dev/null
+++ b/themes/CleanFS/templates/newmultitasks.tpl
@@ -0,0 +1,261 @@
+<?php
+ if (!isset($supertask_id)) {
+ $supertask_id = 0;
+ }
+ $field_num = 3;
+?>
+<!-- Grab fields wanted for this project so we can only show those we want -->
+<?php $fields = explode( ' ', $proj->prefs['visible_fields'] ); ?>
+
+<div id="intromessage"><?php echo L('hintforbulkimport'); ?></div>
+<?php echo tpl_form(Filters::noXSS(CreateUrl('newmultitasks', $proj->id, $supertask_id))); ?>
+ <input type="hidden" name="supertask_id" value="<?php echo Filters::noXSS($supertask_id); ?>" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <input type="hidden" name="action" value="newmultitasks.newmultitasks" />
+ <button class="button" accesskey="f" type="button" onClick="Apply()"><?php echo L('applyfirstline'); ?></button>
+ <table class="list">
+ <thead>
+ <tr>
+ <th></th>
+ <?php if (in_array('tasktype', $fields)) { ?><th><?php echo Filters::noXSS(L('tasktype')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('category', $fields)) { ?><th><?php echo Filters::noXSS(L('category')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('status', $fields)) { ?><th><?php echo Filters::noXSS(L('status')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('os', $fields)) { ?><th><?php echo Filters::noXSS(L('operatingsystem')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('severity', $fields)) { ?><th><?php echo Filters::noXSS(L('severity')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('priority', $fields)) { ?><th><?php echo Filters::noXSS(L('priority')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('reportedin', $fields)) { ?><th><?php echo Filters::noXSS(L('reportedversion')); ?></th><?php $field_num++;} ?>
+ <?php if (in_array('dueversion', $fields)) { ?><th><?php echo Filters::noXSS(L('dueinversion')); ?></th><?php $field_num++;} ?>
+ <?php if ($user->perms('modify_all_tasks')): ?><?php if (in_array('assignedto', $fields)) { ?><th><?php echo Filters::noXSS(L('assignedto')); ?></th><?php $field_num++;} ?><?php endif; ?>
+ <th><?php echo Filters::noXSS(L('summary')); ?></th>
+ <th><?php echo Filters::noXSS(L('details')); ?></th>
+ </tr>
+ </thead>
+ <tbody id="table">
+ <tr id="row">
+ <td><button class="button img delete" accesskey="s" type="button" onClick="removeRow(this);return false;"></button></td>
+ <?php if (in_array('tasktype', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select name="task_type[]" id="tasktype">
+ <?php echo tpl_options($proj->listTaskTypes(), Req::val('task_type')); ?>
+
+ </select>
+ </td>
+
+ <!-- Category-->
+ <?php if (in_array('category', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select class="adminlist" name="product_category[]" id="category">
+ <?php echo tpl_options($proj->listCategories(), Req::val('product_category')); ?>
+
+ </select>
+ </td>
+
+ <!-- Status-->
+ <?php if (in_array('status', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select id="status" name="item_status[]" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <?php echo tpl_options($proj->listTaskStatuses(), Req::val('item_status', ($user->perms('modify_all_tasks') ? STATUS_NEW : STATUS_UNCONFIRMED))); ?>
+ </select>
+ </td>
+
+ <!-- OS-->
+ <?php if (in_array('os', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select id="os" name="operating_system[]">
+ <?php echo tpl_options($proj->listOs(), Req::val('operating_system')); ?>
+
+ </select>
+ </td>
+
+ <!-- Severity-->
+ <?php if (in_array('severity', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select id="severity" class="adminlist" name="task_severity[]">
+ <?php echo tpl_options($fs->severities, Req::val('task_severity', 2)); ?>
+
+ </select>
+ </td>
+
+ <!-- Priority-->
+ <?php if (in_array('priority', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select id="priority" name="task_priority[]" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <?php echo tpl_options($fs->priorities, Req::val('task_priority', 4)); ?>
+ </select>
+ </td>
+
+ <!-- Reported Version-->
+ <?php if (in_array('reportedin', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select class="adminlist" name="product_version[]" id="reportedver">
+ <?php echo tpl_options($proj->listVersions(false, 2), Req::val('product_version')); ?>
+
+ </select>
+ </td>
+
+ <!-- Due Version -->
+ <?php if (in_array('dueversion', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } ?>
+ <select id="dueversion" name="closedby_version[]" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <option value="0"><?php echo Filters::noXSS(L('undecided')); ?></option>
+ <?php echo tpl_options($proj->listVersions(false, 3),$proj->prefs['default_due_version'], false); ?>
+ </select>
+ </td>
+
+ <!-- Assigned To -->
+ <?php if ($user->perms('modify_all_tasks')){ ?><?php if (in_array('assignedto', $fields)) { ?>
+ <td>
+ <?php } else { ?>
+ <td style="display:none">
+ <?php } echo tpl_userselect('assigned_to[0]', Req::val('assigned_to[0]'), 'find_user_0'); ?>
+ </td>
+ <?php } ?>
+ <td>
+ <input type="text" class="text" size="30" id="summary" name="item_summary[]" onPaste="pasteMultiLines(this, event);return false"/>
+ </td>
+ <td>
+ <input type="text" class="text" size="20" id="details" name="detailed_desc[]" onkeydown="return TabandCreate(this, event);" onPaste="pasteMultiLines(this, event);return false"/>
+ </td>
+ </tr>
+
+ <tr>
+ <td class="buttons" colspan="<?php echo $field_num; ?>">
+ <button class="button" accesskey="a" type="button" onClick="createRow('','')"><?php echo L('addmorerows'); ?></button>
+ <button class="button positive" accesskey="s" type="submit"><?php echo L('addtasks'); ?></button>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <script type="text/javascript">
+
+ var index = 0;
+ function createRow(summary, details)
+ {
+ index++;
+ var table = document.getElementById("table");
+ var rows = table.getElementsByTagName("tr");
+ var clone = rows[0].cloneNode(true);
+
+ var tds = clone.getElementsByTagName("td");
+ var length = tds.length;
+ tds[length-2].getElementsByTagName("input")[0].value = summary;
+ tds[length-1].getElementsByTagName("input")[0].value = details;
+ tds[length-3].getElementsByTagName("input")[0].value = "";
+ tds[length-3].getElementsByTagName("script")[0].innerHTML = "";
+ var res = tds[length-3].innerHTML.replace(/assigned_to\[0\]/g, "assigned_to[" + index + "]");
+ res = res.replace(/find_user_0/g, "find_user_" + index);
+ tds[length-3].innerHTML = res;
+ table.insertBefore(clone, table.lastElementChild);
+ showstuff("assigned_to[" + index + "]_complete");
+ new Ajax.Autocompleter(tds[length-3].getElementsByTagName("input")[0].id, tds[length-3].getElementsByTagName("span")[0].id, "<?php echo Filters::noXSS($baseurl); ?>js/callbacks/usersearch.php", null);
+ }
+ function removeRow(elem)
+ {
+ var table = document.getElementById("table");
+ var rows = table.getElementsByTagName("tr");
+ var length = rows.length;
+ if(length <= 2)
+ return false;
+ for(var i = 0; i < length -1; i++)
+ {
+ if(rows[i] == elem.parentNode.parentNode) {
+ table.deleteRow(i);
+ break;
+ }
+ }
+ }
+ function pasteMultiLines(elem, e)
+ {
+
+ if(e && e.clipboardData && e.clipboardData.getData) {
+ var strs = e.clipboardData.getData("text/plain").split("\n");
+ var table = document.getElementById("table");
+ var rows = table.getElementsByTagName("tr");
+ for(var i = 0; i < rows.length-1; i++)
+ {
+ if(rows[i] == elem.parentNode.parentNode)
+ break;
+ }
+ var index;
+ if(elem.id == "summary")
+ index = 2;
+ else
+ index = 1;
+ var k = 0;
+ for(var j = i; j < rows.length-1 && k < strs.length; j++, k++)
+ {
+ var tds = rows[j].getElementsByTagName("td");
+ var length = tds.length;
+ tds[length-index].getElementsByTagName("input")[0].value = strs[k];
+ }
+ for(; k < strs.length; k++)
+ {
+ if(index == 2)
+ createRow(strs[k], "");
+ else
+ createRow("", strs[k]);
+ }
+ }
+ }
+ function Apply()
+ {
+ var table = document.getElementById("table");
+ var rows = table.getElementsByTagName("tr");
+ var fields = rows[0].getElementsByTagName("td");
+ for(var i = 1; i < rows.length-1; i++)
+ {
+ var tds = rows[i].getElementsByTagName("td");
+ for(var j = 1; j < tds.length; j++)
+ {
+ var input = tds[j].getElementsByTagName("input");
+ var select = tds[j].getElementsByTagName("select");
+ if(input != null && input.length > 0)
+ {
+ input[0].value = fields[j].getElementsByTagName("input")[0].value;
+ }
+ if(select != null && select.length > 0)
+ {
+ select[0].value = fields[j].getElementsByTagName("select")[0].value;
+ }
+ }
+ }
+ }
+ function TabandCreate(elem, e)
+ {
+ if(e.keyCode != 9)
+ return true;
+ var table = document.getElementById("table");
+ var rows = table.getElementsByTagName("tr");
+ var length = rows.length;
+ var parent = elem.parentNode.parentNode;
+ if(parent == rows[length-2])
+ createRow('','');
+ parent.nextElementSibling.getElementsByTagName("input")[1].focus();
+ return false;
+ }
+ </script>
+</form>
diff --git a/themes/CleanFS/templates/newtask.tpl b/themes/CleanFS/templates/newtask.tpl
new file mode 100644
index 0000000..a09e423
--- /dev/null
+++ b/themes/CleanFS/templates/newtask.tpl
@@ -0,0 +1,268 @@
+<!--<h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> :: <?= eL('newtask') ?></h3>-->
+<?php
+ if (!isset($supertask_id)) {
+ $supertask_id = 0;
+ }
+?>
+ <script type="text/javascript">
+ function checkContent()
+ {
+ var instance;
+ for(instance in CKEDITOR.instances){
+ CKEDITOR.instances[instance].updateElement();
+ }
+ var summary = document.getElementById("itemsummary").value;
+ if(summary.trim().length == 0){
+ return true;
+ }
+ var detail = document.getElementById("details").value;
+ var project_id = document.getElementsByName('project_id')[0].value;
+
+ var xmlHttp = new XMLHttpRequest();
+ xmlHttp.open("POST", "<?php echo Filters::noXSS($baseurl); ?>js/callbacks/searchtask.php", false);
+ xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
+ xmlHttp.send("summary=" + summary + "&detail=" + detail +"&project_id=" + project_id);
+ if(xmlHttp.status === 200) {
+ if(xmlHttp.responseText > 0) {
+ var res = confirm("There is already a similar task, do you still want to create?");
+ return res;
+ }
+ return true;
+ }
+ return false;
+ }
+ </script>
+<?php echo tpl_form(Filters::noXSS(createUrl('newtask', $proj->id, $supertask_id)), 'newtask', 'post', 'multipart/form-data', 'onsubmit="return checkContent()"'); ?>
+ <input type="hidden" name="supertask_id" value="<?php echo Filters::noXSS($supertask_id); ?>" />
+ <div id="actionbar"><div class="clear"></div></div>
+ <?php
+ # Grab fields wanted for this project so we can only show those we want
+ $fields = explode( ' ', $proj->prefs['visible_fields'] );
+ ?>
+ <div id="taskdetails">
+ <div id="taskfields">
+ <ul class="form_elements slim">
+ <!-- Task Type -->
+ <?php if (in_array('tasktype', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="tasktype"><?= eL('tasktype') ?></label>
+ <select name="task_type" id="tasktype">
+ <?php echo tpl_options($proj->listTaskTypes(), Req::val('task_type')); ?>
+ </select>
+ </li>
+
+ <!-- Category -->
+ <?php if (in_array('category', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="category"><?= eL('category') ?></label>
+ <select class="adminlist" name="product_category" id="category">
+ <?php echo tpl_options($proj->listCategories(), Req::val('product_category')); ?>
+ </select>
+ </li>
+
+ <!-- Status -->
+ <?php if (in_array('status', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="status"><?= eL('status') ?></label>
+ <select id="status" name="item_status" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <?php echo tpl_options($proj->listTaskStatuses(), Req::val('item_status', ($user->perms('modify_all_tasks') ? STATUS_NEW : STATUS_UNCONFIRMED))); ?>
+ </select>
+ </li>
+
+ <?php if ($user->perms('modify_all_tasks')): ?>
+ <!-- Assigned To -->
+ <?php if (in_array('assignedto', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label><?= eL('assignedto') ?></label>
+ <?php if ($user->perms('modify_all_tasks')): ?>
+ <?php $this->display('common.multiuserselect.tpl'); ?>
+ <?php endif; ?>
+ </li>
+ <?php endif; ?>
+
+ <!-- os -->
+ <?php if (in_array('os', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="os"><?= eL('operatingsystem') ?></label>
+ <select id="os" name="operating_system">
+ <?php echo tpl_options($proj->listOs(), Req::val('operating_system')); ?>
+ </select>
+ </li>
+
+ <!-- Severity -->
+ <?php if (in_array('severity', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="severity"><?= eL('severity') ?></label>
+ <select onchange="getElementById('edit_summary').className = 'summary severity' + this.value;
+ getElementById('itemsummary').className = 'text severity' + this.value;"
+ id="severity" class="adminlist" name="task_severity">
+ <?php echo tpl_options($fs->severities, Req::val('task_severity', 2)); ?>
+ </select>
+ </li>
+
+ <!-- Priority-->
+ <?php if (in_array('priority', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="priority"><?= eL('priority') ?></label>
+ <select id="priority" name="task_priority" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <?php echo tpl_options($fs->priorities, Req::val('task_priority', 4)); ?>
+ </select>
+ </li>
+
+ <!-- Reported Version-->
+ <?php if (in_array('reportedin', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="reportedver"><?= eL('reportedversion') ?></label>
+ <select class="adminlist" name="product_version" id="reportedver">
+ <?php echo tpl_options($proj->listVersions(false, 2), Req::val('product_version')); ?>
+ </select>
+ </li>
+
+ <!-- Due Version -->
+ <?php if (in_array('dueversion', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="dueversion"><?= eL('dueinversion') ?></label>
+ <select id="dueversion" name="closedby_version" <?php echo tpl_disableif(!$user->perms('modify_all_tasks')); ?>>
+ <option value="0"><?= eL('undecided') ?></option>
+ <?php echo tpl_options($proj->listVersions(false, 3),$proj->prefs['default_due_version'], false); ?>
+ </select>
+ </li>
+
+ <?php if ($user->perms('modify_all_tasks')): ?>
+ <!-- Due Date -->
+ <?php if (in_array('duedate', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="due_date"><?= eL('duedate') ?></label>
+ <?php echo tpl_datepicker('due_date', '', Req::val('due_date')); ?>
+ </li>
+ <?php endif; ?>
+
+ <?php if($proj->prefs['use_effort_tracking']) {
+ if ($user->perms('view_effort')) {
+ ?>
+ <li>
+ <label for="estimatedeffort"><?= eL('estimatedeffort') ?></label>
+ <input id="estimated_effort" name="estimated_effort" class="text" type="text" size="5" maxlength="100" value="0" />
+ <?= eL('hours') ?>
+ </li>
+ <?php }
+ } ?>
+
+ <?php if ($user->perms('manage_project')): ?>
+ <!-- Private -->
+ <?php if (in_array('private', $fields)) { ?>
+ <li>
+ <?php } else { ?>
+ <li style="display:none">
+ <?php } ?>
+ <label for="private"><?= eL('private') ?></label>
+ <?php echo tpl_checkbox('mark_private', Req::val('mark_private', 0), 'private'); ?>
+ </li>
+ <?php endif; ?>
+ </ul>
+ </div>
+
+ <div id="taskdetailsfull">
+ <!--<h3 class="taskdesc"><?= eL('details') ?></h3>-->
+ <label class="severity<?php echo Filters::noXSS(Req::val('task_severity', 2)); ?> summary" id="edit_summary" for="itemsummary"><?php echo Filters::noXSS(L('summary')); ?></label>
+ <input id="itemsummary" required="required" placeholder="<?= eL('summary') ?>" title="<?= eL('tooltipshorttasktitle') ?>" type="text" value="<?php echo Filters::noXSS(Req::val('item_summary')); ?>"
+ name="item_summary" maxlength="100" />
+ <div id="edit_tags">
+ <label for="tags" title="<?= eL('tagsinfo') ?>"><?= eL('tags') ?>:</label>
+ <input id="tags" title="<?= eL('tagsinfo') ?>" class="text" type="text"
+ value="<?php echo Filters::noXSS(Req::val('tags')); ?>" name="tags" maxlength="100" />
+ </div>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <button tabindex="9" type="button" onclick="showPreview('details', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('detailed_desc', 15, 70, array('id' => 'details'), Req::val('detailed_desc', $proj->prefs['default_task'])); ?>
+
+ <p class="buttons">
+ <?php if ($user->isAnon()): ?>
+ <label class="inline" for="anon_email"><?= eL('youremail') ?></label><input type="text" class="text" id="anon_email" name="anon_email" size="30" required="required" value="<?php echo Filters::noXSS(Req::val('anon_email')); ?>" /><br />
+ <?php endif; ?>
+ <?php if (!$user->perms('modify_all_tasks')): ?>
+ <input type="hidden" name="item_status" value="1" />
+ <input type="hidden" name="task_priority" value="2" />
+ <?php endif; ?>
+ <input type="hidden" name="action" value="newtask.newtask" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <?php if (!$user->isAnon()): ?>
+ &nbsp;&nbsp;<input class="text" type="checkbox" id="notifyme" name="notifyme"
+ value="1" checked="checked" />&nbsp;<label class="inline left" for="notifyme"><?= eL('notifyme') ?></label>
+ <?php endif; ?>
+ </p>
+
+ <?php if ($user->perms('create_attachments')): ?>
+ <div id="uploadfilebox">
+ <span style="display: none"><?php // this span is shown/copied in javascript when adding files ?>
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ <a href="javascript://" tabindex="6" onclick="removeUploadField(this, 'uploadfilebox');"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ <noscript>
+ <span>
+ <input tabindex="5" class="file" type="file" size="55" name="userfile[]" />
+ <a href="javascript://" tabindex="6" onclick="removeUploadField(this, 'uploadfilebox');"><?php echo Filters::noXSS(L('remove')); ?></a><br />
+ </span>
+ </noscript>
+ </div>
+ <button id="uploadfilebox_attachafile" tabindex="7" type="button" onclick="addUploadFields('uploadfilebox')">
+ <?= eL('uploadafile') ?> (<?= eL('max') ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?= eL('MiB') ?>)
+ </button>
+ <button id="uploadfilebox_attachanotherfile" tabindex="7" style="display: none" type="button" onclick="addUploadFields('uploadfilebox')">
+ <?= eL('attachanotherfile') ?> (<?= eL('max') ?> <?php echo Filters::noXSS($fs->max_file_size); ?> <?= eL('MiB') ?>)
+ </button>
+
+ <div id="addlinkbox">
+ <span style="display: none">
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" onclick="removeLinkField(this, 'addlinkbox');"><?= eL('remove') ?></a><br />
+ </span>
+ <noscript>
+ <span>
+ <input tabindex="8" class="text" type="text" size="28" maxlength="100" name="userlink[]" />
+ <a href="javascript://" tabindex="9" onclick="removeLinkField(this, 'addlinkbox');"><?= eL('remove') ?></a><br />
+ </span>
+ </noscript>
+</div>
+<button id="addlinkbox_addalink" tabindex="10" type="button" onclick="addLinkField('addlinkbox')"><?= eL('addalink') ?></button>
+<button id="addlinkbox_addanotherlink" tabindex="10" style="display:none" type="button" onclick="addLinkField('addlinkbox')"><?= eL('addanotherlink') ?></button>
+ <?php endif; ?>
+
+<button class="button positive" style="display:block;margin-top:20px" accesskey="s" type="submit"><?= eL('addthistask') ?></button>
+ </div>
+
+ <div class="clear"></div>
+ </div>
+</form>
diff --git a/themes/CleanFS/templates/permicons.tpl b/themes/CleanFS/templates/permicons.tpl
new file mode 100644
index 0000000..7e3d869
--- /dev/null
+++ b/themes/CleanFS/templates/permicons.tpl
@@ -0,0 +1,30 @@
+<?php
+$permicons=array(
+'view_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_groups_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_own_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_roadmap'=>'<span class="fa fa-stack"><i class="fa fa-road fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_history'=>'<span class="fa fa-stack"><i class="fa fa-history fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_reports'=>'<span class="fa fa-stack"><i class="fa fa-line-chart fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_estimated_effort'=>'<span class="fa fa-stack"><i class="fa fa-clock-o fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_current_effort_done'=>'<span class="fa fa-stack"><i class="fa fa-clock-o fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'track_effort'=>'<span class="fa fa-stack"><i class="fa fa-clock-o fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'open_new_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-plus fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'add_multiple_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-plus fa-stack" style="padding-top:8px;padding-top:8px;"></i></span>',
+'modify_own_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-pencil fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'modify_all_tasks'=>'<span class="fa fa-stack"><i class="fa fa-tasks fa-stack-2x"></i><i class="fa fa-pencil fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'close_own_tasks'=>'<i class="fa fa-check fa-lg"></i>',
+'close_other_tasks'=>'<i class="fa fa-check fa-lg"></i>',
+'create_attachments'=>'<span class="fa fa-stack"><i class="fa fa-paperclip fa-flip-horizontal fa-stack-2x"></i><i class="fa fa-plus fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'delete_attachments'=>'<span class="fa fa-stack"><i class="fa fa-paperclip fa-flip-horizontal fa-stack-2x"></i><i class="fa fa-remove fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'assign_to_self'=>'<span class="fa fa-stack"><i class="fa fa-hand-o-right fa-stack-2x"></i></span>',
+'assign_others_to_self'=>'<span class="fa fa-stack"><i class="fa fa-hand-o-right fa-stack-2x"></i></span>',
+'edit_assignments'=>'<span class="fa fa-stack"><i class="fa fa-hand-o-right fa-stack-2x"></i><i class="fa fa-pencil fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'add_votes'=>'<span class="fa fa-stack"><i class="fa fa-star-o fa-stack-2x"></i><i class="fa fa-plus fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'view_comments'=>'<span class="fa fa-stack"><i class="fa fa-comments fa-stack-2x"></i><i class="fa fa-eye fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'add_comments'=>'<span class="fa fa-stack"><i class="fa fa-comments fa-stack-2x"></i><i class="fa fa-plus fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'edit_comments'=>'<span class="fa fa-stack"><i class="fa fa-comments fa-stack-2x"></i><i class="fa fa-pencil fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'edit_own_comments'=>'<span class="fa fa-stack"><i class="fa fa-comments fa-stack-2x"></i><i class="fa fa-pencil fa-stack" style="padding-top:8px;padding-left:12px"></i></span>',
+'delete_comments'=>'<span class="fa fa-stack"><i class="fa fa-comments fa-stack-2x"></i><i class="fa fa-remove fa-stack" style="padding-top:8px;padding-left:12px"></i></span>'
+);
+?>
diff --git a/themes/CleanFS/templates/pm.cat.tpl b/themes/CleanFS/templates/pm.cat.tpl
new file mode 100644
index 0000000..f629cd4
--- /dev/null
+++ b/themes/CleanFS/templates/pm.cat.tpl
@@ -0,0 +1,5 @@
+<?php $this->assign('sysrows', $proj->listCategories(0, false, true, false)); ?>
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('catlisted')); ?></h3>
+ <?php $this->display('common.cat.tpl'); ?>
+</div>
diff --git a/themes/CleanFS/templates/pm.editgroup.tpl b/themes/CleanFS/templates/pm.editgroup.tpl
new file mode 100644
index 0000000..39b00af
--- /dev/null
+++ b/themes/CleanFS/templates/pm.editgroup.tpl
@@ -0,0 +1,4 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('pmtoolbox')); ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('editgroup')); ?></h3>
+ <?php $this->display('common.editgroup.tpl'); ?>
+</div>
diff --git a/themes/CleanFS/templates/pm.groups.tpl b/themes/CleanFS/templates/pm.groups.tpl
new file mode 100644
index 0000000..2b250ef
--- /dev/null
+++ b/themes/CleanFS/templates/pm.groups.tpl
@@ -0,0 +1,138 @@
+<div id="toolbox">
+<h2><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('groupmanage')); ?></h2>
+<?php if ($user->perms('is_admin')): ?><a class="button" href="<?php echo CreateURL('admin', 'newuser', $proj->id); ?>"><i class="fa fa-user-plus fa-lg fa-fw"></i> <?php echo Filters::noXSS(L('newuser')); ?></a><?php endif; ?>
+<a class="button" href="<?php echo Filters::noXSS(CreateURL('pm', 'newgroup', $proj->id)); ?>"><i class="fa fa-group fa-lg fa-fw"></i><?php echo Filters::noXSS(L('newgroup')); ?></a>
+
+<form style="display:inline-block" action="<?php echo Filters::noXSS($baseurl); ?>index.php" method="get">
+<label for="edit_user"><?php echo Filters::noXSS(L('edituser')); ?></label>
+<?php echo tpl_userselect('user_name', '', 'edit_user'); ?>
+<button type="submit"><?php echo Filters::noXSS(L('edit')); ?></button>
+<input type="hidden" name="do" value="user" />
+<input type="hidden" name="project" value="<?php echo $proj->id; ?>" />
+</form>
+<?php
+# 'group_open 'is not relevant for project groups, so lets not add it here.
+$perm_fields = array(
+'is_admin',
+'manage_project',
+'view_tasks',
+'view_groups_tasks', # TODO: What is the definition of "group's task" and how does it effect project views?
+'view_own_tasks', # TODO: What is the definition of "own task" and how does it effect project views?
+'open_new_tasks',
+'add_multiple_tasks',
+'modify_own_tasks',
+'modify_all_tasks',
+'create_attachments',
+'delete_attachments',
+'assign_to_self',
+'assign_others_to_self',
+'edit_assignments',
+'close_own_tasks',
+'close_other_tasks',
+'view_roadmap',
+'view_history',
+'view_reports',
+'add_votes',
+'view_comments',
+'add_comments',
+'edit_comments',
+'edit_own_comments',
+'delete_comments',
+'view_estimated_effort',
+'view_current_effort_done',
+'track_effort'
+);
+
+$yesno = array(
+ '<td style="color:#ccc" title="'.eL('no').'">-</td>',
+ '<td title="'.eL('yes').'"><i class="good fa fa-check fa-lg"></i></td>'
+);
+
+$merge=array_merge($groups,$globalgroups);
+
+$perms=array();
+$gmembers='';
+$gnames='';
+$gdesc='';
+$cols='';
+foreach ($merge as $group){
+ $cols.='<col class="group g'.$group['group_id'].($group['project_id']==0?' globalgroup':'').($group['project_id']==0 && $group['group_open']==0?' inactive':'').'"></col>';
+ $gmembers.='<td>'.$group['users'].'</td>';
+ if($group['project_id']!=0) {
+ $gnames.='<td><a class="button" title="'.eL('editgroup').'" href="'.(CreateURL('editgroup', $group['group_id'], 'pm')).'">'
+ .Filters::noXSS($group['group_name'])
+ .'<i class="fa fa-pencil fa-lg fa-fw"></i></a></td>';
+ } else {
+ $gnames.='<th title="'.eL('globalgroup').'">'.Filters::noXSS($group['group_name']).'</th>';
+ }
+ $gdesc.='<td>'.Filters::noXSS($group['group_desc']).'</td>';
+ foreach ($group as $key => $val) {
+ if (!is_numeric($key) && in_array($key, $perm_fields)) {
+ $perms[$key][]=$val;
+ }
+ }
+}
+?>
+<style>
+.perms {border-collapse:collapse;margin-top:20px;display:block;}
+.perms tbody tr:hover {background-color:#eee;}
+.perms td, .perms th{border:1px solid #999;}
+.perms thead th, .perms thead td {text-align:center;}
+.perms tbody th{text-align:right;}
+.perms tbody td{width:100px;text-align:center;}
+.perms tbody span i:first-child {color: #090;}
+.group.globalgroup {background-color:#ddd;}
+.group.globalgroup.inactive {background-color:#ccc;}
+</style>
+<table class="perms">
+<colgroup>
+<col></col>
+<?php echo $cols; ?>
+</colgroup>
+<thead>
+<tr>
+<th><?php echo L('groupmembers'); ?></th>
+<?php echo $gmembers; ?>
+</tr>
+<tr>
+<th><?php echo L('group'); ?></th>
+<?php echo $gnames; ?>
+</tr>
+<tr>
+<th><?php echo L('description'); ?></th>
+<?php echo $gdesc; ?>
+</tr>
+</thead>
+<tbody>
+<?php foreach ($perm_fields as $p): ?>
+<tr<?php
+# TODO view_own_tasks
+echo ( ($p=='view_tasks' || $p=='view_groups_tasks' || $p=='view_own_tasks') && $proj->prefs['others_view']) ? ' class="everybody"':'';
+echo ($p=='view_roadmap' && $proj->prefs['others_viewroadmap']) ?' class="everybody"':'';
+echo ($p=='open_new_tasks' && $proj->prefs['anon_open']) ? ' class="everybody"':'';
+?>>
+<th<?php echo ($p=='modify_own_tasks') ? ' title="Fields allowed to change: '.implode(', ', $proj->prefs['basic_fields']).'"':''; ?>><?php echo eL(str_replace('_', '', $p)); ?></th>
+<?php
+require_once('permicons.tpl');
+$i=0;
+
+foreach($perms[$p] as $val){
+ if ($perms['is_admin'][$i]==1 && $val == 0){
+ if(isset($permicons[$p])){
+ echo '<td title="'.eL('yes').' - Permission granted because of is_admin">( '.$permicons[$p].' )</td>';
+ }else{
+ echo $yesno[1];
+ }
+ } elseif($val==1 && isset($permicons[$p])){
+ echo '<td>'.$permicons[$p].'</td>';
+ } else{
+ echo $yesno[$val];
+ }
+ $i++;
+}
+?>
+</tr>
+<?php endforeach; ?>
+</tbody>
+</table>
+</div>
diff --git a/themes/CleanFS/templates/pm.menu.tpl b/themes/CleanFS/templates/pm.menu.tpl
new file mode 100644
index 0000000..f239e10
--- /dev/null
+++ b/themes/CleanFS/templates/pm.menu.tpl
@@ -0,0 +1,34 @@
+<?php $activeclass = ' class="active" '; ?>
+
+<div id="toolboxmenu">
+ <a id="projprefslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'prefs') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'prefs', $proj->id)); ?>"><?php echo Filters::noXSS(L('preferences')); ?></a>
+ <a id="projuglink"
+ <?php if(isset($_GET['area']) and ($_GET['area'] == 'groups' || $_GET['area'] == 'newgroup' || $_GET['area'] == 'editgroup') ) echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'groups', $proj->id)); ?>"><?php echo Filters::noXSS(L('usergroups')); ?></a>
+ <a id="projcatlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'cat') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'cat', $proj->id)); ?>"><?php echo Filters::noXSS(L('categories')); ?></a>
+ <a id="projttlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'tasktype') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'tasktype', $proj->id)); ?>"><?php echo Filters::noXSS(L('tasktypes')); ?></a>
+ <a id="projtglink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'tag') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'tag', $proj->id)); ?>"><i class="fa fa-tag"></i> <?php echo Filters::noXSS(L('tags')); ?></a>
+ <a id="projstatuslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'status') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'status', $proj->id)); ?>"><?php echo Filters::noXSS(L('taskstatuses')); ?></a>
+ <a id="projreslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'resolution') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'resolution', $proj->id)); ?>"><?php echo Filters::noXSS(L('resolutions')); ?></a>
+ <a id="projverlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'version') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'version', $proj->id)); ?>"><?php echo Filters::noXSS(L('versions')); ?></a>
+ <a id="projoslink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'os') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'os', $proj->id)); ?>"><i class="fa fa-linux"></i><i class="fa fa-windows"></i><i class="fa fa-apple"></i> <?php echo Filters::noXSS(L('operatingsystems')); ?></a>
+ <a id="projreqlink"
+ <?php if(isset($_GET['area']) and $_GET['area'] == 'pendingreq') echo $activeclass; ?>
+ href="<?php echo Filters::noXSS(CreateURL('pm', 'pendingreq', $proj->id)); ?>"><?php echo Filters::noXSS(L('pendingrequests')); ?></a>
+</div>
diff --git a/themes/CleanFS/templates/pm.newgroup.tpl b/themes/CleanFS/templates/pm.newgroup.tpl
new file mode 100644
index 0000000..dac1c9a
--- /dev/null
+++ b/themes/CleanFS/templates/pm.newgroup.tpl
@@ -0,0 +1,7 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('pmtoolbox')); ?> :: <?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('createnewgroup')); ?></h3>
+
+ <?php
+ $this->display('common.newgroup.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/pm.os.tpl b/themes/CleanFS/templates/pm.os.tpl
new file mode 100644
index 0000000..a2f2dc4
--- /dev/null
+++ b/themes/CleanFS/templates/pm.os.tpl
@@ -0,0 +1,12 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('oslisted')); ?></h3>
+<?php
+$this->assign('list_type', 'os');
+$this->assign('rows', $proj->listOs(true));
+
+$systemwide = new Project(0);
+$this->assign('sysrows', $systemwide->listOs(true));
+
+$this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/pm.pendingreq.tpl b/themes/CleanFS/templates/pm.pendingreq.tpl
new file mode 100644
index 0000000..353dc3b
--- /dev/null
+++ b/themes/CleanFS/templates/pm.pendingreq.tpl
@@ -0,0 +1,79 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('pendingrequests')); ?></h3>
+
+ <?php if (!count($pendings)): ?>
+ <?php echo Filters::noXSS(L('nopendingreq')); ?>
+
+ <?php else: ?>
+ <table class="requests">
+ <tr>
+ <th><?php echo Filters::noXSS(L('eventdesc')); ?></th>
+ <th><?php echo Filters::noXSS(L('requestedby')); ?></th>
+ <th><?php echo Filters::noXSS(L('daterequested')); ?></th>
+ <th><?php echo Filters::noXSS(L('reasongiven')); ?></th>
+ <th class="pm-buttons"> </th>
+ </tr>
+ <?php foreach ($pendings as $req): ?>
+ <tr>
+ <td>
+ <?php if ($req['request_type'] == 1) : ?>
+ <?php echo Filters::noXSS(L('closetask')); ?> -
+ <a href="<?php echo Filters::noXSS(CreateURL('details', $req['task_id'])); ?>">FS#<?php echo Filters::noXSS($req['task_id']); ?> :
+ <?php echo Filters::noXSS($req['item_summary']); ?></a>
+ <?php elseif ($req['request_type'] == 2) : ?>
+ <?php echo Filters::noXSS(L('reopentask')); ?> -
+ <a href="<?php echo Filters::noXSS(CreateURL('details', $req['task_id'])); ?>">FS#<?php echo Filters::noXSS($req['task_id']); ?> :
+ <?php echo Filters::noXSS($req['item_summary']); ?></a>
+ <?php endif; ?>
+ </td>
+ <td><?php echo tpl_userlink($req['user_id']); ?></td>
+ <td><?php echo Filters::noXSS(formatDate($req['time_submitted'], true)); ?></td>
+ <td><?php echo Filters::noXSS($req['reason_given']); ?></td>
+ <td>
+ <?php if ($req['request_type'] == 1) : ?>
+ <a class="button" href="#" onclick="showhidestuff('closeform<?php echo Filters::noXSS($req['request_id']); ?>');"><?php echo Filters::noXSS(L('accept')); ?></a>
+ <div id="closeform<?php echo Filters::noXSS($req['request_id']); ?>" class="denyform">
+ <?php echo tpl_form(Filters::noXSS(CreateURL('pm', 'pendingreq', $proj->id))); ?>
+ <div>
+ <input type="hidden" name="action" value="details.close"/>
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($req['task_id']); ?>"/>
+ <select class="adminlist" name="resolution_reason" onmouseup="event.stopPropagation();">
+ <option value="0"><?php echo Filters::noXSS(L('selectareason')); ?></option>
+ <?php echo tpl_options($proj->listResolutions(), Req::val('resolution_reason')); ?>
+ </select>
+ <button type="submit"><?php echo Filters::noXSS(L('closetask')); ?></button>
+ <br/>
+ <label class="default text" for="closure_comment"><?php echo Filters::noXSS(L('closurecomment')); ?></label>
+ <textarea class="text" id="closure_comment" name="closure_comment" rows="3"
+ cols="25"><?php echo Filters::noXSS(Req::val('closure_comment')); ?></textarea>
+ <label><?php echo tpl_checkbox('mark100', Req::val('mark100', !(Req::val('action') == 'details.close'))); ?>&nbsp;&nbsp;<?php echo Filters::noXSS(L('mark100')); ?></label>
+ </div>
+ </form>
+ </div>
+ <?php elseif ($req['request_type'] == 2) : ?>
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('pm', 'pendingreq', $proj->id)), null, null, null, 'style="display:inline"'); ?>
+ <input type="hidden" name="action" value="reopen" />
+ <input type="hidden" name="task_id" value="<?php echo Filters::noXSS($req['task_id']); ?>">
+ <input type="submit" class="button" value="<?php echo Filters::noXSS(L('accept')); ?>">
+ </form>
+
+ <?php endif; ?>
+ <a href="#" class="button" onclick="showhidestuff('denyform<?php echo Filters::noXSS($req['request_id']); ?>');"><?php echo Filters::noXSS(L('deny')); ?></a>
+ <div id="denyform<?php echo Filters::noXSS($req['request_id']); ?>" class="denyform">
+ <?php echo tpl_form(Filters::noXSS(CreateUrl('pm', 'pendingreq', $proj->id))); ?>
+ <div>
+ <input type="hidden" name="action" value="denypmreq" />
+ <input type="hidden" name="req_id" value="<?php echo Filters::noXSS($req['request_id']); ?>" />
+ <label for="deny_reason<?php echo Filters::noXSS($req['request_id']); ?>" class="inline"><?php echo Filters::noXSS(L('reasonfordeinal')); ?></label><br />
+ <textarea cols="40" rows="5" name="deny_reason" id="deny_reason<?php echo Filters::noXSS($req['request_id']); ?>"></textarea>
+ <br />
+ <button type="submit"><?php echo Filters::noXSS(L('deny')); ?></button>
+ </div>
+ </form>
+ </div>
+ </td>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ <?php endif; ?>
+</div>
diff --git a/themes/CleanFS/templates/pm.prefs.tpl b/themes/CleanFS/templates/pm.prefs.tpl
new file mode 100644
index 0000000..6af32fa
--- /dev/null
+++ b/themes/CleanFS/templates/pm.prefs.tpl
@@ -0,0 +1,370 @@
+<div id="toolbox">
+<h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('preferences')); ?></h3>
+<?php echo tpl_form(CreateUrl('pm', 'prefs', $proj->id)); ?>
+ <ul id="submenu">
+ <li><a href="#general"><?php echo Filters::noXSS(L('general')); ?></a></li>
+ <li><a href="#lookandfeel"><?php echo Filters::noXSS(L('lookandfeel')); ?></a></li>
+ <li><a href="#notifications"><?php echo Filters::noXSS(L('notifications')); ?></a></li>
+ <li><a href="#feeds"><?php echo Filters::noXSS(L('feeds')); ?></a></li>
+ <li><a href="#effort"><?php echo Filters::noXSS(L('efforttracking')); ?></a></li>
+ </ul>
+
+ <div id="general" class="tab">
+ <ul class="form_elements wide">
+ <li>
+ <label for="projecttitle"><?php echo Filters::noXSS(L('projecttitle')); ?></label>
+ <input id="projecttitle" name="project_title" class="text" type="text" maxlength="100"
+ value="<?php echo Filters::noXSS(Post::val('project_title', $proj->prefs['project_title'])); ?>" />
+ </li>
+
+ <li>
+ <label for="defaultcatowner"><?php echo Filters::noXSS(L('defaultcatowner')); ?></label>
+ <?php echo tpl_userselect('default_cat_owner', Post::val('default_cat_owner', $proj->prefs['default_cat_owner']), 'defaultcatowner'); ?>
+ </li>
+
+ <li>
+ <label for="langcode"><?php echo Filters::noXSS(L('language')); ?></label>
+ <select id="langcode" name="lang_code">
+ <?php echo tpl_options(Flyspray::listLangs(), Post::val('lang_code', $proj->prefs['lang_code']), true); ?>
+ </select>
+ </li>
+
+ <?php echo tpl_checkbox('disp_intro', Post::val('disp_intro', $proj->prefs['disp_intro']), 'disp_intro'); ?>
+ <label for="disp_intro"><?php echo Filters::noXSS(L('dispintro')); ?></label>
+ <li class="disp_introdep">
+ <label class="labeltextarea" for="intromesg"><?php echo Filters::noXSS(L('intromessage')); ?></label>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview"></div>
+ <button tabindex="9" type="button" onclick="showPreview('intromesg', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('intro_message', 8, 70, array('accesskey' => 'r', 'tabindex' => 8, 'id' => 'intromesg'), Post::val('intro_message', $proj->prefs['intro_message'])); ?>
+
+ <label class="labeltextarea"><?php echo Filters::noXSS(L('pagesintromsg')); ?></label>
+ <?php
+ $pages = array(
+ 'index' => L('tasklist'),
+ 'toplevel' => L('toplevel'),
+ 'newmultitasks' => L('addmultipletasks'),
+ 'details' => L('details'),
+ 'roadmap' => L('roadmap'),
+ 'newtask' => L('newtask'),
+ 'reports' => L('reports'),
+ 'depends' => L('dependencygraph'),
+ 'pm' => L('manageproject'));
+ $selectedPages = explode(' ', $proj->prefs['pages_intro_msg']);
+ echo tpl_double_select('pages_intro_msg', $pages, $selectedPages, false, false);
+ ?>
+ </li>
+
+ <li>
+ <label class="labeltextarea" for="default_task"><?php echo Filters::noXSS(L('defaulttask')); ?></label>
+ <?php if (defined('FLYSPRAY_HAS_PREVIEW')): ?>
+ <div class="hide preview" id="preview_taskdesc"></div>
+ <button tabindex="9" type="button" onclick="showPreview('default_task', '<?php echo Filters::noJsXSS($baseurl); ?>', 'preview_taskdesc')"><?php echo Filters::noXSS(L('preview')); ?></button>
+ <?php endif; ?>
+ <?php echo TextFormatter::textarea('default_task', 8, 70, array('accesskey' => 'r', 'tabindex' => 8, 'id' => 'default_task'), Post::val('default_task', $proj->prefs['default_task'])); ?>
+ </li>
+
+ <li>
+ <label for="isactive"><?php echo Filters::noXSS(L('isactive')); ?></label>
+ <?php echo tpl_checkbox('project_is_active', Post::val('project_is_active', $proj->prefs['project_is_active']), 'isactive'); ?>
+ </li>
+
+ <li>
+ <label><?php echo tpl_checkbox('delete_project', null); ?> <?php echo Filters::noXSS(L('deleteproject')); ?></label>
+ <select name="move_to"><?php echo tpl_options(array_merge(array(0 => L('none')), Flyspray::listProjects()), null, false, null, (string) $proj->id); ?></select>
+ </li>
+
+ <li>
+ <label for="othersviewroadmap"><?php echo Filters::noXSS(L('othersviewroadmap')); ?></label>
+ <?php
+ # note for FS1.0: This setting is currently also used as anon/public permission for: show project name, activity, stats, milestone progress
+ # but not listing tasks per milestone
+ echo tpl_checkbox('others_viewroadmap', Post::val('others_viewroadmap', $proj->prefs['others_viewroadmap']), 'othersviewroadmap'); ?>
+ </li>
+
+ <li>
+ <label for="othersview"><?php echo Filters::noXSS(L('othersview')); ?></label>
+ <?php
+ # note for FS1.0: This setting is current anon/public task view permission for: listing tasks (toplevel, tasklist, roadmap, RSS feed, ..)
+ echo tpl_checkbox('others_view', Post::val('others_view', $proj->prefs['others_view']), 'othersview'); ?>
+ </li>
+
+ <li>
+ <label for="anon_open"><?php echo Filters::noXSS(L('allowanonopentask')); ?></label>
+ <?php echo tpl_checkbox('anon_open', Post::val('anon_open', $proj->prefs['anon_open']), 'anon_open'); ?>
+ </li>
+
+ <li>
+ <label for="comment_closed"><?php echo Filters::noXSS(L('allowclosedcomments')); ?></label>
+ <?php echo tpl_checkbox('comment_closed', Post::val('comment_closed', $proj->prefs['comment_closed']), 'comment_closed'); ?>
+ </li>
+
+ <li>
+ <label for="auto_assign"><?php echo Filters::noXSS(L('autoassign')); ?></label>
+ <?php echo tpl_checkbox('auto_assign', Post::val('auto_assign', $proj->prefs['auto_assign']), 'auto_assign'); ?>
+ </li>
+
+ <li>
+ <label for="defaultdueversion"><?php echo Filters::noXSS(L('defaultdueinversion')); ?></label>
+ <select id="defaultdueversion" name="default_due_version">
+ <option value="0"><?php echo Filters::noXSS(L('undecided')); ?></option>
+ <?php echo tpl_options($proj->listVersions(false, 3), Post::val('default_due_version', $proj->prefs['default_due_version']), true); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="freetagging"><?php echo Filters::noXSS(L('freetagging')); ?></label>
+ <?php echo tpl_checkbox('freetagging', Post::val('freetagging', $proj->prefs['freetagging']), 'freetagging'); ?>
+ </li>
+ </ul>
+ </div>
+
+ <div id="lookandfeel" class="tab">
+ <ul class="form_elements wide">
+ <li>
+ <label for="themestyle"><?php echo Filters::noXSS(L('themestyle')); ?></label>
+ <select id="themestyle" name="theme_style">
+ <?php echo tpl_options(Flyspray::listThemes(), Post::val('theme_style', $proj->prefs['theme_style']), true); ?>
+ </select>
+ <label for="customstyle" style="width:auto"><?php echo Filters::noXSS(L('customstyle')); ?></label>
+ <select id="customstyle" name="custom_style">
+ <?php
+ $customs[]=array('', L('no'));
+ $customstyles=glob_compat(BASEDIR ."/themes/".($proj->prefs['theme_style'])."/custom_*.css");
+ foreach ($customstyles as $cs){
+ $customs[]=array($cs,$cs);
+ }
+ echo tpl_options($customs, $proj->prefs['custom_style']);
+ ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="default_entry"><?php echo Filters::noXSS(L('defaultentry')); ?></label>
+ <select id="default_entry" name="default_entry">
+ <?php echo tpl_options(array('index' => L('tasklist'), 'toplevel' => L('toplevel'), 'roadmap' => L('roadmap')), Post::val('default_entry', $proj->prefs['default_entry'])); ?>
+ </select>
+ </li>
+
+ <?php // Set the selectable column names
+ // Do NOT use real database column name here and in the next list,
+ // but a term from translation table entries instead, because it's
+ // also used elsewhere to draw a localized version of the name.
+ // Look also at the end of function
+ // tpl_draw_cell in scripts/index.php for further explanation.
+ $columnnames = array(
+ 'id' => L('id'),
+ 'project' => L('project'),
+ 'parent' => L('parent'),
+ 'tasktype' => L('tasktype'),
+ 'category' => L('category'),
+ 'severity' => L('severity'),
+ 'priority' => L('priority'),
+ 'summary' => L('summary'),
+ 'dateopened' => L('dateopened'),
+ 'status' => L('status'),
+ 'openedby' => L('openedby'),
+ 'private' => L('private'),
+ 'assignedto' => L('assignedto'),
+ 'lastedit' => L('lastedit'),
+ 'editedby' => L('editedby'),
+ 'reportedin' => L('reportedin'),
+ 'dueversion' => L('dueversion'),
+ 'duedate' => L('duedate'),
+ 'comments' => L('comments'),
+ 'attachments' => L('attachments'),
+ 'progress' => L('progress'),
+ 'dateclosed' => L('dateclosed'),
+ 'closedby' => L('closedby'),
+ 'os' => L('os'),
+ 'votes' => L('votes'),
+ 'estimatedeffort' => L('estimatedeffort'),
+ 'effort' => L('effort'));
+ $selectedcolumns = explode(' ', Post::val('visible_columns', $proj->prefs['visible_columns']));
+ ?>
+
+ <li>
+ <label for="default_order_by"><?php echo Filters::noXSS(L('defaultorderby')); ?></label>
+ <select id="default_order_by" name="default_order_by">
+ <?php echo tpl_options($columnnames, $proj->prefs['sorting'][0]['field'], false); ?>
+ </select>
+ <!-- <label><?php echo Filters::noXSS(L('defaultorderbydirection')); ?></label> -->
+ <select id="default_order_by_dir" name="default_order_by_dir">
+ <?php echo tpl_options(array('asc' => L('ascending'), 'desc' => L('descending')), $proj->prefs['sorting'][0]['dir'], false); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="default_order_by2"><?php echo Filters::noXSS(L('defaultorderby2')); ?></label>
+ <select id="default_order_by2" name="default_order_by2">
+ <?php echo tpl_options($columnnames, $proj->prefs['sorting'][1]['field'], false); ?>
+ </select>
+ <select id="default_order_by_dir2" name="default_order_by_dir2">
+ <?php echo tpl_options(array('asc' => L('ascending'), 'desc' => L('descending')), $proj->prefs['sorting'][1]['dir'], false); ?>
+ </select>
+ </li>
+
+ <li>
+ <label><?php echo Filters::noXSS(L('visiblecolumns')); ?></label>
+ <?php echo tpl_double_select('visible_columns', $columnnames, $selectedcolumns, false); ?>
+ </li>
+
+ <li>
+ <label><?php echo Filters::noXSS(L('visiblefields')); ?></label>
+ <?php // Set the selectable field names
+ $fieldnames = array(
+ 'parent' => L('parent'),
+ 'tasktype' => L('tasktype'),
+ 'category' => L('category'),
+ 'severity' => L('severity'),
+ 'priority' => L('priority'),
+ 'status' => L('status'),
+ 'private' => L('private'),
+ 'assignedto' => L('assignedto'),
+ 'reportedin' => L('reportedin'),
+ 'dueversion' => L('dueversion'),
+ 'duedate' => L('duedate'),
+ 'progress' => L('progress'),
+ 'os' => L('os'),
+ 'votes' => L('votes'));
+ $selectedfields = explode(' ', Post::val('visible_fields', $proj->prefs['visible_fields']));
+ ?>
+ <?php echo tpl_double_select('visible_fields', $fieldnames, $selectedfields, false); ?>
+ </li>
+ </ul>
+ </div>
+
+ <div id="notifications" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="notify_subject"><?php echo Filters::noXSS(L('notifysubject')); ?></label>
+ <input id="notify_subject" class="text" name="notify_subject" type="text" value="<?php echo Filters::noXSS(Post::val('notify_subject', $proj->prefs['notify_subject'])); ?>" />
+ <br /><span class="note"><?php echo Filters::noXSS(L('notifysubjectinfo')); ?></span>
+ </li>
+
+ <li>
+ <label for="emailaddress"><?php echo Filters::noXSS(L('emailaddress')); ?></label>
+ <input id="emailaddress" name="notify_email" class="text" type="text" value="<?php echo Filters::noXSS(Post::val('notify_email', $proj->prefs['notify_email'])); ?>" />
+ </li>
+
+ <?php if (!empty($fs->prefs['jabber_server'])): ?>
+ <li>
+ <label for="jabberid"><?php echo Filters::noXSS(L('jabberid')); ?></label>
+ <input id="jabberid" class="text" name="notify_jabber" type="text" value="<?php echo Filters::noXSS(Post::val('notify_jabber', $proj->prefs['notify_jabber'])); ?>" />
+ </li>
+ <?php endif ?>
+
+ <li>
+ <label for="notify_reply"><?php echo Filters::noXSS(L('replyto')); ?></label>
+ <input id="notify_reply" name="notify_reply" class="text" type="text" value="<?php echo Filters::noXSS(Post::val('notify_reply', $proj->prefs['notify_reply'])); ?>" />
+ </li>
+
+ <li>
+ <label for="notify_types"><?php echo Filters::noXSS(L('notifytypes')); ?></label>
+ <select id="notify_types" size="17" multiple="multiple" name="notify_types[]">
+ <?php echo tpl_options(array(0 => L('none'),
+ NOTIFY_TASK_OPENED => L('taskopened'),
+ NOTIFY_TASK_CHANGED => L('pm.taskchanged'),
+ NOTIFY_TASK_CLOSED => L('taskclosed'),
+ NOTIFY_TASK_REOPENED => L('pm.taskreopened'),
+ NOTIFY_DEP_ADDED => L('pm.depadded'),
+ NOTIFY_DEP_REMOVED => L('pm.depremoved'),
+ NOTIFY_COMMENT_ADDED => L('commentadded'),
+ NOTIFY_ATT_ADDED => L('attachmentadded'),
+ NOTIFY_REL_ADDED => L('relatedadded'),
+ NOTIFY_OWNERSHIP => L('ownershiptaken'),
+ NOTIFY_PM_REQUEST => L('pmrequest'),
+ NOTIFY_PM_DENY_REQUEST => L('pmrequestdenied'),
+ NOTIFY_NEW_ASSIGNEE => L('newassignee'),
+ NOTIFY_REV_DEP => L('revdepadded'),
+ NOTIFY_REV_DEP_REMOVED => L('revdepaddedremoved'),
+ NOTIFY_ADDED_ASSIGNEES => L('assigneeadded')),
+ Post::val('notify_types', Flyspray::int_explode(' ', $proj->prefs['notify_types']))); ?>
+ </select>
+ </li>
+ </ul>
+ </div>
+
+ <div id="feeds" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="feed_description"><?php echo Filters::noXSS(L('feeddescription')); ?></label>
+ <input id="feed_description" class="text" name="feed_description" type="text" value="<?php echo Filters::noXSS(Post::val('feed_description', $proj->prefs['feed_description'])); ?>" />
+ </li>
+
+ <li>
+ <label for="feed_img_url"><?php echo Filters::noXSS(L('feedimgurl')); ?></label>
+ <input id="feed_img_url" class="text" name="feed_img_url" type="text" value="<?php echo Filters::noXSS(Post::val('feed_img_url', $proj->prefs['feed_img_url'])); ?>" />
+ </li>
+ </ul>
+ </div>
+
+ <div id="effort" class="tab">
+ <ul class="form_elements">
+ <li>
+ <label for="useeffort"><?php echo Filters::noXSS(L('useeffort')); ?></label>
+ <?php echo tpl_checkbox('use_effort_tracking', Post::val('use_effort_tracking', $proj->prefs['use_effort_tracking']), 'useeffort'); ?>
+ </li>
+ <li>
+ <label for="hours_per_manday"><?php echo Filters::noXSS(L('hourspermanday')); ?></label>
+ <input id="hours_per_manday" class="text" name="hours_per_manday" type="text"
+ value="<?php
+ $seconds = Post::val('hours_per_manday', $proj->prefs['hours_per_manday']);
+ // Post::val is in HH:mm format, $proj->prefs in seconds.
+ if (!preg_match('/^\d+$/', $seconds)) {
+ $seconds = effort::EditStringToSeconds($seconds, $proj->prefs['hours_per_manday'], effort::FORMAT_HOURS_COLON_MINUTES);
+ }
+
+ echo Filters::noXSS(effort::SecondsToEditString($seconds,$proj->prefs['hours_per_manday'], effort::FORMAT_HOURS_COLON_MINUTES));
+ ?>" />
+ </li>
+ <li>
+ <label for="estimated_effort_format"><?php echo Filters::noXSS(L('estimatedeffortformat')); ?></label>
+ <select id="estimated_effort_format" name="estimated_effort_format">
+ <?php echo tpl_options(array(
+ effort::FORMAT_HOURS_COLON_MINUTES => L('hourplural') . ':' . L('minuteplural'),
+ effort::FORMAT_HOURS_SPACE_MINUTES => L('hourplural') . ' ' . L('minuteplural'),
+ effort::FORMAT_HOURS_PLAIN => L('hourplural'),
+ effort::FORMAT_HOURS_ONE_DECIMAL => L('hourplural') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_MINUTES => L('minuteplural'),
+ effort::FORMAT_DAYS_PLAIN => L('mandays'),
+ effort::FORMAT_DAYS_ONE_DECIMAL => L('mandays') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_DAYS_PLAIN_HOURS_PLAIN => L('mandays') . ' ' . L('hourplural'),
+ effort::FORMAT_DAYS_PLAIN_HOURS_ONE_DECIMAL => L('mandays') . ' ' . L('hourplural') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_DAYS_PLAIN_HOURS_COLON_MINUTES => L('mandays') . ' ' . L('hourplural') . ":" . L('minuteplural'),
+ effort::FORMAT_DAYS_PLAIN_HOURS_SPACE_MINUTES => L('mandays') . ' ' . L('hourplural') . " " . L('minuteplural'),
+ ),
+ Post::val('estimated_effort_format', $proj->prefs['estimated_effort_format'])); ?>
+ </select>
+ </li>
+ <li>
+ <label for="current_effort_done_format"><?php echo Filters::noXSS(L('currenteffortdoneformat')); ?></label>
+ <select id="current_effort_done_format" name="current_effort_done_format">
+ <?php echo tpl_options(array(
+ effort::FORMAT_HOURS_COLON_MINUTES => L('hourplural') . ':' . L('minuteplural'),
+ effort::FORMAT_HOURS_SPACE_MINUTES => L('hourplural') . ' ' . L('minuteplural'),
+ effort::FORMAT_HOURS_PLAIN => L('hourplural'),
+ effort::FORMAT_HOURS_ONE_DECIMAL => L('hourplural') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_MINUTES => L('minuteplural'),
+ effort::FORMAT_DAYS_PLAIN => L('mandays'),
+ effort::FORMAT_DAYS_ONE_DECIMAL => L('mandays') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_DAYS_PLAIN_HOURS_PLAIN => L('mandays') . ' ' . L('hourplural'),
+ effort::FORMAT_DAYS_PLAIN_HOURS_ONE_DECIMAL => L('mandays') . ' ' . L('hourplural') . ' (' . L('onedecimal') . ')',
+ effort::FORMAT_DAYS_PLAIN_HOURS_COLON_MINUTES => L('mandays') . ' ' . L('hourplural') . ":" . L('minuteplural'),
+ effort::FORMAT_DAYS_PLAIN_HOURS_SPACE_MINUTES => L('mandays') . ' ' . L('hourplural') . " " . L('minuteplural'),
+ ),
+ Post::val('current_effort_done_format', $proj->prefs['current_effort_done_format'])); ?>
+ </select>
+ </li>
+ </ul>
+ </div>
+
+ <div class="tbuttons">
+ <input type="hidden" name="action" value="pm.updateproject" />
+ <input type="hidden" name="project_id" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <button type="submit" class="positive"><?php echo Filters::noXSS(L('saveoptions')); ?></button>
+ <button type="reset"><?php echo Filters::noXSS(L('resetoptions')); ?></button>
+ </div>
+</form>
+</div>
diff --git a/themes/CleanFS/templates/pm.resolution.tpl b/themes/CleanFS/templates/pm.resolution.tpl
new file mode 100644
index 0000000..451ef5a
--- /dev/null
+++ b/themes/CleanFS/templates/pm.resolution.tpl
@@ -0,0 +1,12 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('resed')); ?></h3>
+<?php
+$this->assign('list_type', 'resolution');
+$this->assign('rows', $proj->listResolutions(true));
+
+$systemwide = new Project(0);
+$this->assign('sysrows', $systemwide->listResolutions(true));
+
+$this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/pm.status.tpl b/themes/CleanFS/templates/pm.status.tpl
new file mode 100644
index 0000000..9c2263e
--- /dev/null
+++ b/themes/CleanFS/templates/pm.status.tpl
@@ -0,0 +1,12 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('taskstatuses')); ?></h3>
+<?php
+$this->assign('list_type', 'status');
+$this->assign('rows', $proj->listTaskStatuses(true));
+
+$systemwide = new Project(0);
+$this->assign('sysrows', $systemwide->listTaskStatuses(true));
+
+$this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/pm.tag.tpl b/themes/CleanFS/templates/pm.tag.tpl
new file mode 100644
index 0000000..7ec3f2d
--- /dev/null
+++ b/themes/CleanFS/templates/pm.tag.tpl
@@ -0,0 +1,14 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS(L('tags')); ?></h3>
+ <p>Tag management is in development.</p>
+ <p>Please see <a href="https://bugs.flyspray.org/2012" target="_blank">bugs.flyspray.org/2012</a> for status of <b>Tags</b> feature.</p>
+<?php
+$this->assign('list_type', 'tag');
+$this->assign('rows', $proj->listTags(true));
+
+$systemwide = new Project(0);
+$this->assign('sysrows', $systemwide->listTags(true));
+
+$this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/pm.tasktype.tpl b/themes/CleanFS/templates/pm.tasktype.tpl
new file mode 100644
index 0000000..6dcd029
--- /dev/null
+++ b/themes/CleanFS/templates/pm.tasktype.tpl
@@ -0,0 +1,12 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('tasktypeed')); ?></h3>
+ <?php
+ $this->assign('list_type', 'tasktype');
+ $this->assign('rows', $proj->listTaskTypes(true));
+
+ $systemwide = new Project(0);
+ $this->assign('sysrows', $systemwide->listTaskTypes(true));
+
+ $this->display('common.list.tpl');
+ ?>
+</div>
diff --git a/themes/CleanFS/templates/pm.version.tpl b/themes/CleanFS/templates/pm.version.tpl
new file mode 100644
index 0000000..0b56fe6
--- /dev/null
+++ b/themes/CleanFS/templates/pm.version.tpl
@@ -0,0 +1,12 @@
+<div id="toolbox">
+ <h3><?php echo Filters::noXSS($proj->prefs['project_title']); ?> : <?php echo Filters::noXSS(L('verlisted')); ?></h3>
+<?php
+$this->assign('list_type', 'version');
+$this->assign('rows', $proj->listVersions(true));
+
+$systemwide = new Project(0);
+$this->assign('sysrows', $systemwide->listVersions(true));
+
+$this->display('common.list.tpl');
+?>
+</div>
diff --git a/themes/CleanFS/templates/profile.tpl b/themes/CleanFS/templates/profile.tpl
new file mode 100644
index 0000000..2c828ef
--- /dev/null
+++ b/themes/CleanFS/templates/profile.tpl
@@ -0,0 +1,70 @@
+<fieldset class="box"><legend><?php echo Filters::noXSS(L('profile')); ?> <?php echo Filters::noXSS($theuser->infos['real_name']); ?> (<?php echo Filters::noXSS($theuser->infos['user_name']); ?>)</legend>
+<table id="profile">
+ <tr>
+ <th><?php echo Filters::noXSS(L('realname')); ?></th>
+ <td><?php echo Filters::noXSS($theuser->infos['real_name']); ?></td>
+ </tr>
+ <?php if ((!$user->isAnon() && !$fs->prefs['hide_emails'] && !$theuser->infos['hide_my_email']) || $user->perms('is_admin')): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('emailaddress')); ?></th>
+ <td><a href="mailto:<?php echo Filters::noXSS($theuser->infos['email_address']); ?>"><?php echo Filters::noXSS($theuser->infos['email_address']); ?></a></td>
+ </tr>
+ <?php endif; ?>
+ <?php if (!empty($fs->prefs['jabber_server']) && (( !$user->isAnon() && !$fs->prefs['hide_emails'] && !$theuser->infos['hide_my_email']) || $user->perms('is_admin')) ): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('jabberid')); ?></th>
+ <td><?php echo Filters::noXSS($theuser->infos['jabber_id']); ?></td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('globalgroup')); ?></th>
+ <td><?php echo Filters::noXSS($groups[Flyspray::array_find('group_id', $theuser->infos['global_group'], $groups)]['group_name']); ?></td>
+ </tr>
+ <?php if ($proj->id): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('projectgroup')); ?></th>
+ <td>
+ <?php if ($user->perms('manage_project')): ?>
+ <?php echo tpl_form(Filters::noXSS($baseurl).'index.php?do=user&amp;id='.Filters::noXSS($theuser->id)); ?>
+ <select id="projectgroupin" class="adminlist" name="project_group_in">
+ <?php $sel = $theuser->perms('project_group') == '' ? 0 : $theuser->perms('project_group'); ?>
+ <?php echo tpl_options(array_merge($project_groups, array(0 => array('group_name' => L('none'), 0 => 0, 'group_id' => 0, 1 => L('none')))), $sel); ?>
+ </select>
+ <input type="hidden" name="old_group_id" value="<?php echo Filters::noXSS($theuser->perms('project_group')); ?>" />
+ <input type="hidden" name="action" value="admin.edituser" />
+ <input type="hidden" name="user_id" value="<?php echo Filters::noXSS($theuser->id); ?>" />
+ <input type="hidden" name="project_id" value="<?php echo $proj->id; ?>" />
+ <input type="hidden" name="onlypmgroup" value="1" />
+ <button type="submit"><?php echo Filters::noXSS(L('update')); ?></button>
+ </form>
+ <?php else: ?>
+ <?php if ($theuser->perms('project_group')): ?>
+ <?php echo Filters::noXSS($project_groups[Flyspray::array_find('group_id', $theuser->perms('project_group'), $project_groups)]['group_name']); ?>
+ <?php else: ?>
+ <?php echo Filters::noXSS(L('none')); ?>
+ <?php endif; ?>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <th><a href="<?php echo CreateURL('tasklist', 0, null, array('opened'=>$theuser->id, 'status[]'=>'')); ?>"><?php echo Filters::noXSS(L('tasksopened')); ?></a></th>
+ <td><a href="<?php echo CreateURL('tasklist', 0, null, array('opened'=>$theuser->id, 'status[]'=>'')); ?>"><?php echo Filters::noXSS($tasks); ?></a></td>
+ </tr>
+ <tr>
+ <th><a href="<?php echo CreateURL('tasklist', 0, null, array('dev'=>$theuser->id)); ?>"><?php echo Filters::noXSS(L('assignedto')); ?></a></th>
+ <td><a href="<?php echo CreateURL('tasklist', 0, null, array('dev'=>$theuser->id)); ?>"><?php echo Filters::noXSS($assigned); ?></a></td>
+ </tr>
+ <tr>
+ <th><?php echo Filters::noXSS(L('comments')); ?></th>
+ <td><?php echo Filters::noXSS($comments); ?></td>
+ </tr>
+ <?php if ($theuser->infos['register_date']): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('regdate')); ?></th>
+ <td><?php echo Filters::noXSS(formatDate($theuser->infos['register_date'])); ?></td>
+ </tr>
+ <?php endif; ?>
+</table>
+</fieldset>
+<div><?php if($user->perms('is_admin')): ?><a href="<?php echo CreateURL('edituser', $theuser->id); ?>" class="button"><?php echo L('edituser'); ?></a><?php endif; ?></div>
diff --git a/themes/CleanFS/templates/register.magic.tpl b/themes/CleanFS/templates/register.magic.tpl
new file mode 100644
index 0000000..b93e743
--- /dev/null
+++ b/themes/CleanFS/templates/register.magic.tpl
@@ -0,0 +1,31 @@
+<h3><?php echo Filters::noXSS(L('registernewuser')); ?></h3>
+<div class="box">
+ <!--
+<?php echo tpl_form(Filters::noXSS($baseurl).'index.php','registernewuser',null,null,'id="registernewuser"'); ?>
+ -->
+<?php echo tpl_form(Filters::noXSS(CreateUrl('registernewuser')),null,null,null,'id="registernewuser"'); ?>
+ <p><?php echo Filters::noXSS(L('entercode')); ?></p>
+ <ul class="form_elements wide">
+ <li>
+ <label for="confirmation_code"><?php echo Filters::noXSS(L('confirmationcode')); ?></label>
+ <input id="confirmation_code" class="text" name="confirmation_code" value="<?php echo Filters::noXSS(Req::val('confirmation_code')); ?>" type="text" size="20" maxlength="20" />
+ </li>
+
+ <li>
+ <label for="user_pass"><?php echo Filters::noXSS(L('password')); ?></label>
+ <input id="user_pass" class="password" name="user_pass" value="<?php echo Filters::noXSS(Req::val('user_pass')); ?>" type="password" size="20" maxlength="100" /> <em><?php echo Filters::noXSS(L('minpwsize')); ?></em>
+ </li>
+ <?php if($fs->prefs['repeat_password']): ?>
+ <li>
+ <label for="user_pass2"><?php echo Filters::noXSS(L('confirmpass')); ?></label>
+ <input id="user_pass2" class="password" name="user_pass2" value="<?php echo Filters::noXSS(Req::val('user_pass2')); ?>" type="password" size="20" maxlength="100" />
+ </li>
+ <?php endif;?>
+ </ul>
+ <div>
+ <input type="hidden" name="action" value="register.registeruser" />
+ <input type="hidden" name="magic_url" value="<?php echo Filters::noXSS(Req::val('magic_url')); ?>" />
+ <button type="submit" name="buSubmit"><?php echo Filters::noXSS(L('registeraccount')); ?></button>
+ </div>
+</form>
+</div>
diff --git a/themes/CleanFS/templates/register.no-magic.tpl b/themes/CleanFS/templates/register.no-magic.tpl
new file mode 100644
index 0000000..16fedd2
--- /dev/null
+++ b/themes/CleanFS/templates/register.no-magic.tpl
@@ -0,0 +1,78 @@
+<h3><?= eL('registernewuser') ?></h3>
+<div class="box">
+<?php echo tpl_form(Filters::noXSS(createUrl('register')),null,null,null,'id="registernewuser"'); ?>
+ <ul class="form_elements wide">
+ <li>
+ <label for="username"><?= eL('username') ?></label>
+ <input required="required" value="<?php echo Filters::noXSS(Req::val('user_name')); ?>" id="username" name="user_name" type="text" size="20" maxlength="32" onblur="checkname(this.value);" /> <?= eL('validusername') ?><br /><strong><span id="errormessage"></span></strong>
+ </li>
+
+ <li>
+ <label for="realname"><?= eL('realname') ?></label>
+ <input required="required" value="<?php echo Filters::noXSS(Req::val('real_name')); ?>" id="realname" name="real_name" type="text" size="30" maxlength="100" />
+ </li>
+
+ <li>
+ <label for="emailaddress"><?= eL('emailaddress') ?></label>
+ <input id="emailaddress" value="<?php echo Filters::noXSS(Req::val('email_address')); ?>" name="email_address" required="required" type="text" size="20" maxlength="100" /> <?= eL('validemail') ?>
+ </li>
+ <?php if ($fs->prefs['repeat_emailaddress']): ?>
+ <li>
+ <label for="verifyemailaddress"><?= eL('verifyemailaddress') ?></label>
+ <input id="verifyemailaddress" value="<?php echo Filters::noXSS(Req::val('verify_email_address')); ?>" name="verify_email_address" required="required" type="text" size="20" maxlength="100" />
+ </li>
+ <?php endif ?>
+
+ <?php if (!empty($fs->prefs['jabber_server'])): ?>
+ <li>
+ <label for="jabberid"><?= eL('jabberid') ?></label>
+ <input id="jabberid" value="<?php echo Filters::noXSS(Req::val('jabber_id')); ?>" name="jabber_id" type="text" size="20" maxlength="100" />
+ </li>
+ <?php endif ?>
+
+ <li>
+ <label for="notify_type"><?= eL('notifications') ?></label>
+ <select id="notify_type" name="notify_type">
+ <?php echo tpl_options($fs->getNotificationOptions(), Req::val('notify_type')); ?>
+ </select>
+ </li>
+
+ <li>
+ <label for="time_zone"><?= eL('timezone') ?></label>
+ <select id="time_zone" name="time_zone">
+ <?php
+ $times = array();
+ for ($i = -12; $i <= 13; $i++) {
+ $times[$i] = L('GMT') . (($i == 0) ? ' ' : (($i > 0) ? '+' . $i : $i));
+ }
+ ?>
+ <?php echo tpl_options($times, Req::val('time_zone', 0)); ?>
+ </select>
+ </li>
+ <?php if($fs->prefs['captcha_securimage']) : ?>
+ <li class="captchali">
+ <style>
+ #captcha_code{width:100px;}
+ .captchali .securimage label{width:auto;}
+ .captchali .securimage {display:inline-block; width:300px;}
+ </style>
+ <label for="captcha_code"><?= eL('registercaptcha') ?></label>
+ <div class="securimage"><?php echo $captcha_securimage_html; ?></div>
+ </li>
+ <?php endif; ?>
+ </ul>
+ <div>
+ <input type="hidden" name="action" value="register.sendcode" />
+ <?php if(isset($fs->prefs['captcha_recaptcha']) && $fs->prefs['captcha_recaptcha']
+ && isset($fs->prefs['captcha_recaptcha_sitekey']) && $fs->prefs['captcha_recaptcha_sitekey']
+ && isset($fs->prefs['captcha_recaptcha_secret']) && $fs->prefs['captcha_recaptcha_secret']
+ ): ?>
+ <div class="g-recaptcha" data-sitekey="<?php echo Filters::noXSS($fs->prefs['captcha_recaptcha_sitekey']); ?>"></div>
+ <noscript>Javascript is required for this Google reCAPTCHA.</noscript>
+ <?php endif; ?>
+ <button type="submit" name="buSubmit" id="buSubmit"><?= eL('sendcode') ?></button>
+ </div>
+ <br />
+ <p><?= L('note') ?></p>
+</form>
+</div>
diff --git a/themes/CleanFS/templates/register.oauth.tpl b/themes/CleanFS/templates/register.oauth.tpl
new file mode 100644
index 0000000..0e6ed38
--- /dev/null
+++ b/themes/CleanFS/templates/register.oauth.tpl
@@ -0,0 +1,15 @@
+<h3><?php echo Filters::noXSS(L('register')); ?></h3>
+<div class="box">
+
+<form action="index.php?do=oauth" method="post" id="registernewuser">
+ <ul class="form_elements">
+ <li>
+ <label for="username"><?php echo Filters::noXSS(L('username')); ?></label>
+ <input class="required text" value="<?php echo Filters::noXSS($username); ?>" id="user_name" name="username" type="text" size="20" maxlength="32" /> <?php echo Filters::noXSS(L('validusername')); echo '<span class="warning"> ' . Filters::noXSS(L('usernametaken')) . '</span>'; ?>
+ </li>
+ </ul>
+ <div>
+ <button type="submit" name="buSubmit" id="buSubmit"><?php echo Filters::noXSS(L('register')); ?></button>
+ </div>
+</form>
+</div>
diff --git a/themes/CleanFS/templates/register.ok.tpl b/themes/CleanFS/templates/register.ok.tpl
new file mode 100644
index 0000000..3bc05a8
--- /dev/null
+++ b/themes/CleanFS/templates/register.ok.tpl
@@ -0,0 +1,4 @@
+<div class="redirectmessage">
+ <p><?= eL('loginbelow') ?></p>
+ <p><?= eL('newuserwarning') ?></p>
+</div>
diff --git a/themes/CleanFS/templates/reports.tpl b/themes/CleanFS/templates/reports.tpl
new file mode 100644
index 0000000..f7b0cdf
--- /dev/null
+++ b/themes/CleanFS/templates/reports.tpl
@@ -0,0 +1,120 @@
+<?php
+if(isset($theuser->infos['eventtypes'])){
+ $eventpref=$theuser->infos['eventtypes'];
+}else{
+ $eventpref=array_keys($events);
+ $usereventpref=array_keys($user_events);
+}
+?>
+<h3><?php echo Filters::noXSS(L('eventlog')); ?></h3>
+<div class="box">
+ <form action="<?php echo Filters::noXSS(CreateURL('reports', $proj->id)); ?>" method="get">
+ <table id="event1">
+ <tr>
+ <td><label for="events[]"><?php echo Filters::noXSS(L('events')); ?></label></td>
+ <td>
+ <select name="events[]" class='eventlist<?php echo $histories ? ' hasresult':''; ?>' multiple="multiple" id="events[]" size="<?php echo Filters::noXSS(count($events)+count($user_events)+2); ?>">
+ <optgroup label="<?php echo Filters::noXSS(L('Tasks')); ?>">
+ <?php echo tpl_options($events, Req::val('events', $eventpref)); ?>
+ </optgroup>
+ <optgroup label="<?php echo Filters::noXSS(L('users')); ?>">
+ <?php echo tpl_options($user_events, Req::val('events', $usereventpref)); ?>
+ </optgroup>
+ </select>
+ </td>
+ <td>
+ <div>
+ <label class="inline" for="fromdate"><?php echo Filters::noXSS(L('from')); ?></label>
+ <?php echo tpl_datepicker('fromdate'); ?>
+ <?php echo tpl_datepicker('todate', L('to')); ?>
+ </div>
+ <div>
+ <label for="event_number"><?php echo Filters::noXSS(L('show')); ?></label>
+ <select name="event_number" id="event_number">
+ <?php
+ # set 20 to 25 like in tasks_per_page because we use same settings here too
+ echo tpl_options(array(-1 => L('all'), 10 => 10, 25 => 25, 50 => 50, 100 => 100, 200 => 200),
+ Req::val('event_number', isset($theuser->infos['tasks_perpage']) ? $theuser->infos['tasks_perpage'] : 50)); ?>
+ </select>
+ <?php echo Filters::noXSS(L('events')); ?>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <input type="hidden" name="project" value="<?php echo Filters::noXSS($proj->id); ?>" />
+ <input type="hidden" name="do" value="reports" />
+ <button type="submit" name="submit"><?php echo Filters::noXSS(L('show')); ?></button>
+ </form>
+
+ <?php if ($histories): ?>
+ <div id="tasklist">
+ <table id="eventlist_table">
+ <thead>
+ <tr>
+ <th>
+ <a href="<?php echo Filters::noXSS(CreateURL('reports', $proj->id, null, array('sort' => (Req::val('order') == 'type' && $sort == 'DESC') ? 'asc' : 'desc', 'order' => 'type') + $_GET)); ?>">
+ <?php echo Filters::noXSS(L('event')); ?>
+
+ </a>
+ </th>
+ <th>
+ <a href="<?php echo Filters::noXSS(CreateURL('reports', $proj->id, null, array('sort' => (Req::val('order') == 'user' && $sort == 'DESC') ? 'asc' : 'desc', 'order' => 'user') + $_GET)); ?>">
+ <?php echo Filters::noXSS(L('user')); ?>
+
+ </a>
+ </th>
+ <th>
+ <a href="<?php echo Filters::noXSS(CreateURL('reports', $proj->id, null, array('sort' => (Req::val('order') == 'date' && $sort == 'DESC') ? 'asc' : 'desc', 'order' => 'date') + $_GET)); ?>">
+ <?php echo Filters::noXSS(L('eventdate')); ?>
+
+ </a>
+ </th>
+ <th><?php echo Filters::noXSS(L('summary')); ?></th>
+ </tr>
+ </thead>
+ <?php foreach ($histories as $history): ?>
+ <?php if (isset($events[$history['event_type']])): ?>
+ <tr class="severity1"><?php /* just for different colors */ ?>
+ <td><?php echo Filters::noXSS($events[$history['event_type']]); ?></td>
+ <?php else: ?>
+ <tr class="severity2">
+ <td><?php echo Filters::noXSS($user_events[$history['event_type']]); ?></td>
+ <?php endif; ?>
+ <td><?php echo tpl_userlink($history['user_id']); ?></td>
+ <td><?php echo Filters::noXSS(formatDate($history['event_date'], true)); ?></td>
+ <?php if ($history['event_type'] == 30 ||
+ $history['event_type'] == 31):
+ $user_data = unserialize($history['new_value']); ?>
+ <td>
+ <a href="javascript:showhidestuff('h<?php echo Filters::noXSS($history['history_id']); ?>')"><?php echo Filters::noXSS(L('detailedinfo')); ?></a>
+ <div class="hide popup" id="h<?php echo Filters::noXSS($history['history_id']); ?>">
+ <table>
+ <tr>
+ <th><?php echo Filters::noXSS(L('username')); ?></th>
+ <td><?php echo Filters::noXSS($user_data['user_name']); ?></td>
+ </tr>
+ <tr>
+ <th><?php echo Filters::noXSS(L('realname')); ?></th>
+ <td><?php echo Filters::noXSS($user_data['real_name']); ?></td>
+ </tr>
+ <tr>
+ <th><?php echo Filters::noXSS(L('email')); ?></th>
+ <td><?php echo Filters::noXSS($user_data['email_address']); ?></td>
+ </tr>
+ <tr>
+ <th><?php echo Filters::noXSS(L('jabber')); ?></th>
+ <td><?php echo Filters::noXSS($user_data['jabber_id']); ?></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ <?php else: ?>
+ <td><?php echo tpl_tasklink($history); ?></td>
+ <?php endif; ?>
+ </tr>
+ <?php endforeach; ?>
+ </table>
+ </div>
+ <?php endif; ?>
+</div>
diff --git a/themes/CleanFS/templates/roadmap.text.tpl b/themes/CleanFS/templates/roadmap.text.tpl
new file mode 100644
index 0000000..7d33199
--- /dev/null
+++ b/themes/CleanFS/templates/roadmap.text.tpl
@@ -0,0 +1,51 @@
+=== <?php echo Filters::noXSS($proj->prefs['project_title']); ?> ===
+
+<?php foreach($data as $milestone): ?>
+<?php echo Filters::noXSS(L('roadmapfor')); ?> <?php echo Filters::noXSS($milestone['name']); ?>
+
+
+<?php echo Filters::noXSS($milestone['percent_complete']); ?><?php echo Filters::noXSS(L('of')); ?> <?php echo Filters::noXSS(count($milestone['all_tasks'])); ?> <?php echo Filters::noXSS(L('tasks')); ?> <?php echo Filters::noXSS(L('completed')); ?> <?php
+ if(count($milestone['open_tasks'])):
+ ?><?php echo Filters::noXSS(count($milestone['open_tasks'])); ?> <?php echo Filters::noXSS(L('opentasks')); ?>:<?php
+ endif; ?>
+<?php
+ if ($proj->prefs['use_effort_tracking']) {
+ $total_estimated = 0;
+ $actual_effort = 0;
+
+ foreach($milestone['open_tasks'] as $task) {
+ $total_estimated += $task['estimated_effort'];
+ $effort = new effort($task['task_id'],0);
+ $effort->populateDetails();
+
+ foreach($effort->details as $details) {
+ $actual_effort += $details['effort'];
+ }
+ $effort = null;
+ }
+ // }
+?>
+
+<?php
+ if ($user->perms('view_estimated_effort')) {
+ echo Filters::noXSS(L('opentasks')); ?> - <?php echo Filters::noXSS(L('totalestimatedeffort')); ?>: <?php echo effort::SecondsToString($total_estimated, $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);
+} ?>
+
+<?php
+ if ($user->perms('view_current_effort_done')) {
+ echo Filters::noXSS(L('opentasks')); ?> - <?php echo Filters::noXSS(L('currenteffortdone')); ?>: <?php echo effort::SecondsToString($actual_effort, $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']);
+} ?>
+<?php } ?>
+
+<?php if(count($milestone['open_tasks'])): ?>
+
+<?php foreach($milestone['open_tasks'] as $task):
+ if(!$user->can_view_task($task)) continue; ?>
+FS#<?php echo Filters::noXSS($task['task_id']); ?> - <?php echo Filters::noXSS($task['item_summary']); ?>
+
+
+<?php endforeach; ?>
+
+<?php endif; ?>
+
+<?php endforeach; ?>
diff --git a/themes/CleanFS/templates/roadmap.tpl b/themes/CleanFS/templates/roadmap.tpl
new file mode 100644
index 0000000..2ec8a48
--- /dev/null
+++ b/themes/CleanFS/templates/roadmap.tpl
@@ -0,0 +1,116 @@
+<script type="text/javascript">
+
+function hideAll(allTasks)
+{
+ for (i = 0; i < allTasks.length; i++) {
+ if (!allTasks[i]) continue;
+ hidestuff('dd'+ allTasks[i]);
+ hidestuff('hide'+ allTasks[i]);
+ showstuff('expand'+ allTasks[i], 'inline');
+ }
+}
+
+function showAll(allTasks)
+{
+ for (i = 0; i < allTasks.length; i++) {
+ if (!allTasks[i]) continue;
+ showstuff('dd'+ allTasks[i]);
+ hidestuff('expand'+ allTasks[i]);
+ showstuff('hide'+ allTasks[i], 'inline');
+ }
+}
+</script>
+
+<?php foreach($data as $milestone): ?>
+
+<script type="text/javascript">
+allTasks<?php echo Filters::noXSS($milestone['id']); ?> = [<?php foreach($milestone['open_tasks'] as $task): echo $task['task_id'] . ','; endforeach; ?>];
+</script>
+
+<div class="box roadmap">
+<h3><?php echo Filters::noXSS(L('roadmapfor')); ?> <?php echo Filters::noXSS($milestone['name']); ?>
+
+ <?php if (count($milestone['open_tasks'])): ?>
+ <small class="DoNotPrint">
+ <a href="javascript:showAll(allTasks<?php echo Filters::noXSS($milestone['id']); ?>)"><?php echo Filters::noXSS(L('expandall')); ?></a> |
+ <a href="javascript:hideAll(allTasks<?php echo Filters::noXSS($milestone['id']); ?>)"><?php echo Filters::noXSS(L('collapseall')); ?></a>
+ </small>
+ <?php endif; ?>
+</h3>
+<div class="progress_bar_container" style="width: 250px;">
+ <span><?php echo Filters::noXSS($milestone['percent_complete']); ?>%</span>
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($milestone['percent_complete']); ?>%"></div>
+</div>
+<p style="margin-top: 5px;"><?php echo Filters::noXSS($milestone['percent_complete']); ?><?php echo Filters::noXSS(L('of')); ?>
+
+ <a href="<?php echo Filters::noXSS($baseurl); ?>index.php?do=index&amp;tasks=&amp;project=<?php echo Filters::noXSS($proj->id); ?>&amp;due=<?php echo Filters::noXSS($milestone['id']); ?>&amp;status[]=">
+ <?php echo Filters::noXSS(count($milestone['all_tasks'])); ?> <?php echo Filters::noXSS(L('tasks')); ?>
+
+ </a> <?php echo Filters::noXSS(L('completed')); ?>
+
+ <?php if(count($milestone['open_tasks'])): ?>
+ <a href="<?php echo Filters::noXSS($baseurl); ?>index.php?do=index&amp;tasks=&amp;project=<?php echo Filters::noXSS($proj->id); ?>&amp;due=<?php echo Filters::noXSS($milestone['id']); ?>"><?php echo Filters::noXSS(count($milestone['open_tasks'])); ?> <?php echo Filters::noXSS(L('opentasks')); ?>:</a>
+ <?php endif; ?>
+ <?php
+ if ($proj->prefs['use_effort_tracking']) {
+ $total_estimated = 0;
+ $actual_effort = 0;
+
+ foreach($milestone['open_tasks'] as $task) {
+ $total_estimated += $task['estimated_effort'];
+ $effort = new effort($task['task_id'],0);
+ $effort->populateDetails();
+
+ foreach($effort->details as $details) {
+ $actual_effort += $details['effort'];
+ }
+ $effort = null;
+ }
+ // }
+ ?>
+ <br />
+ <?php
+ if ($user->perms('view_estimated_effort')) {
+ echo Filters::noXSS(L('opentasks')); ?> - <?php echo Filters::noXSS(L('totalestimatedeffort')); ?>: <?php echo effort::SecondsToString($total_estimated, $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']);
+ } ?>
+ <br />
+ <?php
+ if ($user->perms('view_current_effort_done')) {
+ echo Filters::noXSS(L('opentasks')); ?> - <?php echo Filters::noXSS(L('currenteffortdone')); ?>: <?php echo effort::SecondsToString($actual_effort, $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']);
+ } ?>
+ <?php }
+ ?>
+</p>
+
+<?php if(count($milestone['open_tasks'])): ?>
+<dl class="roadmap">
+ <?php foreach($milestone['open_tasks'] as $task): ?>
+ <dt class="severity<?php echo Filters::noXSS($task['task_severity']); ?>">
+ <i class="fa typ<?php echo $task['task_type']; ?>"></i>
+ <?php echo tpl_tasklink($task['task_id']); ?>
+
+ <small class="DoNotPrint">
+ <a id="expand<?php echo Filters::noXSS($task['task_id']); ?>" href="javascript:showstuff('dd<?php echo Filters::noXSS($task['task_id']); ?>');hidestuff('expand<?php echo Filters::noXSS($task['task_id']); ?>');showstuff('hide<?php echo Filters::noXSS($task['task_id']); ?>', 'inline')"><?php echo Filters::noXSS(L('expand')); ?></a>
+ <a class="hide" id="hide<?php echo Filters::noXSS($task['task_id']); ?>" href="javascript:hidestuff('dd<?php echo Filters::noXSS($task['task_id']); ?>');hidestuff('hide<?php echo Filters::noXSS($task['task_id']); ?>');showstuff('expand<?php echo Filters::noXSS($task['task_id']); ?>', 'inline')"><?php echo Filters::noXSS(L('collapse')); ?></a>
+ </small>
+ </dt>
+ <dd id="dd<?php echo Filters::noXSS($task['task_id']); ?>" style="display: none;">
+ <?php echo TextFormatter::render($task['detailed_desc'], 'rota', $task['task_id'], $task['content']); ?>
+
+ <br style="position:absolute;" />
+ </dd>
+ <?php endforeach; ?>
+</dl>
+
+<?php endif; ?>
+</div>
+<?php endforeach; ?>
+
+<?php if (!count($data)): ?>
+<div class="box roadmap">
+<p><em><?php echo Filters::noXSS(L('noroadmap')); ?></em></p>
+</div>
+<?php else: ?>
+<p><a href="<?php echo Filters::noXSS(CreateURL('roadmap', $proj->id, null, array('txt' => 'true'))); ?>">
+<!--<img src="<?php echo Filters::noXSS($this->get_image('mime/text')); ?>" alt="" />--> <?php echo Filters::noXSS(L('textversion')); ?></a></p>
+<?php endif; ?>
diff --git a/themes/CleanFS/templates/shortcuts.tpl b/themes/CleanFS/templates/shortcuts.tpl
new file mode 100644
index 0000000..b6905a4
--- /dev/null
+++ b/themes/CleanFS/templates/shortcuts.tpl
@@ -0,0 +1,31 @@
+<input type="checkbox" id="s_shortcuts" />
+<label for="s_shortcuts" id="shortcutlabel"><i class="fa fa-keyboard-o"></i> <?php echo Filters::noXSS(L('keyboardshortcuts')); ?></label>
+<label for="s_shortcuts" id="shortcutsmodal"></label>
+<div id="shortcuts">
+<label for="s_shortcuts" id="shortcutclose"><i class="fa fa-close fa-2x"></i></label>
+<h3><?php echo Filters::noXSS(L('availablekeybshortcuts')); ?></h3>
+<h4></h4>
+<ul>
+<li><kbd>SHIFT+ALT+l</kbd> <?php echo Filters::noXSS(L('logindialoglogout')); ?></li>
+<li><kbd>SHIFT+ALT+a</kbd> <?php echo Filters::noXSS(L('addnewtask')); ?></li>
+<li><kbd>SHIFT+ALT+m</kbd> <?php echo Filters::noXSS(L('mysearch')); ?></li>
+<li><kbd>SHIFT+ALT+t</kbd> <?php echo Filters::noXSS(L('focustaskidsearch')); ?></li>
+</ul>
+<h4><?php echo Filters::noXSS(L('tasklist')); ?></h4>
+<ul>
+<li><kbd>o</kbd> <?php echo Filters::noXSS(L('openselectedtask')); ?></li>
+<li><kbd>j</kbd> <?php echo Filters::noXSS(L('movecursordown')); ?></li>
+<li><kbd>k</kbd> <?php echo Filters::noXSS(L('movecursorup')); ?></li>
+</ul>
+<h4><?php echo Filters::noXSS(L('taskdetails')); ?></h4>
+<ul>
+<li><kbd>n</kbd> <?php echo Filters::noXSS(L('nexttask')); ?></li>
+<li><kbd>p</kbd> <?php echo Filters::noXSS(L('previoustask')); ?></li>
+<li><kbd>SHIFT+ALT+e</kbd> <kbd>ENTER</kbd> <?php echo Filters::noXSS(L('edittask')); ?></li>
+<li><kbd>SHIFT+ALT+y</kbd> <?php echo Filters::noXSS(L('closetask')); ?></li>
+</ul>
+<h4><?php echo Filters::noXSS(L('taskediting')); ?></h4>
+<ul>
+<li><kbd>SHIFT+ALT+s</kbd> <?php echo Filters::noXSS(L('savetask')); ?></li>
+</ul>
+</div>
diff --git a/themes/CleanFS/templates/toplevel.tpl b/themes/CleanFS/templates/toplevel.tpl
new file mode 100644
index 0000000..78766d6
--- /dev/null
+++ b/themes/CleanFS/templates/toplevel.tpl
@@ -0,0 +1,169 @@
+<?php $project_count = count($projects);
+
+/* If user has no projects, just redirect them to the index page of All Projects */
+if (!$project_count): ?>
+ <meta http-equiv="Refresh" content="0;url=/index.php?project=0&do=index" />
+<?php endif; ?>
+<style type="text/css">
+.activity::after {
+content: "\25B4";
+position: absolute;
+right: -3px;
+bottom:-5px;
+text-align: right;
+color:#c00;
+}
+.activity img{
+padding-right:1px;
+background-color:#c00;
+}
+.activity {
+display: block;
+position: relative;
+width: 160px;
+}
+#s_inactive {display:none;}
+#s_inactive ~ .box {display: none;}
+#s_inactive:checked ~ .box {display: inline-block;}
+</style>
+<?php
+# $projects are now sorted active first, then inactive
+$lastprojectactive=1;
+foreach ($projects as $project): ?>
+ <?php if( count($projects)>1 && $lastprojectactive==1 && $project['project_is_active']==0) : ?>
+ <div style="clear:both;padding-top:20px;border-bottom:1px solid #999;"></div>
+ <input type="checkbox" id="s_inactive" />
+ <label class="button" style="display:block;width:100px;" for="s_inactive"><?php echo Filters::noXSS(L('showinactive')); ?></label>
+ <?php endif; ?>
+ <?php $lastprojectactive=$project['project_is_active']; ?>
+
+<div class="box<?php if ($project_count == 1) echo ' single-project' ?>">
+<h2><a href="<?php echo Filters::noXSS(CreateUrl('project', $project['project_id'])); ?>"><?php echo Filters::noXSS($project['project_title']); ?></a></h2>
+
+<table class="toplevel">
+<?php if($user->can_view_project($project['project_id'])): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('viewtasks')); ?></th>
+ <td>
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('status[]'=>'')); ?>"><?php echo Filters::noXSS(L('All')); ?></a> -
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('status[]'=>'open')); ?>"><?php echo Filters::noXSS(L('open')); ?></a> -
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('openedfrom'=>'-1 week')); ?>"><?php echo Filters::noXSS(L('recentlyopened')); ?></a>
+ <?php if (!$user->isAnon()): ?>
+ <br />
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('dev'=>$user->id, 'devsm'=>'userid')); ?>"><?php echo Filters::noXSS(L('assignedtome')); ?></a> -
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('only_watched'=>1)); ?>"><?php echo Filters::noXSS(L('taskswatched')); ?></a> -
+ <a href="<?php echo CreateURL('tasklist', $project['project_id'], null, array('opened'=>$user->id, 'openedsm'=>'userid')); ?>"><?php echo Filters::noXSS(L('tasksireported')); ?></a>
+ <?php endif; ?>
+ </td>
+
+ <?php if ($project_count == 1 and isset($most_wanted[$project['project_id']])): ?>
+ <td rowspan="4">
+ <strong><?php echo Filters::noXSS(L('mostwanted')); ?></strong>
+ <ul>
+ <?php foreach($most_wanted[$project['project_id']] as $task): ?>
+ <li><?php echo tpl_tasklink($task['task_id']); ?>, <?php echo Filters::noXSS($task['num_votes']); ?> <?php echo ($task['num_votes']==1) ? Filters::noXSS(L('vote')) : Filters::noXSS(L('votes')); ?></li>
+ <?php endforeach; ?>
+ </ul>
+ </td>
+ <?php endif; ?>
+ <?php if ($project_count == 1 and isset($assigned_to_myself[$project['project_id']])): ?>
+ <td rowspan="4">
+ <strong><?php echo Filters::noXSS(L('assignedtome')); ?></strong>
+ <ul>
+ <?php foreach($assigned_to_myself[$project['project_id']] as $task): ?>
+ <li><?php echo tpl_tasklink($task['task_id']); ?></li>
+ <?php endforeach; ?>
+ </ul>
+ </td>
+ <?php endif; ?>
+ </tr>
+<?php endif; ?>
+<?php
+# lets say if someone can view normal tasks of a project, then activity graphs are allowed.
+if($user->can_view_project($project['project_id']) ) : ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('activity')); ?></th>
+ <td><span class="activity" title="red line=today"><img width="160px" height="25px" src="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?line=0066CC&amp;do=activity&amp;project_id=<?php echo Filters::noXSS($project['project_id']); ?>&amp;graph=project"/></span></td>
+ </tr>
+ <?php if (!$user->isAnon()): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('myactivity')); ?></th>
+ <td><span class="activity" title="red line=today"><img width="160px" height="25px" src="<?php echo Filters::noXSS($_SERVER['SCRIPT_NAME']); ?>?line=0066CC&amp;do=activity&amp;user_id=<?php echo Filters::noXSS($user->id); ?>&amp;project_id=<?php echo Filters::noXSS($project['project_id']); ?>&amp;graph=user"/></span></td>
+ </tr>
+ <?php endif; ?>
+<?php endif; ?>
+<?php if($projprefs[$project['project_id']]['others_viewroadmap'] || ($user->perms('view_roadmap', $project['project_id'])) ) : ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('stats')); ?></th>
+ <td><?php echo Filters::noXSS($stats[$project['project_id']]['open']); ?> <?php echo Filters::noXSS(L('opentasks')); ?>, <?php echo Filters::noXSS($stats[$project['project_id']]['all']); ?> <?php echo Filters::noXSS(L('totaltasks')); ?>.</td>
+ </tr>
+ <tr>
+ <th><?php echo Filters::noXSS(L('progress')); ?></th>
+ <td>
+ <?php echo Filters::noXSS($stats[$project['project_id']]['average_done']); ?>% <?php echo Filters::noXSS(L('done')); ?>
+
+ <?php $progressbar_value = $stats[$project['project_id']]['average_done']; ?>
+
+ <div class="progress_bar_container">
+ <span><?php echo Filters::noXSS($stats[$project['project_id']]['average_done']); ?>%</span>
+ <div class="progress_bar" style="width:<?php echo Filters::noXSS($stats[$project['project_id']]['average_done']); ?>%"></div>
+ </div>
+ </td>
+ </tr>
+<?php endif; ?>
+<?php
+ if($projprefs[$project['project_id']]['use_effort_tracking']) :
+ $total_estimated = 0;
+ $actual_effort = 0;
+
+ if(isset($stats[$project['project_id']]['tasks'])) :
+ foreach($stats[$project['project_id']]['tasks'] as $task) {
+ $total_estimated += $task['estimated_effort'];
+ $effort = new effort($task['task_id'],0);
+ $effort->populateDetails();
+
+ foreach($effort->details as $details) {
+ $actual_effort += $details['effort'];
+ }
+ $effort = null;
+ }
+ endif;
+
+ if ($user->perms('view_estimated_effort', $project['project_id'])) : ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('estimatedeffortopen')); ?></th>
+ <td><?php echo effort::SecondsToString($total_estimated, $proj->prefs['hours_per_manday'], $proj->prefs['estimated_effort_format']); ?></td>
+ </tr>
+ <?php endif; ?>
+ <?php if ($user->perms('view_current_effort_done', $project['project_id'])) : ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('currenteffortdoneopen')); ?></th>
+ <td><?php echo effort::SecondsToString($actual_effort, $proj->prefs['hours_per_manday'], $proj->prefs['current_effort_done_format']); ?></td>
+ </tr>
+ <?php endif; ?>
+ <?php endif; ?>
+<?php if($projprefs[$project['project_id']]['others_view']==1): ?>
+ <tr>
+ <th><?php echo Filters::noXSS(L('feeds')); ?></th>
+ <td>
+ <b><?php echo Filters::noXSS(L('rss')); ?> 1.0</b> <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss1&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('opened')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss1&amp;topic=edit&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('edited')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss1&amp;topic=clo&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('closed')); ?></a>
+ <br />
+ <b><?php echo Filters::noXSS(L('rss')); ?> 2.0</b> <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss2&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('opened')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss2&amp;topic=edit&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('edited')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=rss2&amp;topic=clo&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('closed')); ?></a>
+ <br />
+ <b><?php echo Filters::noXSS(L('atom')); ?></b> <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=atom&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('opened')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=atom&amp;topic=edit&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('edited')); ?></a> -
+ <a href="<?php echo Filters::noXSS($baseurl); ?>feed.php?feed_type=atom&amp;topic=clo&amp;project=<?php echo Filters::noXSS($project['project_id']); ?>"><?php echo Filters::noXSS(L('closed')); ?></a>
+ </td>
+ </tr>
+<?php endif; ?>
+</table>
+</div>
+<?php
+endforeach;
+?>
+
+<div class="clear"></div>