You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

343 lines
15 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
if (basename($_SERVER['SCRIPT_NAME']) === basename(__FILE__)) {
die('This script may only be included.');
}
// need to rebuild because they were created in tiki-setup and just removed due to clear cache
// we need to create upfront in case codemirror is used later on.
require_once("lib/codemirror_tiki/tiki_codemirror.php");
createCodemirrorModes();
// Javascript auto-detection
// (to be able to generate non-javascript code if there is no javascript, when noscript tag is not useful enough)
// It uses cookies instead of session vars to keep the correct value after a session timeout
$js_cookie = getCookie('javascript_enabled');
if ($prefs['disableJavascript'] == 'y') {
$prefs['javascript_enabled'] = 'n';
} elseif (! empty($js_cookie)) {
// Update the pref with the cookie value
$prefs['javascript_enabled'] = 'y';
if ($js_cookie !== 'y') { // if it's not 'y' then it's the expiry in ms
setcookie('javascript_enabled', 'y', $js_cookie / 1000);
$js_cookie = 'y';
}
setCookieSection('javascript_enabled_detect', '', '', time() - 3600); // remove the test cookie
$_COOKIE['javascript_enabled_detect'] = '';
} else {
if (isset($_COOKIE['runs_before_js_detect'])) { // pre-tiki 14 method detected, delete both test cookies (reloading here caused redirect a loop in some case)
setcookie('runs_before_js_detect', '', time() - 3600);
setcookie('javascript_enabled_detect', '', time() - 3600);
}
$prefs['javascript_enabled'] = '';
}
// the first and second time, we should not trust the absence of javascript_enabled cookie yet,
// as it could be a redirection and the js will not get a chance to run yet, so we wait until the third run,
// assuming that js is on before then
$javascript_enabled_detect = getCookie('javascript_enabled_detect', '', '0');
// Cookie Consent: setCookieSection uses the session tiki_cookie_jar to simulate cookies,
// so check that $feature_no_cookie is not true because cookies are not really set when using cookie_consent_feature
// and so javascript will get disabled by mistake
if ($prefs['javascript_assume_enabled'] === 'y') {
$prefs['javascript_enabled'] = 'y';
} elseif (empty($javascript_enabled_detect) && $feature_no_cookie) {
$prefs['javascript_enabled'] = 'y'; // assume javascript should be enabled while cookie consent is pending
} elseif ($prefs['javascript_enabled'] === '' && $prefs['disableJavascript'] != 'y' && $javascript_enabled_detect < 3) {
// Set the cookie to 'y', through javascript - expires: approx. 1 year
$prefs['javascript_enabled'] = 'y'; // temporarily enable to we output the test js
$plus_one_year = ($tikilib->now + 365 * 24 * 3600) * 1000; // ms
$headerlib->add_js("setCookieBrowser('javascript_enabled', '{$plus_one_year}', '', new Date({$plus_one_year}));", 0); // setCookieBrowser does not use the tiki_cookie_jar
if (
strpos($_SERVER['PHP_SELF'], 'tiki-download') === false &&
strpos($_SERVER['PHP_SELF'], 'tiki-ajax_services.php') === false &&
strpos($_SERVER['PHP_SELF'], 'tiki-login.php') === false &&
strpos($_SERVER['PHP_SELF'], 'tiki-install.php') === false
) {
$javascript_enabled_detect++;
setCookieSection('javascript_enabled_detect', $javascript_enabled_detect, '', $plus_one_year / 1000);
}
} elseif ($js_cookie !== 'y') { // no js cookie detected
$prefs['javascript_enabled'] = 'n';
}
if ($prefs['javascript_enabled'] == 'n') {
// disable js dependant features
$prefs['feature_tabs'] = 'n';
$prefs['feature_jquery'] = 'n';
$prefs['feature_shadowbox'] = 'n';
$prefs['feature_wysiwyg'] = 'n';
$prefs['feature_ajax'] = 'n';
// assign short variable for use in templates
$smarty->assign('js', 0);
//for use in setting tags for css menus as fallback for action dropdowns in case of no javascript
$smarty->assign('libeg', '<li>');
$smarty->assign('liend', '</li>');
}
if ($prefs['javascript_enabled'] == 'y') { // we have JavaScript
// assign short variable for use in templates
$smarty->assign('js', 1);
//for use in setting tags for css menus as fallback for action dropdowns in case of no javascript
$smarty->assign('libeg', '');
$smarty->assign('liend', '');
$prefs['feature_jquery'] = 'y'; // just in case
// load translations lang object from /lang/xx/language.js if there
if (file_exists('lang/' . $prefs['language'] . '/language.js')) {
// after the usual lib includes (up to 10) but before custom.js (50)
$headerlib
->add_jsfile_late('lang/' . $prefs['language'] . '/language.js')
->add_js("$.lang = '" . $prefs['language'] . "';");
}
/** Use custom.js in lang dir if there **/
$language = $prefs['language'];
if (is_file("lang/$language/custom.js")) {
TikiLib::lib('header')->add_jsfile_late("lang/$language/custom.js"); // before styles custom.js
}
if (! empty($tikidomain) && is_file("lang/$language/$tikidomain/custom.js")) { // Note: lang tikidomain dirs not created automatically
TikiLib::lib('header')->add_jsfile_late("lang/$language/$tikidomain/custom.js");
}
/** Use custom.js in themes and options dir if there **/
$themelib = TikiLib::lib('theme');
// custom.js in the root of /themes/js
$custom_js = $themelib->get_theme_path('', '', 'custom.js');
if (! empty($custom_js)) {
$headerlib->add_jsfile($custom_js);
}
// custom.js in the current theme?
if (! empty($prefs['theme_admin']) && ($section === 'admin' || empty($section))) { // use admin theme if set
$custom_js = $themelib->get_theme_path($prefs['theme_admin'], '', 'custom.js');
} else {
$custom_js = $themelib->get_theme_path($prefs['theme'], '', 'custom.js');
}
if (! empty($custom_js)) {
$headerlib->add_jsfile($custom_js);
}
// custom.js in the theme's current option?
if (! empty($prefs['theme_admin']) && ($section === 'admin' || empty($section))) { // use admin theme if set
$custom_js = $themelib->get_theme_path($prefs['theme_admin'], $prefs['theme_option_admin'], 'custom.js');
} else {
$custom_js = $themelib->get_theme_path($prefs['theme'], $prefs['theme_option'], 'custom.js');
}
if (! empty($custom_js)) {
$headerlib->add_jsfile($custom_js);
}
// setup timezone array
$tz = TikiDate::getTimezoneAbbreviations();
$headerlib->add_js(
'
try {
var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
setCookie("local_tz", timezone);
} catch (e) {}
// this is used by tiki-confirm.js checkTimeout, so needs to be always set
var now = new Date();
if (! timezone) {
function inArray(item, array) {
for (var i in array) {
if (array[i] === item) {
return i;
}
}
return false;
}
var allTimeZoneCodes = ' . json_encode(array_map("strtoupper", $tz)) . ';
var now_string = now.toString();
var offsethours = - now.getTimezoneOffset() / 60;
setCookie("local_tzoffset", offsethours);
var m = now_string.match(/[ \(]([A-Z]{3,6})[ \)]?[ \d]*$/); // try three or more char tz first at the end or just before the year
if (!m) {
m = now_string.match(/[ \(]([A-Z]{1,6})[ \)]?[ \d]*$/); // might be a "military" one if not
}
if (m) {
m = m[1];
} else { // IE (sometimes) gives UTC +offset instead of the abbreviation
// sadly this workaround will fail for non-whole hour offsets
var hours = - now.getTimezoneOffset() / 60;
m = "GMT" + (hours > 0 ? "+" : "") + hours;
}
// Etc/GMT+ is equivalent to GMT-
if (m.substring(0,4) == "GMT+") {
m = "Etc/GMT-" + m.substring(4);
setCookie("local_tz", m);
}
if (m.substring(0,4) == "GMT-") {
m = "Etc/GMT+" + m.substring(4);
setCookie("local_tz", m);
}
if (inArray(m, allTimeZoneCodes)) {
setCookie("local_tz", m);
}
}
',
2
);
$jqueryTiki['ui'] = $prefs['feature_jquery_ui'] === 'y' ? true : false;
$jqueryTiki['ui_theme'] = $prefs['feature_jquery_ui_theme'];
$jqueryTiki['tooltips'] = $prefs['feature_jquery_tooltips'] === 'y' ? true : false;
$jqueryTiki['autocomplete'] = $prefs['feature_jquery_autocomplete'] === 'y' ? true : false;
$jqueryTiki['superfish'] = $prefs['feature_jquery_superfish'] === 'y' ? true : false;
$jqueryTiki['smartmenus'] = $prefs['jquery_smartmenus_enable'] === 'y' ? true : false;
$jqueryTiki['smartmenus_collapsible_behavior'] = $prefs['jquery_smartmenus_collapsible_behavior'];
$jqueryTiki['smartmenus_open_close_click'] = $prefs['jquery_smartmenus_open_close_click'] === 'y' ? true : false;
$jqueryTiki['reflection'] = $prefs['feature_jquery_reflection'] === 'y' ? true : false;
$jqueryTiki['tablesorter'] = $prefs['feature_jquery_tablesorter'] === 'y' ? true : false;
$jqueryTiki['colorbox'] = $prefs['feature_shadowbox'] === 'y' ? true : false;
$jqueryTiki['cboxCurrent'] = "{current} / {total}";
$jqueryTiki['sheet'] = $prefs['feature_sheet'] === 'y' ? true : false;
$jqueryTiki['carousel'] = $prefs['feature_jquery_carousel'] === 'y' ? true : false;
$jqueryTiki['validate'] = $prefs['feature_jquery_validation'] === 'y' ? true : false;
$jqueryTiki['zoom'] = $prefs['feature_jquery_zoom'] === 'y' ? true : false;
// Default effect
$jqueryTiki['effect'] = $prefs['jquery_effect'];
// "horizontal" | "vertical" etc
$jqueryTiki['effect_direction'] = $prefs['jquery_effect_direction'];
// "slow" | "normal" | "fast" | milliseconds (int) ]
$jqueryTiki['effect_speed'] = $prefs['jquery_effect_speed'] === 'normal' ? '400' : $prefs['jquery_effect_speed'];
$jqueryTiki['effect_tabs'] = $prefs['jquery_effect_tabs']; // Different effect for tabs
$jqueryTiki['effect_tabs_direction'] = $prefs['jquery_effect_tabs_direction'];
$jqueryTiki['effect_tabs_speed'] = $prefs['jquery_effect_tabs_speed'] === 'normal' ? '400' : $prefs['jquery_effect_tabs_speed'];
$jqueryTiki['home_file_gallery'] = $prefs['home_file_gallery'];
$jqueryTiki['autosave'] = $prefs['ajax_autosave'] === 'y' ? true : false;
$jqueryTiki['sefurl'] = $prefs['feature_sefurl'] === 'y' ? true : false;
$jqueryTiki['ajax'] = $prefs['feature_ajax'] === 'y' ? true : false;
$jqueryTiki['syntaxHighlighter'] = $prefs['feature_syntax_highlighter'] === 'y' ? true : false;
$jqueryTiki['select2'] = $prefs['jquery_select2'] === 'y' ? true : false;
$jqueryTiki['select2_sortable'] = $prefs['jquery_select2_sortable'] === 'y' ? true : false;
$jqueryTiki['mapTileSets'] = $tikilib->get_preference('geo_tilesets', ['openstreetmap'], true);
$jqueryTiki['infoboxTypes'] = Services_Object_Controller::supported();
$jqueryTiki['googleStreetView'] = $prefs['geo_google_streetview'] === 'y' ? true : false;
$jqueryTiki['googleStreetViewOverlay'] = $prefs['geo_google_streetview_overlay'] === 'y' ? true : false;
$jqueryTiki['googleMapsAPIKey'] = $prefs['gmap_key'];
$jqueryTiki['structurePageRepeat'] = $prefs['page_n_times_in_a_structure'] === 'y' ? true : false;
$jqueryTiki['mobile'] = $prefs['mobile_mode'] === 'y' ? true : false;
$jqueryTiki['no_cookie'] = false;
$jqueryTiki['cookie_consent_analytics'] = $prefs['cookie_consent_analytics'] === 'y' ? true : false;
$jqueryTiki['language'] = $prefs['language'];
$jqueryTiki['useInlineComment'] = $prefs['feature_inline_comments'] === 'y' ? true : false;
$jqueryTiki['useInlineAnnotations'] = $prefs['comments_inline_annotator'] === 'y' ? true : false;
$jqueryTiki['helpurl'] = $prefs['feature_help'] === 'y' ? $prefs['helpurl'] : '';
$jqueryTiki['shortDateFormat'] = $prefs['short_date_format_js'];
$jqueryTiki['shortTimeFormat'] = $prefs['short_time_format_js'];
$jqueryTiki['changeMonth'] = $prefs['change_month'] === 'y' ? true : false;
$jqueryTiki['changeYear'] = $prefs['change_year'] === 'y' ? true : false;
$jqueryTiki['username'] = $user;
$jqueryTiki['userRealName'] = TikiLib::lib('user')->clean_user($user);
$jqueryTiki['userAvatar'] = $base_url . TikiLib::lib('userprefs')->get_public_avatar_path($user);
$jqueryTiki['autoToc_inline'] = $prefs['wiki_inline_auto_toc'] === 'y' ? true : false;
$jqueryTiki['autoToc_pos'] = $prefs['wiki_toc_pos'];
$jqueryTiki['autoToc_offset'] = $prefs['wiki_toc_offset'];
$jqueryTiki['autoToc_tabs'] = $prefs['wiki_toc_tabs'];
$jqueryTiki['bingMapsAPIKey'] = $prefs['geo_bingmaps_key'];
$jqueryTiki['nextzenAPIKey'] = $prefs['geo_nextzen_key'];
$jqueryTiki['numericFieldScroll'] = $prefs['unified_numeric_field_scroll'];
//set at 4 hours if empty
$jqueryTiki['securityTimeout'] = ! empty($prefs['site_security_timeout']) ? $prefs['site_security_timeout']
: TikiLib::lib('access')->getDefaultTimeout();
if (empty($object)) {
$object = current_object();
}
$jqueryTiki['current_object'] = $object;
$jqueryTiki['usernamePattern'] = $prefs['username_pattern'];
$jqueryTiki['print_pdf_from_url'] = "{$prefs['print_pdf_from_url']}";
if ($prefs['feature_calendar'] === 'y') {
$calendarlib = TikiLib::lib('calendar');
$jqueryTiki['firstDayofWeek'] = $calendarlib->firstDayofWeek();
}
$js = '
// JS Object to hold prefs for jq
var jqueryTiki = ' . json_encode($jqueryTiki, JSON_UNESCAPED_SLASHES) . "\n";
if ($prefs['feature_syntax_highlighter'] !== 'y') {
// add a dummy syntaxHighlighter object as it seems to be used all over the place without checking for the feature
$js .= '
var syntaxHighlighter = {
ready: function(textarea, settings) { return null; },
sync: function(textarea) { return null; },
add: function(editor, $input, none, skipResize) { return null; },
remove: function($input) { return null; },
get: function($input) { return null; },
fullscreen: function(textarea) { return null; },
find: function(textareaEditor, val) { return null; },
searchCursor: [],
replace: function(textareaEditor, val, replaceVal) { return null; },
insertAt: function(textareaEditor, replaceString, perLine, blockLevel) { return null; }
};
';
}
if ($prefs['jquery_ui_modals_draggable'] === 'y') {
$js .= '
$(document).on("shown.bs.modal", function (event) {
$(event.target).find(".modal-dialog")
.css({left: "", top: ""})
.draggable({
handle: ".modal-header",
cursor: "grabbing"
});
});
';
$headerlib->add_css('.modal-header {cursor: grab}');
}
if ($prefs['jquery_ui_modals_resizable'] === 'y') {
$js .= '
$(document).on("tiki.modal.redraw", function (event) {
var $modalContent = $(event.target);
if (! $modalContent.is(".modal-content")) {
$modalContent = $modalContent.find(".modal-content")
}
if ($modalContent.is(".ui-resizable")) {
$modalContent.resizable( "destroy" );
}
$modalContent
.css({width: "", height: ""})
.resizable({
minHeight: 100,
minWidth: 200
})
.find(".modal-body").css({
"overflow": "auto"
});
});';
}
$headerlib->add_js($js);
}
if ($prefs['feature_ajax'] != 'y') {
$prefs['ajax_autosave'] = 'n';
}