2025-01-18 09:06:54 +01:00
< ? php defined ( 'KOBLOG' ) or die ( 'Koblog CMS.' ); ?>
2018-07-12 20:03:31 +02:00
2018-10-17 22:35:30 +02:00
< ? php
2018-11-02 00:34:42 +01:00
// Start form
2018-10-17 22:35:30 +02:00
echo Bootstrap :: formOpen ( array (
2024-06-22 16:22:05 +02:00
'id' => 'jsform' ,
'class' => 'd-flex flex-column h-100'
2018-10-17 22:35:30 +02:00
));
2024-06-22 16:22:05 +02:00
// Token CSRF
echo Bootstrap :: formInputHidden ( array (
'name' => 'tokenCSRF' ,
'value' => $security -> getTokenCSRF ()
));
// UUID
// The UUID is generated in the controller
echo Bootstrap :: formInputHidden ( array (
'name' => 'uuid' ,
'value' => $uuid
));
// Type = published, draft, sticky, static
echo Bootstrap :: formInputHidden ( array (
'name' => 'type' ,
'value' => 'published'
));
// Cover image
echo Bootstrap :: formInputHidden ( array (
'name' => 'coverImage' ,
'value' => ''
));
// Content
echo Bootstrap :: formInputHidden ( array (
'name' => 'content' ,
'value' => ''
));
2018-10-17 22:35:30 +02:00
?>
2025-01-18 15:44:25 +01:00
< div class = " row " >
2018-10-17 22:35:30 +02:00
<!-- TOOLBAR -->
2025-01-18 15:44:25 +01:00
< div class = " mb-3 col-lg-6 " >
< button type = " button " class = " btn btn-light " data - bs - toggle = " modal " data - bs - target = " #jsmediaManagerModal " >< span class = " fa fa-image " ></ span > < ? php $L -> p ( 'Images' ) ?> </button>
< span id = " jsswitchButton " data - switch = " publish " class = " ml-2 btn-outline-success btn " >< ? php $L -> p ( 'Publish' ) ?> </span>
</ div >
2018-04-15 22:23:11 +02:00
2025-01-18 15:44:25 +01:00
< div class = " col-lg-6 text-end " >
< button id = " jsbuttonPreview " type = " button " class = " btn btn-secondary " >< ? php $L -> p ( 'Preview' ) ?> </button>
< button type = " button " class = " btn btn-primary " id = " jsbuttonSave " >< ? php echo $L -> g ( 'Save' ) ?> </button>
2018-10-17 22:35:30 +02:00
</ div >
</ div >
2018-07-07 12:04:34 +02:00
2025-01-18 15:44:25 +01:00
< div class = " row " >
< div class = " col-lg-9 " >
<!-- Title -->
< div class = " form-group mb-2 " >
< input id = " jstitle " name = " title " type = " text " dir = " auto " class = " form-control form-control-lg " value = " " placeholder = " <?php $L->p ('Enter title') ?> " >
</ div >
<!-- Editor -->
< textarea id = " jseditor " class = " editable h-100 mb-1 " ></ textarea >
<!-- Custom fields : BOTTOM -->
< ? php
$customFields = $site -> customFields ();
foreach ( $customFields as $field => $options ) {
if ( isset ( $options [ 'position' ]) && ( $options [ 'position' ] == 'bottom' )) {
if ( $options [ 'type' ] == " string " ) {
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'value' => ( isset ( $options [ 'default' ]) ? $options [ 'default' ] : '' ),
'tip' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' ),
'class' => 'mt-2' ,
'labelClass' => 'mb-0 pb-1 text-uppercase w-100'
));
} elseif ( $options [ 'type' ] == " bool " ) {
echo Bootstrap :: formCheckbox ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' ),
'checked' => ( isset ( $options [ 'checked' ]) ? true : false ),
'labelForCheckbox' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' ),
'class' => 'mt-2' ,
'labelClass' => 'mb-0 pb-1 text-uppercase w-100'
));
}
}
}
?>
</ form >
</ div >
2018-10-30 16:12:44 +01:00
<!-- SIDEBAR OPTIONS -->
2025-01-18 15:44:25 +01:00
< div class = " col-lg-3 " >
< nav class = " mb-2 " >
< div class = " nav nav-pills " id = " nav-tab " role = " tablist " >
< a class = " nav-link active show " id = " nav-general-tab " data - bs - toggle = " tab " data - bs - target = " #nav-general " role = " tab " aria - controls = " general " >< ? php $L -> p ( 'General' ) ?> </a>
< a class = " nav-link " id = " nav-advanced-tab " data - bs - toggle = " tab " data - bs - target = " #nav-advanced " role = " tab " aria - controls = " advanced " >< ? php $L -> p ( 'Advanced' ) ?> </a>
2024-06-22 16:22:05 +02:00
< ? php if ( ! empty ( $site -> customFields ())) : ?>
2025-01-18 15:44:25 +01:00
< a class = " nav-link " id = " nav-custom-tab " data - bs - toggle = " tab " data - bs - target = " #nav-custom " role = " tab " aria - controls = " custom " >< ? php $L -> p ( 'Custom' ) ?> </a>
2019-09-02 18:24:34 +02:00
< ? php endif ?>
2025-01-18 15:44:25 +01:00
< a class = " nav-link " id = " nav-seo-tab " data - bs - toggle = " tab " data - bs - target = " #nav-seo " role = " tab " aria - controls = " seo " >< ? php $L -> p ( 'SEO' ) ?> </a>
2018-07-07 12:04:34 +02:00
</ div >
2018-10-30 16:12:44 +01:00
</ nav >
2025-01-18 15:44:25 +01:00
< div class = " card mb-2 " >< div class = " card-body " >
< div class = " tab-content pr-3 pl-3 pb-3 " >
< div id = " nav-general " class = " tab-pane fade show active " role = " tabpanel " aria - labelledby = " general-tab " >
< ? php
// Category
echo Bootstrap :: formSelectBlock ( array (
'name' => 'category' ,
'label' => $L -> g ( 'Category' ),
'selected' => '' ,
'class' => '' ,
'emptyOption' => '- ' . $L -> g ( 'Uncategorized' ) . ' -' ,
'options' => $categories -> getKeyNameArray (),
'mt' => 'mt-0'
));
// Tags
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'tags' ,
'label' => $L -> g ( 'Tags' ),
'placeholder' => '' ,
'tip' => $L -> g ( 'Write the tags separated by comma' )
));
// Description
echo Bootstrap :: formTextareaBlock ( array (
'name' => 'description' ,
'label' => $L -> g ( 'Description' ),
'selected' => '' ,
'class' => '' ,
'value' => '' ,
'rows' => 5 ,
'placeholder' => $L -> get ( 'this-field-can-help-describe-the-content' )
));
?>
2018-10-30 16:12:44 +01:00
2025-01-18 15:44:25 +01:00
<!-- Cover Image -->
< label class = " mt-2 mb-0 pb-1 text-uppercase w-100 " >< ? php $L -> p ( 'Cover Image' ) ?> </label>
< div >
< img id = " jscoverImagePreview " class = " mx-auto d-block w-100 " alt = " Cover image preview " src = " <?php echo HTML_PATH_CORE_IMG ?>default.svg " />
</ div >
< div class = " mt-2 text-center " >
< button type = " button " id = " jsbuttonSelectCoverImage " class = " btn btn-primary btn-sm " >< ? php echo $L -> g ( 'Select cover image' ) ?> </button>
< button type = " button " id = " jsbuttonRemoveCoverImage " class = " btn btn-secondary btn-sm " >< ? php echo $L -> g ( 'Remove cover image' ) ?> </button>
</ div >
< script >
$ ( document ) . ready ( function () {
$ ( " #jscoverImagePreview " ) . on ( " click " , function () {
openMediaManager ();
});
$ ( " #jsbuttonSelectCoverImage " ) . on ( " click " , function () {
openMediaManager ();
});
$ ( " #jsbuttonRemoveCoverImage " ) . on ( " click " , function () {
$ ( " #jscoverImage " ) . val ( '' );
$ ( " #jscoverImagePreview " ) . attr ( 'src' , HTML_PATH_CORE_IMG + 'default.svg' );
});
2018-10-30 16:12:44 +01:00
});
2025-01-18 15:44:25 +01:00
</ script >
</ div >
< div id = " nav-advanced " class = " tab-pane fade " role = " tabpanel " aria - labelledby = " advanced-tab " >
< ? php
// Date
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'date' ,
'label' => $L -> g ( 'Date' ),
'placeholder' => '' ,
'value' => Date :: current ( DB_DATE_FORMAT ),
'tip' => $L -> g ( 'date-format-format' ),
'mt' => 'mt-0'
));
// Type
echo Bootstrap :: formSelectBlock ( array (
'name' => 'typeSelector' ,
'label' => $L -> g ( 'Type' ),
'selected' => '' ,
'options' => array (
'published' => '- ' . $L -> g ( 'Default' ) . ' -' ,
'sticky' => $L -> g ( 'Sticky' ),
'static' => $L -> g ( 'Static' )
),
'tip' => ''
));
// Position
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'position' ,
'label' => $L -> g ( 'Position' ),
'tip' => $L -> g ( 'Field used when ordering content by position' ),
'value' => $pages -> nextPositionNumber ()
));
// Parent
echo Bootstrap :: formSelectBlock ( array (
'name' => 'parent' ,
'label' => $L -> g ( 'Parent' ),
'options' => array (),
'selected' => false ,
'class' => '' ,
'tip' => $L -> g ( 'Start typing a page title to see a list of suggestions.' ),
));
2024-06-22 16:22:05 +02:00
2025-01-18 15:44:25 +01:00
?>
2018-10-17 22:35:30 +02:00
2025-01-18 15:44:25 +01:00
< script >
$ ( document ) . ready ( function () {
var parent = $ ( " #jsparent " ) . select2 ({
placeholder : " " ,
allowClear : true ,
theme : " bootstrap4 " ,
minimumInputLength : 2 ,
ajax : {
url : HTML_PATH_ADMIN_ROOT + " ajax/get-published " ,
data : function ( params ) {
var query = {
checkIsParent : true ,
query : params . term
}
return query ;
},
processResults : function ( data ) {
return data ;
2024-06-22 16:22:05 +02:00
}
},
2025-01-18 15:44:25 +01:00
escapeMarkup : function ( markup ) {
return markup ;
},
templateResult : function ( data ) {
var html = data . text ;
if ( data . type == " static " ) {
html += '<span class="badge badge-pill badge-light">' + data . type + '</span>' ;
}
return html ;
2024-06-22 16:22:05 +02:00
}
2025-01-18 15:44:25 +01:00
});
2024-06-22 16:22:05 +02:00
});
2025-01-18 15:44:25 +01:00
</ script >
2019-10-05 21:20:58 +02:00
2025-01-18 15:44:25 +01:00
< ? php
// Template
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'template' ,
'label' => $L -> g ( 'Template' ),
'placeholder' => '' ,
'value' => '' ,
'tip' => $L -> g ( 'Write a template name to filter the page in the theme and change the style of the page.' )
));
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'externalCoverImage' ,
'label' => $L -> g ( 'External cover image' ),
'placeholder' => " https:// " ,
'value' => '' ,
'tip' => $L -> g ( 'Set a cover image from external URL, such as a CDN or some server dedicated for images.' )
));
// Username
echo Bootstrap :: formInputTextBlock ( array (
'name' => '' ,
'label' => $L -> g ( 'Author' ),
'placeholder' => '' ,
'value' => $login -> username (),
'tip' => '' ,
'disabled' => true
));
?>
2024-06-22 16:22:05 +02:00
2025-01-18 15:44:25 +01:00
< script >
$ ( document ) . ready ( function () {
2024-06-22 16:22:05 +02:00
2025-01-18 15:44:25 +01:00
// Changes in External cover image input
$ ( " #jsexternalCoverImage " ) . change ( function () {
$ ( " #jscoverImage " ) . val ( $ ( this ) . val ());
});
2019-09-25 20:18:36 +02:00
2025-01-18 15:44:25 +01:00
// Generate slug when the user type the title
$ ( " #jstitle " ) . keyup ( function () {
var text = $ ( this ) . val ();
var parent = $ ( " #jsparent " ) . val ();
var currentKey = " " ;
var ajax = new koblogAjax ();
var callBack = $ ( " #jsslug " );
ajax . generateSlug ( text , parent , currentKey , callBack );
});
2019-09-25 20:18:36 +02:00
2025-01-18 15:44:25 +01:00
// Datepicker
$ ( " #jsdate " ) . datetimepicker ({
format : DB_DATE_FORMAT
});
2018-10-17 22:35:30 +02:00
2024-06-22 16:22:05 +02:00
});
2025-01-18 15:44:25 +01:00
</ script >
</ div >
< ? php if ( ! empty ( $site -> customFields ())) : ?>
< div id = " nav-custom " class = " tab-pane fade " role = " tabpanel " aria - labelledby = " custom-tab " >
< ? php
$customFields = $site -> customFields ();
foreach ( $customFields as $field => $options ) {
if ( ! isset ( $options [ 'position' ])) {
if ( $options [ 'type' ] == " string " ) {
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'value' => ( isset ( $options [ 'default' ]) ? $options [ 'default' ] : '' ),
'tip' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' )
));
} elseif ( $options [ 'type' ] == " bool " ) {
echo Bootstrap :: formCheckbox ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' ),
'checked' => ( isset ( $options [ 'checked' ]) ? true : false ),
'labelForCheckbox' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' )
));
}
2024-06-22 16:22:05 +02:00
}
2019-09-09 20:34:50 +02:00
}
2025-01-18 15:44:25 +01:00
?>
</ div >
< ? php endif ?>
< div id = " nav-seo " class = " tab-pane fade " role = " tabpanel " aria - labelledby = " seo-tab " >
< ? php
// Friendly URL
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'slug' ,
'tip' => $L -> g ( 'URL associated with the content' ),
'label' => $L -> g ( 'Friendly URL' ),
'placeholder' => $L -> g ( 'Leave empty for autocomplete by Koblog.' ),
'mt' => 'mt-0'
));
// Robots
echo Bootstrap :: formCheckbox ( array (
'name' => 'noindex' ,
'label' => 'Robots' ,
'labelForCheckbox' => $L -> g ( 'apply-code-noindex-code-to-this-page' ),
'placeholder' => '' ,
'checked' => false ,
'tip' => $L -> g ( 'This tells search engines not to show this page in their search results.' )
));
// Robots
echo Bootstrap :: formCheckbox ( array (
'name' => 'nofollow' ,
'label' => '' ,
'labelForCheckbox' => $L -> g ( 'apply-code-nofollow-code-to-this-page' ),
'placeholder' => '' ,
'checked' => false ,
'tip' => $L -> g ( 'This tells search engines not to follow links on this page.' )
));
// Robots
echo Bootstrap :: formCheckbox ( array (
'name' => 'noarchive' ,
'label' => '' ,
'labelForCheckbox' => $L -> g ( 'apply-code-noarchive-code-to-this-page' ),
'placeholder' => '' ,
'checked' => false ,
'tip' => $L -> g ( 'This tells search engines not to save a cached copy of this page.' )
));
2024-06-22 16:22:05 +02:00
?>
</ div >
2018-10-17 22:35:30 +02:00
</ div >
2025-01-18 15:44:25 +01:00
</ div ></ div >
2018-10-30 16:12:44 +01:00
</ div >
2018-10-17 22:35:30 +02:00
2019-09-09 20:34:50 +02:00
<!-- Custom fields : TOP -->
< ? php
2024-06-22 16:22:05 +02:00
$customFields = $site -> customFields ();
foreach ( $customFields as $field => $options ) {
if ( isset ( $options [ 'position' ]) && ( $options [ 'position' ] == 'top' )) {
if ( $options [ 'type' ] == " string " ) {
echo Bootstrap :: formInputTextBlock ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'value' => ( isset ( $options [ 'default' ]) ? $options [ 'default' ] : '' ),
'tip' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' ),
'class' => 'mb-2' ,
2025-01-18 15:44:25 +01:00
'labelClass' => 'mb-0 pb-1 text-uppercase w-100'
2024-06-22 16:22:05 +02:00
));
} elseif ( $options [ 'type' ] == " bool " ) {
echo Bootstrap :: formCheckbox ( array (
'name' => 'custom[' . $field . ']' ,
'label' => ( isset ( $options [ 'label' ]) ? $options [ 'label' ] : '' ),
'placeholder' => ( isset ( $options [ 'placeholder' ]) ? $options [ 'placeholder' ] : '' ),
'checked' => ( isset ( $options [ 'checked' ]) ? true : false ),
'labelForCheckbox' => ( isset ( $options [ 'tip' ]) ? $options [ 'tip' ] : '' ),
'class' => 'mb-2' ,
2025-01-18 15:44:25 +01:00
'labelClass' => 'mb-0 pb-1 text-uppercase w-100'
2024-06-22 16:22:05 +02:00
));
2019-09-09 20:34:50 +02:00
}
}
2024-06-22 16:22:05 +02:00
}
2019-09-09 20:34:50 +02:00
?>
2018-07-10 18:37:46 +02:00
<!-- Modal for Media Manager -->
2025-01-18 13:47:55 +01:00
< ? php include ( PATH_ADMIN_THEMES . 'koblog/html/media.php' ); ?>
2018-07-10 18:37:46 +02:00
2025-01-18 15:44:25 +01:00
</ div >
2015-05-05 03:00:01 +02:00
< script >
2024-06-22 16:22:05 +02:00
$ ( document ) . ready ( function () {
2019-02-03 14:29:37 +01:00
2024-06-22 16:22:05 +02:00
// Define function if they doesn't exist
// This helps if the user doesn't activate any plugin as editor
if ( typeof editorGetContent != " function " ) {
window . editorGetContent = function () {
return $ ( " #jseditor " ) . val ();
};
}
if ( typeof editorInsertMedia != " function " ) {
window . editorInsertMedia = function ( filename ) {
$ ( " #jseditor " ) . val ( $ ( '#jseditor' ) . val () + '<img src="' + filename + '" alt="">' );
};
}
if ( typeof editorInsertLinkedMedia != " function " ) {
window . editorInsertLinkedMedia = function ( filename , link ) {
$ ( " #jseditor " ) . val ( $ ( '#jseditor' ) . val () + '<a href="' + link + '"><img src="' + filename + '" alt=""></a>' );
};
2019-04-23 23:10:46 +02:00
}
2024-06-22 16:22:05 +02:00
// Button switch
2025-01-18 15:44:25 +01:00
$ ( " #jsswitchButton " ) . on ( " click " , function () {
2024-06-22 16:22:05 +02:00
if ( $ ( this ) . data ( " switch " ) == " publish " ) {
2025-01-18 15:44:25 +01:00
$ ( this ) . html ( '<?php $L->p(' Draft ') ?>' );
2024-06-22 16:22:05 +02:00
$ ( this ) . data ( " switch " , " draft " );
2025-01-18 15:44:25 +01:00
$ ( this ) . attr ( 'class' , " ml-2 btn-outline-secondary btn " );
2024-06-22 16:22:05 +02:00
} else {
2025-01-18 15:44:25 +01:00
$ ( this ) . html ( '<?php $L->p(' Publish ') ?>' );
2024-06-22 16:22:05 +02:00
$ ( this ) . data ( " switch " , " publish " );
2025-01-18 15:44:25 +01:00
$ ( this ) . attr ( 'class' , " ml-2 btn-outline-success btn " );
2024-06-22 16:22:05 +02:00
}
2019-05-09 19:31:55 +02:00
});
2019-04-27 20:30:57 +02:00
2024-06-22 16:22:05 +02:00
// Button preview
$ ( " #jsbuttonPreview " ) . on ( " click " , function () {
var uuid = $ ( " #jsuuid " ) . val ();
var title = $ ( " #jstitle " ) . val ();
var content = editorGetContent ();
2025-01-18 09:06:54 +01:00
koblogAjax . saveAsDraft ( uuid , title , content ) . then ( function ( data ) {
var preview = window . open ( " <?php echo DOMAIN_PAGES . 'autosave-' . $uuid . '?preview=' . md5('autosave-' . $uuid ) ?> " , " koblog-preview " );
2024-06-22 16:22:05 +02:00
preview . focus ();
});
});
2018-05-08 23:25:18 +02:00
2024-06-22 16:22:05 +02:00
// Button Save
$ ( " #jsbuttonSave " ) . on ( " click " , function () {
2024-06-30 21:59:24 +02:00
let actionParameters = '' ;
2024-06-22 16:22:05 +02:00
// If the switch is setted to "published", get the value from the selector
if ( $ ( " #jsbuttonSwitch " ) . data ( " switch " ) == " publish " ) {
var value = $ ( " #jstypeSelector option:selected " ) . val ();
$ ( " #jstype " ) . val ( value );
2024-06-30 21:59:24 +02:00
actionParameters = '#' + value ;
2024-06-22 16:22:05 +02:00
} else {
$ ( " #jstype " ) . val ( " draft " );
2024-06-30 21:59:24 +02:00
actionParameters = '#draft' ;
2024-06-22 16:22:05 +02:00
}
2018-10-03 00:19:19 +02:00
2024-06-22 16:22:05 +02:00
// Get the content
$ ( " #jscontent " ) . val ( editorGetContent ());
2018-05-08 00:15:40 +02:00
2024-06-22 16:22:05 +02:00
// Submit the form
2024-06-30 21:59:24 +02:00
$ ( " #jsform " ) . attr ( 'action' , actionParameters );
2024-06-22 16:22:05 +02:00
$ ( " #jsform " ) . submit ();
});
// Autosave
var currentContent = editorGetContent ();
setInterval ( function () {
2018-05-08 00:15:40 +02:00
var uuid = $ ( " #jsuuid " ) . val ();
2019-05-10 11:35:23 +02:00
var title = $ ( " #jstitle " ) . val () + " [<?php $L->p ('Autosave') ?>] " ;
2018-05-08 00:15:40 +02:00
var content = editorGetContent ();
2019-05-10 11:35:23 +02:00
// Autosave when content has at least 100 characters
2024-06-22 16:22:05 +02:00
if ( content . length < 100 ) {
2019-05-10 11:35:23 +02:00
return false ;
}
// Autosave only when the user change the content
2024-06-22 16:22:05 +02:00
if ( currentContent != content ) {
2019-05-09 19:31:55 +02:00
currentContent = content ;
2025-01-18 09:06:54 +01:00
koblogAjax . saveAsDraft ( uuid , title , content ) . then ( function ( data ) {
2024-06-22 16:22:05 +02:00
if ( data . status == 0 ) {
2019-05-10 11:35:23 +02:00
showAlert ( " <?php $L->p ('Autosave') ?> " );
2019-05-09 19:31:55 +02:00
}
});
}
2024-06-22 16:22:05 +02:00
}, 1000 * 60 * AUTOSAVE_INTERVAL );
2018-05-08 00:15:40 +02:00
2024-06-22 16:22:05 +02:00
});
2018-04-15 22:23:11 +02:00
</ script >