Initial commit: Kimai TMS

Kimai time management system (PHP 5.6 / MySQL) with custom extensions:
- Budget tracking (ki_budget)
- Change request form (ki_changerequest)
- Invoice generation (ki_invoice)
- Expense tracking (ki_expenses)
- Flexi time (ki_flexitime)
- Export, admin panel, timesheets, tasks, summary

Database: ~900K time entries, 2,000+ users, 439 projects.
Config: includes/autoconf.php — localhost/kimai/kimai
This commit is contained in:
TMS
2026-06-18 21:20:26 +00:00
commit eb299c9131
1099 changed files with 359817 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
{literal}
<script type="text/javascript" charset="utf-8">
$(function()
{
$('.date-pick').datepicker(
{dateFormat:'mm/dd/yy',
onSelect: function(dateText, instance) {
if (this == $('#pick_in')[0]) {
setTimespace(new Date(dateText),undefined);
}
if (this == $('#pick_out')[0]) {
setTimespace(undefined,new Date(dateText));
}
}
});
setTimespaceStart(new Date({/literal}{$timespace_in*1000}{literal}));
setTimespaceEnd(new Date({/literal}{$timespace_out*1000}{literal}));
updateTimespaceWarning();
});
</script>
{/literal}
<div id="dates">
<input type="hidden" id="pick_in" class="date-pick"/>
<a href="#" id="ts_in" onClick="$('#pick_in').datepicker('show');return false"></a> -
<input type="hidden" id="pick_out" class="date-pick"/>
<a href="#" id="ts_out" onClick="$('#pick_out').datepicker('show');return false"></a>
</div>
<div id="infos">
<span id="n_date"></span> &nbsp;
<img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/g3_display_smallclock.png" width="13" height="13" alt="Display Smallclock" />
<span id="n_uhr">00:00</span> &nbsp;
<img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/g3_display_eye.png" width="15" height="12" alt="Display Eye" />
<strong id="display_total">{$total}</strong>
</div>

356
templates/core/main.tpl Normal file
View File

