diff --git a/sai/modules/autoload_modules.php b/sai/modules/autoload_modules.php
index b06e339..428b21c 100644
--- a/sai/modules/autoload_modules.php
+++ b/sai/modules/autoload_modules.php
@@ -11,4 +11,5 @@ SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_locale','SYSTEM\S
SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_cache','SYSTEM\SAI');
SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_docu','SYSTEM\SAI');
SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_todo','SYSTEM\SAI');
-SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_files','SYSTEM\SAI');
\ No newline at end of file
+SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_files','SYSTEM\SAI');
+SYSTEM\autoload::registerFolder(dirname(__FILE__).'/saimod_sys_cron','SYSTEM\SAI');
\ No newline at end of file
diff --git a/sai/modules/register_modules.php b/sai/modules/register_modules.php
index 5c4c50b..619764e 100644
--- a/sai/modules/register_modules.php
+++ b/sai/modules/register_modules.php
@@ -7,6 +7,7 @@
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_locale');
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_files');
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_cache');
+\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_cron');
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_todo');
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_docu');
\SYSTEM\SAI\sai::register_sys('\SYSTEM\SAI\saimod_sys_login');
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/delete_dialog.tpl b/sai/modules/saimod_sys_cron/delete_dialog.tpl
new file mode 100644
index 0000000..54505c1
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/delete_dialog.tpl
@@ -0,0 +1,26 @@
+
+
Api Call: ${ID}
+
+
+
+ ID
+ Group
+ Type
+ ParentID
+ ParentValue
+ Name
+ Verify
+
+
+ ${ID}
+ ${group}
+ ${type}
+ ${parentID}
+ ${parentValue}
+ ${name}
+ ${verify}
+
+
+
+Delete
+Close
diff --git a/sai/modules/saimod_sys_cron/list_entry.tpl b/sai/modules/saimod_sys_cron/list_entry.tpl
new file mode 100644
index 0000000..894c367
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/list_entry.tpl
@@ -0,0 +1,10 @@
+
+ ${class}
+ ${min}
+ ${hour}
+ ${day}
+ ${day_week}
+ ${month}
+ ${last_run}
+ ${status}
+
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/saimod_sys_cron.css b/sai/modules/saimod_sys_cron/saimod_sys_cron.css
new file mode 100644
index 0000000..07df088
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/saimod_sys_cron.css
@@ -0,0 +1,64 @@
+p {
+ font-size: 90%;
+}
+.tree {
+ min-height:20px;
+ padding:19px;
+ margin-bottom:20px;
+ background-color:#fbfbfb;
+ border:1px solid #999;
+ -webkit-border-radius:4px;
+ -moz-border-radius:4px;
+ border-radius:4px;
+ -webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05)
+}
+.tree li {
+ list-style-type:none;
+ margin:0;
+ padding:10px 5px 0 5px;
+ position:relative
+}
+.tree li::before, .tree li::after {
+ content:'';
+ left:-20px;
+ position:absolute;
+ right:auto
+}
+.tree li::before {
+ border-left:1px solid #999;
+ bottom:50px;
+ height:100%;
+ top:0;
+ width:1px
+}
+.tree li::after {
+ border-top:1px solid #999;
+ height:20px;
+ top:25px;
+ width:25px
+}
+.tree li span {
+ -moz-border-radius:5px;
+ -webkit-border-radius:5px;
+ border:1px solid #999;
+ border-radius:5px;
+ display:inline-block;
+ padding:3px 8px;
+ text-decoration:none
+}
+.tree li.parent_li>span {
+ cursor:pointer
+}
+.tree>ul>li::before, .tree>ul>li::after {
+ border:0
+}
+.tree li:last-child::before {
+ height:30px
+}
+.tree li.parent_li>span:hover, .tree li.parent_li>span:hover+ul li span {
+ background:#eee;
+ border:1px solid #94a0b4;
+ color:#000
+}
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/saimod_sys_cron.js b/sai/modules/saimod_sys_cron/saimod_sys_cron.js
new file mode 100644
index 0000000..c80b5a1
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/saimod_sys_cron.js
@@ -0,0 +1,98 @@
+var currentID = '';
+
+function init__SYSTEM_SAI_saimod_sys_api() {
+ saimod_sys_api_tree();
+ saimod_sys_api_register_clickevents();
+
+}
+
+function saimod_sys_api_loadcontent(){
+ $('#api_wrapper').load(SAI_ENDPOINT+'sai_mod=.SYSTEM.SAI.saimod_sys_api', function(){
+ console.log('api module loaded');
+ saimod_sys_api_register_clickevents();
+ });
+
+}
+
+function saimod_sys_api_register_clickevents(){
+ $('tr.api_entries').click(function() {
+ console.log("ahsf");
+ currentID = $(this).attr("id");
+ $.ajax({
+ url: SAI_ENDPOINT,
+ data: { sai_mod: '.SYSTEM.SAI.saimod_sys_api',
+ action: 'deletedialog',
+ ID: currentID},
+ type: 'GET',
+ success: function(data) {
+ console.log("works");
+ $('#api_content').html(data);
+ $('#del_api_close').click(function() {
+ console.log("olenski");
+ $('#del_api_description').hide();
+ $('#del_api_del').show();
+ saimod_sys_api_loadcontent();
+ });
+ $('#del_api_del').click(function() {
+ $.ajax({
+ url: SAI_ENDPOINT,
+ data: { sai_mod: '.SYSTEM.SAI.saimod_sys_api',
+ action: 'deletecall',
+ ID: currentID},
+ type: 'GET',
+ success: function(data) {
+ console.log("api call deleted");
+ $('#api_deletedialog').html('Api call deleted!
');
+ $('#del_api_del').hide();
+ }});});}});});
+
+ $('#addcall').click(function() {
+ var id = $('#new_call_id').val();
+ var group = $('#new_call_group').val();
+ var type = $('#new_call_type').val();
+ var parentid = $('#new_call_parentid').val();
+ var parentvalue = $('#new_call_parentvalue').val();
+ var name = $('#new_call_name').val();
+ var verify = $('#new_call_verify').val();
+ $.ajax({
+ url: SAI_ENDPOINT,
+ data: { sai_mod: '.SYSTEM.SAI.saimod_sys_api',
+ action: 'addcall',
+ ID: id,
+ group: group,
+ type: type,
+ parentID: parentid,
+ parentValue : parentvalue,
+ name: name,
+ verify: verify},
+ type: 'GET',
+ success: function(data) {
+ console.log("new api call added");
+ saimod_sys_api_loadcontent();
+ }
+ });
+
+ });
+ $('#del_api_close').click(function() {
+ console.log("olenski");
+ $('#del_api_description').hide();
+ $('#del_api_del').show();
+ saimod_sys_api_loadcontent();
+ });
+ $('#localetab a').click(function (e) {e.preventDefault(); $(this).tab('show');});
+}
+
+function saimod_sys_api_tree(){
+ $('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title', 'Collapse this branch');
+ $('.tree li.parent_li > span').on('click', function (e) {
+ var children = $(this).parent('li.parent_li').find(' > ul > li');
+ if (children.is(":visible")) {
+ children.hide('fast');
+ $(this).attr('title', 'Expand this branch').find(' > i').addClass('icon-plus-sign').removeClass('icon-minus-sign');
+ } else {
+ children.show('fast');
+ $(this).attr('title', 'Collapse this branch').find(' > i').addClass('icon-minus-sign').removeClass('icon-plus-sign');
+ }
+ e.stopPropagation();
+ });
+}
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/saimod_sys_cron.php b/sai/modules/saimod_sys_cron/saimod_sys_cron.php
new file mode 100644
index 0000000..54a2a37
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/saimod_sys_cron.php
@@ -0,0 +1,102 @@
+query('SELECT "group", count(*) as "count" FROM system.api GROUP BY "group" ORDER BY "group" ASC;');
+ } else {
+ $res = $con->query('SELECT `group`, count(*) as `count` FROM system_api GROUP BY `group` ORDER BY `group` ASC;');
+ }
+
+ $vars['tabopts'] = '';
+ $first = true;
+ while($r = $res->next()){
+ $vars2 = array( 'active' => ($first ? 'active' : ''),
+ 'tab_id' => $r['group']);
+ $first = false;
+ $vars['tabopts'] .= \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/tabopt.tpl'), $vars2);
+ }
+
+ if(\SYSTEM\system::isSystemDbInfoPG()){
+ $res = $con->query('SELECT * FROM system.api ORDER BY "group", "ID" ASC;');
+ } else {
+ $res = $con->query('SELECT * FROM system_api ORDER BY `group`, `ID` ASC;');
+ }
+
+ while($r = $res->next()){
+ $tabs[$r['group']]['tab_id'] = $r['group'];
+ $tabs[$r['group']]['content'] = isset($tabs[$r['group']]['content']) ? $tabs[$r['group']]['content'] : '';
+ $r['tr_class'] = self::tablerow_class($r['type']);
+ $r['type'] = self::type_names($r['type']);
+ $tabs[$r['group']]['content'] .= \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/list_entry.tpl'), $r);
+ }
+
+ $vars['tabs'] = '';
+ $first = true;
+ foreach($tabs as $tab){
+ $tab['active'] = ($first ? 'active' : '');
+ $first = false;
+ $vars['tabs'] .= \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/tab.tpl'), $tab);}
+
+ return \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/tabs.tpl'), $vars);
+
+/* $result = "";
+ $result .= ''.''.$r['ID'].' '.''.$r['group'].' '.''.$r['type'].' '.''.$r['parentID'].' '.''.$r['parentValue'].' '.''.$r['name'].' '.''.$r['verify'].' '.' ';
+ return $result;*/
+ }
+
+ public static function sai_mod__system_sai_saimod_sys_api_action_deletedialog($ID){
+ $res = \SYSTEM\DBD\SYS_SAIMOD_API_SINGLE_SELECT::Q1(array($ID));
+ return \SYSTEM\PAGE\replace::replaceFile(\SYSTEM\SERVERPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/delete_dialog.tpl'), $res);
+ }
+
+ public static function sai_mod__system_sai_saimod_sys_api_action_addcall($ID,$group,$type,$parentID,$parentValue,$name,$verify){
+ if(!\SYSTEM\SECURITY\Security::check(\SYSTEM\SECURITY\RIGHTS::SYS_SAI_API)){
+ throw new \SYSTEM\LOG\ERROR("You dont have edit Rights - Cant proceeed");}
+ \SYSTEM\DBD\SYS_SAIMOD_API_ADD::QI(array($ID,$group,$type,$parentID,$parentValue,$name,$verify));
+ return \SYSTEM\LOG\JsonResult::ok();
+ }
+
+ public static function sai_mod__system_sai_saimod_sys_api_action_deletecall($ID){
+ if(!\SYSTEM\SECURITY\Security::check(\SYSTEM\SECURITY\RIGHTS::SYS_SAI_API)){
+ throw new \SYSTEM\LOG\ERROR("You dont have edit Rights - Cant proceeed");}
+ \SYSTEM\DBD\SYS_SAIMOD_API_DEL::QI(array($ID));
+ return \SYSTEM\LOG\JsonResult::ok();
+ }
+
+ private static function type_names($type){
+ switch($type){
+ case 0: return 'COMMAND';
+ case 1: return 'COMMAND_FLAG';
+ case 2: return 'PARAMETER';
+ case 3: return 'PARAMETER_OPT';
+ case 4: return 'STATIC';
+ default: return 'Problem unknown type';
+ }
+ }
+
+ private static function tablerow_class($flag){
+ switch($flag){
+ case 0: return 'info';
+ case 1: return '';
+ case 4: return 'warning';
+ default: return 'success';
+ }
+ }
+
+ public static function html_li_menu(){return 'Cron ';}
+ public static function right_public(){return false;}
+ public static function right_right(){return \SYSTEM\SECURITY\Security::check(\SYSTEM\SECURITY\RIGHTS::SYS_SAI);}
+
+ public static function sai_mod__SYSTEM_SAI_saimod_sys_cron_flag_css(){
+ return \SYSTEM\LOG\JsonResult::toString(
+ array( \SYSTEM\WEBPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/saimod_sys_cron.css')));}
+ public static function sai_mod__SYSTEM_SAI_saimod_sys_cron_flag_js(){
+ return \SYSTEM\LOG\JsonResult::toString(
+ array( \SYSTEM\WEBPATH(new \SYSTEM\PSAI(),'modules/saimod_sys_cron/saimod_sys_cron.js')));}
+}
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/tab.tpl b/sai/modules/saimod_sys_cron/tab.tpl
new file mode 100644
index 0000000..bbfaecf
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/tab.tpl
@@ -0,0 +1,15 @@
+
+
+
+ class
+ min
+ hour
+ day
+ day_week
+ month
+ last_run
+ status
+
+ ${content}
+
+
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/tabopt.tpl b/sai/modules/saimod_sys_cron/tabopt.tpl
new file mode 100644
index 0000000..cf223b0
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/tabopt.tpl
@@ -0,0 +1 @@
+Group ${tab_id}
\ No newline at end of file
diff --git a/sai/modules/saimod_sys_cron/tabs.tpl b/sai/modules/saimod_sys_cron/tabs.tpl
new file mode 100644
index 0000000..c1596be
--- /dev/null
+++ b/sai/modules/saimod_sys_cron/tabs.tpl
@@ -0,0 +1,38 @@
+