@@ -0,0 +1,356 @@
<!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" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="robots" value="noindex,nofollow" />
<title>{$kga.usr.usr_name|escape:'html'} - Kimai</title>
<!-- Default Stylesheets -->
<link rel="stylesheet" href="../skins/{$kga.conf.skin|escape:'html'}/styles.css" type="text/css" media="screen" title="no title" charset="utf-8" />
<link rel="stylesheet" type="text/css" href="../skins/{$kga.conf.skin|escape:'html'}/jquery.jqplot.css" />
<!-- /Default Stylesheets -->
<!-- Extension Stylesheets -->
{foreach from=$css_extension_files item="object"}
<link rel="stylesheet" href="{$object|escape:'html'}" type="text/css" media="screen" title="no title" charset="utf-8" />
{/foreach}
<!-- /Extension Stylesheets -->
<!-- Libs -->
<script src="../libraries/jQuery/jquery-1.4.2.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery.hoverIntent.minified.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery.form.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery.newsticker.pack.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery.cookie.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery.selectboxes.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../libraries/jQuery/jquery-ui-1.8.5.custom.min.js" type="text/javascript" charset="utf-8"></script>
<!--[if IE]><script src="../libraries/jQuery/excanvas.js" type="text/javascript"></script><![endif]-->
<script src="../libraries/jQuery/jquery.jqplot.min.js" type="text/javascript"></script>
<script src="../libraries/jQuery/jqplot.pieRenderer.min.js" type="text/javascript" ></script>
<script src="../libraries/phpjs/strftime.min.js" type="text/javascript" ></script>
<!-- /Libs -->
<!-- Default JavaScripts -->
<script src="../js/main.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/init.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/func.js" type="text/javascript" charset="utf-8"></script>
<!-- /Default JavaScripts -->
<!-- Extension JavaScripts -->
{foreach from=$js_extension_files item="object"}
<script src="{$object|escape:'html'}" type="text/javascript" charset="utf-8"></script>
{/foreach}
<!-- /Extension JavaScripts -->
<script type="text/javascript">
var skin ="{$kga.conf.skin|escape:'html'}";
var lang_checkUsername = "{$kga.lang.checkUsername}";
var lang_checkGroupname = "{$kga.lang.checkGroupname}";
var lang_passwordsDontMatch = "{$kga.lang.passwordsDontMatch}";
var lang_passwordTooShort = "{$kga.lang.passwordTooShort}";
var recstate = {$recstate};
{if $kga.conf.quickdelete == 2}
var confirmText = "{$kga.lang.sure}";
{else}
var confirmText = undefined;
{/if}
{if (isset($kga.usr))}
var usr_ID = {$kga.usr.usr_ID};
{else}
var usr_ID = null;
{/if}
{if ($kga.conf.noFading)}
fading_enabled = false;
{/if}
var timeoutTicktack = 0;
var hour = {$current_timer_hour};
var min = {$current_timer_min};
var sec = {$current_timer_sec};
var startsec = {$current_timer_start};
var now = {$current_time};
var offset = Math.floor(((new Date()).getTime())/1000)-now;
var default_title = "{$kga.usr.usr_name|escape:'html'} - Kimai";
var revision = {$kga.revision};
var timespaceDateFormat = "{$kga.date_format.2|escape:'html'}";
var selected_knd = '{$knd_data.knd_ID}';
var selected_pct = '{$pct_data.pct_ID}';
var selected_evt = '{$evt_data.evt_ID}';
var pickerClicked = '';
var weekdayNames = {$weekdays_short_array};
$.datepicker.setDefaults(
{literal}{{/literal} showOtherMonths :true,
selectOtherMonths : true,
nextText: '',
prevText: '',
{if ($kga.conf.noFading)}
showAnim: '',
{/if}
dateFormat : 'dd.mm.yy', // TODO use correct format depending on admin panel setting
dayNames: {$weekdays_array},
dayNamesMin:{$weekdays_short_array},
dayNamesShort: {$weekdays_short_array},
monthNames: {$months_array},
monthNamesShort: {$months_short_array},
firstDay:1 //TODO should also be depending on user setting
{literal}}{/literal}
);
// HOOKS
{literal}function hook_tss(){{/literal}{$hook_tss}{literal}}{/literal}
{literal}function hook_bzzRec(){{/literal}{$hook_bzzRec}{literal}}{/literal}
{literal}function hook_bzzStp(){{/literal}{$hook_bzzStp}{literal}}{/literal}
{literal}function hook_chgUsr(){lists_reload("usr");{/literal}{$hook_chgUsr}{literal}}{/literal}
{literal}function hook_chgKnd(){lists_reload("knd");lists_reload("pct");{/literal}{$hook_chgKnd}{literal}}{/literal}
{literal}function hook_chgPct(){lists_reload("pct");{/literal}{$hook_chgPct}{literal}}{/literal}
{literal}function hook_chgEvt(){lists_reload("evt");{/literal}{$hook_chgEvt}{literal}}{/literal}
{literal}function hook_filter(){{/literal}{$hook_filter}{literal}}{/literal}
{literal}function hook_resize(){{/literal}{$hook_resize}{literal}}{/literal}
{literal}function kill_reg_timeouts(){{/literal}{$timeoutlist}{literal}}{/literal}
{literal}function kimai_onload() {
$('#extShrink').hover(lists_extShrinkShow,lists_extShrinkHide);
$('#extShrink').click(lists_shrinkExtToggle);
$('#kndShrink').hover(lists_kndShrinkShow,lists_kndShrinkHide);
$('#kndShrink').click(lists_shrinkKndToggle);
{/literal}{if !$kga.usr || $kga.usr.usr_sts < 2}
$('#usrShrink').hover(lists_usrShrinkShow,lists_usrShrinkHide);
$('#usrShrink').click(lists_shrinkUsrToggle);
{else}
$('#usrShrink').hide();
{/if}
{if $kga.conf.user_list_hidden || $kga.usr.usr_sts == 2}
lists_shrinkUsrToggle();
{/if}
{literal}
$('#pct>table>tbody>tr>td>a.preselect#ps'+selected_pct+'>img').attr('src','../skins/'+skin+'/grfx/preselect_on.png');
$('#evt>table>tbody>tr>td>a.preselect#ps'+selected_evt+'>img').attr('src','../skins/'+skin+'/grfx/preselect_on.png');
$('#floater').draggable({
zIndex:20,
ghosting:false,
opacity:0.7,
cursor:'move',
handle: '#floater_handle'
});
$('#n_date').html(weekdayNames[Jetzt.getDay()] + " " +strftime(timespaceDateFormat,new Date()));
// give browser time to render page. afterwards make sure lists are resized correctly
setTimeout(lists_resize,500);
clearTimeout(lists_resize);
if ($('#row_evt'+selected_evt).length == 0) {
$('#buzzer').addClass('disabled');
}
resize_menu();
{/literal}{if $showInstallWarning}
floaterShow("floaters.php","securityWarning","installer",0,450,200);
{/if}{literal}
}{/literal}
</script>
<link href="../favicon.ico" rel="shortcut icon" />
</head>
<body onload="kimai_onload();">
<div id="top">
<div id="logo">
<img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/g3_logo.png" width="151" height="52" alt="Logo" />
</div>
<div id="menu">
<a id="main_logout_button" href="../index.php?a=logout"><img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/g3_menu_logout.png" width="36" height="27" alt="Logout" /></a>
<a id="main_tools_button" href="#" ><img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/g3_menu_dropdown.png" width="44" height="27" alt="Menu Dropdown" /></a>
<br/>{$kga.lang.logged_in_as} <b>{$kga.usr.usr_name|escape:'html'}</b>
</div>
<div id="main_tools_menu">
<div class="slider">
<a href="#" id="main_credits_button">{$kga.lang.about} Kimai</a> |
<a href="#" id="main_prefs_button">{$kga.lang.preferences}</a> |
<a href="#" id="main_print_timesheet_button">{$kga.lang.printtimesheet}</a>
</div>
<div class="end"></div>
</div>
<div id="display">
{include file="core/display.tpl"}
</div>
{if $kga.usr}
<div id="selector">
{include file="core/selector.tpl"}
</div>
<div id="stopwatch">
<span class="watch"><span id="h">00</span>:<span id="m">00</span>:<span id="s">00</span></span>
</div>
<div id="stopwatch_edit_comment">
<a href="#" onclick="edit_running_comment();$(this).blur();return false;"><img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/blase.gif"/></a>
</div>
<div id="stopwatch_ticker">
<ul id="ticker"><li id="ticker_knd">&nbsp;</li><li id="ticker_pct">&nbsp;</li><li id="ticker_evt">&nbsp;</li></ul>
</div>
<div id="buzzer" class="disabled">
<div>&nbsp;</div>
</div>
{/if}
</div>
<div id="fliptabs" class="menuBackground">
<ul class="menu">
<li class="tab act" id="exttab_0">
<a href="javascript:void(0);" onclick="changeTab(0,'ki_timesheets/init.php'); ts_ext_triggerchange();">
<span class="aa">&nbsp;</span>
<span class="bb">
{if isset($kga.lang.extensions.ki_timesheet)}
{$kga.lang.extensions.ki_timesheet}
{else}
Timesheet
{/if}</span>
<span class="cc">&nbsp;</span>
</a>
</li>
{foreach name="tabloop" from=$extensions item="object"}
{if $object.EXTENSION_NAME AND $object.EXTENSION_KEY != "ki_timesheet"}
<li class="tab norm" id="exttab_{$smarty.foreach.tabloop.iteration}">
<a href="javascript:void(0);" onclick="changeTab({$smarty.foreach.tabloop.iteration}, '{$object.EXTENSION_INIT_FILE}'); {$object.TAB_CHANGE_TRIGGER};">
<span class="aa">&nbsp;</span>
<span class="bb">
{if isset($kga.lang.extensions[$object.EXTENSION_KEY])}
{$kga.lang.extensions[$object.EXTENSION_KEY]}
{else}
{$object.EXTENSION_NAME|escape:'html'}
{/if}</span>
<span class="cc">&nbsp;</span>
</a>
</li>
{/if}
{/foreach}
</ul>
</div>
<div id="gui">
<div id="extdiv_0" class="ext ki_timesheet"></div>
{foreach name="extensionloop" from=$extensions item="object"}
{if $object.EXTENSION_KEY != "ki_timesheet"}
<div id="extdiv_{$smarty.foreach.extensionloop.iteration}" class="ext {$object.EXTENSION_KEY}" style="display:none;"></div>
{/if}
{/foreach}
</div>
<div class="lists" style="display:none">
<div id="usr_head">
<input class="livefilterfield" onkeyup="lists_live_filter('usr', this.value);" type="text" id="filt_usr" name="filt_usr"/>
{$kga.lang.users}
</div>
<div id="knd_head">
<input class="livefilterfield" onkeyup="lists_live_filter('knd', this.value);" type="text" id="filt_knd" name="filt_knd"/>
{$kga.lang.knds}
</div>
<div id="pct_head">
<input class="livefilterfield" onkeyup="lists_live_filter('pct', this.value);" type="text" id="filt_pct" name="filt_pct"/>
{$kga.lang.pcts}
</div>
<div id="evt_head">
<input class="livefilterfield" onkeyup="lists_live_filter('evt', this.value);" type="text" id="filt_evt" name="filt_evt"/>
{$kga.lang.evts}
</div>
<div id="usr">{$usr_display}</div>
<div id="knd">{$knd_display}</div>
<div id="pct">{$pct_display}</div>
<div id="evt">{$evt_display}</div>
<div id="usr_foot">
<a href="#" class="selectAllLink" onClick="lists_filter_select_all('usr'); $(this).blur(); return false;"></a>
<a href="#" class="deselectAllLink" onClick="lists_filter_deselect_all('usr'); $(this).blur(); return false;"></a>
<a href="#" class="selectInvertLink" onClick="lists_filter_select_invert('usr'); $(this).blur(); return false;"></a>
<div style="clear:both"></div>
</div>
<div id="knd_foot">
{if $kga.usr && $kga.usr.usr_sts != 2 }
<a href="#" class="addLink" onClick="floaterShow('floaters.php','add_edit_knd',0,0,450,200); $(this).blur(); return false;"></a>
{/if}
<a href="#" class="selectAllLink" onClick="lists_filter_select_all('knd'); $(this).blur(); return false;"></a>
<a href="#" class="deselectAllLink" onClick="lists_filter_deselect_all('knd'); $(this).blur(); return false;"></a>
<a href="#" class="selectInvertLink" onClick="lists_filter_select_invert('knd'); $(this).blur(); return false;"></a>
<div style="clear:both"></div>
</div>
<div id="pct_foot">
{if $kga.usr && $kga.usr.usr_sts != 2 }
<a href="#" class="addLink" onClick="floaterShow('floaters.php','add_edit_pct',0,0,450,200); $(this).blur(); return false;"></a>
{/if}
<a href="#" class="selectAllLink" onClick="lists_filter_select_all('pct'); $(this).blur(); return false;"></a>
<a href="#" class="deselectAllLink" onClick="lists_filter_deselect_all('pct'); $(this).blur(); return false;"></a>
<a href="#" class="selectInvertLink" onClick="lists_filter_select_invert('pct'); $(this).blur(); return false;"></a>
<div style="clear:both"></div>
</div>
<div id="evt_foot">
{if $kga.usr && $kga.usr.usr_sts != 2 }
<a href="#" class="addLink" onClick="floaterShow('floaters.php','add_edit_evt',0,0,450,200); $(this).blur(); return false;"></a>
{/if}
<a href="#" class="selectAllLink" onClick="lists_filter_select_all('evt'); $(this).blur(); return false;"></a>
<a href="#" class="deselectAllLink" onClick="lists_filter_deselect_all('evt'); $(this).blur(); return false;"></a>
<a href="#" class="selectInvertLink" onClick="lists_filter_select_invert('evt'); $(this).blur(); return false;"></a>
<div style="clear:both"></div>
</div>
<div id="extShrink">&nbsp;</div>
<div id="usrShrink">&nbsp;</div>
<div id="kndShrink">&nbsp;</div>
</div>
<div id="loader">&nbsp;</div>
<div id="floater">floater</div>
</body>
</html>

View File

@@ -0,0 +1,8 @@
<div class="preselection">
<strong>{$kga.lang.selectR}</strong><br />
<strong class="short">{$kga.lang.selectKND}</strong><span class="selection" id="sel_knd">{$knd_data.knd_name|escape:'html'}</span><br/>
<strong class="short">{$kga.lang.selectPCT}</strong><span class="selection" id="sel_pct">{$pct_data.pct_name|escape:'html'}</span><br/>
<strong class="short">{$kga.lang.selectEVT}</strong><span class="selection" id="sel_evt">{$evt_data.evt_name|escape:'html'}</span><br/>
</div>

View File

@@ -0,0 +1,142 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#add_edit_evt').ajaxForm(function() {
if ($('#evt_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgEvt();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.evt}{else}{$kga.lang.new_evt}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#projects">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.pcts}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="add_edit_evt" action="processor.php" method="post">
<input name="evt_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="evt" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="evt_name" >{$kga.lang.evt}:</label>
<input type="text" name="evt_name" id="focus" value="{$evt_name|escape:'html'}" />
</li>
<li>
<label for="evt_default_rate" >{$kga.lang.default_rate}:</label>
<input type="text" name="evt_default_rate" value="{$evt_default_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="evt_my_rate" >{$kga.lang.my_rate}:</label>
<input type="text" name="evt_my_rate" id="focus" value="{$evt_my_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="evt_visible">{$kga.lang.visibility}:</label>
<input name="evt_visible" type="checkbox" value='1' {if $evt_visible || !$id }checked="checked"{/if} />
</li>
</ul>
</fieldset>
<fieldset id="comment">
<ul>
<li>
<label for="evt_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='evt_comment' cols='30' rows='5' >{$evt_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="evt_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id="evt_grps" name="evt_grp[]" multiple size='5' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="evt_grps" name="evt_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="projects">
<ul>
<li>
<label for="evt_pct" >{$kga.lang.pcts}:</label>
<select class="formfield" name="evt_pct[]" multiple size='5' style="width:255px">
{html_options values=$sel_pct_IDs output=$sel_pct_names selected=$pct_selection}
</select>
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}'/>
</div>
</form>
</div>

View File

@@ -0,0 +1,212 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#add_edit_knd').ajaxForm(function() {
if ($('#knd_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgKnd();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.knd}{else}{$kga.lang.new_knd}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#address">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.address}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#contact">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.contact}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="add_edit_knd" action="processor.php" method="post">
<input name="knd_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="knd" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="knd_name" >{$kga.lang.knd}:</label>
<input type="text" name="knd_name" id="focus" value="{$knd_name|escape:'html'}" />
</li>
<li>
<label for="knd_vat" >{$kga.lang.vat}:</label>
<input type="text" name="knd_vat" value="{$knd_vat|escape:'html'}" />
</li>
<li>
<label for="knd_visible">{$kga.lang.visibility}:</label>
<input name="knd_visible" type="checkbox" value='1' {if $knd_visible || !$id }checked="checked"{/if} />
</li>
<li>
<label for="knd_password">{$kga.lang.password}:</label>
<input type="password" name='knd_password' cols='30' rows='3' value=""/>
{if !$knd_password}
<br/>
<img src="../skins/{$kga.conf.skin|escape:'html'}/grfx/caution_mini.png" alt="Caution" valign=middle />
<strong style="color:red">{$kga.lang.nopassword}</strong>
{/if}
</li>
</ul>
</fieldset>
<fieldset id="comment">
<ul>
<li>
<label for="knd_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='knd_comment' cols='30' rows='3' >{$knd_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="knd_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id ="knd_grps" name="knd_grp[]" multiple size='3' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="knd_grps" name="knd_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="address">
<ul>
<li>
<label for="knd_company" >{$kga.lang.company}:</label>
<input type="text" name="knd_company" value="{$knd_company|escape:'html'}" />
</li>
<li>
<label for="knd_contact" >{$kga.lang.contactPerson}:</label>
<input type="text" name="knd_contact" value="{$knd_contact|escape:'html'}" />
</li>
<li>
<label for="knd_street" >{$kga.lang.street}:</label>
<input type="text" name="knd_street" value="{$knd_street|escape:'html'}" />
</li>
<li>
<label for="knd_zipcode" >{$kga.lang.zipcode}:</label>
<input type="text" name="knd_zipcode" value="{$knd_zipcode|escape:'html'}" />
</li>
<li>
<label for="knd_city" >{$kga.lang.city}:</label>
<input type="text" name="knd_city" value="{$knd_city|escape:'html'}" />
</li>
</ul>
</fieldset>
<fieldset id="contact">
<ul>
<li>
<label for="knd_tel" >{$kga.lang.telephon}:</label>
<input type="text" name="knd_tel" value="{$knd_tel|escape:'html'}" />
</li>
<li>
<label for="knd_fax" >{$kga.lang.fax}:</label>
<input type="text" name="knd_fax" value="{$knd_fax|escape:'html'}" />
</li>
<li>
<label for="knd_mobile" >{$kga.lang.mobilephone}:</label>
<input type="text" name="knd_mobile" value="{$knd_mobile|escape:'html'}" />
</li>
<li>
<label for="knd_mail" >{$kga.lang.mail}:</label>
<input type="text" name="knd_mail" value="{$knd_mail|escape:'html'}" />
</li>
<li>
<label for="knd_homepage" >{$kga.lang.homepage}:</label>
<input type="text" name="knd_homepage" value="{$knd_homepage|escape:'html'}" />
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</form>
</div>

View File

@@ -0,0 +1,161 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#addPct').ajaxForm(function() {
if ($('#pct_grps').val() == null) {
alert("{/literal}{$kga.lang.atLeastOneGroup}{literal}");
return;
}
floaterClose();
hook_chgPct();
hook_chgEvt();
});
$('#floater_innerwrap').tabs({ selected: 0 });
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}: {$kga.lang.pct}{else}{$kga.lang.new_pct}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
<li class="tab norm"><a href="#general">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.general}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#money">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.budget}</span>
<span class="cc">&nbsp;</span>
</a></li>
<li class="tab norm"><a href="#evts">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.evts}</span>
<span class="cc">&nbsp;</span>
</a></li>
{if $sel_grp_IDs|@count gt 1}
<li class="tab norm"><a href="#groups">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.groups}</span>
<span class="cc">&nbsp;</span>
</a></li>
{/if}
<li class="tab norm"><a href="#comment">
<span class="aa">&nbsp;</span>
<span class="bb">{$kga.lang.comment}</span>
<span class="cc">&nbsp;</span>
</a></li>
</ul>
</div>
<form id="addPct" action="processor.php" method="post">
<input name="pct_filter" type="hidden" value="0" />
<input name="axAction" type="hidden" value="add_edit_KndPctEvt" />
<input name="axValue" type="hidden" value="pct" />
<input name="id" type="hidden" value="{$id}" />
<div id="floater_tabs" class="floater_content">
<fieldset id ="general">
<ul>
<li>
<label for="pct_name" >{$kga.lang.pct}:</label>
<input type="text" name="pct_name" id="focus" value="{$pct_name|escape:'html'}" />
</li>
<li>
<label for="pct_kndID" >{$kga.lang.knd}:</label>
<select class="formfield" name="pct_kndID">
{html_options values=$sel_knd_IDs output=$sel_knd_names selected=$knd_selection}
</select>
</li>
<li>
<label for="pct_visible">{$kga.lang.visibility}:</label>
<input name="pct_visible" type="checkbox" value='1' {if $pct_visible || !$id}checked="checked"{/if} />
</li>
<li>
<label for="pct_internal" >{$kga.lang.internalProject}:</label>
<input type="checkbox" name="pct_internal" value='1' {if $pct_internal}checked="checked"{/if} />
</li>
</ul>
</fieldset>
<fieldset id ="money">
<ul>
<li>
<label for="pct_default_rate" >{$kga.lang.default_rate}:</label>
<input type="text" name="pct_default_rate" value="{$pct_default_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="pct_my_rate" >{$kga.lang.my_rate}:</label>
<input type="text" name="pct_my_rate" value="{$pct_my_rate|replace:'.':$kga.conf.decimalSeparator|escape:'html'}" />
</li>
<li>
<label for="pct_budget">{$kga.lang.budget}:</label>
<input type='text' name='pct_budget' cols='30' rows='5' value="{$pct_budget|replace:'.':$kga.conf.decimalSeparator|escape:'html'}"/>
</li>
</ul>
</fieldset>
<fieldset id="evts">
<ul>
<li>
<label for="pct_comment">{$kga.lang.evts}:</label>
<select class="formfield" name="pct_evt[]" multiple size='5' style="width:255px">
{html_options values=$sel_evt_IDs output=$sel_evt_names selected=$evt_selection}
</select>
</li>
</ul>
</fieldset>
{if $sel_grp_IDs|@count gt 1}
<fieldset id="groups">
<ul>
<li>
<label for="pct_grp" >{$kga.lang.groups}:</label>
<select class="formfield" id="pct_grps" name="pct_grp[]" multiple size='5' style="width:255px">
{html_options values=$sel_grp_IDs output=$sel_grp_names selected=$grp_selection}
</select>
</li>
</ul>
</fieldset>
{else}
<input id="pct_grps" name="pct_grp[]" type="hidden" value="{$grp_selection.0|escape:'html'}" />
{/if}
<fieldset id="comment">
<ul>
<li>
<label for="pct_comment">{$kga.lang.comment}:</label>
<textarea class='comment' name='pct_comment' cols='30' rows='5' >{$pct_comment|escape:'html'}</textarea>
</li>
</ul>
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</form>
</div>

View File

@@ -0,0 +1,17 @@
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.about} Kimai</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content">
<h2>Kimai - Open Source Time Tracking</h2>
v{$kga.version}.{$kga.revision} - &copy; {$devtimespan} by the Kimai Core-Development-Team<br />
{$kga.lang.credits}
</div>
</div>

View File

@@ -0,0 +1,142 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
var options = {
beforeSubmit: function() {
if ( ($('#password').val() != "" || $('#retypePassword').val() != "")
&& !validatePassword($('#password').val(),$('#retypePassword').val()))
return false;
window.location.reload();
}
};
$('#core_prefs').ajaxForm(options);
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.preferences}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content">
<form id="core_prefs" action="processor.php" method="post">
<fieldset>
<ul>
<li>
<label for="skin">{$kga.lang.skin}:</label>
<select name="skin">
{html_options values=$skins output=$skins selected=$kga.conf.skin}
</select>
</li>
<li>
<label for="pw">{$kga.lang.newPassword}:</label>
<input type="password" name="pw" size="9" id="password" /> {$kga.lang.minLength}
</li>
<li>
<label for="pw">{$kga.lang.retypePassword}:</label>
<input type="password" name="retypePassword" size="9" id="retypePassword" />
</li>
<li>
<label for="rate">{$kga.lang.my_rate}:</label>
<input type="text" name="rate" size="9" value="{$rate|replace:'.':$kga.conf.decimalSeparator}"/>
</li>
<li>
<label for="rowlimit">{$kga.lang.rowlimit}:</label>
<input type="text" name="rowlimit" value="{$kga.conf.rowlimit}" size="9" />
</li>
<li>
<label for="lang">{$kga.lang.lang}:</label>
<select name="lang">
{html_options values=$langs output=$langs selected=$kga.conf.lang}
</select>
</li>
<li>
<label for="timezone">{$kga.lang.timezone}:</label>
<select name="timezone">
{html_options values=$timezones output=$timezones selected=$kga.conf.timezone}
</select>
</li>
<li>
{$kga.lang.sublistAnnotations}:
<select name="sublistAnnotations">
<option value="0" {if $kga.conf.sublistAnnotations==0}selected="selected"{/if}>{$kga.lang.timelabel}</option>
<option value="1" {if $kga.conf.sublistAnnotations==1}selected="selected"{/if}>{$kga.lang.xp_ext.costs}</option>
<option value="2" {if $kga.conf.sublistAnnotations==2}selected="selected"{/if}>{$kga.lang.timelabel} &amp; {$kga.lang.xp_ext.costs}</option>
</select>
</li>
<li>
<label for="autoselection"></label>
<input type="checkbox" name="autoselection" value="1" {if $kga.conf.autoselection}checked{/if} /> {$kga.lang.autoselection}
</li>
<li>
{$kga.lang.quickdelete}:
<select name="quickdelete">
<option value="0" {if $kga.conf.quickdelete==0}selected="selected"{/if}>{$kga.lang.quickdeleteHide}</option>
<option value="1" {if $kga.conf.quickdelete==1}selected="selected"{/if}>{$kga.lang.quickdeleteShow}</option>
<option value="2" {if $kga.conf.quickdelete==2}selected="selected"{/if}>{$kga.lang.quickdeleteShowConfirm}</option>
</select>
</li>
<li>
<label for="flip_pct_display"></label>
<input type="checkbox" name="flip_pct_display" value="1" {if $kga.conf.flip_pct_display}checked{/if} /> {$kga.lang.flip_pct_display}
</li>
<li>
<label for="pct_comment_flag"></label>
<input type="checkbox" name="pct_comment_flag" value="1" {if $kga.conf.pct_comment_flag}checked{/if} /> {$kga.lang.pct_comment_flag}
</li>
<li>
<label for="showIDs"></label>
<input type="checkbox" name="showIDs" value="1" {if $kga.conf.showIDs}checked{/if} /> {$kga.lang.showIDs}
</li>
<li>
<label for="noFading"></label>
<input type="checkbox" name="noFading" value="1" {if $kga.conf.noFading}checked{/if} /> {$kga.lang.noFading}
</li>
<li>
<label for="user_list_hidden"></label>
<input type="checkbox" name="user_list_hidden" value="1" {if $kga.conf.user_list_hidden}checked{/if} /> {$kga.lang.user_list_hidden}
</li>
<li>
<label for="hideClearedEntries"></label>
<input type="checkbox" name="hideClearedEntries" value="1" {if $kga.conf.hideClearedEntries}checked{/if} /> {$kga.lang.hideClearedEntries}
</li>
</ul>
<input name="axAction" type="hidden" value="editPrefs" />
<input name="id" type="hidden" value="0" />
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' type='submit' value='{$kga.lang.submit}' />
</div>
</fieldset>
</form>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{$kga.lang.securityWarning}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
</div>
</div>
<div class="floater_content" style="padding:20px">
<h2 style="color:red">{$kga.lang.securityWarning}</h2>
<b>{$kga.lang.installerWarningHeadline}</b> <br/><br/>
{$kga.lang.installerWarningText}
</div>
</div>

View File

@@ -0,0 +1,180 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#help').hide();
var availableEndDay = 9;
var availableStartDay = 9;
var tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
var tpl_jasper_url = tpl_template[0].tpl_jasper_url;
var tpl_jasper_usr = tpl_template[0].tpl_jasper_usr;
var tpl_jasper_pwd = tpl_template[0].tpl_jasper_pwd;
availableEndDay = tpl_template[0].tpl_start_weekday;
availableStartDay = tpl_template[0].tpl_end_weekday;
function disableEndDays(date) {
var day = date.getDay();
if(availableEndDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableEndDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
function disableStartDays(date) {
var day = date.getDay();
if(availableStartDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableStartDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
$('#tpl_ID').change(function(){
var x = document.getElementById("tpl_ID").selectedIndex;
tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
for (var i = 0; i < tpl_template.length; i++){
// look for the entry with a matching `code` value
if (tpl_template[i].tpl_index == x){
// we found it
tpl_jasper_url = tpl_template[i].tpl_jasper_url;
tpl_jasper_usr = tpl_template[i].tpl_jasper_usr;
tpl_jasper_pwd = tpl_template[i].tpl_jasper_pwd;
availableEndDay = tpl_template[i].tpl_start_weekday;
availableStartDay = tpl_template[i].tpl_end_weekday;
}
}
//availableEndDay = tpl_end_weekday; // disable wednesdays
$("#select_in_day").datepicker("refresh");
});
$('#tpl_view_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
if (fromdate != '' && todate != ''){
var urlstring = 'https://tms.alteram.co.za/digital.php'.concat("?from_date=", fromdate, "&to_date=", todate, "&kimaiuserid=", user_id, "&reportid=", tpl_jasper_url);
//var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".html?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
}else{
window.alert("Please select date range!");
}
});
$('#tpl_download_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
if (fromdate != '' && todate != ''){
var urlstring = 'https://tms.alteram.co.za/manual.php'.concat("?from_date=", fromdate, "&to_date=", todate, "&kimaiuserid=", user_id, "&reportid=", tpl_jasper_url);
// var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".pdf?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
}else{
window.alert("Please select date range!");
}
});
setupDatePicker()
function setupDatePicker(){
$('#select_in_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableEndDays,
onSelect: function(dateText, instance) {
$('#select_out_day').datepicker( "option", $('#select_in_day').datepicker("getDate") );
}
});
$('#select_out_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableStartDays,
onSelect: function(dateText, instance) {
$('#select_in_day').datepicker( "option", $('#select_out_day').datepicker("getDate") );
}
});
}
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}{else}{$kga.lang.printtimesheet}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
<a href="#" class="help" onClick="$(this).blur(); $('#help').slideToggle();">{$kga.lang.help}</a>
</div>
</div>
<div id="help">
<div class="content">
{$kga.lang.dateAndTimeHelp}
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
</ul>
</div>
<form id="mn_ext_form_add_edit_record" action="../extensions/ki_timesheets/processor.php" method="post">
<input name="id" type="hidden" value="{$id}" />
<input name="axAction" type="hidden" value="add_edit_record" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="tpl_ID" >{$kga.lang.tpl}:</label>
<select class="formfield" name="tpl_ID" id="tpl_ID">
{html_options values=$sel_tpl_IDs output=$sel_tpl_names}
</select>
</li>
{* -------------------------------------------------------------------- *}
<li>
<label for="select_in_day">{$kga.lang.fromdate}:</label>
<input id='select_in_day' type='text' name='select_in_day' value='{$select_in_day|escape:'html'}' maxlength='10' size='10' tabindex='5' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
<li>
<label for="select_out_day">{$kga.lang.todate}:</label>
<input id='select_out_day' type='text' name='select_out_day' value='{$select_out_day|escape:'html'}' maxlength='10' size='10' tabindex='6' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
</ul>
</fieldset>
{* -------------------------------------------------------------------- *}
{* -------------------------------------------------------------------- *}
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' id="tpl_view_btn" type='button' value='{$kga.lang.view}'/>
<input class='btn_ok' id="tpl_download_btn" type='button' value='{$kga.lang.download}'/>
</div>
</div>
{* -------------------------------------------------------------------- *}
</form>
</div>

View File

@@ -0,0 +1,168 @@
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#help').hide();
var availableEndDay = 9;
var availableStartDay = 9;
var tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
var tpl_jasper_url = tpl_template[0].tpl_jasper_url;
var tpl_jasper_usr = tpl_template[0].tpl_jasper_usr;
var tpl_jasper_pwd = tpl_template[0].tpl_jasper_pwd;
availableEndDay = tpl_template[0].tpl_start_weekday;
availableStartDay = tpl_template[0].tpl_end_weekday;
function disableEndDays(date) {
var day = date.getDay();
if(availableEndDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableEndDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
function disableStartDays(date) {
var day = date.getDay();
if(availableStartDay < 7){
var str1 = "beforeShowDay: ";
return [(day == availableStartDay), ""];
}else{
return [(day == 0 ||day == 1 || day == 2 ||day == 3 || day == 4 ||day == 5 || day == 6), ""];
}
}
$('#tpl_ID').change(function(){
var x = document.getElementById("tpl_ID").selectedIndex;
tpl_template = {/literal}{$tpl_template|@json_encode}{literal};
for (var i = 0; i < tpl_template.length; i++){
// look for the entry with a matching `code` value
if (tpl_template[i].tpl_index == x){
// we found it
tpl_jasper_url = tpl_template[i].tpl_jasper_url;
tpl_jasper_usr = tpl_template[i].tpl_jasper_usr;
tpl_jasper_pwd = tpl_template[i].tpl_jasper_pwd;
availableEndDay = tpl_template[i].tpl_start_weekday;
availableStartDay = tpl_template[i].tpl_end_weekday;
}
}
//availableEndDay = tpl_end_weekday; // disable wednesdays
$("#select_in_day").datepicker("refresh");
});
$('#tpl_view_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".html?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
});
$('#tpl_download_btn').click(function(){
var user_id = "{/literal}{$kga.usr.usr_ID}{literal}";
var fromdate = $('#select_in_day').val();
var todate = $('#select_out_day').val();
var jasper_server_base_url = "{/literal}{$kga.lang.jasper_server_base_url}{literal}";
var urlstring = jasper_server_base_url.concat(tpl_jasper_url,".pdf?from_date=", fromdate, "&to_date=", todate, "&KimaiUserId=", user_id, "&j_username=", tpl_jasper_usr, "&j_password=", tpl_jasper_pwd);
window.open(urlstring);
});
setupDatePicker()
function setupDatePicker(){
$('#select_in_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableEndDays,
onSelect: function(dateText, instance) {
$('#select_out_day').datepicker( "option", $('#select_in_day').datepicker("getDate") );
}
});
$('#select_out_day').datepicker({
dateFormat: 'yy-mm-dd',
closeText: 'Clear',
beforeShowDay: disableStartDays,
onSelect: function(dateText, instance) {
$('#select_in_day').datepicker( "option", $('#select_out_day').datepicker("getDate") );
}
});
}
});
</script>
{/literal}
<div id="floater_innerwrap">
<div id="floater_handle">
<span id="floater_title">{if $id}{$kga.lang.edit}{else}{$kga.lang.printtimesheet}{/if}</span>
<div class="right">
<a href="#" class="close" onClick="floaterClose();">{$kga.lang.close}</a>
<a href="#" class="help" onClick="$(this).blur(); $('#help').slideToggle();">{$kga.lang.help}</a>
</div>
</div>
<div id="help">
<div class="content">
{$kga.lang.dateAndTimeHelp}
</div>
</div>
<div class="menuBackground">
<ul class="menu tabSelection">
</ul>
</div>
<form id="mn_ext_form_add_edit_record" action="../extensions/ki_timesheets/processor.php" method="post">
<input name="id" type="hidden" value="{$id}" />
<input name="axAction" type="hidden" value="add_edit_record" />
<div id="floater_tabs" class="floater_content">
<fieldset id="general">
<ul>
<li>
<label for="tpl_ID" >{$kga.lang.tpl}:</label>
<select class="formfield" name="tpl_ID" id="tpl_ID">
{html_options values=$sel_tpl_IDs output=$sel_tpl_names}
</select>
</li>
{* -------------------------------------------------------------------- *}
<li>
<label for="select_in_day">{$kga.lang.fromdate}:</label>
<input id='select_in_day' type='text' name='select_in_day' value='{$select_in_day|escape:'html'}' maxlength='10' size='10' tabindex='5' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
<li>
<label for="select_out_day">{$kga.lang.todate}:</label>
<input id='select_out_day' type='text' name='select_out_day' value='{$select_out_day|escape:'html'}' maxlength='10' size='10' tabindex='6' autocomplete="off" onChange="mn_timeToDuration();" {if $kga.conf.autoselection}onClick="this.select();"{/if} />
</li>
</ul>
</fieldset>
{* -------------------------------------------------------------------- *}
{* -------------------------------------------------------------------- *}
</fieldset>
</div>
<div id="formbuttons">
<input class='btn_norm' type='button' value='{$kga.lang.cancel}' onClick='floaterClose(); return false;' />
<input class='btn_ok' id="tpl_view_btn" type='button' value='{$kga.lang.view}'/>
<input class='btn_ok' id="tpl_download_btn" type='button' value='{$kga.lang.download}'/>
</div>
{* -------------------------------------------------------------------- *}
</form>
</div>

View File

@@ -0,0 +1,44 @@
<!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" xml:lang="en">
<head>
<link rel="SHORTCUT ICON" href="favicon.ico">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="robots" value="noindex,nofollow" />
<title>Kimai Installer</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/login.css" />
</head>
<body>
<div id='install'>
<form action="installer/install.php" method="post">
<fieldset>
<div class="installtext">
<div class="welcome">Welcome!</div>
<div class="txt">We need to set up the database first.</div>
<div class="txt">
Due to security reasons you should erase the "install.php" file after installation!
</div>
<div class="txt">
<input type="checkbox" name="accept" value=1 style="width:15px;height:15px;display:inline;">
{if $disagreedGPL}<strong style="color:red">{/if} I accept the terms of the GNU GPL Version 3{if $disagreedGPL}</strong>{/if}
{if $disagreedGPL}<br /><img src="grfx/caution_small.png" alt="Caution" /> <span style="color:red">You have to accept the the terms!</span>{/if}
</div>
</div>
<button type="submit">Install</button>
</fieldset>
</form>
{include file="misc/copyrightnotes.tpl"}
</div>
</body>
</html>

53
templates/lists/evt.tpl Normal file
View File

@@ -0,0 +1,53 @@
{cycle values="odd,even" reset=true print=false}
<table>
<tbody>
{section name=row loop=$arr_evt}
{if $arr_evt[row].evt_visible}
<tr id="row_evt{$arr_evt[row].evt_ID}" class="{cycle values="odd,even"}" >
<td nowrap class="option">
{if $kga.usr && $kga.usr.usr_sts != 2}
<a href ="#" onClick="editSubject('evt',{$arr_evt[row].evt_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/edit2.gif' width='13' height='13' alt='{$kga.lang.edit}' title='{$kga.lang.edit} (ID:{$arr_evt[row].evt_ID})' border='0' /></a>
{/if}
<a href ="#" onClick="lists_update_filter('evt',{$arr_evt[row].evt_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/filter.png' width='13' height='13' alt='{$kga.lang.filter}' title='{$kga.lang.filter}' border='0' /></a>
<a href ="#" class="preselect" onClick="buzzer_preselect('evt',{$arr_evt[row].evt_ID},'{$arr_evt[row].evt_name|replace:"'":"\\'"|escape:'html'}',0,0); return false;" id="ps{$arr_evt[row].evt_ID}"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/preselect_off.png' width='13' height='13' alt='{$kga.lang.select}' title='{$kga.lang.select} (ID:{$arr_evt[row].evt_ID})' border='0' /></a>
</td>
<td width="100%" class="events" onClick="buzzer_preselect('evt',{$arr_evt[row].evt_ID},'{$arr_evt[row].evt_name|replace:"'":"\\'"|escape:'html'}',0,0); return false;" onmouseover="lists_change_color(this,true);" onmouseout="lists_change_color(this,false);">
{if $arr_evt[row].evt_visible != 1}<span style="color:#bbb">{/if}
{if $kga.conf.showIDs == 1}<span class="ids">{$arr_evt[row].evt_ID}</span> {/if}{$arr_evt[row].evt_name|escape:'html'}
{if $arr_evt[row].evt_visible != 1}</span>{/if}
</td>
<td nowrap class="annotation">
{$arr_evt[row].zeit|escape:'html'}
</td>
</tr>
{/if}
{/section}
{if $arr_evt == '0'}
<tr>
<td colspan='3'>
<strong style="color:red">{$kga.lang.noItems}</strong>
</td>
</tr>
{/if}
</tbody>
</table>

52
templates/lists/knd.tpl Normal file
View File

@@ -0,0 +1,52 @@
{cycle values="odd,even" reset=true print=false}
<table>
<tbody>
{section name=row loop=$arr_knd}
{if $arr_knd[row].knd_visible}
<tr id="row_knd{$arr_knd[row].knd_ID}" class="knd knd{$arr_knd[row].knd_ID} {cycle values="odd,even"}">
{* --- option cell ---*}
<td nowrap class="option">
{if $kga.usr && $kga.usr.usr_sts != 2}
<a href ="#" onClick="editSubject('knd',{$arr_knd[row].knd_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/edit2.gif' width='13' height='13' alt='{$kga.lang.edit}' title='{$kga.lang.edit}' border='0' /></a>
{/if}
<a href ="#" onClick="lists_update_filter('knd',{$arr_knd[row].knd_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/filter.png' width='13' height='13' alt='{$kga.lang.filter}' title='{$kga.lang.filter}' border='0' /></a>
</td>
{* --- name cell ---*}
<td width="100%" class="clients" onmouseover="lists_change_color(this,true);" onmouseout="lists_change_color(this,false);" onClick="lists_knd_prefilter({$arr_knd[row].knd_ID},'highlight'); $(this).blur(); return false;">
{if $arr_knd[row].knd_visible != 1}<span style="color:#bbb">{/if}
{if $kga.conf.showIDs == 1}<span class="ids">{$arr_knd[row].knd_ID}</span> {/if}{$arr_knd[row].knd_name|escape:'html'}
{if $arr_knd[row].knd_visible != 1}</span>{/if}
</td>
{* --- annotation cell ---*}
<td nowrap class="annotation">
{$arr_knd[row].zeit|escape:'html'}
</td>
</tr>
{/if}
{/section}
{if $arr_knd == '0'}
<tr>
<td colspan='3'>
<strong style="color:red">{$kga.lang.noItems}</strong>
</td>
</tr>
{/if}
</tbody>
</table>

54
templates/lists/pct.tpl Normal file
View File

@@ -0,0 +1,54 @@
{cycle values="odd,even" reset=true print=false}
<table>
<tbody>
{section name=row loop=$arr_pct}
{if $arr_pct[row].pct_visible}
<tr id="row_pct{$arr_pct[row].pct_ID}" class="pct knd{$arr_pct[row].knd_ID} {cycle values="odd,even"}" >
<td nowrap class="option">
{if $kga.usr && $kga.usr.usr_sts != 2}
<a href ="#" onClick="editSubject('pct',{$arr_pct[row].pct_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/edit2.gif' width='13' height='13' alt='{$kga.lang.edit}' title='{$kga.lang.edit} (ID:{$arr_pct[row].pct_ID})' border='0' /></a>
{/if}
<a href ="#" onClick="lists_update_filter('pct',{$arr_pct[row].pct_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/filter.png' width='13' height='13' alt='{$kga.lang.filter}' title='{$kga.lang.filter}' border='0' /></a>
<a href ="#" class="preselect" onClick="buzzer_preselect('pct',{$arr_pct[row].pct_ID},'{$arr_pct[row].pct_name|replace:"'":"\\'"|escape:'html'}',{$arr_pct[row].knd_ID},'{$arr_pct[row].knd_name|replace:"'":"\\'"|escape:'html'}'); lists_reload('evt'); return false;" id="ps{$arr_pct[row].pct_ID}"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/preselect_off.png' width='13' height='13' alt='{$kga.lang.select}' title='{$kga.lang.select} (ID:{$arr_pct[row].pct_ID})' border='0' /></a>
</td>
<td width="100%" class="projects" onmouseover="lists_change_color(this,true);" onmouseout="lists_change_color(this,false);" onClick="buzzer_preselect('pct',{$arr_pct[row].pct_ID},'{$arr_pct[row].pct_name|replace:"'":"\\'"|escape:'html'}',{$arr_pct[row].knd_ID},'{$arr_pct[row].knd_name|replace:"'":"\\'"|escape:'html'}'); lists_reload('evt'); return false;">
{if $arr_pct[row].pct_visible != 1}<span style="color:#bbb">{/if}
{if $kga.conf.flip_pct_display}
{if $kga.conf.showIDs == 1}<span class="ids">{$arr_pct[row].pct_ID}</span> {/if}<span class="lighter">{$arr_pct[row].knd_name|truncate:30:"..."|escape:'html'}:</span> {$arr_pct[row].pct_name|escape:'html'}
{else}
{if $kga.conf.pct_comment_flag == 1}
{if $kga.conf.showIDs == 1}<span class="ids">{$arr_pct[row].pct_ID}</span> {/if}{$arr_pct[row].pct_name|escape:'html'} <span class="lighter">{if $arr_pct[row].pct_comment}({$arr_pct[row].pct_comment|truncate:30:"..."|escape:'html'}){else}<span class="lighter">({$arr_pct[row].knd_name|truncate:30:"..."|escape:'html'})</span>{/if}</span>
{else}
{if $kga.conf.showIDs == 1}<span class="ids">{$arr_pct[row].pct_ID}</span> {/if}{$arr_pct[row].pct_name|escape:'html'} <span class="lighter">({$arr_pct[row].knd_name|truncate:30:"..."|escape:'html'})</span>
{/if}
{/if}
{if $arr_pct[row].pct_visible != 1}</span>{/if}
</td>
<td class="annotation">
{$arr_pct[row].zeit|escape:'html'}
</td>
</tr>
{/if}
{/section}
{if $arr_pct == '0'}
<tr>
<td nowrap colspan='3'>
<strong style="color:red">{$kga.lang.noItems}</strong>
</td>
</tr>
{/if}
</tbody>
</table>

44
templates/lists/usr.tpl Normal file
View File

@@ -0,0 +1,44 @@
{cycle values="odd,even" reset=true print=false}
<table>
<tbody>
{section name=row loop=$arr_usr}
<tr id="row_usr{$arr_usr[row].usr_ID}" class="{cycle values="odd,even"}">
{* --- option cell ---*}
<td nowrap class="option">
<a href ="#" onClick="lists_update_filter('usr',{$arr_usr[row].usr_ID}); $(this).blur(); return false;"><img src='../skins/{$kga.conf.skin|escape:'html'}/grfx/filter.png' width='13' height='13' alt='{$kga.lang.filter}' title='{$kga.lang.filter}' border='0' /></a>
</td>
{* --- name cell ---*}
<td width="100%" class="clients">
{$arr_usr[row].usr_name|escape:'html'}
</td>
{* --- annotation cell ---*}
<td nowrap class="annotation">
</td>
</tr>
{/section}
{if $arr_usr == '0'}
<tr>
<td colspan='3'>
<strong style="color:red">{$kga.lang.noItems}</strong>
</td>
</tr>
{/if}
</tbody>
</table>

View File

@@ -0,0 +1,43 @@
<!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" xml:lang="en">
<head>
<link rel="SHORTCUT ICON" href="favicon.ico">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="robots" value="noindex,nofollow" />
<title>Kimai {$kga.lang.login}</title>
<script type="text/javascript" src="libraries/jQuery/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="libraries/jQuery/jquery.cookie.js"></script>
{if $kga.check_at_startup}
<script type="text/javascript" src="js/main.js"></script>
{/if}
{literal}<script type='text/javascript'>function setfocus() { document.form1.name.focus(); }</script>
<script type='text/javascript'>
$(function(){
$("#JSwarning").remove();
$.cookie('KimaiCookietest', 'jes');
KimaiCookietest = $.cookie('KimaiCookietest');
if (KimaiCookietest == 'jes') {
$("#cookiewarning").remove();
$.cookie('KimaiCookietest', '', {expires: -1});
}
if (!$("#warning p").size()) $("#warning").remove();
});
</script>
{/literal}
{if $kga.check_at_startup}
{literal}
<script type='text/javascript'>
$(function(){
checkupdate("core/");
});
</script>
{/literal}
{/if}
<link rel="stylesheet" type="text/css" media="screen" href="css/login.css" />
</head>
{if not $kga.virtual_users}<body onLoad='setfocus();'>
{else}<body>
{/if}

31
templates/login/panel.tpl Normal file
View File

@@ -0,0 +1,31 @@
<div id='login'>
<form action='index.php?a=checklogin' name='form1' method='post'>
<fieldset>
<label for='kimaiusername'>
{$kga.lang.username}:
</label>
<input type='text' name='name' />
<label for='kimaipassword'>
{$kga.lang.password}:
</label>
<input type='password' name='password' />
{$selectbox}
<button type='submit'>Submit</button>
</fieldset>
</form>
<div id="warning">
<p id="JSwarning"><strong style='color:red'>{$kga.lang.JSwarning}</strong></p>
<p id="cookiewarning"><strong style='color:red'>{$kga.lang.cookiewarning}</strong></p>
</div>
{include file="misc/copyrightnotes.tpl"}
{*
YOU ARE NOT ALLOWED TO REMOVE THE COPYRIGHT NOTES! YOU MAY CHANGE THE APPEARANCE OF THE LOGIN WINDOW
BUT REMOVING THE CREDITS IS STRICTLY PROHIBITED. If you feel uncomfortable with this rule - use
other time tracking software, please.
*}
</div>
</body>
</html>

View File

@@ -0,0 +1,16 @@
{*
YOU ARE NOT ALLOWED TO REMOVE THE COPYRIGHT NOTES! YOU MAY CHANGE THE APPEARANCE OF THE LOGIN WINDOW
BUT REMOVING THE CREDITS IS STRICTLY PROHIBITED. If you feel uncomfortable with this rule - use
other time tracking software, please.
*}
<p>
<strong><a hrefKimai <span style="color:red">{$kga.status}</span> {$kga.version}.{$kga.revision}</strong> - &copy; {$devtimespan} the <a href="http://www.kimai.org" target="_blank">Kimai Team</a><br />
This software is provided under the terms and conditions of the <a href="COPYING">General Public License Version 3</a><br />
Powered by
<a href="http://www.jquery.com" target="_blank">jQuery</a> |
<a href="http://www.xajax-project.org/" target="_blank">xajax</a> |
<a href="http://smarty.php.net/" target="_blank">Smarty</a> |
<a href="http://php.net/" target="_blank">PHP</a> |
<a href="http://mysql.com/" target="_blank">MySQL</a>
</p>

34
templates/misc/error.tpl Normal file
View File

@@ -0,0 +1,34 @@
<!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" xml:lang="en">
<head>
<link rel="SHORTCUT ICON" href="favicon.ico">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="robots" value="noindex,nofollow" />
<title>Kimai Error</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/error.css" />
<script src="../../libraries/jQuery/jquery-1.4.2.min.js" type="text/javascript" charset="utf-8"></script>
{literal}
<script type="text/javascript">
$(document).ready(function() {
$('#ok').focus();
});
</script>
{/literal}
</head>
<body>
<div id="error_wrapper">
<dix id="error_txt">
<h3>{$headline}</h3>
{$message}
</dix>
<div id="error_button">
<form action="index.php" method="post"><input type="submit" value="OK" id="ok"/></form>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,38 @@
<!-- FILE IS TEMPORARILY NOT IN USE! -->
<!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" xml:lang="en">
<head>
<link rel="SHORTCUT ICON" href="favicon.ico">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="robots" value="noindex,nofollow" />
<title>Kimai {$kga.lang.login}</title>
<link rel="stylesheet" type="text/css" media="screen" href="css/login.css" />
</head>
<body>
<body>
<div id='login'>
<div align='center'>
<img src='grfx/caution.png' />
<h1 style="color:red">UPDATE WARNING!</h1>
<div id="message" style="width:500px">
<p><strong style='color:#C81C22'>{$kga.lang.update}</strong></p>
</div>
<p>
<a href='updater.php?ok=1' title="{$kga.lang.updateNow}"><img src='grfx/but_update.gif' border = "0"/></a></p>
<p style="color:#C81C22;">CAUTION: If you use more than one database (server_ext_database),<br />each of them has to be updated seperately!
</p>
</div>
</div>
{$refresh}
</body>
</html>