From 25140784ac20caf6995f5f2f8a41660a2639c924 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 5 Jul 2018 08:44:08 +0100 Subject: [PATCH 001/241] [I] Add date to active users hit time As idle users can be listed the date is needed as well as the time for last hit in the dashboard 'Online Managers and Members' table --- manager/actions/welcome.static.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/actions/welcome.static.php b/manager/actions/welcome.static.php index f36d7f58c2..045ddfe022 100755 --- a/manager/actions/welcome.static.php +++ b/manager/actions/welcome.static.php @@ -204,7 +204,7 @@ $webicon, abs($activeusers['internalKey']), $ip, - strftime('%H:%M:%S', $activeusers['lasthit'] + $server_offset_time), + strftime($modx->toDateFormat(0,'formatOnly').' %H:%M:%S', $activeusers['lasthit'] + $server_offset_time), $currentaction ); } From 952c85d0a6139c6f610c5c0da3cbe848d64d61b4 Mon Sep 17 00:00:00 2001 From: Mr B Date: Fri, 6 Jul 2018 14:19:12 +0100 Subject: [PATCH 002/241] [I] Action name for dashboard Plus a couple of MODX to EVO ... if they are even used. --- manager/includes/actionlist.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/includes/actionlist.inc.php b/manager/includes/actionlist.inc.php index 7bcc98a5c5..b564716e28 100755 --- a/manager/includes/actionlist.inc.php +++ b/manager/includes/actionlist.inc.php @@ -6,12 +6,12 @@ // action list $GLOBALS['action_list'] = array( '1' => 'Loading a frame(set)', - '2' => 'Viewing home page/ online users', + '2' => 'Viewing dashboard', '3' => 'Viewing data for resource', '4' => 'Creating a resource', '5' => 'Saving resource', '6' => 'Deleting resource', - '7' => 'Waiting while MODX cleans up', + '7' => 'Waiting while EVO cleans up', '8' => 'Logged out', '9' => 'Viewing help', '10' => 'Viewing/ composing messages', @@ -62,7 +62,7 @@ '56' => 'Refresh resource tree', '57' => 'Refresh menu', '58' => 'Logged in', - '59' => 'About MODX', + '59' => 'About EVO', '60' => 'Emptying Recycle Bin', '61' => 'Publishing a resource', '62' => 'Un-publishing a resource', From 0059936582673c7c5d3508d5b22efb8e4e3608eb Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Fri, 8 Jun 2018 19:38:46 +0300 Subject: [PATCH 003/241] Fix notice variables --- assets/plugins/updater/plugin.updater.php | 65 +++++++++++++---------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/assets/plugins/updater/plugin.updater.php b/assets/plugins/updater/plugin.updater.php index 129142abdf..c18a665b84 100755 --- a/assets/plugins/updater/plugin.updater.php +++ b/assets/plugins/updater/plugin.updater.php @@ -23,6 +23,7 @@ $version = isset($version) ? $version : 'evolution-cms/evolution'; $type = isset($type) ? $type : 'tags'; $showButton = isset($showButton) ? $showButton : 'AdminOnly'; +$result = ''; if ($role != 1 && $wdgVisibility == 'AdminOnly') { @@ -207,15 +208,19 @@ switch ($_GET['q']) { case $_SESSION['updatelink']: $currentVersion = $modx->getVersionData(); - $commit = $_GET['sha']; + $commit = isset($_GET['sha']) ? $_GET['sha'] : ''; if ($_SESSION['updateversion'] != $currentVersion['version'] || (isset($commit) && $type == 'commits')) { file_put_contents(MODX_BASE_PATH . 'update.php', 'errors[] = array("ERROR:Download", $e->getMessage()); @@ -257,9 +262,8 @@ function removeFolder($path) return; } - $it = new RecursiveDirectoryIterator($dir); - $files = new RecursiveIteratorIterator($it, - RecursiveIteratorIterator::CHILD_FIRST); + $it = new RecursiveDirectoryIterator($dir); + $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) { if ($file->getFilename() === "." || $file->getFilename() === "..") { continue; @@ -273,10 +277,12 @@ function removeFolder($path) rmdir($dir); } -function copyFolder($src, $dest) -{ - $path = realpath($src); - $dest = realpath($dest); +function copyFolder( + $src, + $dest +) { + $path = realpath($src); + $dest = realpath($dest); $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach ($objects as $name => $object) { @@ -287,13 +293,15 @@ function copyFolder($src, $dest) } if (is_writable($dest . $startsAt) and $object->isFile()) { - copy((string) $name, $dest . $startsAt . DIRECTORY_SEPARATOR . basename($name)); + copy((string)$name, $dest . $startsAt . DIRECTORY_SEPARATOR . basename($name)); } } } -function mmkDir($folder, $perm = 0777) -{ +function mmkDir( + $folder, + $perm = 0777 +) { if (!is_dir($folder)) { mkdir($folder, $perm); } @@ -301,7 +309,7 @@ function mmkDir($folder, $perm = 0777) $version = "' . $version . '"; -downloadFile("https://github.com/".$version."/archive/" . $_GET["version"] . ".zip", "evo.zip"); +downloadFile("https://github.com/" . $version . "/archive/" . $_GET["version"] . ".zip", "evo.zip"); $zip = new ZipArchive; $res = $zip->open(__DIR__ . "/evo.zip"); $zip->extractTo(__DIR__ . "/temp"); @@ -323,23 +331,24 @@ function mmkDir($folder, $perm = 0777) unlink(__DIR__ . "/temp/" . $dir . "/sample-robots.txt"); unlink(__DIR__ . "/temp/" . $dir . "/composer.json"); - -if(is_file(__DIR__ . "/assets/cache/siteManager.php")){ +if (is_file(__DIR__ . "/assets/cache/siteManager.php")) { unlink(__DIR__ . "/temp/" . $dir . "/assets/cache/siteManager.php"); include_once(__DIR__ . "/assets/cache/siteManager.php"); - if(!defined("MGR_DIR")){ define("MGR_DIR","manager"); } - if(MGR_DIR != "manager"){ - mmkDir(__DIR__."/temp/".$dir."/".MGR_DIR); - copyFolder(__DIR__."/temp/".$dir."/manager", __DIR__."/temp/".$dir."/".MGR_DIR); - removeFolder(__DIR__."/temp/".$dir."/manager"); - } + if (!defined("MGR_DIR")) { + define("MGR_DIR", "manager"); + } + if (MGR_DIR != "manager") { + mmkDir(__DIR__ . "/temp/" . $dir . "/" . MGR_DIR); + copyFolder(__DIR__ . "/temp/" . $dir . "/manager", __DIR__ . "/temp/" . $dir . "/" . MGR_DIR); + removeFolder(__DIR__ . "/temp/" . $dir . "/manager"); + } // echo __DIR__."/temp/".$dir."/".MGR_DIR; } -copyFolder(__DIR__."/temp/".$dir, __DIR__."/"); -removeFolder(__DIR__."/temp"); -unlink(__DIR__."/evo.zip"); -unlink(__DIR__."/update.php"); +copyFolder(__DIR__ . "/temp/" . $dir, __DIR__ . "/"); +removeFolder(__DIR__ . "/temp"); +unlink(__DIR__ . "/evo.zip"); +unlink(__DIR__ . "/update.php"); header("Location: ' . constant('MODX_SITE_URL') . 'install/index.php?action=mode");'); if ($result === false){ echo 'Update failed: cannot write to ' . MODX_BASE_PATH . 'update.php'; From 3eda7b7d65abdc49b64280afb9d7ac7b54d55a6e Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Fri, 8 Jun 2018 21:47:55 +0300 Subject: [PATCH 004/241] Fix add images in settings --- .../tab4_manager_settings.inc.php | 115 ++++++++++-------- 1 file changed, 63 insertions(+), 52 deletions(-) diff --git a/manager/actions/mutate_settings/tab4_manager_settings.inc.php b/manager/actions/mutate_settings/tab4_manager_settings.inc.php index 4fac9f68b2..e013186110 100755 --- a/manager/actions/mutate_settings/tab4_manager_settings.inc.php +++ b/manager/actions/mutate_settings/tab4_manager_settings.inc.php @@ -105,33 +105,8 @@
[(login_logo)]
- +
- @@ -143,33 +118,8 @@ function SetUrl(url, width, height, alt) {
[(login_bg)]
- +
- @@ -673,3 +623,64 @@ function SetUrl(url, width, height, alt) { + + \ No newline at end of file From 51f9102e0a02f6fb7aea4b62ce3b87df5c9d868a Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Fri, 8 Jun 2018 22:06:43 +0300 Subject: [PATCH 005/241] Fix theme ajax.php --- manager/media/style/default/ajax.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manager/media/style/default/ajax.php b/manager/media/style/default/ajax.php index 7cd012963f..7918e3a7a7 100755 --- a/manager/media/style/default/ajax.php +++ b/manager/media/style/default/ajax.php @@ -65,7 +65,7 @@ case 'element_templates': $a = 16; $sqlLike = $filter ? 'WHERE t1.templatename LIKE "' . $modx->db->escape($filter) . '%"' : ''; - $sql = $modx->db->query('SELECT t1.*, t1.templatename AS name + $sql = $modx->db->query('SELECT t1.id, t1.templatename AS name, t1.locked, 0 AS disabled FROM ' . $modx->getFullTableName('site_templates') . ' AS t1 ' . $sqlLike . ' ORDER BY t1.templatename ASC @@ -79,7 +79,7 @@ case 'element_tplvars': $a = 301; - $sql = $modx->db->query('SELECT t1.id,t1.name,t1.locked, IF(MIN(t2.tmplvarid),0,1) AS disabled + $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, 0 AS disabled FROM ' . $modx->getFullTableName('site_tmplvars') . ' AS t1 LEFT JOIN ' . $modx->getFullTableName('site_tmplvar_templates') . ' AS t2 ON t1.id=t2.tmplvarid ' . $sqlLike . ' @@ -95,7 +95,7 @@ case 'element_htmlsnippets': $a = 78; - $sql = $modx->db->query('SELECT t1.* + $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, t1.disabled FROM ' . $modx->getFullTableName('site_htmlsnippets') . ' AS t1 ' . $sqlLike . ' ORDER BY t1.name ASC @@ -109,7 +109,7 @@ case 'element_snippets': $a = 22; - $sql = $modx->db->query('SELECT t1.* + $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, t1.disabled FROM ' . $modx->getFullTableName('site_snippets') . ' AS t1 ' . $sqlLike . ' ORDER BY t1.name ASC @@ -123,7 +123,7 @@ case 'element_plugins': $a = 102; - $sql = $modx->db->query('SELECT t1.* + $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, t1.disabled FROM ' . $modx->getFullTableName('site_plugins') . ' AS t1 ' . $sqlLike . ' ORDER BY t1.name ASC From beaa44e113f502798aff73943e542db07015eed7 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Fri, 8 Jun 2018 22:09:35 +0300 Subject: [PATCH 006/241] Fix theme ajax.php --- manager/media/style/default/ajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/style/default/ajax.php b/manager/media/style/default/ajax.php index 7918e3a7a7..e6cd180915 100755 --- a/manager/media/style/default/ajax.php +++ b/manager/media/style/default/ajax.php @@ -79,7 +79,7 @@ case 'element_tplvars': $a = 301; - $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, 0 AS disabled + $sql = $modx->db->query('SELECT t1.id, t1.name, t1.locked, IF(MIN(t2.tmplvarid),0,1) AS disabled FROM ' . $modx->getFullTableName('site_tmplvars') . ' AS t1 LEFT JOIN ' . $modx->getFullTableName('site_tmplvar_templates') . ' AS t2 ON t1.id=t2.tmplvarid ' . $sqlLike . ' From 323ca8d28c965e251dc318d6c84ce74d2b9b1d79 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 9 Jun 2018 01:04:10 +0300 Subject: [PATCH 007/241] Revert getExtension --- manager/includes/functions/actions/files.php | 574 +++++++++++++++++++ 1 file changed, 574 insertions(+) create mode 100644 manager/includes/functions/actions/files.php diff --git a/manager/includes/functions/actions/files.php b/manager/includes/functions/actions/files.php new file mode 100644 index 0000000000..bc6a53b381 --- /dev/null +++ b/manager/includes/functions/actions/files.php @@ -0,0 +1,574 @@ + 'fa fa-file-o', + 'edit' => 'fa fa-pencil-square-o', + 'view' => 'fa fa-eye' + ); + $icon = $icons['default']; + if ($file == $selFile) { + $icon = isset($icons[$mode]) ? $icons[$mode] : $icons['default']; + } + + return ''; + } +} + +if(!function_exists('markRow')) { + /** + * @param string $file + * @param string $selFile + * @param string $mode + * @return string + */ + function markRow($file, $selFile, $mode) + { + $classNames = array( + 'default' => '', + 'edit' => 'editRow', + 'view' => 'viewRow' + ); + if ($file == $selFile) { + $class = isset($classNames[$mode]) ? $classNames[$mode] : $classNames['default']; + + return ' class="' . $class . '"'; + } + + return ''; + } +} + +if(!function_exists('ls')) { + /** + * @param string $curpath + */ + function ls($curpath) + { + global $_lang, $theme_image_path, $_style; + global $excludes, $protected_path, $editablefiles, $inlineviewablefiles, $viewablefiles, $enablefileunzip, $enablefiledownload, $uploadablefiles, $folders, $files, $filesizes, $len, $dirs_array, $files_array, $webstart_path, $modx; + $dircounter = 0; + $filecounter = 0; + $curpath = str_replace('//', '/', $curpath . '/'); + + if (!is_dir($curpath)) { + echo 'Invalid path "', $curpath, '"
'; + + return; + } + $dir = scandir($curpath); + + // first, get info + foreach ($dir as $file) { + $newpath = $curpath . $file; + if ($file === '..' || $file === '.') { + continue; + } + if (is_dir($newpath)) { + $dirs_array[$dircounter]['dir'] = $newpath; + $dirs_array[$dircounter]['stats'] = lstat($newpath); + if ($file === '..' || $file === '.') { + continue; + } elseif (!in_array($file, $excludes) && !in_array($newpath, $protected_path)) { + $dirs_array[$dircounter]['text'] = ' ' . $file . ''; + + $dfiles = scandir($newpath); + foreach ($dfiles as $i => $infile) { + switch ($infile) { + case '..': + case '.': + unset($dfiles[$i]); + break; + } + } + $file_exists = (0 < count($dfiles)) ? 'file_exists' : ''; + + $dirs_array[$dircounter]['delete'] = is_writable($curpath) ? '' : ''; + } else { + $dirs_array[$dircounter]['text'] = ' ' . $file . ''; + $dirs_array[$dircounter]['delete'] = is_writable($curpath) ? '' : ''; + } + + $dirs_array[$dircounter]['rename'] = is_writable($curpath) ? ' ' : ''; + + // increment the counter + $dircounter++; + } else { + $type = getExtension($newpath); + $files_array[$filecounter]['file'] = $newpath; + $files_array[$filecounter]['stats'] = lstat($newpath); + $files_array[$filecounter]['text'] = determineIcon($newpath, $_REQUEST['path'], + $_REQUEST['mode']) . ' ' . $file; + $files_array[$filecounter]['view'] = (in_array($type, + $viewablefiles)) ? '' : (($enablefiledownload && in_array($type, + $uploadablefiles)) ? '' : ''); + $files_array[$filecounter]['view'] = (in_array($type, + $inlineviewablefiles)) ? '' : $files_array[$filecounter]['view']; + $files_array[$filecounter]['unzip'] = ($enablefileunzip && $type == '.zip') ? '' : ''; + $files_array[$filecounter]['edit'] = (in_array($type, + $editablefiles) && is_writable($curpath) && is_writable($newpath)) ? '' : ''; + $files_array[$filecounter]['duplicate'] = (in_array($type, + $editablefiles) && is_writable($curpath) && is_writable($newpath)) ? '' : ''; + $files_array[$filecounter]['rename'] = (in_array($type, + $editablefiles) && is_writable($curpath) && is_writable($newpath)) ? '' : ''; + $files_array[$filecounter]['delete'] = is_writable($curpath) && is_writable($newpath) ? '' : ''; + + // increment the counter + $filecounter++; + } + } + + // dump array entries for directories + $folders = count($dirs_array); + sort($dirs_array); // sorting the array alphabetically (Thanks pxl8r!) + for ($i = 0; $i < $folders; $i++) { + $filesizes += $dirs_array[$i]['stats']['7']; + echo ''; + echo '' . $dirs_array[$i]['text'] . ''; + echo '' . $modx->toDateFormat($dirs_array[$i]['stats']['9']) . ''; + echo '' . $modx->nicesize($dirs_array[$i]['stats']['7']) . ''; + echo ''; + echo $dirs_array[$i]['rename']; + echo $dirs_array[$i]['delete']; + echo ''; + echo ''; + } + + // dump array entries for files + $files = count($files_array); + sort($files_array); // sorting the array alphabetically (Thanks pxl8r!) + for ($i = 0; $i < $files; $i++) { + $filesizes += $files_array[$i]['stats']['7']; + echo ''; + echo '' . $files_array[$i]['text'] . ''; + echo '' . $modx->toDateFormat($files_array[$i]['stats']['9']) . ''; + echo '' . $modx->nicesize($files_array[$i]['stats']['7']) . ''; + echo ''; + echo $files_array[$i]['unzip']; + echo $files_array[$i]['view']; + echo $files_array[$i]['edit']; + echo $files_array[$i]['duplicate']; + echo $files_array[$i]['rename']; + echo $files_array[$i]['delete']; + echo ''; + echo ''; + } + + return; + } +} + +if(!function_exists('removeLastPath')) { + /** + * @param string $string + * @return bool|string + */ + function removeLastPath($string) + { + $pos = strrpos($string, '/'); + if ($pos !== false) { + $path = substr($string, 0, $pos); + } else { + $path = false; + } + + return $path; + } +} + +if(!function_exists('getExtension')) { + /** + * @param string $string + * @return bool|string + * + * @TODO: not work if $string contains folder name with dot + */ + function getExtension($string) + { + $pos = strrpos($string, '.'); + if ($pos !== false) { + $ext = substr($string, $pos); + $ext = strtolower($ext); + } else { + $ext = false; + } + + return $ext; + } +} + +if(!function_exists('checkExtension')) { + /** + * @param string $path + * @return bool + */ + function checkExtension($path = '') + { + global $uploadablefiles; + + if (in_array(getExtension($path), $uploadablefiles)) { + return true; + } else { + return false; + } + } +} + +if(!function_exists('mkdirs')) { + /** + * recursive mkdir function + * + * @param string $strPath + * @param int $mode + * @return bool + */ + function mkdirs($strPath, $mode) + { + if (is_dir($strPath)) { + return true; + } + $pStrPath = dirname($strPath); + if (!mkdirs($pStrPath, $mode)) { + return false; + } + + return @mkdir($strPath); + } +} + +if(!function_exists('logFileChange')) { + /** + * @param string $type + * @param string $filename + */ + function logFileChange($type, $filename) + { + //global $_lang; + + $log = new EvolutionCMS\Legacy\LogHandler(); + + switch ($type) { + case 'upload': + $string = 'Uploaded File'; + break; + case 'delete': + $string = 'Deleted File'; + break; + case 'modify': + $string = 'Modified File'; + break; + default: + $string = 'Viewing File'; + break; + } + + $string = sprintf($string, $filename); + $log->initAndWriteLog($string, '', '', '', $type, $filename); + + // HACK: change the global action to prevent double logging + // @see index.php @ 915 + global $action; + $action = 1; + } +} + +if(!function_exists('unzip')) { + /** + * by patrick_allaert - php user notes + * + * @param string $file + * @param string $path + * @return bool|int + */ + function unzip($file, $path) + { + global $newfolderaccessmode, $token_check; + + if (!$token_check) { + return false; + } + + // added by Raymond + if (!extension_loaded('zip')) { + return 0; + } + // end mod + $zip = zip_open($file); + if ($zip) { + $old_umask = umask(0); + $path = rtrim($path, '/') . '/'; + while ($zip_entry = zip_read($zip)) { + if (zip_entry_filesize($zip_entry) > 0) { + // str_replace must be used under windows to convert "/" into "\" + $zip_entry_name = zip_entry_name($zip_entry); + $complete_path = $path . str_replace('\\', '/', dirname($zip_entry_name)); + $complete_name = $path . str_replace('\\', '/', $zip_entry_name); + if (!file_exists($complete_path)) { + $tmp = ''; + foreach (explode('/', $complete_path) AS $k) { + $tmp .= $k . '/'; + if (!is_dir($tmp)) { + mkdir($tmp, 0777); + } + } + } + if (zip_entry_open($zip, $zip_entry, 'r')) { + file_put_contents($complete_name, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry))); + zip_entry_close($zip_entry); + } + } + } + umask($old_umask); + zip_close($zip); + + return true; + } + zip_close($zip); + } +} + +if(!function_exists('rrmdir')) { + /** + * @param string $dir + * @return bool + */ + function rrmdir($dir) + { + foreach (glob($dir . '/*') as $file) { + if (is_dir($file)) { + rrmdir($file); + } else { + unlink($file); + } + } + + return rmdir($dir); + } +} + +if(!function_exists('fileupload')) { + /** + * @return string + */ + function fileupload() + { + $modx = evolutionCMS(); + global $_lang, $startpath, $filemanager_path, $uploadablefiles, $new_file_permissions; + $msg = ''; + foreach ($_FILES['userfile']['name'] as $i => $name) { + if (empty($_FILES['userfile']['tmp_name'][$i])) { + continue; + } + $userfile = array(); + + $userfile['tmp_name'] = $_FILES['userfile']['tmp_name'][$i]; + $userfile['error'] = $_FILES['userfile']['error'][$i]; + $name = $_FILES['userfile']['name'][$i]; + if ($modx->config['clean_uploaded_filename'] == 1) { + $nameparts = explode('.', $name); + $nameparts = array_map(array( + $modx, + 'stripAlias' + ), $nameparts, array('file_manager')); + $name = implode('.', $nameparts); + } + $userfile['name'] = $name; + $userfile['type'] = $_FILES['userfile']['type'][$i]; + + // this seems to be an upload action. + $path = $modx->config['site_url'] . substr($startpath, strlen($filemanager_path), strlen($startpath)); + $path = rtrim($path, '/') . '/' . $userfile['name']; + $msg .= $path; + if ($userfile['error'] == 0) { + $img = (strpos($userfile['type'], + 'image') !== false) ? '
' : ''; + $msg .= "

" . $_lang['files_file_type'] . $userfile['type'] . ", " . $modx->nicesize(filesize($userfile['tmp_name'])) . $img . '

'; + } + + $userfilename = $userfile['tmp_name']; + + if (is_uploaded_file($userfilename)) { + // file is uploaded file, process it! + if (!checkExtension($userfile['name'])) { + $msg .= '

' . $_lang['files_filetype_notok'] . '

'; + } else { + if (@move_uploaded_file($userfile['tmp_name'], $_POST['path'] . '/' . $userfile['name'])) { + // Ryan: Repair broken permissions issue with file manager + if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') { + @chmod($_POST['path'] . "/" . $userfile['name'], $new_file_permissions); + } + // Ryan: End + $msg .= '

' . $_lang['files_upload_ok'] . '


'; + + // invoke OnFileManagerUpload event + $modx->invokeEvent('OnFileManagerUpload', array( + 'filepath' => $_POST['path'], + 'filename' => $userfile['name'] + )); + // Log the change + logFileChange('upload', $_POST['path'] . '/' . $userfile['name']); + } else { + $msg .= '

' . $_lang['files_upload_copyfailed'] . ' ' . $_lang["files_upload_permissions_error"] . '

'; + } + } + } else { + $msg .= '
' . $_lang['files_upload_error'] . ':'; + switch ($userfile['error']) { + case 0: //no error; possible file attack! + $msg .= $_lang['files_upload_error0']; + break; + case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini + $msg .= $_lang['files_upload_error1']; + break; + case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form + $msg .= $_lang['files_upload_error2']; + break; + case 3: //uploaded file was only partially uploaded + $msg .= $_lang['files_upload_error3']; + break; + case 4: //no file was uploaded + $msg .= $_lang['files_upload_error4']; + break; + default: //a default error, just in case! :) + $msg .= $_lang['files_upload_error5']; + break; + } + $msg .= '
'; + } + } + + return $msg . '
'; + } +} + +if(!function_exists('textsave')) { + /** + * @return string + */ + function textsave() + { + global $_lang; + + $msg = $_lang['editing_file']; + $filename = $_POST['path']; + $content = $_POST['content']; + + // Write $content to our opened file. + if (file_put_contents($filename, $content) === false) { + $msg .= '' . $_lang['file_not_saved'] . '

'; + } else { + $msg .= '' . $_lang['file_saved'] . '

'; + $_REQUEST['mode'] = 'edit'; + } + // Log the change + logFileChange('modify', $filename); + + return $msg; + } +} + +if(!function_exists('delete_file')) { + /** + * @return string + */ + function delete_file() + { + global $_lang, $token_check; + + $msg = sprintf($_lang['deleting_file'], str_replace('\\', '/', $_REQUEST['path'])); + + $file = $_REQUEST['path']; + if (!$token_check || !@unlink($file)) { + $msg .= '' . $_lang['file_not_deleted'] . '

'; + } else { + $msg .= '' . $_lang['file_deleted'] . '

'; + } + + // Log the change + logFileChange('delete', $file); + + return $msg; + } +} + +if(!function_exists('parsePlaceholder')) { + /** + * @param string $tpl + * @param array $ph + * @return string + */ + function parsePlaceholder($tpl, $ph) + { + foreach ($ph as $k => $v) { + $k = "[+{$k}+]"; + $tpl = str_replace($k, $v, $tpl); + } + + return $tpl; + } +} + +if(!function_exists('checkToken')) { + /** + * @return bool + */ + function checkToken() + { + if (isset($_POST['token']) && !empty($_POST['token'])) { + $token = $_POST['token']; + } elseif (isset($_GET['token']) && !empty($_GET['token'])) { + $token = $_GET['token']; + } else { + $token = false; + } + + if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] === $token) { + $rs = true; + } else { + $rs = false; + } + $_SESSION['token'] = ''; + + return $rs; + } +} + +if(!function_exists('makeToken')) { + /** + * @return string + */ + function makeToken() + { + $newToken = uniqid(''); + $_SESSION['token'] = $newToken; + + return $newToken; + } +} From 9d322ab6de08976d6d2eb943bdbf15648eac6729 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 9 Jun 2018 03:36:19 +0300 Subject: [PATCH 008/241] Fix style left-menu position --- manager/media/style/default/css/mainmenu.css | 336 ++++--------------- 1 file changed, 63 insertions(+), 273 deletions(-) diff --git a/manager/media/style/default/css/mainmenu.css b/manager/media/style/default/css/mainmenu.css index 85855821c3..0dc756e078 100755 --- a/manager/media/style/default/css/mainmenu.css +++ b/manager/media/style/default/css/mainmenu.css @@ -145,284 +145,74 @@ border: none !important; border-left: 1px solid rgba(0, 0, 0, 0.05) !important; /* darkness */ .darkness #mainMenu { -webkit-box-shadow: 0 0.25rem 0.25rem rgba(0, 0, 0, 0.3); box-shadow: 0 0.25rem 0.25rem rgba(0, 0, 0, 0.3); } .darkness #mainMenu { background-color: #202329; color: #bbb; } -.darkness #mainMenu .nav > li > a, .darkness #mainMenu .nav .label_searchid { color: #bbb; } -.darkness #mainMenu.show .nav > li.dropdown.hover > a { color: #eee; background-color: #343942; } -.darkness #mainMenu .nav > li > ul { background-color: #343942; } -.darkness #mainMenu .nav > li > ul > li > a:first-child, .darkness #mainMenu .nav > li > ul > li > span { color: #eee; } -#mainMenu .nav > li > ul > li > span:hover { background-color: inherit; } -.darkness #mainMenu .nav li.item-group > * { background-color: transparent } +.darkness #mainMenu .nav > li > a, .darkness #mainMenu .nav .label_searchid, .dark.navbar-left #mainMenu .nav > li > a { color: #bbb; } +.darkness #mainMenu.show .nav > li.dropdown.hover > a, .dark.navbar-left #mainMenu.show .nav > li.dropdown.hover > a { color: #eee; background-color: #343942; } +.darkness #mainMenu .nav > li > ul, .dark.navbar-left #mainMenu .nav > li > ul { background-color: #343942; } +.darkness #mainMenu .nav > li > ul > li > a:first-child, .darkness #mainMenu .nav > li > ul > li > span, .dark.navbar-left #mainMenu .nav > li > ul > li > a:first-child, .dark.navbar-left #mainMenu .nav > li > ul > li > span, .dark.navbar-left #mainMenu .nav li.item-group > * { color: #eee; } +.darkness #mainMenu .nav > li > ul > li > span:hover { background-color: inherit; } +.darkness #mainMenu .nav li.item-group > *, .dark.navbar-left #mainMenu .nav li.item-group > * { background-color: transparent } .darkness #searchresult { background-color: #202329; border-left: 1px solid #282c34; } .darkness #searchresult .ajaxSearchResults b { background-color: #1a1c21; } .darkness #searchresult .ajaxSearchResults b, .darkness #searchresult .ajaxSearchResults strong, .darkness #searchresult .ajaxSearchResults a { border-color: #282c34; color: #aaa; } .darkness #searchresult .ajaxSearchResults a:hover { background-color: #343942; } .darkness #searchresult .ajaxSearchResults .disabled a { color: #da4439; } /* navbar left */ -@media (min-width: 768px) and (min-height: 568px) { - .navbar-left #tree, - .navbar-left #main { - top: 0; - } - .navbar-left #tree { - left: 3rem; - } - .navbar-left #main, - .navbar-left #resizer { - left: 23rem; - } - .navbar-left.sidebar-closed #main { - left: 3rem !important; - } - .navbar-left #mainMenu { - width: 3rem; - height: 100%; - } - .navbar-left #mainMenu > .container { - display: block; - padding-left: 0; - padding-right: 0; - } - .navbar-left #mainMenu > .container > .row { - display: block; - margin-left: 0; - margin-right: 0; - } - .navbar-left #mainMenu > .container > .row > .cell { - display: block; - } - .navbar-left #mainMenu #nav, - .navbar-left #mainMenu #settings { - float: none; - } - .navbar-left #mainMenu #settings { - margin-top: 0.5rem; - padding-top: 0.5rem; - border-top: 1px solid rgba(255,255,255,0.15); - } - .navbar-left #mainMenu .nav > li { - position: relative; - display: block; - text-align: center; - /*border-bottom: 1px solid rgba(255,255,255,0.05);*/ - } - .navbar-left #mainMenu .nav > li > a { - height: auto; - } - .navbar-left #mainMenu #nav > li > a, - .navbar-left #mainMenu #settings > li > a { - padding: 0; - } - .navbar-left #mainMenu #nav > li > a > .fa { - display: inline-block; - } - .navbar-left #mainMenu #nav > li > a > .fa, - .navbar-left #mainMenu #searchform .fa, - .navbar-left #mainMenu #preview .fa, - .navbar-left #mainMenu #nav > li > .fa, - .navbar-left #mainMenu #nav > li > a > .fa, - .navbar-left #mainMenu #system > a > .fa { - font-size: 0.875rem; - } - .navbar-left #mainMenu .nav > li > ul, - .navbar-left #mainMenu #settings.nav > li > ul { - top: 0; - left: 3rem !important; - right: auto; - border-radius: 0 0.25rem 0.25rem 0; - } - .navbar-left #mainMenu #nav.nav > #bars, - .navbar-left #mainMenu #settings.nav > #account, - .navbar-left #mainMenu #settings.nav > #system, - .navbar-left #mainMenu #settings.nav > #fullscreen { - position: absolute; - width: 3rem; - } - .navbar-left #mainMenu #settings.nav > #account { - bottom: 0.5rem; - } - .navbar-left #mainMenu #nav.nav > #bars { - top: 2.75rem; - } - .navbar-left #mainMenu #settings.nav > #system { - bottom: 2.75rem; - } - .navbar-left #mainMenu #settings.nav > #fullscreen { - bottom: 5rem; - } - .navbar-left #mainMenu #settings.nav > #account > ul, - .navbar-left #mainMenu #settings.nav > #system > ul { - top: auto; - bottom: 0; - } - .navbar-left #mainMenu .nav > li > .sub-menu { - left: 16rem !important; - border-radius: 0.25rem; - } - .navbar-left #mainMenu .menu-item-text, - .navbar-left #mainMenu .username { - display: none; - } - .navbar-left #mainMenu .icon, - .navbar-left #mainMenu .icon.photo, - .navbar-left #mainMenu .nav > li > a .icon { - margin-top: 0; - margin-left: 0; - } - .navbar-left #mainMenu #nav #bars { - width: 100%; - } - .navbar-left #mainMenu #nav #site { - padding-top: 5rem; - } - .navbar-left #mainMenu #nav #site a { - position: static; - padding: 0; - } - .navbar-left #mainMenu #nav #site a::before { - display: block; - content: ""; - position: absolute; - top: 0.5rem; - left: auto; - width: 100%; - height: 2.25rem; - margin-top: 0; - margin-bottom: 0; - background-color: transparent; - background-repeat: no-repeat; - background-position: 50% 50%; - background-size: 2.25rem; - background-image: url("../images/misc/logo-navbar-left.png"); - } - .navbar-left #mainMenu #searchform input, - .navbar-left #mainMenu #searchform .mask { - left: 0; - right: auto; - } - .navbar-left #mainMenu #searchform .mask { - display: none; - width: 15.75rem; - height: 2.6rem; - } - .navbar-left #searchresult { - top: 0; - } - /* theme modes */ - .navbar-left.lightness #mainMenu { - -webkit-box-shadow: 0 2px 0 1px rgba(0,0,0,0.15); - box-shadow: 0 2px 0 1px rgba(0,0,0,0.15); - } - .navbar-left.lightness #mainMenu .nav > li { - /*border-bottom-color: rgba(0,0,0,0.05);*/ - } - .navbar-left.light .treeframebody { - background-color: #f3f3f3; - } - .navbar-left.dark #mainMenu { - -webkit-box-shadow: 0 2px 0 1px rgba(0,0,0,0.4); - box-shadow: 0 2px 0 1px rgba(0,0,0,0.4); - background-color: #17191e; - } - .navbar-left.dark #mainMenu .nav > li > a, - .navbar-left.dark #mainMenu .nav .label_searchid { - color: #dcd9e3; - } - .navbar-left.darkness #mainMenu { - -webkit-box-shadow: 0 2px 0 1px rgba(255,255,255,0.2); - box-shadow: 0 2px 0 1px rgba(255,255,255,0.2); - background-color: #17191e; - } - .navbar-left.light #mainMenu #nav #site a::before, - .navbar-left.dark #mainMenu #nav #site a::before, - .navbar-left.darkness #mainMenu #nav #site a::before { - background-image: url("../images/misc/logo-navbar-left-white.png"); - } - .navbar-left.lightness #mainMenu #settings { - border-top: 1px solid rgba(0,0,0,0.1); - } +@media (min-width: 768px) { +.navbar-left #resizer { top: 1.9rem; } +.navbar-left #tree, .navbar-left #main { top: 0; } +.navbar-left #tree { padding-left: 3rem; } +.navbar-left.sidebar-closed #tree { padding-left: 0; } +.navbar-left.sidebar-closed #main { left: 3rem !important; } +.navbar-left #mainMenu { width: 3rem; height: 100%; } +.navbar-left #mainMenu > .container { display: block; padding-left: 0; padding-right: 0; } +.navbar-left #mainMenu > .container > .row { display: block; margin-left: 0; margin-right: 0; } +.navbar-left #mainMenu > .container > .row > .cell { display: block; } +.navbar-left #mainMenu #nav, .navbar-left #mainMenu #settings { float: none; } +.navbar-left #mainMenu #settings { margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid rgba(255, 255, 255, 0.15); } +.navbar-left #mainMenu .nav > li { position: static; display: block; text-align: center; } +.navbar-left #mainMenu .nav > li > a { height: auto; } +.navbar-left #mainMenu #nav > li > a, .navbar-left #mainMenu #settings > li > a { padding: 0; } +.navbar-left #mainMenu #settings > li > a { padding: .5rem 0 } +.navbar-left #mainMenu #nav > li > a > .fa { display: inline-block; } +.navbar-left #mainMenu #nav > li > a > .fa, .navbar-left #mainMenu #searchform .fa, .navbar-left #mainMenu #preview .fa, .navbar-left #mainMenu #nav > li > .fa, .navbar-left #mainMenu #nav > li > a > .fa, .navbar-left #mainMenu #system > a > .fa { font-size: 0.875rem; } +.navbar-left #mainMenu .nav > li > ul, .navbar-left #mainMenu #settings.nav > li > ul { left: 3rem; top: 0; right: auto; bottom: 0; max-height: 100%; min-width: 20rem; padding: 0; border-radius: 0; } +.navbar-left #mainMenu #settings.nav > li > ul { max-height: none; } +.navbar-left #mainMenu #settings.nav > #account, .navbar-left #mainMenu #settings.nav > #system, .navbar-left #mainMenu #settings.nav > #fullscreen { position: absolute; width: 3rem; } +.navbar-left #mainMenu #settings.nav > #account { bottom: 0; } +.navbar-left #mainMenu #settings.nav > #system { bottom: 3.2rem; } +.navbar-left #mainMenu #settings.nav > #fullscreen { bottom: 5rem; } +.navbar-left #mainMenu #settings.nav > #account > ul, .navbar-left #mainMenu #settings.nav > #system > ul { top: auto; bottom: 0; } +.navbar-left #mainMenu #settings.nav > #system > ul { bottom: -5rem; } +.navbar-left #mainMenu .nav > li > .sub-menu { margin-left: 3rem; border-radius: 0; } +.navbar-left #mainMenu .menu-item-text, .navbar-left #mainMenu .username { display: none; } +.navbar-left #mainMenu .icon, .navbar-left #mainMenu .icon.photo, .navbar-left #mainMenu .nav > li > a .icon { margin-top: 0; margin-left: 0; } +.navbar-left #mainMenu #nav #bars { width: 100%; } +.navbar-left #mainMenu #nav #site a { position: static; padding: 0.5rem 0; } +.navbar-left #mainMenu #nav #site a::before { display: block; content: ""; left: auto; width: 100%; height: 2.25rem; background: transparent url("../images/misc/logo-navbar-left.png") no-repeat 50% 50%; background-size: 2.25rem; } +.navbar-left #mainMenu #nav #site a i { display: none; } +.navbar-left #mainMenu #searchform input, .navbar-left #mainMenu #searchform .mask { left: 0; right: auto; } +.navbar-left #mainMenu #searchform .mask { display: none; width: 15.75rem; height: 2.6rem; } +.navbar-left #searchresult { top: 0; } +/* theme modes */ +.navbar-left.lightness #mainMenu { -webkit-box-shadow: 0 2px 0 1px rgba(0, 0, 0, 0.15); box-shadow: 0 2px 0 1px rgba(0, 0, 0, 0.15); } +.navbar-left.lightness #mainMenu .nav > li { /*border-bottom-color: rgba(0,0,0,0.05);*/ } +.navbar-left.light .treeframebody { background-color: #f3f3f3; } +.navbar-left.dark #mainMenu { -webkit-box-shadow: 0 2px 0 1px rgba(255, 255, 255, 0.07); box-shadow: 0 2px 0 1px rgba(255, 255, 255, 0.07); background-color: #17191e; } +.navbar-left.dark #mainMenu .nav > li > a, .navbar-left.dark #mainMenu .nav .label_searchid { color: #dcd9e3; } +.navbar-left.darkness #mainMenu { -webkit-box-shadow: 0 2px 0 1px rgba(255, 255, 255, 0.07); box-shadow: 0 2px 0 1px rgba(255, 255, 255, 0.07); background-color: #17191e; } +.navbar-left.light #mainMenu #nav #site a::before, .navbar-left.dark #mainMenu #nav #site a::before, .navbar-left.darkness #mainMenu #nav #site a::before { background-image: url("../images/misc/logo-navbar-left-white.png"); } +.navbar-left.lightness #mainMenu #settings { border-top: 1px solid rgba(0, 0, 0, 0.1); } } -@media (min-width: 1200px) and (min-height: 720px) { - .navbar-left #tree { - left: 5rem; - } - .navbar-left #main, - .navbar-left #resizer { - left: 25rem; - } - .navbar-left.sidebar-closed #main { - left: 5rem !important; - } - .navbar-left #mainMenu { - width: 5rem; - } - .navbar-left #mainMenu #nav > li > a > .fa, - .navbar-left #mainMenu #searchform .fa, - .navbar-left #mainMenu #preview .fa, - .navbar-left #mainMenu #nav > li > .fa, - .navbar-left #mainMenu #nav > li > a > .fa, - .navbar-left #mainMenu #system > a > .fa { - font-size: 1.125rem; - } - .navbar-left #mainMenu .nav > li > ul, - .navbar-left #mainMenu #settings.nav > li > ul { - left: 5rem !important; - } - .navbar-left #mainMenu #nav.nav > #bars, - .navbar-left #mainMenu #settings.nav > #account, - .navbar-left #mainMenu #settings.nav > #system, - .navbar-left #mainMenu #settings.nav > #fullscreen { - width: 5rem; - } - .navbar-left #mainMenu #settings.nav > #account { - bottom: 1rem; - } - .navbar-left #mainMenu #settings.nav > #system { - bottom: 3.5rem; - } - .navbar-left #mainMenu #nav.nav > #bars { - top: 4rem; - } - .navbar-left #mainMenu #settings.nav > #fullscreen { - bottom: 6rem; - } - .navbar-left #mainMenu #nav #site { - padding-top: 6.75rem; - } - .navbar-left #mainMenu #nav #site a::before { - top: 1rem; - height: 3rem; - background-size: 3rem; - } - /* icons + text */ - .navbar-left-icon-and-text #mainMenu .menu-item-text { - display: block; - margin-top: 0.5rem; - font-size: 0.6875rem; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding: 0 0.3125rem; - } - .navbar-left-icon-and-text #mainMenu .nav > #site > a, - .navbar-left-icon-and-text #mainMenu .nav > #elements > a, - .navbar-left-icon-and-text #mainMenu .nav > #modules > a, - .navbar-left-icon-and-text #mainMenu .nav > #users > a, - .navbar-left-icon-and-text #mainMenu .nav > #tools > a, - .navbar-left-icon-and-text #mainMenu .nav > #site > a .fa, - .navbar-left-icon-and-text #mainMenu .nav > #elements > a .fa, - .navbar-left-icon-and-text #mainMenu .nav > #modules > a .fa, - .navbar-left-icon-and-text #mainMenu .nav > #users > a .fa, - .navbar-left-icon-and-text #mainMenu .nav > #tools > a .fa { - line-height: 1em; - } - .navbar-left-icon-and-text #mainMenu .nav > #site > a, - .navbar-left-icon-and-text #mainMenu .nav > #elements > a, - .navbar-left-icon-and-text #mainMenu .nav > #modules > a, - .navbar-left-icon-and-text #mainMenu .nav > #users > a, - .navbar-left-icon-and-text #mainMenu .nav > #tools > a { - padding-top: 0.75rem !important; - padding-bottom: 0.75rem !important; - } - .navbar-left #mainMenu .nav > li > .sub-menu { - left: 18rem !important; - } +@media (min-width: 1200px) { +.navbar-left #tree { padding-left: 5rem; } +.navbar-left.sidebar-closed #main { left: 5rem !important; } +.navbar-left #mainMenu, .navbar-left #mainMenu #nav.nav > #bars, .navbar-left #mainMenu #settings.nav > #account, .navbar-left #mainMenu #settings.nav > #system { width: 5rem; } +.navbar-left #mainMenu #nav #site::before { display: none; } +.navbar-left #mainMenu #nav #site a { margin-left: 0; } +.navbar-left #mainMenu #nav > li > a > .fa, .navbar-left #mainMenu #searchform .fa, .navbar-left #mainMenu #preview .fa, .navbar-left #mainMenu #nav > li > .fa, .navbar-left #mainMenu #nav > li > a > .fa, .navbar-left #mainMenu #system > a > .fa { font-size: 1.125rem; } +.navbar-left #mainMenu .menu-item-text, .navbar-left #mainMenu .username { display: block; font-size: 0.6875rem; line-height: 1em; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 0 0.3125rem .5rem; } +.navbar-left #mainMenu #nav #site a .menu-item-text { padding-top: .5rem; padding-bottom: 0; } +.navbar-left #mainMenu #settings.nav > #system { bottom: 5rem; } +.navbar-left #mainMenu .nav > li > ul, .navbar-left #mainMenu #settings.nav > li > ul { left: 5rem; } +.navbar-left #mainMenu .nav > li > .sub-menu { margin-left: 5rem; } } From 9a64f25aadd3afeab7e6988802b27365bd4dffad Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 9 Jun 2018 03:45:15 +0300 Subject: [PATCH 009/241] Fix style left-menu position --- manager/media/style/default/css/mainmenu.css | 2 +- manager/media/style/default/css/tree.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/css/mainmenu.css b/manager/media/style/default/css/mainmenu.css index 0dc756e078..a6b32af1aa 100755 --- a/manager/media/style/default/css/mainmenu.css +++ b/manager/media/style/default/css/mainmenu.css @@ -149,7 +149,7 @@ border: none !important; border-left: 1px solid rgba(0, 0, 0, 0.05) !important; .darkness #mainMenu.show .nav > li.dropdown.hover > a, .dark.navbar-left #mainMenu.show .nav > li.dropdown.hover > a { color: #eee; background-color: #343942; } .darkness #mainMenu .nav > li > ul, .dark.navbar-left #mainMenu .nav > li > ul { background-color: #343942; } .darkness #mainMenu .nav > li > ul > li > a:first-child, .darkness #mainMenu .nav > li > ul > li > span, .dark.navbar-left #mainMenu .nav > li > ul > li > a:first-child, .dark.navbar-left #mainMenu .nav > li > ul > li > span, .dark.navbar-left #mainMenu .nav li.item-group > * { color: #eee; } -.darkness #mainMenu .nav > li > ul > li > span:hover { background-color: inherit; } +.darkness #mainMenu .nav > li > ul > li > span:hover, .dark.navbar-left #mainMenu .nav > li > ul > li > span:hover { background-color: inherit; } .darkness #mainMenu .nav li.item-group > *, .dark.navbar-left #mainMenu .nav li.item-group > * { background-color: transparent } .darkness #searchresult { background-color: #202329; border-left: 1px solid #282c34; } .darkness #searchresult .ajaxSearchResults b { background-color: #1a1c21; } diff --git a/manager/media/style/default/css/tree.css b/manager/media/style/default/css/tree.css index d6c9d5e84f..38c13a6824 100755 --- a/manager/media/style/default/css/tree.css +++ b/manager/media/style/default/css/tree.css @@ -77,4 +77,4 @@ /* darkness */ .darkness #tree .treeframebody { background-color: #202329; border-color: #414449; } .darkness #treeMenu { background-color: #1a1c21; border-color: #414449; } -.darkness #mainMenu .nav > li > ul > li { border-bottom-color: rgba(0, 0, 0, 0.15); } +.darkness #mainMenu .nav > li > ul > li, .dark.navbar-left #mainMenu .nav > li > ul > li { border-bottom-color: rgba(0, 0, 0, 0.15); } From 44ff0ff104887cf4aa4c7fee57fef3c702249807 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 11 Jun 2018 11:49:08 +0300 Subject: [PATCH 010/241] Fix #722 --- manager/media/style/default/ajax.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manager/media/style/default/ajax.php b/manager/media/style/default/ajax.php index e6cd180915..4ef51b2d3d 100755 --- a/manager/media/style/default/ajax.php +++ b/manager/media/style/default/ajax.php @@ -169,6 +169,11 @@ $sqlLike = $filter ? 'WHERE t1.username LIKE "' . $modx->db->escape($filter) . '%"' : ''; $sqlLimit = $sqlLike ? '' : 'LIMIT ' . $limit; + if(!$modx->hasPermission('save_role')) { + $sqlLike .= $sqlLike ? ' AND ' : 'WHERE '; + $sqlLike .= 't2.role != 1'; + } + $sql = $modx->db->query('SELECT t1.*, t1.username AS name, t2.blocked FROM ' . $modx->getFullTableName('manager_users') . ' AS t1 LEFT JOIN ' . $modx->getFullTableName('user_attributes') . ' AS t2 ON t1.id=t2.internalKey From 55b91f6f4add5f63638d0e15dcb717be4ab1b56c Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 11 Jun 2018 12:05:37 +0300 Subject: [PATCH 011/241] Fix #722 --- manager/processors/save_user.processor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/processors/save_user.processor.php b/manager/processors/save_user.processor.php index ae20f92be2..db329229f8 100755 --- a/manager/processors/save_user.processor.php +++ b/manager/processors/save_user.processor.php @@ -56,8 +56,8 @@ // verify admin security if($_SESSION['mgrRole'] != 1) { // Check to see if user tried to spoof a "1" (admin) role - if(!$modx->hasPermission('save_role')) { - webAlertAndQuit("Illegal attempt to create/modify administrator by non-administrator!"); + if(!$modx->hasPermission('save_user')) { + webAlertAndQuit("Illegal attempt to create/modify administrator by non-administrator!", 12); } // Verify that the user being edited wasn't an admin and the user ID got spoofed $rs = $modx->db->select('count(internalKey)', $tbl_user_attributes, "internalKey='{$id}' AND role=1"); From 4d909750f1c4ae28e0a25f36bca9104acb0e4347 Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Tue, 12 Jun 2018 19:19:02 +0300 Subject: [PATCH 012/241] fix validator in FormLister --- assets/snippets/FormLister/lib/Validator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/snippets/FormLister/lib/Validator.php b/assets/snippets/FormLister/lib/Validator.php index f865b6feb0..ff9630096a 100644 --- a/assets/snippets/FormLister/lib/Validator.php +++ b/assets/snippets/FormLister/lib/Validator.php @@ -113,7 +113,7 @@ public static function alpha($value) */ public static function numeric($value) { - var_dump($value); + //var_dump($value); return (bool) is_scalar($value) && preg_match('#^[0-9]*$#',$value); } From 239fda8a2df46537ea483dd7719f03deebc85e94 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Tue, 12 Jun 2018 21:40:32 +0300 Subject: [PATCH 013/241] Fix html --- manager/actions/mutate_content.dynamic.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 55c2714d57..20a170b0f4 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -1117,28 +1117,29 @@ function SetUrl(url, width, height, alt) {

' . $_lang['settings_templvars'] . '

-
'; } - $templateVariables .= $templateVariablesOutput; - $templateVariables .= ' + if ($templateVariablesOutput) { + $templateVariables .= $templateVariablesOutput; + $templateVariables .= '
' . "\n"; - if ($group_tvs == 1) { - $templateVariables .= ' + if ($group_tvs == 1) { + $templateVariables .= '
' . "\n"; - } else if ($group_tvs == 2 || $group_tvs == 4) { - $templateVariables .= ' + } else if ($group_tvs == 2 || $group_tvs == 4) { + $templateVariables .= ' ' . "\n"; - } else if ($group_tvs == 3) { - $templateVariables .= ' + } else if ($group_tvs == 3) { + $templateVariables .= ' ' . "\n"; + } } $templateVariables .= ' ' . "\n"; @@ -1146,7 +1147,7 @@ function SetUrl(url, width, height, alt) { } // Template Variables - if ($modx->config['group_tvs'] < 3) { + if ($group_tvs < 3) { echo $templateVariables; } ?> From b5b88d912dd53193ad99518b52581c1b04615c3b Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Wed, 13 Jun 2018 01:23:54 +0300 Subject: [PATCH 014/241] Save and close global tabs --- manager/media/style/default/js/modx.js | 3 ++- manager/media/style/default/js/modx.min.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index a7c95b31d7..52b7f95999 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1491,6 +1491,7 @@ this.timer = null; this.olduid = ''; this.closeactions = [6, 61, 62, 63, 94]; + this.saveAndCloseActions = [3, 75, 76, 86, 99, 106]; this.reload = typeof a.reload !== 'undefined' ? a.reload : 1; this.action = modx.getActionFromUrl(a.url); this.uid = modx.getActionFromUrl(a.url, 2) ? 'home' : modx.urlToUid(a.url); @@ -1608,7 +1609,7 @@ } }); } else { - if (modx.getActionFromUrl(this.url, 2)) { + if (modx.getActionFromUrl(this.url, 2) || (~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url)) && parseInt(modx.main.getQueryVariable('r', this.url)))) { this.close(e); } else if (this.olduid !== this.uid && d.getElementById('evo-tab-' + this.uid)) { this.close(e); diff --git a/manager/media/style/default/js/modx.min.js b/manager/media/style/default/js/modx.min.js index c395b1d38f..65f4801145 100755 --- a/manager/media/style/default/js/modx.min.js +++ b/manager/media/style/default/js/modx.min.js @@ -1 +1 @@ -(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML='';}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); +(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,76,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file From 3d178f6543f9c0296b5c14d995e55348f058011d Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Wed, 13 Jun 2018 01:40:09 +0300 Subject: [PATCH 015/241] fix #727 --- manager/processors/save_settings.processor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/processors/save_settings.processor.php b/manager/processors/save_settings.processor.php index ebe7c6f654..1c98a301fe 100755 --- a/manager/processors/save_settings.processor.php +++ b/manager/processors/save_settings.processor.php @@ -70,7 +70,7 @@ foreach ($data as $k => $v) { switch ($k) { case 'site_name': - $v = htmlspecialchars($v); + $v = htmlentities($v, ENT_COMPAT | ENT_SUBSTITUTE, $modx->config['modx_charset'], false); break; case 'settings_version':{ if($modx->getVersionData('version')!=$data['settings_version']){ From 4143fea6b3a77d07c2182b4a458e61a2f463ed8b Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Wed, 13 Jun 2018 10:16:32 +0300 Subject: [PATCH 016/241] remove docs from core #366 --- .../FormLister/docs/en/010_Controllers.md | 50 --- .../FormLister/docs/en/020_Parameters.md | 298 ------------------ .../FormLister/docs/en/030_Data_Validation.md | 132 -------- .../FormLister/docs/en/035_Captcha_Usage.md | 43 --- .../FormLister/docs/en/040_Data_Output.md | 59 ---- .../FormLister/docs/en/050_Mail_Sending.md | 239 -------------- .../docs/en/060_Authorizing_Users.md | 132 -------- .../docs/en/070_Registering_Users.md | 138 -------- .../docs/en/075_Activating_User_Profiles.md | 77 ----- .../docs/en/080_Editing_User_Profiles.md | 98 ------ .../docs/en/085_Deleting_Users_Profiles.md | 50 --- .../docs/en/090_Reminding_Passwords.md | 143 --------- ...100_Creating_And_Editing_User_Documents.md | 166 ---------- .../docs/en/105_Deleting_User_Documents.md | 97 ------ .../FormLister/docs/en/110_Lexicons.md | 32 -- ...21\204\320\276\321\200\320\274\320\260.md" | 91 ------ ...20\273\320\265\320\275\320\270\321\217.md" | 140 -------- ...20\260\320\271\320\273\320\276\320\262.md" | 118 ------- ...20\260\320\277\321\207\320\265\320\271.md" | 85 ----- ...21\211\320\265\320\275\320\270\320\271.md" | 74 ----- ...20\277\320\276\320\273\320\265\320\271.md" | 148 --------- ...20\267\320\260\321\206\320\270\321\217.md" | 48 --- ...21\200\320\260\321\206\320\270\321\217.md" | 98 ------ ...20\260\320\277\320\270\321\201\320\270.md" | 42 --- ...21\200\320\276\320\273\320\265\320\271.md" | 131 -------- assets/snippets/FormLister/docs/history.md | 199 ------------ ...20\273\320\273\320\265\321\200\321\213.md" | 50 --- ...20\274\320\265\321\202\321\200\321\213.md" | 298 ------------------ ...20\260\320\275\320\275\321\213\321\205.md" | 132 -------- ...20\272\320\260\320\277\321\207\320\270.md" | 175 ---------- ...20\260\320\275\320\275\321\213\321\205.md" | 40 --- ...20\277\320\270\321\201\320\265\320\274.md" | 237 -------------- ...21\202\320\265\320\273\320\265\320\271.md" | 204 ------------ ...21\202\320\265\320\273\320\265\320\271.md" | 142 --------- ...20\277\320\270\321\201\320\265\320\271.md" | 89 ------ ...20\260\321\202\320\265\320\273\321\217.md" | 99 ------ ...20\260\321\202\320\265\320\273\321\217.md" | 50 --- ...20\265\320\273\321\217\320\274\320\270.md" | 148 --------- ...20\265\320\273\321\217\320\274\320\270.md" | 166 ---------- ...20\265\320\273\321\217\320\274\320\270.md" | 97 ------ ...20\270\320\272\320\276\320\275\321\213.md" | 32 -- 41 files changed, 4887 deletions(-) delete mode 100755 assets/snippets/FormLister/docs/en/010_Controllers.md delete mode 100755 assets/snippets/FormLister/docs/en/020_Parameters.md delete mode 100755 assets/snippets/FormLister/docs/en/030_Data_Validation.md delete mode 100755 assets/snippets/FormLister/docs/en/035_Captcha_Usage.md delete mode 100755 assets/snippets/FormLister/docs/en/040_Data_Output.md delete mode 100755 assets/snippets/FormLister/docs/en/050_Mail_Sending.md delete mode 100755 assets/snippets/FormLister/docs/en/060_Authorizing_Users.md delete mode 100755 assets/snippets/FormLister/docs/en/070_Registering_Users.md delete mode 100755 assets/snippets/FormLister/docs/en/075_Activating_User_Profiles.md delete mode 100755 assets/snippets/FormLister/docs/en/080_Editing_User_Profiles.md delete mode 100755 assets/snippets/FormLister/docs/en/085_Deleting_Users_Profiles.md delete mode 100755 assets/snippets/FormLister/docs/en/090_Reminding_Passwords.md delete mode 100755 assets/snippets/FormLister/docs/en/100_Creating_And_Editing_User_Documents.md delete mode 100755 assets/snippets/FormLister/docs/en/105_Deleting_User_Documents.md delete mode 100644 assets/snippets/FormLister/docs/en/110_Lexicons.md delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/001_\320\237\321\200\320\276\321\201\321\202\320\260\321\217_\321\204\320\276\321\200\320\274\320\260.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" delete mode 100755 "assets/snippets/FormLister/docs/examples/ru/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" delete mode 100644 "assets/snippets/FormLister/docs/examples/ru/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" delete mode 100644 "assets/snippets/FormLister/docs/examples/ru/010_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271.md" delete mode 100644 assets/snippets/FormLister/docs/history.md delete mode 100755 "assets/snippets/FormLister/docs/ru/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217_\320\264\320\260\320\275\320\275\321\213\321\205.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\260\320\277\321\207\320\270.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/040_\320\222\321\213\320\262\320\276\320\264_\320\264\320\260\320\275\320\275\321\213\321\205.md" delete mode 100644 "assets/snippets/FormLister/docs/ru/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\320\277\320\270\321\201\320\265\320\274.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\321\213\321\205_\320\267\320\260\320\277\320\270\321\201\320\265\320\271.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\270_\321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" delete mode 100755 "assets/snippets/FormLister/docs/ru/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" delete mode 100644 "assets/snippets/FormLister/docs/ru/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md" diff --git a/assets/snippets/FormLister/docs/en/010_Controllers.md b/assets/snippets/FormLister/docs/en/010_Controllers.md deleted file mode 100755 index dac73a6705..0000000000 --- a/assets/snippets/FormLister/docs/en/010_Controllers.md +++ /dev/null @@ -1,50 +0,0 @@ -## Controllers -Controller is the class extending \FormLister\Core base class, which perfoms: - -- loading classes to validate data and generate captcha; -- processing form data (form data here is the value of formData property, not only of $_REQUEST array); -- processing form template and success template. - -The way it works: - -1. Data are loaded from form. -2. Data are loaded from external sources. -3. Snippets are called to process data. -4. Data validation if it's received from form; -3. Snippets are called to process data again. -6. Final processing - if data came from form and passed validation successfully. -7. Output. - -Final processing is done by controller's process() method. Result flag has to be set with setFormStatus() method after successful processing, then fill renderTpl property with template to output processing results. - -These are some base controllers, feel free to extend them: - -### Form -Sends e-mail using form data. - -### Login -Authorizes users. - -### Register -Creates users and sends needed notifications. - -### Activate -Processes a special link to confirm user registration or sends it via e-mail. - -### DeleteUser -Allows users to delete their profiles. It requests password to confirm. - -### Profile -Allows users to edit their profiles. - -### Reminder -Helps users to remind their passwords. - -### Content -Allows to create and edit resources with MODxAPI classes. - -### DeleteContent -Allows users to delete resources they created. - -### MailChimp -Adds users to MailChimp mailing lists. It's provided as example of \FormLister\Core class extension. diff --git a/assets/snippets/FormLister/docs/en/020_Parameters.md b/assets/snippets/FormLister/docs/en/020_Parameters.md deleted file mode 100755 index c48d8988f2..0000000000 --- a/assets/snippets/FormLister/docs/en/020_Parameters.md +++ /dev/null @@ -1,298 +0,0 @@ -## General parameters - -These parameters are processed by FormLister core class. Controllers can change parameters purposes. - -## Settings -### controller -Sets the class to process data. - -Possible values - php-file name without extension which contains controller class. - -Default value - Form. - -### dir -Folder where controller class is located. - -Default value - assets/snippets/FormLister/core/controller/ - -### formid -The name of the form, required parameter. - -Form needs to have a hidden field named "formid" and its value has to be the same as parameter value. The form means to be sent, if there is a key named "formid" in the $_REQUEST array and its value is equal to the parameter value. - -### formMethod -Possible values - post, get or request. - -Default value - post. - -### config -Loads parameters from json file. - -Possible values - filename:folder, several values are separated by the semicolon. - -#### Example -myparams:core - loads parameters from assets/snippets/FormLister/config/core/myparams.json file; -myparams - loads parameters from assets/snippets/FormLister/config/custom/myparams.json file; myparams:/assets/myfolder - loads parameters from assets/myfolder/myparams.json file. - -Default value - none. - -### api -The way of output. - -Possible values: - -- 0: html only; -- 1: json array with form data; -- 2: json array with form data and html. - -### apiFormat -Output format. - -Possible value - json or array. - -Defaut value - json. - -### debug -Enables debug mode. Debug data is sent to MODX events log. - -Possible values - 0, 1. - -Default value - 0. - -### saveObject -Saves FormLister object to placeholder, so other snippets can use it. The object is saved only if form processing is finished successfully. - -Possible values - placeholder name. - -Default value - none. - -### removeGpc -Restores data sanitized by MODX as it contains {{, [[ and so on. MODX tags will be sanitized in output. - -Default value - 0, 1 or field names comma separated. - -Default value - 0. - -## Data sources -### defaultsSources -Allows to load data from external sources, to pre-fill form fields, for example. External data are loaded only before initial form output and ignored after form is sent. This behaviour can be changed with "keepDefaults" parameter. - -Possible values: sources, semicolon separated. The order of loading data matches the sources order in parameter. - -The source can be set as "name:key:prefix". Prefix is added to field name, if set - for example, config.site_name. - -Possible sources: - -- array: json or php array, its values are defined by the parameter named "defaults"; -- param:parameter name:prefix - the same as the "array" source but you can specify any snippet parameter, not only "defaults"; -- session:array key:prefix - loads data from $_SESSION[array key]; -- plh:keys, comma separated:prefix - loads data from $modx->placeholders property; -- aplh:placeholder name:prefix - loads data from an array stored in placeholder; -- config:prefix- loads data from MODX configuration; -- cookie:keys, comma separated:префикс - loads data from the $_COOKIE array; -- MODxAPI class name:key:prefix - a key is the argument of edit() method, the class has to be loaded before snippet call; -- document:prefix - loads current document data from modResource model. It needs no key; -- user:key:prefix - load authorized user data from modUsers model. User type is provided by key value (web or mgr). - -Default value - array. - -### defaults -Data for the "array" source. - -Possible values: json or php array. - -### keepDefaults -Allows to load external data after the form is sent. If fields list is specified, then only these fields will be loaded. - -Possible values: 1, 0; field names, comma separated. - -Default value - 0. - -### allowEmptyFields -Allows to set fields with empty values. - -Possible values - 0 or 1. - -Default value - 1. - -## Form Controls -### formControls -The list of fields hold by form controls (selects, checkboxes, radio buttons). It needs to determine their state. - -Possible values - field names, comma separated. - -Default value - none. - -### emptyFormControls -This parameter allows to solve the problem of unchecked checkboxes, as they are excluded from fields array during form submission: if there's no needed element in the $_REQUEST array, then it's set according to this parameter. The problem is actual mostly for MODxAPI classes usage, because MODxAPI requires to list changed fields in fromArray() method. But it's possible to use it in common forms to set the value of unchecked checkbox in templates. - -Possible values - an array: -``` -&emptyFormControls=`{ - "mycheckbox" : "No", - "published" : 0 -}` -``` - -## Data Processing -### prepare, prepareProcess, prepareAfterProcess -It's similar to the "prepare" parameter of DocLister. - -Snippets defined in the "prepare" parameter are run after form data loaded, "prepareProcess" - after validation is passed successfully, "prepareAfterProcess" - after form processing is finished. Controller object is available in prepare-snippets via $FormLister variable, while $data array contains the values of form fields. Additional $name variable allows to determine the parameter initiated snippet call; so you can use one snippet for all cases. Use controller methods (setField, setFields etc.) to change form data in prepare-snippets. - -Possible values - snippet names, anonymous functions, static methods of loaded classes. - -Default value - none. - -## Validation -### validator -Class name to validate data. Is has to be loaded before snippet call. - -Default value - \FormLister\Validator. - -### rules -Validation rules array. - -Default value - none. - -## Templates -### formTpl -Form template. It needs to have the required field named "formid" with the same value as "formid" parameter's one. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. - -### arraySplitter - -The separator to convert arrays to strings. - -Default value - semicolon. - -### {field}.arraySplitter -The separator to convert arrays to strings, but for particular {field}. Example: groups.arraySplitter - the separator for the field named "groups". - -If not set, then the "arraySplitter" parameter is used. - -### errorTpl -Template for validation messages. - -Possible values - template name, according to DocLister templating rules. - -Default value: -``` -@CODE:
[+message+]
-``` - -### requiredClass, errorClass -Class name for empty required fields and wrong filled fields. - -Default value - required and error accordingly. - -### {field}.requiredClass, {field}.errorClass -Allows to set classes mentioned above for particular fields. - -If not set, then "requiredClass", "errorClass" parameters are used. - -### messagesTpl -Template for controller messages. It outputs message groups (messages, required, error). - -Possible values - template name, according to DocLister templating rules. - -Default value: -``` -@CODE:
[+messages+]
-``` - -### messagesOuterTpl -Wrapper template for controller message groups. - -Possible values - template name, according to DocLister templating rules. - -Default value - -``` -@CODE: [+messages+] -``` - -### messagesRequiredOuterTpl -Wrapper template for the "required" message group. - -Possible values - template name, according to DocLister templating rules. - -Default value: -``` -@CODE: [+messages+] -``` - -### messagesErrorOuterTpl -Wrapper template for the "error" message group. - -Possible values - template name, according to DocLister templating rules. - -Default value: -``` -@CODE: [+messages+] -``` - -### messagesSplitter, messagesRequiredSplitter, messagesErrorSplitter -Messages separator in groups. - -Possible values - string. - -Default value: -``` -
-``` - -### removeEmptyPlaceholders -Removes placeholders without values from templates. - -Possible values - 0 or 1. - -Default value - 1. - -### parseDocumentSource -Enables MODX-parser for output post-processing. - -Possible values - 0 or 1. - -Default value - 0. - -### rewriteUrls -Allows to parse links in templates if the "parseDocumentSource" parameter is off. - -Possible values - 0 or 1. - -Default value - 0. - -### skipPrerender -Allows to skip some form fields processing (sanitizing values, converting arrays to strings, error messages rendering). Set to 1, if you do not use MODX templates. - -Possible values - 0 or 1. - -Default value - 0. - -### templatePath, templateExtension -Sets template files folder and template files extension. These parameters are needed to use with EvoTwig plugin. - -Default value - none. - -## Redirect after finish -### redirectTo -Target page id to redirect if form is processed successfully. There's no redirect in api-mode, but absolute url for target page is saved in form data as "redirectTo" field. - -Instead of target page id, you can specify an array with additional options: -``` -&redirectTo=`{ - "page":10, - "query":{ - "foo":"bar" - }, - "header":"HTTP/1.1 307 Temporary Redirect" -}` -``` -The "page" key is the target page id, the "query" array contains get-parameters to pass, the "header" key can be used to set redirect header. - -Possible values - number or array. - -Default value - none. diff --git a/assets/snippets/FormLister/docs/en/030_Data_Validation.md b/assets/snippets/FormLister/docs/en/030_Data_Validation.md deleted file mode 100755 index eee9c95664..0000000000 --- a/assets/snippets/FormLister/docs/en/030_Data_Validation.md +++ /dev/null @@ -1,132 +0,0 @@ -## Data validation - -Validator applies validation rules to field values one by one, if error occures then the record is added to form errors array and further form procession is interrupted. - -Validation is passed successfully if there are no records in form errors array. - -### Validation rules -Validation rules are described as an array. Field name is the array key, and array value contains the rules array. Validation rule is the method of validator class. The key of rules array is the rule name (the name of validation method), its value is either error message string, or an array with rule description. This array contains needed values in the key named "params" and an error message in the key named "message". - -Use exclamation mark for rule denial: "!numeric" - the field passes validation if its value is not numeric. - -If you need to validate only not empty fields, then set exclamation mark before field name to ignore rules if the field is empty. - -``` -{ - "field 1": { - "rule 1" : "error message", - "rule 2" : "error message" - }, - "field 2": { - "rule 1" : "error message", - "rule 2" : { - "params" : value, - "message" : "error message" - } - }, - "!field 3":{ - "rule 1" : "error message" - } -} -``` -\FormLister\Validator base class has the following rules: - -- required: field value is not empty; -- date: field value is a date in defined format; -- min: field value length is greater or equal to defined; -- max: field value length is less or equal to defined; -- greater: field value is greater than defined; -- less: field value is less than defined; -- between: field value is in the range; -- equals: field value is equals to defined; -- in: field value is in defined array; -- alpha: field value contains only letters; -- numeric: field value contains only digits; -- alphaNumeric: field value contains only letters and digits; -- slug: field value is an url slug; -- decimal: field value is a decimal number; -- phone: field value is a phone number; -- matches: field value matches regular expression; -- url: field value is an url; -- email: field value is an e-mail address; -- length: field value length is equal to defined; -- minLength: field value length is greater or equal to defined; -- maxLength: field value length is less or equal to defined; -- lengthBetween: field value length is in the range; -- minCount: array size is greater than defined; -- maxCount: array size is less than defined; -- countBetween: array size is in the range. - -If several values are needed for the rule, then pass them as an array: -``` -&rules=`{ - "field" : { - "lengthBetween" : { - "params" : [10,20], - "message" : "Длина должна быть от 10 до 20" - } - } -}` -``` - -If the rule requires an array (the "in" rule and other), then you should specify this array in the following way: -``` -&rules=`{ - "field" : { - "in" : { - "params" : [ [10,20,30] ], - "message" : "field value should be equal to 10, 20 or 30" - } - } -}` -``` - -It needs to pass an array to validator method as single argument. - -It's possible to use anonymous functions or static methods of loaded classes: -``` -&rules=`{ - "myfield":{ - "required":"Required field", - "custom":{ - "function":"\\Namespace\\Classname::myCustomRule", - "params":[10,20,30], - "message":"Custom check failed" - } - } -}` -``` - -Validation method should accept controller object as the first argument, field value as the second argument, parameters from the "params" key of the rule description as other arguments: -``` -public static function myCustomRule($fl,$value,$a,$b,$c) { - $result = $fl->getField('field1') == $a && $fl->getField('field2') == $b && $value == $c; - return $result; -} -``` -The rule above will be passed if the field1 value is 10, the field2 value is 20, and the value of the the field which the rule is applied to is equal to 30. - -Validator method returns true if the rule is passed, false or error message if not (so it's possible not to use the "message" key for custom rules). - -Example contains the "сustom" rule name, but it can be any if it's not in validator class. So you can use several custom rules. - -### Validation results -Error data are stored as an array and can be obtained with getFormData('errors') method call: -``` -{ - "field 1": { - "failed rule" : "error message" - }, - "field 2": { - "failed rule" : "error message" - } -} -``` -This array is filled with addError(field name, rule name, error message) method. So, it's possible to affect final result adding records to this array manually. You can also call setValid(false) method to decline failed validation. - -Each field validation result can be output in template with [+field name.error+] placeholder. Total results can be output with [+form.messages+] placholder set by messagesTpl parameter. You can use the following placeholders on its part: - -- [+required+] - messages about empty required fields; -- [+errors+] - messages about wrong filled fields. - -Use getErrorMessage(field name) method to get validation error messages for any field. diff --git a/assets/snippets/FormLister/docs/en/035_Captcha_Usage.md b/assets/snippets/FormLister/docs/en/035_Captcha_Usage.md deleted file mode 100755 index 8286070dc7..0000000000 --- a/assets/snippets/FormLister/docs/en/035_Captcha_Usage.md +++ /dev/null @@ -1,43 +0,0 @@ -## Captcha usage - -FormLister can use modified MODX captcha and Google Recaptcha by default. - -Set the "captcha" parameter value with the name of captcha files folder (located at assets/snippets/FormLister/lib/captcha/) to enable it: -``` -&captcha=`modxCaptcha` -``` - -The parameter named "captchaParams" contains an array of captcha settings. For example: -``` -&captchaParams=`{ -"width":200, -"height":120 -}` -``` - -The field name to get captcha value from user is defined by the "captchaField" parameter ("vericode" by default). Validation rule for this field is created automatically. - -To output captcha in form template use [+captcha+] placeholder. - -### modxCaptcha - -Settings: -* width and height - width and height of a captcha image (100 and 60 by default); -* inline - output format. If it's 1, then [+captcha+] placeholder contains an image in base64-format. If it's 0, then placeholder contains the link to connector.php file, which generates captcha image. Default value - 1; -* connectorDir - path to the folder containing connector.php file, if "inline" parameter is set to 0. Default value - assets/snippets/FormLister/lib/captcha/modxCaptcha/; -* errorEmptyCode - error message, if user doesn't enter captcha. -* errorCodeFailed - error message, if user enters wrong value. - -### reCaptcha - -Uses Google reCAPTCHA V2. Include the following script in page tempalate to use it: -``` - -``` - -The value of "captchaField" parameter should be set to "g-recaptcha-response" (see [documentation](https://developers.google.com/recaptcha/docs/verify)). - -Settings: -* secretKey, siteKey - keys to access reCAPTCHA api; -* size, theme, badge, callback, expired_callback, tabIndex, type - see. [documentation](https://developers.google.com/recaptcha/docs/display#render_param); -* errorCodeFailed - error message if captcha validation failed. diff --git a/assets/snippets/FormLister/docs/en/040_Data_Output.md b/assets/snippets/FormLister/docs/en/040_Data_Output.md deleted file mode 100755 index 4a98a8198c..0000000000 --- a/assets/snippets/FormLister/docs/en/040_Data_Output.md +++ /dev/null @@ -1,59 +0,0 @@ -## Data output - -Data are sanitized, arrays are converted to strings to be output in templates. Special placeholders are set for form controls. "Field name" below is the raw field name, without brackets for array fields. - -Raw field value (or placeholder): -[+field name+] - -Sanitized field value (array fields are converted to strings): -``` -[+field name.value+] -``` -Example: -``` -[+comment.value+] //The value of a field named "comment". It may be a scalar value of the real input or textarea or any other form element, but it can be set with PHP as well. -``` - -Setting checkbox: -``` -[+c.field name.field value+] -``` -Example: -``` -[+c.agree.Yes+] //It outputs "checked" if a single checkbox named "agree" contains "Yes" value. -[+c.district.West+] //Same but for one checkbox from an array of two checkboxes named "district[]" -[+c.district.East+] //Same but for one checkbox from an array of two checkboxes named "district[]" -``` - - -Setting select or radio-button: -``` -[+s.field name.field value+] -``` -Example: -``` -[+s.country.Russia+] //It outputs "selected" if a single option of select named "country" is selected and its value is "Russia". See example for checkboxes if you need to use select with multiple options available to choose. -``` - -Class for empty required field: -[+field name.requiredСlass+] - -Class for wrong filled field: -[+field value.errorClass+] - -Alternative classes output: -[+field value.class+] -[+field value.classnames+] - -Validation error message: -[+field name.error+] - -Controller messages output: -[+form.messages+] - -There are 3 possible types of messages in the [+form.messages+] placeholder: failed the "required" rule fields, wrong filled fields, any messages set by addMessage() method. The last ones are output by default, see the "messagesTpl" parameter description. - -Lexicon entries: -[%lexicon keys%] - -If EvoTwig plugin is used then template variables are available: FormLister (controller object), errors (formData['errors'] array), messages (formData['messages'] array), data (formData['fields'] array). diff --git a/assets/snippets/FormLister/docs/en/050_Mail_Sending.md b/assets/snippets/FormLister/docs/en/050_Mail_Sending.md deleted file mode 100755 index e1109d7714..0000000000 --- a/assets/snippets/FormLister/docs/en/050_Mail_Sending.md +++ /dev/null @@ -1,239 +0,0 @@ -## Sending e-mail - -Form controller allows to send form data via e-mail. - -## Mailer parameters -### parseMailerParams -Allows to use form data in mail sending parameters (&to=\`[+user.email.value+]\` etc.). - -Possible values - 1, 0. - -Default value - 0. - -### isHtml -Allows to send e-mail in html format. - -Possible values - 1, 0. - -Default value - 1. - -### to -Receiver's address. If it's not set then the mail is not sent, but form procession is finished successfully. - -Possible values - e-mail address. - -Default value - none. - -### from -Sender's address. - -Possible values - e-mail address. - -Default value - the "emailsender" configuration parameter value. - -### fromName -Sender's name. - -Possible values - string. - -Default value - the "site_name" configuration parameter value. - -### replyTo -ReplyTo header. - -Possible values - e-mail address. - -Default value - none. - -### cc -Cс header. - -Possible values - e-mail address. - -Default value - none. - -### bcc -Bcc header. - -Possible values - e-mail address. - -Default value - none. - -### noemail -If it's set, then the mail isn't sent, but supposed to be sent successfully. - -Possible values - 1, 0. - -Default value - 0. - -### ignoreMailerResult -If it's set, the mail is sent and supposed to be sent successfully. - -Possible values - 1, 0. - -Default value - 0. - -### subject, ccSubject, autoSubject -Letter subject. - -Possible values - string. - -Default value - none. - -### subjectTpl, ccSubjectTpl, autoSubjectTpl -Letter subject template. - -Possible values - template name, according to DocLister templating rules. - -Default value - the "subject" parameter value ("ccSubject", "autoSubject"). - -### autosender -Address to send additional letter. - -Possible values - e-mail address. - -Default value - none. - -### autosenderFromName -The name of the additional letter sender. - -Possible values - string. - -Default value - the "site_name" configuration parameter value. - -### ccSender -If it's set then the receiver's address is defined by the value of form field. - -Possible values - 1, 0. - -Default value - 0. - -### ccSenderField -Field name containing e-mail address. - -Possible values - field name. - -Default value - email. - -### ccSenderFromName -Sender's name for the mail sent to the form field defined address. - -Possible values - string. - -Default value - none. - -## ccMailConfig -Allows to redefine mail sending parameters for the letters to the address taken from the form field ((isHtml, from, fromName, subject, replyTo, cc, bcc, noemail)). - -Possible values - json or php array. - -Default value - none. - -## autoMailConfig -Allows to redefine mail sending parameters for the additional letters (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail). - -Possible values - json or php array. - -Default value - none. - -## Submit protection -### protectSubmit -Prevents submission of the form with the same data again. - -Possible values - 1, 0 or fields list to check if the form is unique. Required fields are used by default. - -Default value - 1. - -### submitLimit -Prevents sending mail too often. - -Possible values - number of seconds between form submits. - -Default value - 60. - -## Templates -### reportTpl -The main template of the letter. - -Possible values - template name, according to DocLister templating rules. - -Default value - the list of fields and their values. - -### automessageTpl -Template of the additional letter. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. - -### ccSenderTpl -Template of the letter sent to the user defined address. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. - -### successTpl -Success message template. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. - -## Sending files -### attachments -Field names to store files. Single file fields (name="field" type="file") and multiple file fields as simple arrays (name="field[]" type="file" multiple) are supported. - -Default value - none. - -### attachFiles -Allows to send any files. - -Possible values - array: -``` -&attachFiles=`{ -"field ":{ - "filepath":"assets/images/logo.png", - "filename":"logo.png" -}, -"field 2":[ - { - "filepath":"assets/images/file1.jpg", - "filename":"report.jpg" - }, - { - "filepath":"assets/images/file2.jpg", - "filename":"report2.jpg" - } -] -}` -``` -### deleteAttachments -Allows to delete attachment files if the mail is sent successfully. - -Possible values - 0 or 1. - -Default value - 0. - -### fileValidator -Class name to validate files. This class has to be loaded before snippet call. - -Default value - \FormLister\FileValidator - -### fileRules -Validation rules (see "Data validation" chapter). Default validator has the following rules: - -- required: files are loaded successfully; -- optional: returns true even if files were not submitted (it makes file field not required); -- allowed: file extension is in defined array; -- images: file extension is jpg, jpeg, gif, png, bmp; -- minSize: file size in kilobytes is greater than defined; -- maxSize: file size in kilobytes is less than defined; -- sizeBetween: file size in kilobytes is in the range; -- minCount: files count is greater than defined; -- maxCount: files count is less than defined; -- countBetween: files count is in the range; - -There's no sense to use the "!field name" construction in file validation rules, because the value of the file field can not be empty, so use the "optional" rule instead. - -There's the [+attachments.value+] placeholder available in reportTpl template, it contains the list of attached files. To output particular file field use the [+field name.value+] placeholder. Files are sent only in letters with reportTpl template. diff --git a/assets/snippets/FormLister/docs/en/060_Authorizing_Users.md b/assets/snippets/FormLister/docs/en/060_Authorizing_Users.md deleted file mode 100755 index 1ce2b3791a..0000000000 --- a/assets/snippets/FormLister/docs/en/060_Authorizing_Users.md +++ /dev/null @@ -1,132 +0,0 @@ -## Authorizing users - -Login controller authorizes registered users using special MODxAPI class to manage them. Users are identified by their names or e-mails (username and email database fields), but it's possible to use alternative ways with "OnWebAuthentication" event. Plugin named "userHelper" performs some related operations: it counts login attempts, registers last login time, checks auto login cookie, blocks users after some unsuccessful tries, logs out users. - -## Controller parameters - -### model -Class to manage users. - -Possible values - class name. - -Default value - \modUsers - -### modelPath -Path to the class to manage users. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modUsers.php - -### loginField -Field to identify user. - -Possible values - field name. - -Default value - username. - -### passwordField -Password field. - -Possible values - field name. - -Default value - password. - -### rememberField -Field to remember user. If the field value is equal to true, then a special auto login cookie will be set after successful authorization. Cookie name and its lifetime is defined by the "cookieName" and "cookieLifetime" parameters. - -It's possible to set the "rememberme" field in the "defaults" parameter, to enable it by default: -``` -&defaults=`{"rememberme":1}` -``` - -Possible values - field name. - -Default value - rememberme. - -### checkActivation -Enables check for the profile activation (see "Activating user profiles"). - -Possible values - 0 or 1. - -Default value - 1. - -### context -Authorization context. - -Possible values - mgr or web. - -Default value - web. - -### cookieName -Cookie name to store auto login parameters. - -Default value - WebLoginPE. - -### cookieLifetime -Autologin cookie life time. - -Possible values - the number of seconds since last login. - -Default value - 157680000 (5 years). - -### redirectTo -Redirects user after successful authorization. - -Possible values - target page id or array. - -Default value - none. - -### exitTo -Redirects already authorized user. - -Possible values - target page id or array. - -Default value - none. - -### successTpl -Success message template. User data can be used there. - -Possible values - template name, according to DocLister templating rules. - -Default value - lexicon entry with the key [%login.default_successTpl%] - -### skipTpl -Outputs message if user is already authorized. - -Possible values - template name, according to DocLister templating rules. - -Default value - lexicon entry with the key [%login.default_skipTpl%] - -## userHelper plugin parameters -### logoutKey -GET-parameter name to catch for user logout request. For example, http://sitename.ru/page.html?logout. - -Default value - logout. - -### cookieName -Cookie name to store autologin parameters. - -Default value - WebLoginPE. - -### cookieLifetime -Autologin cookie life time. - -Possible values - number of seconds since last login. - -Default value - 157680000 (5 years). - -### maxFails -Number of unsuccessful login attempts before the block. - -Possible values - number greater than 0. - -Default value - 3. - -### blockTime -Time to block. - -Possible values - number of seconds since last login attempt. - -Default value - 3600 (1 hour). - diff --git a/assets/snippets/FormLister/docs/en/070_Registering_Users.md b/assets/snippets/FormLister/docs/en/070_Registering_Users.md deleted file mode 100755 index 45eda88ac2..0000000000 --- a/assets/snippets/FormLister/docs/en/070_Registering_Users.md +++ /dev/null @@ -1,138 +0,0 @@ -## Регистрация пользователей - -Register controller allows to register users, add them to user groups and send notifications. It extends Form controller, so you can use all its parameters to send letters during registration. - -Field names should be the same as [modUsers](http://docs.evolution-cms.com/Extras/Snippets/DocLister/MODxAPI) model's ones. - -If there's no "username" field in the form, then its value will be the value of the "email" field. So it's possible to register users only by e-mail. - -If there's no "password" field, then its value will be created automatically. So, the registration adds up to specify e-mail only. - -If there's the "repeatPassword" field in the form and validation rules are set for the "password" and "repeatPassword" fields, then the "equals" rule will be corrected to check if the "password" field matches the "repeatPassword" field: -: -``` -"repeatPassword":{ - "required":"Enter password one more time", - "equals":{ - "params" : "This key is not needed because it will be set by Register controller", - "message":"Passwords don't match" - } -} -``` - -Registration need to check if the "username" and "email" fields are unique. Controller provides rules needed: -``` -&rules=`{ - "username":{ - "required":"Enter user name", - "alphaNumeric":"Only letters and digits are allowed", - "custom":{ - "function":"\\FormLister\\Register::uniqueUsername", - "message":"You cannot use this name" - } - }, - "email":{ - "required":"Enter e-mail", - "email":"Wrong e-mail", - "custom":{ - "function":"\\FormLister\\Register::uniqueEmail", - "message":"You cannot use this e-mail" - } - } -}` -``` -All model fields for the new record are available in templates. Additional field "user.password" with given password is set. - -## Parameters -### model -Class to manage users. - -Possible values - class name. - -Default value - \modUsers - -### modelPath -Path to the class to manage users. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modUsers.php - -### allowedFields -Fields allowed to process, other fields are ignored. The "username", "email" and "password" fields are enabled always. - -If not set, then all fields are allowed. - -Possible value - field names, comma separated. - -Default value - none. - -### forbiddenFields -Fields forbidden to process. The "username", "email" and "password" fields will be removed from the list of forbidden fields. - -Possible value - field names, comma separated. - -Default value - none. - -### userGroups -Adds registered user to user group. - -Possible values - group names, comma separated (or an array). - -Default value - none. - -### checkActivation -Enables the check for user profile activation (see "Activating user profiles"). The "activate.url" field will be set, which contains link to a page with FormLister call to activate user profile. - -Possible values - 1 or 0. - -Default value - 0. - -### activateTo -If profile activation check is enabled, then you have to specify the id of the page with FormLister call to activate user profile. - -Possible values - page id. - -Default value - the value of $modx->config['site_start']. - -### preparePostProcess -Allows to process data after saving new user. - -Possible values - snippet names, anonymous functions, static methods of loaded classes. - -Default value - none. - -### redirectTo -Redirects user after successful registration. - -Possible values - target page id or array. - -Default value - none. - -### exitTo -Redirects authorized user. - -Possible values - target page id or array. - -Default value - none. - -### skipTpl -Outputs message if user is authorized. - -Possible values - template name, according to DocLister templating rules. - -Default value - register lexicon entry with the key [%register.default_skipTpl%]. - -### successTpl -Success message template. - -Possible values - template name, according to DocLister templating rules. - -Default value - register lexicon entry with the key [%register.default_successTpl%] - -### passwordLength -Password length (if the password needs to be created automatically). - -Possible values - number of characters greater than 6. - -Default value - 6. diff --git a/assets/snippets/FormLister/docs/en/075_Activating_User_Profiles.md b/assets/snippets/FormLister/docs/en/075_Activating_User_Profiles.md deleted file mode 100755 index 38558536c9..0000000000 --- a/assets/snippets/FormLister/docs/en/075_Activating_User_Profiles.md +++ /dev/null @@ -1,77 +0,0 @@ -## Activating user profiles - -Activate controller activates user profile, so it's possible to request registration confirmation by following the special link in the letter sent after the registration. - -If the user hasn't received this letter, then he can request this letter again. - -User profile assumes to be inactivated if the "logincount" field value is -1. - -Snippet calls to register and authorize users should have the "checkActivation" parameter enabled. - -If user creates password himself during registration, then this password needs to be requested to send a letter with the activation link. Or the new password will be created, because if user hasn't received the letter containing generated password after registration, then he cannot know this password - -All model fields are available in templates. Additional field "user.password" with raw password value is set as well as the "activate.url" field with activation link. - -## Parameters -### model -Class to manage users. - -Possible values - class name. - -Default value - \modUsers - -### modelPath -Path to the class to manage users. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modUsers.php - -### redirectTo -Redirects user after successful activation. - -Possible values - target page id or array. - -Default value - none. - -### exitTo -Redirects authorized user. - -Possible values - target page id or array. - -Default value - none. - -### skipTpl -Outputs message if user is authorized. - -Possible values - template name, according to DocLister templating rules. - -Default value - activate lexicon entry with the key [%activate.default_skipTpl%]. - -### reportTpl -Letter template containing profile activation data. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. - -### successTpl -Message template if e-mail with activation data is sent successfully. - -Possible values - template name, according to DocLister templating rules. - -Default value - activate lexicon entry with the key [%activate.default_successTpl%] - -### activateSuccessTpl -Message template if activation is finished successfully. - -Possible values - template name, according to DocLister templating rules. - -Default value - activate lexicon entry with the key [+activate.default_activateSuccessTpl+] - -### passwordLength -Password length. - -Possible values - number of characters greater than 6. - -Default value - 6. diff --git a/assets/snippets/FormLister/docs/en/080_Editing_User_Profiles.md b/assets/snippets/FormLister/docs/en/080_Editing_User_Profiles.md deleted file mode 100755 index f5f3be6df3..0000000000 --- a/assets/snippets/FormLister/docs/en/080_Editing_User_Profiles.md +++ /dev/null @@ -1,98 +0,0 @@ -## Editing user profile - -Profile controller allow authorized users to change their profiles, as well as passwords. - -E-mail should be checked for uniqueness with controller's special rule: -``` -&rules=`{ - "email":{ - "required":"Enter e-mail", - "email":"Wrong e-mail", - "custom":{ - "function":"\\FormLister\\Profile::uniqueEmail", - "message":"You cannot use this e-mail" - } - } -}` -``` -The same for the "username" field: -``` -&rules=`{ - "username":{ - "required":"Enter user name", - "alphaNumeric":"Only letters and digits are allowed", - "custom":{ - "function":"\\FormLister\\Profile::uniqueUsername", - "message":"You cannot use this name" - } - } -}` -``` - -If the "password" field is empty, then the password will stay unchanged.If the password is changed then user needs to be authorized again. The new password is stored in the "user.password" field. - -## Parameters -### model -Class to manage users. - -Possible values - class name. - -Default value - \modUsers - -### modelPath -Path to the class to manage users. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modUsers.php - -### allowedFields -Fields allowed to process, other fields are ignored. If password is changed, then the "password" field will be added to the list. If no value is set to the "username" field then, it this field be set with the "e-mail" field value. The "username" will be allowed in this case. - -If not set, then all fields are allowed. - -Possible value - field names, comma separated. - -Default value - none. - -### forbiddenFields -Fields forbidden to process. The "password" and "username" fields are processed the same way as for the "allowedFields" parameter. - -Possible value - field names, comma separated. - -Default value - none. - -### preparePostProcess -Allows to process data after saving user data. - -Possible values - snippet names, anonymous functions, static methods of loaded classes. - -Default value - none. - -### redirectTo -Redirects user after successful profile update. - -Possible values - target page id or array. - -Default value - none. - -### exitTo -Redirects non authorized user. - -Possible values - target page id or array. - -Default value - none. - -### skipTpl -Outputs message if user is not authorized. - -Possible values - template name, according to DocLister templating rules. - -Default value - profile lexicon entry with the key [%profile.default_skipTpl%]. - -### successTpl -Success message template. - -Possible values - template name, according to DocLister templating rules. - -Default value - none. diff --git a/assets/snippets/FormLister/docs/en/085_Deleting_Users_Profiles.md b/assets/snippets/FormLister/docs/en/085_Deleting_Users_Profiles.md deleted file mode 100755 index bfe4041476..0000000000 --- a/assets/snippets/FormLister/docs/en/085_Deleting_Users_Profiles.md +++ /dev/null @@ -1,50 +0,0 @@ -## Удаление профиля пользователя - -Контроллер DeleteUser позволяет авторизованным пользователям удалять свои профили. Для подтверждения действия пользователю необходимо ввести свой пароль. - -Расширяет Form. - -В шаблонах доступны поля модели для удаляемой записи. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### redirectTo -Перенаправляет пользователя на указанную страницу после сохранения профиля. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для неавторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteUser с ключом [+deleteUser.default_skipTpl+] - -### successTpl -Шаблон сообщения об успешном удалении профиля. Если не задан, то генерируется сообщение об успешном сохранении формы. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. diff --git a/assets/snippets/FormLister/docs/en/090_Reminding_Passwords.md b/assets/snippets/FormLister/docs/en/090_Reminding_Passwords.md deleted file mode 100755 index e9b507dd4f..0000000000 --- a/assets/snippets/FormLister/docs/en/090_Reminding_Passwords.md +++ /dev/null @@ -1,143 +0,0 @@ -## Восстановление паролей пользователями - -Контроллер Reminder позволяет web-пользователям восстанавливать забытые пароли. Расширяет контроллер Form. - -Восстановление паролей происходит по следующей схеме: - -- пользователь вводит в форме свой идентификатор (им может быть имя пользователя или email); -- пользователь получает письмо, в котором содержится ссылка для восстановления; -- при переходе по ссылке пользователь получает возможность ввести новый пароль либо пароль будет сгенерирован автоматически; -- пользователю отправляется письмо с новым паролем и показыается сообщение (в сообщении можно также вывести новый пароль). - -Параметр to перезаписывается значением email пользователя. Обязательно должен быть задан параметр resetTo. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### hashField -Имя поля для хранения хэша данных пользователя. - -Значение по умолчанию - hash. - -### userField -Имя поля для хранения идентификатора пользователя (имя пользователя или email). - -Значение по умолчанию - email. - -### uidField -Имя поля, которое используется для идентификации пользователя при переходе по ссылке. - -Значение по умолчанию - id. - -### exitTo -Перенаправляет авторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### resetTo -Страница, на которую будет указывать ссылка для восстановления паролей. Обязательный параметр. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - id документа, в котором вызван контроллер. - -### redirectTo -Перенаправляет на указанную страницу после успешного восстановления пароля. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для авторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_skipTpl+]. - -### formTpl -Шаблон формы для ввода идентификатора пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### resetTpl -Шаблон формы для ввода нового пароля. Если параметр не задан, то пароль будет сгенерирован автоматически. - -Поля для ввода паролей должны называться password и repeatPassword. В форме должны также присутствовать скрытые поля с именами из параметров uidField и hashField. Значение для поля hashField задается через плейсхолдер [+user.hash+]. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### successTpl -Шаблон сообщения об успешной отправке письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.). - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_successTpl+]. - -### resetSuccessTpl -Шаблон сообщения об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_resetSuccessTpl+]. - -### reportTpl -Шаблон письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Ссылка для восстановлени пароля в письме задается через плейсхолдер [+reset.url+] - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_reportTpl+].. - -### resetReportTpl -Шаблон письма об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Если не задан, то письмо пользователю отправляться не будет. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### rules -Правила валидации для формы идентификации пользователя. - -Возможные значения - см. раздел "Валидация данных". - -Значение по умолчанию - пусто. - -### resetRules -Правила валидации для формы установки нового пароля. Если заданы правила валидации для полей password и repeatPassword, то при наличии для поля repeatPassword правила equals, оно будет автоматически скорректировано для проверки равенства значений полей password и repeatPassword: -``` -"repeatPassword":{ - "required":"Введите пароль еще раз", - "equals":{ - "params" : "Этот ключ в описании правила можно не задавать, он будет сформирован контроллером автоматически", - "message":"Пароли не совпадают" - } -} -``` -Возможные значения - см. раздел "Валидация данных". - -Значение по умолчанию - пусто. - -### passwordLength -Длина пароля (если создается автоматически). - -Возможные значения - число символов больше 6. - -Значение по умолчанию - 6. diff --git a/assets/snippets/FormLister/docs/en/100_Creating_And_Editing_User_Documents.md b/assets/snippets/FormLister/docs/en/100_Creating_And_Editing_User_Documents.md deleted file mode 100755 index d383e93f47..0000000000 --- a/assets/snippets/FormLister/docs/en/100_Creating_And_Editing_User_Documents.md +++ /dev/null @@ -1,166 +0,0 @@ -## Создание и редактирование документов пользователями - -Контроллер Content позволяет web-пользователям создавать и редактировать записи в таблицах MODxAPI. Расширяет контроллер Form, что позволяет отправлять письма после создания записи. При редактировании записей отправка почты отключена, при необходимости ее можно реализовать с помощью плагинов на событие сохранения (OnDocFormSave и т.п.). - -Данные формы передаются в объект MODxAPI как есть, соответственно разработчику нужно заботиться об их корректности самостоятельно. - -При редактировании записей можно запретить изменение отдельных полей, используя параметр keepDefaults. - -При создании новой записи вызывается событие OnMakeDocUrl, в которое передается id записи и массив data со значениями полей записи. Это позволяет вернуть ссылку на созданную запись, она будет доступна через плейсхолдер [+content.url+]. Ссылку можно использовать в письме c уведомлением о создании новой записи. - -Также можно использовать данные авторизованного пользователя, доступны через плейсхолдеры [+user.fullname+], [+user.email+] и т.д. - -## Параметры -### model -Класс MODxAPI. - -Возможные значения - имя класса MODxAPI. - -Значение по умолчанию - \modResource. - -### modelPath -Путь к файлу класса, если класс не загружается заранее. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modResource.php. - -### userModel -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### userModelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### onlyUsers -Разрешить добавление записей только для зарегистрированных пользователей. - -Возможные значения - 0, 1. - -Значение по умолчанию - 1. - -### userGroups -Группы пользователей, которым разрешено добавлять или изменять записи. - -Возможные значения - список групп через точку с запятой. - -Значение по умолчанию - пусто (разрешены любые группы). - -### onlyOwners -Разрешает редактирование записей только их авторами. Автор определяется по полю, указанному в параметре ownerField. - -Возможные значения - 0, 1. - -Значение по умолчанию - 1. - -### ownerField -Имя поля, определяющего владельца записи. Если работать с документами modResource, то это будет имя tv-параметра (в Evo не предусмотрено создание записей веб-пользователями). - -Возможные значения - имя поля. - -Значение по умолчанию - aid. - -### idField -Имя ключа массива $_REQUEST, по которому определяется id редактируемой записи. Если ключ не задан, то контроллер вызывается в режиме создания записей. Информацию о режиме контроллера можно получить с помощью метода getMode. - -В форме редактирования нужно предусмотреть скрытое поле с именем параметра, в котором будет сохраняться id записи. - -Значение по умолчанию - id. - -### contentFields -Задает сопоставление полей MODxAPI и полей формы. Можно не задавать, если имена полей совпадают. Если параметр не задан, то ограничить список передаваемых в модель полей можно с помощью параметров allowedFields и forbiddenFields. - -Возможные значения - массив вида: -``` -&contentFields=`{ - "поле MODxAPI":"поле формы", - "поле MODxAPI":"поле формы" -} -` -``` -Значение по умолчанию - пусто. - -### clearCache -Очищать кэш после сохранения записи. - -Возможные значения - 0, 1. - -Значение по умолчанию - 0. - -### redirectTo -Перенаправляет пользователя на указанную страницу после сохранения новой записи. В режиме редактирования не используется. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### editAfterCreate -Переправляет пользователя на страницу для редактирования созданной записи. Страница указывается в параметре redirectTo. - -Возможные значения - 1 или 0. - -Значение по умолчанию - 0. - -### editTpl -Шаблон формы для редактирования документа. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - значение параметра formTpl. - -### badOwnerTpl -Шаблон сообщения о том, что пользователь не является автором документа. Только режим редактирования. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+edit.default_badOwnerTpl+]. - -### badGroupTpl, badGroupEditTpl -Шаблон сообщения о том, что пользователь не входит в группу пользователей которым разрешено создавать и редактировать документы. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом -[+create.default_badGroupTpl+] или [+edit.default_badGroupTpl+]. - -### badRecordTpl -Шаблон сообщения о том, что пользователь не может редактировать запись: например, запись не существует. Только режим редактирования. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+edit.default_badRecordTpl+]. - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl, skipEditTpl -Шаблон сообщения для неавторизованного пользователя. Для режима редактирования - skipEditTpl. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+create.default_skipTpl+] (edit.default_skipEditTpl). - -### successTpl -Шаблон сообщения об успешном сохранении новой записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+create.default_successTpl+] - -### editSuccessTpl -Шаблон сообщения об успешном обновлении записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. diff --git a/assets/snippets/FormLister/docs/en/105_Deleting_User_Documents.md b/assets/snippets/FormLister/docs/en/105_Deleting_User_Documents.md deleted file mode 100755 index a83245f789..0000000000 --- a/assets/snippets/FormLister/docs/en/105_Deleting_User_Documents.md +++ /dev/null @@ -1,97 +0,0 @@ -## Deleting user documents - -DeleteContent controller allows authorized users to delete documents they created. - -It extends Form controller. - -Model fields are available in templates with the "user" prefix (user.fullname, user.email etc.). - -## Parameters -### model -MODxAPI class to manage documents or other type of records. - -Possible values - MODxAPI class name. - -Default value - \modResource. - -### modelPath -Path to the MODxAPI class. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modResource.php. - -### userModel -Class to manage users. - -Possible values - class name. - -Default value - \modUsers - -### userModelPath -Path to the class to manage users. - -Possible values - relative file path. - -Default value - assets/lib/MODxAPI/modUsers.php - -### ownerField -Field name to get the record owner. For the modResource class it can be the name of a tv-parameter (because web users can not create documents in Evo). - -Possible values - field name. - -Default value - aid. - -### idField -$_REQUEST array key to get the id of the record to be deleted. - -Default value - id. - -### redirectTo -Redirects user after successful operation. - -Possible values - target page id or array. - -Default value - none. - -### badOwnerTpl -Outputs message if user is not the record owner. - -Possible values - template name, according to DocLister templating rules. - -Default value - deleteContent lexicon entry with the key [%deleteContent.default_badOwnerTpl%]. - -### badRecordTpl -Outputs message if user can not delete record (it doesn't exists, for example). - -Possible values - template name, according to DocLister templating rules. - -Default value - deleteContent lexicon entry with the key [%deleteContent.default_badRecordTpl%]. - -### skipTpl -Outputs message if user is not authorized. - -Possible values - template name, according to DocLister templating rules. - -Default value - deleteContent lexicon entry with the key [%deleteContent.default_skipTpl%]. - -### successTpl -Success message template. - -Possible values - template name, according to DocLister templating rules. - -Default value - deleteContent lexicon entry with the key [%deleteContent.default_successTpl%] - -### exitTo -Redirects non authorized user. - -Possible values - target page id or array. - -Default value - none. - -### badRecordTo -Redirects if record can not be deleted. - -Possible values - target page id or array. - -Default value - none. diff --git a/assets/snippets/FormLister/docs/en/110_Lexicons.md b/assets/snippets/FormLister/docs/en/110_Lexicons.md deleted file mode 100644 index 254a30e29d..0000000000 --- a/assets/snippets/FormLister/docs/en/110_Lexicons.md +++ /dev/null @@ -1,32 +0,0 @@ -## Lexicons - -To use lexicons you should create a file named "lexicon name.inc.php" in a folder named as full language name (russian-UTF8, english etc.): -``` - -``` -Parameters to load lexicons are: - -* langDir - lexicon folder path; -* lang - lexicon language (the "manager_language" configuration parameter value by default); -* lexicon - lexicon names, comma separated. Or specify an array of values right here: -``` -&lexicon=`{ - "english":{ - "test":"Test lexicon value", - "foo":"Another lexicon value", - "bar":"And one more value" - }, - "russian-UTF8":{ - "test":"Проверка", - "foo":"Еще проверка", - "bar":"И еще" - } -}` -``` - -After that you can use the [%key%] placeholders to output lexicon entries. EvoBabel lexicons are supported as well. diff --git "a/assets/snippets/FormLister/docs/examples/ru/001_\320\237\321\200\320\276\321\201\321\202\320\260\321\217_\321\204\320\276\321\200\320\274\320\260.md" "b/assets/snippets/FormLister/docs/examples/ru/001_\320\237\321\200\320\276\321\201\321\202\320\260\321\217_\321\204\320\276\321\200\320\274\320\260.md" deleted file mode 100755 index 55bbb1ca87..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/001_\320\237\321\200\320\276\321\201\321\202\320\260\321\217_\321\204\320\276\321\200\320\274\320\260.md" +++ /dev/null @@ -1,91 +0,0 @@ -## Простая форма -``` -[!FormLister? -&formid=`basic` -&rules=` -{ - "name":{ - "required":"Обязательно введите имя", - "matches":{ - "params":"\/^[\\pL\\s\\-']++$\/uD", - "message":"Введите имя правильно" - } - }, - "email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" - }, - "phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" - }, - "message":{ - "required":"Обязательно введите сообщение", - "minLength":{ - "params":10, - "message":"Сообщение должно быть не менее 10 символов" - } - } -}` -&formTpl=`@CODE: -
-
-
-
- -
- -
- - [+name.error+] -
-
-
- -
- - [+email.error+] -
-
-
- -
- - [+phone.error+] -
-
- -
- -
- - [+message.error+] -
-
- [+form.messages+] -
-
- -
-
-
-
-
-
` -&to=`test@test.com` -&ccSender=`1` -&ccSenderField=`email` -&ccSenderTpl=`@CODE:Спасибо за обращение, [+name.value+]` -&reportTpl=`@CODE: -

Имя: [+name.value+]

-

Телефон: [+phone.value+]

-

Email: [+email.value+]

-

Сообщение: [+message:strip_tags:nl2br+]

-` -&errorClass=` has-error` -&requiredClass=` has-warning` -&subject=`Новое сообщение` -&messagesOuterTpl=`@CODE:` -&errorTpl=`@CODE:[+message+]` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" "b/assets/snippets/FormLister/docs/examples/ru/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" deleted file mode 100755 index f3df8d9e89..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" +++ /dev/null @@ -1,140 +0,0 @@ -## Форма с элементами управления -``` -[!FormLister? -&formid=`advanced` -&rules=`{ -"name":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email" -}, -"phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" -}, -"message":{ - "required":"Обращение не может быть пустым", - "minLength":{ - "params":100, - "message":"Должно быть не менее 100 символов" - } -}, -"agree":{ - "required":"Вы не можете отправить обращение, если не согласны с правилами" -}, -"products":{ - "minCount":{ - "params": 2, - "message": "Выберите минимум 2 продукта" - } -} -}` -&defaults=`{ -"topic":"Жалоба" -}` -&formControls=`topic,agree,department,products` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+name.error+] -
-
-
-
- - - [+email.error+] -
-
-
-
- - - [+phone.error+] -
-
-
-
- - -
-
- -
-
- - -
-
- -
- -
-
- -
-
- -
- [+products.error+] -
-
- - - [+message.error+] -
-
- - [+agree.error+] -
- [+form.messages+] -
- -
-
-
-
-
` -&to=`test@test.com` -&subjectTpl=`@CODE: [+topic.value+] в [+department.value+]` -&reportTpl=`@CODE: -

Имя: [+name.value+]

-

Телефон: [+phone.value+]

-

Email: [+email.value+]

-

Продукты: [+products.value+]

-

Сообщение: [+message:strip_tags:nl2br+]

-` -&errorClass=` has-error` -&requiredClass=` has-warning` -&subject=`Новое сообщение` -&messagesOuterTpl=`@CODE:` -&errorTpl=`@CODE:[+message+]` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" "b/assets/snippets/FormLister/docs/examples/ru/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" deleted file mode 100755 index 006527c2f8..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" +++ /dev/null @@ -1,118 +0,0 @@ -## Отправка файлов -``` -[!FormLister? -&formid=`basic` -&rules=`{ -"name":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"message":{ - "required":"Обязательно введите сообщение" -} -}` -&attachments=`first,second` -&attachFiles=`{"userfile":{"filepath":"assets/images/logo.png","filename":"logo.png"}}` -&fileRules=`{ -"first":{ - "required":"Приложите документ", - "allowed":{ - "params": [ ["doc","docx","pdf"] ], - "message": "Разрешены только документы Word и Pdf" - }, - "maxSize" : { - "params": 100, - "message": "Размер файла не должен превышать 100 кб" - } -}, -"second":{ - "required":"Приложите 2 картинки", - "maxSize" : { - "params": 1024, - "message": "Размер файла не должен превышать 1 мб" - }, - "allowed": { - "params": [ ["jpg","jpeg","png","gif"] ], - "message" : "Разрешены только картинки" - }, - "maxCount":{ - "params" : 4, - "message" : "Не больше 4 картинок" - }, - "minCount":{ - "params" : 2, - "message" : "Не меньше 2 картинок" - } -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- -
- - [+name.error+] -
-
-
- -
- - [+email.error+] -
-
-
- -
- - [+message.error+] -
-
-
- -
- - [+first.error+] -
-
-
- -
- - [+second.error+] -
-
- [+form.messages+] -
-
- -
-
-
-
-
-
` -&to=`test@test.com` -&reportTpl=`@CODE: -

Имя: [+name.value+]

-

Email: [+email.value+]

-

Сообщение: [+message:strip_tags:nl2br+]

-

Документы:[+first.value+]

-

Картинки:[+second.value+]

-

Доп.:[+userfile.value+] -

Вложения: [+attachments.value+]

-` -&errorClass=` has-error` -&requiredClass=` has-warning` -&subject=`Новое сообщение` -&messagesOuterTpl=`@CODE:` -&errorTpl=`@CODE:[+message+]` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" "b/assets/snippets/FormLister/docs/examples/ru/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" deleted file mode 100755 index ccebc32acb..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" +++ /dev/null @@ -1,85 +0,0 @@ -## Форма с капчей -``` -[!FormLister? -&formid=`basic` -&rules=`{ -"name":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" -}, -"message":{ - "required":"Обязательно введите сообщение", - "minLength":{ - "params":100, - "message":"Сообщение должно быть не менее 100 символов" - } -} -}` -&captcha=`modxCaptcha` -&formTpl=`@CODE: -
-
-
-
- -
- -
- - [+name.error+] -
-
-
- -
- - [+email.error+] -
-
-
- -
- - [+phone.error+] -
-
- -
- -
- - [+message.error+] -
-
- [+form.messages+] -
- -
-
Введите число
- - [+vericode.error+] -
-
-
-
- -
-
-
-
-
-
` -&errorClass=` has-error` -&requiredClass=` has-warning` -&subject=`Новое сообщение` -&messagesOuterTpl=`@CODE:` -&errorTpl=`@CODE:[+message+]` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" "b/assets/snippets/FormLister/docs/examples/ru/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" deleted file mode 100755 index 82c029975c..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" +++ /dev/null @@ -1,74 +0,0 @@ -## Вывод сообщений -``` -[!FormLister? -&formid=`basic` -&rules=`{ -"name":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер телефона правильно" -}, -"message":{ - "required":"Обязательно введите сообщение", - "minLength":{ - "params":100, - "message":"Сообщение должно быть не менее 100 символов" - } -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
- -
- -
-
- [+form.messages+] -
-
- -
-
-
-
-
-
` -&messagesTpl=`@CODE:
[+required+][+errors+][+messages+]
` -&messagesRequiredOuterTpl=`@CODE:
Вы не заполнили обязательные поля
[+messages+]
` -&messagesErrorOuterTpl=`@CODE:
Некоторые поля заполнены неверно
[+messages+]
` -&messagesOuterTpl=`@CODE:
[+messages+]
` -&errorClass=` has-error` -&requiredClass=` has-warning` -&errorTpl=`@CODE:[+message+]` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" "b/assets/snippets/FormLister/docs/examples/ru/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" deleted file mode 100755 index 73a7ab6387..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" +++ /dev/null @@ -1,148 +0,0 @@ -## Два набора полей -В зависимости от значения поля type используются разные правила валидации и шаблоны письма. - -### Вызов FormLister -``` -[!FormLister? -&formid=`basic` -&rules=`{ -"name":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" -} -}` -&entRules=`{ -"entname":{ - "required":"Обязательно введите имя" -}, -"entemail":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"entphone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" -}, -"entaddress":{ - "required":"Обязательно введите адрес" -} -}` -&formControls=`type` -&defaults=`{"type":"Физическое лицо"}` -&formTpl=`@CODE: -
-
-
-
- -
- - -
-

Заполняется только физлицами

-
- - - - [+name.error+] - -
-
-
-
- - - - [+email.error+] - -
-
-
-
- - - - [+phone.error+] - -
-
-
-

Заполняется только юрлицами

-
- - - [+entname.error+] - -
-
-
-
- - - [+entemail.error+] -
-
-
-
- - - [+entphone.error+] -
-
-
-
- - - [+entaddress.error+] - -
- [+form.messages+] -
- -
-
-
-
-
` -&to=`test@test.com` -&subjectTpl=`@CODE:[+type.value+]` -&reportTpl=`@CODE: -

Имя: [+name.value+]

-

Телефон: [+phone.value+]

-

Email: [+email.value+]

-` -&reportEntTpl=`@CODE: -

Название предприятия: [+entname.value+]

-

Телефон: [+entphone.value+]

-

Email: [+entemail.value+]

-

Юридический адрес: [+entaddress.value+]

-` -&prepare=`typeSelector` -&errorClass=` has-error` -&requiredClass=` has-warning` -&messagesOuterTpl=`@CODE:` -&errorTpl=`@CODE:[+message+]` -!] -``` -### Prepare-сниппет typeSelector -``` -if ($FormLister->getField('type') == 'Юридическое лицо') { - $FormLister->config->setConfig(array( - 'rules'=>$FormLister->getCFGDef('entRules'), - 'reportTpl'=>$FormLister->getCFGDef('reportEntTpl') - )); -} else { - $FormLister->setField('type','Физическое лицо'); -} -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/assets/snippets/FormLister/docs/examples/ru/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" deleted file mode 100755 index 00010188b8..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" +++ /dev/null @@ -1,48 +0,0 @@ -## Авторизация -``` -[!FormLister? -&formid=`login` -&controller=`Login` -&loginField=`email` -&rules=`{ -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"password":{ - "required":"Обязательно введите пароль" -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+email.error+] -
-
- - - [+password.error+] -
- [+form.messages+] -
- -
- -
-
-
-
` -&messagesOuterTpl=`@CODE:` -&skipTpl=`@CODE:
Вы уже авторизованы.
` -&successTpl=`@CODE:
Привет, [+fullname+]!
` -&errorTpl=`@CODE:[+message+]` -&errorClass=` has-error` -&requiredClass=` has-warning` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" "b/assets/snippets/FormLister/docs/examples/ru/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" deleted file mode 100755 index 4561108910..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" +++ /dev/null @@ -1,98 +0,0 @@ -## Регистрация пользователей - -При регистрации пользователь добавляется в группу opt. Отправляется два письма - менеджеру и пользователю. Пользователь должен подтвердить регистрацию, перейдя по ссылке из письма (см. Активация учетных записей). - -``` -[!FormLister? -&formid=`register` -&controller=`Register` -&userGroups=`opt` -&checkActivation=`1` -&activateTo=`1514` -&rules=`{ -"fullname":{ - "required":"Обязательно введите имя" -}, -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -}, -"password":{ - "required":"Обязательно введите пароль", - "minLength":{ - "params":6, - "message":"В пароле должно быть больше 6 символов" - } -}, -"repeatPassword":{ - "required":"Повторите пароль", - "equals":{ - "message":"Пароли не совпадают" - } -}, -"agree":{ - "required":"Для регистрации вы должны принять правила" -} -}` -&allowedFields=`fullname` -&formControls=`agree` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+fullname.error+] -
-
- - - [+email.error+] -
-
-
-
- - - [+password.error+] -
-
-
-
- - - [+repeatPassword.error+] -
-
-
-
- - [+agree.error+] -
- [+form.messages+] -
- -
-
-
-
-
` -&to=`info@sitename.ru` -&reportTpl=`@CODE:Новый пользователь [+fullname.value+] ([+id.value+])` -&ccSender=`1` -&ccSenderField=`email` -&ccSenderTpl=`@CODE:Привет [+fullname.value+]. Для активации учетной записи нужно перейти по ссылке [+activate.url+]` -&subject=`Регистрация на сайте [(site_name)]` -&messagesOuterTpl=`@CODE:` -&successTpl=`@CODE:
Поздравляем с успешной регистрацией, [+fullname.value+]! После активации вы можете авторизоваться на сайте. Если вы не получили письмо для активации учетной записи, запросите его еще раз.
` -&errorTpl=`@CODE:[+message+]` -&errorClass=` has-error` -&requiredClass=` has-warning` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" "b/assets/snippets/FormLister/docs/examples/ru/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" deleted file mode 100644 index 4b5d85558c..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" +++ /dev/null @@ -1,42 +0,0 @@ -## Активация учетной записи -``` -[!FormLister? -&controller=`Activate` -&formid=`activate` -&protectSubmit=`0` -&rules=`{ -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+email.error+] -
- [+form.messages+] -
- -
-
-
-
-
` -&messagesOuterTpl=`@CODE:` -&successTpl=`@CODE:
На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
` -&subject=`Активация учетной записи` -&reportTpl=`@CODE:

Для активации учетной записи перейдите по ссылке [+activate.url+]

` -&activateReportTpl=`@CODE:

Здравствуйте, [+fullname.value+]!

Ваша учетная запись успешно активирована.

` -&activateSuccessTpl=`@CODE:
Ваша учетная запись успешно активирована!
` -&errorTpl=`@CODE:[+message+]` -&errorClass=` has-error` -&requiredClass=` has-warning` -!] -``` diff --git "a/assets/snippets/FormLister/docs/examples/ru/010_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271.md" "b/assets/snippets/FormLister/docs/examples/ru/010_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271.md" deleted file mode 100644 index 27d4a54f14..0000000000 --- "a/assets/snippets/FormLister/docs/examples/ru/010_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271.md" +++ /dev/null @@ -1,131 +0,0 @@ -## Восстановление паролей -### Вариант 1 -Пароль генерируется автоматически и отправляется в письме. -``` -[!FormLister? -&controller=`Reminder` -&formid=`remind` -&rules=`{ -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+email.error+] -
- [+form.messages+] -
- -
-
-
-
-
` -&messagesOuterTpl=`@CODE:` -&successTpl=`@CODE:
На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
` -&subject=`Восстановление пароля` -&resetTo=`38` -&reportTpl=`@CODE:

Для восстановления пароля перейдите по ссылке [+reset.url+]

` -&resetReportTpl=`@CODE:

Здравствуйте, [+fullname.value+]!

Ваш новый пароль: [+newpassword+]

` -&resetSuccessTpl=`@CODE:
На указанный вами при регистрации email отправлено письмо с новым паролем!
` -&errorTpl=`@CODE:[+message+]` -&errorClass=` has-error` -&requiredClass=` has-warning` -!] -``` - -### Вариант 2 -Пользователь вводит новый пароль. -``` -[!FormLister? -&controller=`Reminder` -&formid=`remind` -&rules=`{ -"email":{ - "required":"Обязательно введите email", - "email":"Введите email правильно" -} -}` -&resetRules=`{ -"password":{ - "required":"Обязательно введите пароль", - "minLength":{ - "params":6, - "message":"В пароле должно быть больше 6 символов" - } -}, -"repeatPassword":{ - "required":"Повторите пароль", - "equals":{ - "message":"Пароли не совпадают" - } -} -}` -&formTpl=`@CODE: -
-
-
-
- -
- - - [+email.error+] -
- [+form.messages+] -
- -
-
-
-
-
` -&resetTpl=`@CODE: -
-
-
-
- - - -
- - - [+password.error+] -
-
- - - [+repeatPassword.error+] -
- [+form.messages+] -
- -
-
-
-
-
-` -&uidName=`uid` -&messagesOuterTpl=`@CODE:` -&successTpl=`@CODE:
На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
` -&subject=`Восстановление пароля` -&reportTpl=`@CODE:

Для восстановления пароля перейдите по ссылке [+reset.url+]

` -&resetReportTpl=`@CODE:

Здравствуйте, [+fullname.value+]!

Ваш новый пароль: [+newpassword+]

` -&resetSuccessTpl=`@CODE:Готово!` -&resetTo=`12` -&errorTpl=`@CODE:[+message+]` -&errorClass=` has-error` -&requiredClass=` has-warning` -!] -``` diff --git a/assets/snippets/FormLister/docs/history.md b/assets/snippets/FormLister/docs/history.md deleted file mode 100644 index 1981c3009f..0000000000 --- a/assets/snippets/FormLister/docs/history.md +++ /dev/null @@ -1,199 +0,0 @@ -## History -### 1.7.19 -* [Refactor] Имя пользователя и E-mail не приводятся в нижний регистр (Login, Register, Profile). -* [Refactor] Не выводятся пустые обертки для сообщений формы (Core). -* [Enhancement] Вывод логов моделей MODxAPI при отладке (Content, Register, Profile). -* [Enhancement] Spanish, Italian lexicons. -* [Fix] Опечатка в методе renderMessages() (Core). -* [Fix] Неправильно задавался параметр size для ReCaptcha. - -### 1.7.18 -* [Enhancement] Dutch, Polish, English-Britain, German lexicons. -* [Refactor] Экранирование значений массива до преобразования массива в строку в методе fieldsToPlaceholders - -### 1.7.17 -* [Refactor] Мультибайтовые функции. - -### 1.7.16 -* [Fix] Ошибка с полями username и email при их отсутствии (Profile). -* [Enhancement] В метод getField можно передать значение по умолчанию (Core). -* [Refactor] Оптимизация обработки чанков (Core). - -### 1.7.15 -* [Enhancement] Отдельные настройки почты для писем ccSender и automessage в параметрах ccMailConfig и autoMailConfig (Form). -* [Refactor] Проверка типа входящих данных (Validator). -* [Refactor] Изменен метод renderForm (Core). -* [Enhancement] Параметр apiFormat для формата вывода данных (json или просто массив) (Core). -* [Fix] В валидаторе файлов неправильно обрабатывалась ситуация, когда файлы отправляются одним массивом из нескольких полей (Form). -* [Enhancement] Разлогинивание удаленных и заблокированных пользователей (userHelper). - -### 1.7.14 -* [Refactor] Упрощение параметра parseMailerParams. - -### 1.7.13 -* [Enhancement] Параметр parseMailerParams для обработки плейсхолдеров в параметрах отправки почты, по умолчанию отключен (Form). -* [Fix] Некорректная загрузка пользовательских лексиконов из файлов (Core, Lexicon). -* [Fix] Параметр debug со значением 0 не отключал отладку (Core). - -### 1.7.12 -* [Enhancement] Возможность указывать имя параметра с id пользователя в ссылках (Reminder, Activate). -* [Refactor] Имя пользователя и E-mail принудительно приводятся в нижний регистр (Login, Register, Profile). -* [Fix] Неверное значение по умолчанию параметра resetTo (Reminder). -* [Fix] Неверное значение по умолчанию параметра activateTo (Activate). -* [Fix] Ошибка при расчете хэша для активации учетной записи (Register, Activate). - -### 1.7.11 -* [Fix] Предупреждения в PHP 7 (Core). -* [Enhancement] Вывод сообщений в лог при проблемах с параметрами rules, fileRules и contentFields (Core, Content). -* [Refactor] Обработка языковых плейсхолдеров в сообщениях (Core). -* [Enhancement] Из prepare-сниппетов можно возвращать массив значений полей, который будет передан в метод setFields (Core). - -### 1.7.10 -* [Enhancement] Возможность использовать плейсхолдеры с данными пользователя в шаблоне skipTpl (Login, Activate, Register, Reminder). -* [Fix] Неверное определение страницы для редиректа (Login). - -### 1.7.9 -* [Fix] Исправления ошибок. - -### 1.7.8 -* [Refactor] Переименованы файлы документации. -* [Refactor] Параметр removeEmptyPlaceholders по умолчанию включен (Core). -* [Refactor] Параметр rewriteUrls по умолчанию включен (Core). -* [Refactor] Плейсхолдеры ошибок [+field.error+] не устанавливаются, если нет сообщения об ошибке (Core). -* [Enhancement] Плейсхолдеры [+field.class+] (включает class="") и [+field.classname+] (не включает class="") (Core). -* [Refactor] Параметр lexicon может содержать или имена файлов (без расширения) через запятую или массив с языковыми строками (Lexicon). - -### 1.7.7 -* [Enhancement] Возможность указывать разный subject для разных типов писем (Form). - -### 1.7.6 -* [Fix] Исправления ошибок. - -### 1.7.5 -* [Fix] $this->modx вместо $modx в сниппете. - -### 1.7.4 -* [Fix] Ошибка в лексиконе (Form). -* [Refactor] Версии PHP ниже 5.6 не поддерживаются (Core). - -### 1.7.3 -* [Refactor] Подключать __autoload.php, если не задан другой загрузчик. -* [Fix] Ошибка в обработке параметра редиректа (Core). - -### 1.7.2 -* [Enhancement] Параметр &context в контроллере Login для поддержки модели modManagers (Login). -* [Fix] Ошибка в обработке параметра редиректа (Core). - -### 1.7.1 -* [Enhancement] Сниппет записывает в лог, если не задан параметр formid или не удалось загрузить класс контроллера. -* [Refactor] Плагин userHelper по умолчанию отключен. -* [Refactor] По умолчанию загружается лексикон english. -* [Fix] Ошибка в формате даты для лексикона english/form. - -### 1.7.0 -* [Refactor] Изменен метод loadModel, добавлена возможность указывать параметры, передаваемые в конструктор модели (Core). -* [Fix] Ошибка в лексиконе контроллера DeleteContent. -* [Fix] Создание записей анонимными пользователями если &onlyUsers=`0` (Content). -* [Refactor] Убраны include/require, для загрузки классов подключается файл assets/snippets/FormLister/__autoload.php. Модели MODxAPI загружаются этим же загрузчиком. -* [Refactor] Создание записи в логе, если не удалось сохранить данные (Content). -* [Refactor] Изменена обработка поля для запоминания авторизации: теперь время для автологина задается в параметре cookieLifetime (по умолчанию 5 лет, в секундах), а не значением поля (Login). -* [Refactor] Имя куки для автологина можно задать с помощью параметра cookieName, по умолчанию WebLoginPE (Login). -* [Refactor] В контроллере Login сначала проверяется, активирована ли учетная запись, а потом уже возможность авторизации (Login). -* [Enhancement] Блокировка пользователей после определенного числа неудачных попыток авторизации в плагине userHelper. - -### 1.6.2 -* [Fix] Неверное объявление метода в классах капчи. - -### 1.6.1 -* [Refactor] Переделан автологин в плагине userHelper. - -### 1.6.0 -* [Enhancement] Параметр rewriteUrls для обработки ссылок в шаблонах. Игнорируется, если задан параметр parseDocumentSource (Core). -* [Enhancement] Если страница с вызовом контроллера Login указана в конфигурации, как страница "Доступ запрещен", то после успешной авторизации будет произведен редирект на запрашиваемую страницу (Login). -* [Enhancement] Новый параметр ignoreMailerResult (Form). -* [Fix] Неправильная проверка уникальности username в контроллере Profile. -* [Refactor] Для добавления пользователей в группы используется метод из modUsers (Register). -* [Refactor] Введенный пользователем пароль сохраняется в поле user.password (Register). -* [Refactor] Контроллеры Register, Profile и Content загружают данные из моделей после успешного выполнения; после этого можно выполнить сниппеты из параметра preparePostProcess. Сделано это потому что плагины на сохранение или сами модели могут менять данные. -* [Enhancement] Восстановление данных, испорченных в protect.inc.php. Если параметр removeGpc равен 1, то очищены будут все входящие поля. Можно указать в параметре имена полей через запятую. При выводе обработанных полей будут экранироваться тэги MODX (Core). -* [Refactor] В prepare-сниппеты передается переменная name с названием параметра в котором задан сниппет. Можно использовать один сниппет для всех случаев (Core). -* [Enhancement] Контроллер DeleteUser для удаления пользователей c запросом пароля. -* [Enhancement] Контроллер DeleteContent для удаления записей MODxAPI. -* [Enhancement] Контроллер Activate для активации учетных записей. -* [Enhancement] Контроллеры Register и Login могут работать с активацией учетных записей. -* [Enhancement] Вывод параметров data-badge и data-callback для рекапчи (ReCaptchaWrapper). -* [Enhancement] Параметр deleteAttachments для удаления файлов после отправки письма (Form). -* [Enhancement] Сохранение имен файлов в поля формы (Form). -* [Enhancement] Отправка файлов не из формы. Список файлов задается массивом в параметре attachFiles: {"field":{"filepath":"assets/images/logo.png","filename":"logo.png"}} (Form). -* [Refactor] Можно не задавать параметр contentFields, в этом случае в модель будут переданы поля формы (Content). -* [Refactor] Корректная обработка полей lastlogin и thislogin в плагине userHelper. -* [Fix] Неверно выбирался шаблон при восстановлении паролей (Reminder). -* [Enhancement] Дополнительная обработка чанков парсером MODX c помощью параметра parseDocumentSource (Core). -* [Enhancement] Возможность вырезать необработанные плейсхолдеры из чанков с помощью параметра removeEmptyPlaceholders (Core). -* [Enhancement] Параметр removeEmptyPlaceholders для удаления необработанных плейсхолдеров из чанков (возможные значения 0,1; по умолчанию - 0) (Core). -* [Fix] Из-за неправильной обработки параметра defaultsSources не загружались поля в контроллере Profile (Core). -* [Fix] Метод filterFields не учитывал значение параметра allowEmptyFields (Core). - -### 1.5.1 -Исправления ошибок. - -###1.5.0 -* [Refactor] Переделана загрузка внешних параметров с учетом того, что не все источники могут содержать массив: добавлен источник aplh для загрузки массива значений из плейсхолдера MODX, в источнике cookie можно указать несколько имен кук через запятую. Добавлен источник user для загрузки данных авторизованного веб-пользователя (user:web) или менеджера (user:mgr) (Core). Добавлен источник document для загрузки данных текущего или указанного документа. -* [Refactor] Валидация капчи вынесена в класс капчи (Core). -* [Refactor] Параметры капчи задаются массивом, там же указываются сообщения об ошибках (Core). -* [Refactor] Валидация капчи происходит в классе капчи. (Core). -* [Enhancement] reCaptcha2. -* [Enhancement] smsCaptcha. -* [Enhancement] Поддержка Twig: в шаблон передаются переменные FormLister, data, errors, messages. Добавлен метод getErrorMessage для получения в шаблоне сообщений об ошибках для указанного поля (Core). -* [Enhancement] Параметры редиректа можно задавать в виде массива с ключами page (id страницы), query (массив параметров запроса) и header (заголовок) (Core). -* [Enhancement] Если задан параметр redirectTo и параметр editAfterCreate равен 1, то в параметры редиректа будет добавлен идентификатор созданного документа (Core, Content). -* [Fix] Плагин userHelper теперь перенаправляет пользователя на текущую страницу без ?logout в ссылке. -* [Fix] Сопоставление имен полей формы и модели в параметре contentFields неправильно работало в режиме редактирования, если имена различались (Content). -* [Refactor] Пользовательские функции валидации могут вместо false возвращать сообщение об ошибке (Core). - -### 1.4.1 -* [Refactor] Больше рандома в modxCaptcha. - -### 1.4.0 -* [Refactor] Класс modxCaptchaWrapper больше не привязан к FormLister (Core, modxCaptchaWrapper). -* [Enhancement] Убрано принудительное отключение параметров submitLimit и protectSubmit (Content). -* [Refactor] Изменен алгоритм загрузки пользовательских лексиконов. Теперь в параметре lexicon можно указывать как имя файла, так и сразу массив c языковыми записями (Core, Lexicon). -* [Refactor] Загрузка полей отправленной формы происходит не из $_REQUEST, а согласно параметру formMethod (значение по умолчанию - 'post') (Core). -* [Enhancement] Метод loadArray можно использовать для обработки строк с разделителем (по умолчанию - ',') (Config). -* [Enhancement] Если значение параметра submitLimit меньше 60, то оно не пересчитывается в минуты (Form). - -### 1.3.0 -* [Enhancement] Поддержка события OnBeforeWebLogin. В плагине можно реализовать процедуру авторизации независимую от модели; установку полей и шаблона сообщения об успешной авторизации нужно также производить в плагине. Плагин должен вернуть true в случае успешной авторизации, иначе будет выполнена авторизация методами модели (Login). - -### 1.2.1 -* [Refactor] Метод isArray теперь protected (FileValidator). - -### 1.2.0 -* [Refactor] Переделан пропуск полей при преобразовании в плейсхолдеры. Теперь плейсхолдеры отделены от полей формы, для работы с ними следует использовать методы setPlaceholder и getPlaceholder. Выводятся через [+placeholder+]. -* [Bug] Сниппеты, указанные в prepareProcess, выполнялись независимо от результатов валидации. -* [Refactor] Изменена логика обработки правил валидации. Теперь все правила, которых нет в валидаторе, обрабатываются как custom. Это позволяет применять сразу несколько таких правил. -* [Enhancement] Возможность применять правила валидации только для заполненных полей. -* [Refactor] Информация о файлах размещается в массиве formData c помощью метода setFiles (Core, Form). -* [Refactor] Объект FS теперь публичный. -* [Refactor] Контроллер Profile наследуется от Form, а не от Core. - -### 1.1.0 -* [Refactor] Метод filesToArray перемещен в Core. -* [Enhancement] Возможность загрузки произвольных моделей в контроллерах, которые используют MODxAPI. Новые параметры - model и modelPath. -* [Refactor] Метод для загрузки моделей MODxAPI. -* [Enhancement] Возможность загружать произвольные модели MODxAPI в контроллерах. -* [Enhancement] Новое правило валидации - date, проверяет является ли значение поля датой в указанном формате (Validator). -* [Enhancement] Возможность пропускать поля при преобразовании в плейсхолдеры (Core). - -### 1.0.2 -* [Enhancement] Убрано значение по умолчанию свойства allowedFields в контроллерах Register и Profile. - -### 1.0.1 -* [Enhancement] Новое правило валидации файлов - optional, аналог правила required но выполняется также, если файл не загружен пользователем (FileValidator). -* [Enhancement] Правила валидации файлов allowed, minSize, sizeBetween считаются выполненными, если файл не загружен пользователем (код ошибки 4). Решает проблему с файловыми полями, для которых не задано правило required (FileValidator). -* [Bug] К письму прикреплялись не загруженные пользователем файлы, теперь прикрепляются только успешно загруженные (код ошибки 0) (Form). -* [Fix] Параметры из файлов перезаписывали параметры сниппета (Core). -* [Bug] Конфиг из файла не добавлялся в общий массив настроек (Helpers/Config). - -### 1.0.0 -Public release. diff --git "a/assets/snippets/FormLister/docs/ru/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md" "b/assets/snippets/FormLister/docs/ru/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md" deleted file mode 100755 index e566b9dae2..0000000000 --- "a/assets/snippets/FormLister/docs/ru/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md" +++ /dev/null @@ -1,50 +0,0 @@ -## Контроллеры -Контроллер представляет собой класс, унаследованный от базового класса \FormLister\Core, который реализует: - -- загрузку классов для валидации и генерации капчи; -- работу с данными (под данными здесь и далее подразумеваются значения свойства formData, то есть не только значения массива $_REQUEST); -- работу с шаблоном формы и шаблоном успешной обработки. - -Схема работы: - -1. Загрузка данных из формы -2. Загрузка данных из внешних источников -3. Вызов сниппетов для обработки данных. -4. Валидация данных - если получены данные из формы; -3. Вызов сниппетов для обработки данных. -6. Итоговая обработка - если получены данные из формы и пройдена валидация. -7. Вывод. - -Итоговая обработка формы происходит в методе process() контроллера. После успешной обработки необходимо установить флаг результа обработки формы с помощью метода setFormStatus(), а также и указать в свойстве renderTpl шаблон для вывода информации с результатами обработки. - -Ниже перечислены базовые контроллеры. - -### Контроллер Form -Отправляет письма с данными формы. - -### Контроллер Login -Авторизует пользователя в контексте web. - -### Контроллер Register -Создает web-пользователя и отправляет соответствующие письма. - -### Контроллер Activate -Обрабатывает ссылку из письма с подтверждением регистрации или отправляет такое письмо. - -### Контроллер DeleteUser -Позволяет пользователям удалять свои учетные записи. Для подтверждения запрашивает пароль. - -### Контроллер Profile -Предназначен для редактирования данных web-пользователя. - -### Контроллер Reminder -Предназначен для восстановления паролей web-пользователями. - -### Контроллер Content -Позволяет создавать и изменять записи с помощью классов MODxAPI. - -### Контроллер DeleteContent -Позволяет пользователям удалять созданные ими записи. - -### Контроллер MailChimp -Добавляет пользователей в список рассылки сервиса MailChimp. Добавлен как пример расширения базового класса \FormLister\Core. diff --git "a/assets/snippets/FormLister/docs/ru/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/assets/snippets/FormLister/docs/ru/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" deleted file mode 100755 index 19d7add816..0000000000 --- "a/assets/snippets/FormLister/docs/ru/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" +++ /dev/null @@ -1,298 +0,0 @@ -## Общие параметры - -Эти параметры обрабатываются базовым классом FormLister. В контроллерах некоторые общие параметры могут иметь другое назначение. - -## Настройки -### controller -Задает класс для обработки данных. - -Возможные значения - имя php-файла с классом без расширения. - -Значение по умолчанию - Form. - -### dir -Папка в которой находится класс контроллера. - -Значение по умолчанию - assets/snippets/FormLister/core/controller/ - -### formid -Имя формы, обязательный параметр. - -В шаблоне формы обязательно должно быть скрытое поле с именем formid и значением, указанным в параметре. Форма считается отправленной, если в массиве $_REQUEST присутствует ключ с именем параметра, а его значение соответствует значению параметра. - -### formMethod -Возможные значения - post, get или request. - -Значение по умолчанию - post. - -### config -Загрузка параметров в формате json из файла. - -Возможные значения - имяфайла:папка, несколько значений разделяются точкой с запятой. - -#### Пример -myparams:core - загрузить параметры из файла assets/snippets/FormLister/config/core/myparams.json; myparams - загрузить параметры из файла assets/snippets/FormLister/config/custom/myparams.json; myparams:/assets/myfolder - загрузить параметры из файла assets/myfolder/myparams.json. - -Значение по умолчанию - пусто. - -### api -Определяет, в каком виде будут выводиться данные. - -Возможные значения: - -- 0: только html; -- 1: json-массив с данными формы; -- 2: json-массив с данными формы и html. - -### apiFormat -Формат вывода данных для api-режимов. - -Возможные значения - json, array. - -Значение по умолчанию - json. - -### debug -Режим отладки. Вывод записывается в лог MODX. - -Возможные значения - 0, 1. - -Значение по умолчанию - 0. - -### saveObject -Сохраняет объект класса FormLister в плейсхолдер, который можно использовать в других сниппетах. Объект сохраняется только при успешной обработке формы. - -Возможные значения - имя плейсхолдера. - -Значение по умолчанию - пусто. - -### removeGpc -Убирает экранирование данных, которое выполняет MODX для символов {{, [[ и т.д. При этом экранируются тэги MODX при выводе. - -Возножные значения - 0, 1 или имена полей через запятую. - -Значение по умолчанию - 0. - -## Источники данных -### defaultsSources -Позволяет загружать дополнительные данные из внешних источников, например, для предварительного заполнения полей формы. По умолчанию внешние данные загружаются только при начальном выводе формы и не загружаются после отправки формы Это поведение может быть изменено с помощью параметра keepDefaults. - -Возможные значения: список источников, разделенных точкой с запятой. Загрузка данных производится в том порядке, в котором они указаны в списке. - -Источник может задаваться в формате "имя:ключ:префикс". Префикс, если указан, добавляется c точкой к имени поля - например, config.site_name. - -Возможные значения: - -- array: json или php-массив, значения задаются параметром defaults; -- param:имя параметра:префикс - значения задаются значением параметра из вызова сниппета (аналогично array, только значение задается не параметром defaults, а произвольным, также можно указать префикс); -- session:ключ массива:префикс - значения загружаются из массива $_SESSION; -- plh:ключи через запятую:префикс - загружаются значения из массива $modx->placeholders; -- aplh:имя плейсхолдера:префикс - загружаются значения из плейсхолдера, содержащего массив; -- config:префикс - загружаются значения из конфигурации MODX; -- cookie:ключи через запятую:префикс - загружаются значения из массива $_COOKIE; -- имя класса MODxAPI:ключ:префикс - ключ является аргументом метода edit(), класс должен быть заранее загружен; -- document:префикс - загружает данные из модели modResource для документа, в котором вызван сниппет. Ключ не указывается; -- user:ключ:префикс - загружает данные из модели modUsers для авторизованного пользователя. Тип пользователя уточняется в ключе (web или mgr). - -Значение по умолчанию - array. - -### defaults -Данные для источника array. - -Возможные значения: массив значений по умолчанию, в формате json или php. - -### keepDefaults -Позволяет повторно загружать данные из внешних источников после отправки формы. Если в параметре указан список полей, то загружены будут только указанные поля. - -Возможные значения: 1, 0, имена полей, разделенные запятой. - -Значение по умолчанию - 0. - -### allowEmptyFields -Разрешает задавать поля с пустыми значениями. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 1. - -## Элементы управления -### formControls -Список полей с управляющими элементами формы (списки, чекбоксы, радио-кнопки). Необходимо для отслеживания состояния элементов. - -Возможные значения - имена полей, разделенные запятой. - -Значение по умолчанию - пусто. - -### emptyFormControls - -Этот параметр позволяет решить проблему неотмеченных чекбоксов, которые не включаются в массив полей при отправке формы: если в $_REQUEST отсутствует нужный элемент, то он создается согласно данному параметру. Необходимость в таком параметре возникла в связи с тем, что MODxAPI требует явно указывать изменяемые поля в методе fromArray(). Но можно использовать и в обычных формах, чтобы подставить в шаблон значение неотмеченного чекбокса. - -Возможные значения - массив: -``` -&emptyFormControls=`{ - "mycheckbox" : "Нет", - "published" : 0 -}` -``` - -## Обработка данных -### prepare, prepareProcess, prepareAfterProcess -Аналогично параметру prepare в DocLister. - -Сниппеты из параметра prepare выполняются после загрузки данных в форму, сниппеты из параметра prepareProcess - после прохождения валидации, сниппеты из параметра prepareAfterProcess - после успешного выполнения обработки. В сниппетах через переменную $FormLister доступен объект контроллера, а через массив $data - значения полей формы. Также доступна переменная $name, которая задержит имя параметра из которого взят сниппет (prepare, prepareProcess и т.д.); это позволяет использовать один и тот же сниппет для разных случаев. Для изменения данных следует использовать в prepare-сниппетах методы контроллера (setField, setFields и т.д.) - -Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов. - -Значение по умолчанию - пусто. - -## Валидация -### validator -Имя класса для валидации данных. Класс должен быть предварительно загружен. - -Значение по умолчанию - \FormLister\Validator. - -### rules -Массив с правилами валидации. - -Значение по умолчанию - пусто. - -## Шаблоны -### formTpl -Шаблон формы. В шаблоне формы обязательно должно быть поле с именем formid и значением, указанным в параметре formid. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### arraySplitter - -Разделитель для преобразования массивов в строку. - -Значение по умолчанию - точка с запятой. - -### {field}.arraySplitter -Разделитель для преобразования массивов в строку, но для отдельного поля {field}. Например: groups.arraySplitter - разделитель для массива из поля groups. - -Если не задано, то используется значение параметра arraySplitter. - -### errorTpl -Шаблон для вывода сообщений валидатора. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию: -``` -@CODE:
[+message+]
-``` - -### requiredClass, errorClass -Имена классов для обозначения незаполненных (required) и неверно заполенных (error) полей. - -Значение по умолчанию - required и error соответственно. - -### {field}.requiredClass, {field}.errorClass -Позволяет задавать указанные выше классы для конкретных полей. - -По умолчанию используются значения параметров requiredClass и errorClass. - -### messagesTpl -Шаблон сообщений обработчика формы. В шаблоне выводятся группы сообщений (messages, required, error). - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию: -``` -@CODE:
[+messages+]
-``` - -### messagesOuterTpl -Шаблон-обертка для группы произвольных сообщений. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - -``` -@CODE: [+messages+] -``` - -### messagesRequiredOuterTpl -Шаблон-обертка для группы сообщений о незаполненных полях. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию: -``` -@CODE: [+messages+] -``` - -### messagesErrorOuterTpl -Шаблон-обертка для группы сообщений о неверно заполненных полях. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию: -``` -@CODE: [+messages+] -``` - -### messagesSplitter, messagesRequiredSplitter, messagesErrorSplitter -Разделитель сообщений в группе. - -Возможные значения - произвольная строка. - -Значение по умолчанию: -``` -
-``` - -### removeEmptyPlaceholders -Удаляет из шаблонов незаполненные прейслхолдеры. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 1. - -### parseDocumentSource -Обрабатывает чанки MODX-парсером. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 0. - -### rewriteUrls -Если параметр parseDocumentSource отключен, то парсит ссылки в шаблонах. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 0. - -### skipPrerender -Позволяет отключить предварительную обработку полей формы (экранирование значений, преобразование массивов в строки, установка сообщений об ошибках). Можно включить, если для вывода не используется парсер MODX. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 0. - -### templatePath, templateExtension -Путь к папке с файлами шаблонов и расширение файлов шаблонов. Эти параметры необходимо задавать при использовании плагина EvoTwig. - -Значение по умолчанию - пусто. - -## Перенаправление после обработки -### redirectTo -Id страницы, на которую нужно выполнить перенаправление после успешной обработки формы. В api-режиме перенаправление не выполняется, но в массиве данных формы сохраняется абсолютная ссылка на целевую страницу (поле "redirectTo"). - -Вместо числа можно указывать массив: -``` -&redirectTo=`{ - "page":10, - "query":{ - "foo":"bar" - }, - "header":"HTTP/1.1 307 Temporary Redirect" -}` -``` -Ключ page задает id станицы, в массиве query можно передать дополнительные get-параметры, значением ключа header может быть текст заголовка для перенаправления. - -Возможные значения - число или массив. - -Значение по умолчанию - пусто. diff --git "a/assets/snippets/FormLister/docs/ru/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217_\320\264\320\260\320\275\320\275\321\213\321\205.md" "b/assets/snippets/FormLister/docs/ru/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217_\320\264\320\260\320\275\320\275\321\213\321\205.md" deleted file mode 100755 index 9efb7da81d..0000000000 --- "a/assets/snippets/FormLister/docs/ru/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217_\320\264\320\260\320\275\320\275\321\213\321\205.md" +++ /dev/null @@ -1,132 +0,0 @@ -## Валидация данных - -При валидации данных валидатор последовательно применяет к значению поля заданные правила, при возникновении ошибки в массив данных об ошибках добавляется запись и дальнейшая обработка формы прекращается. - -Валидация считается пройденной, если в массиве данных об ошибках отсутствуют записи. - -### Правила валидации -Список правил задается в виде массива. Ключом является имя поля, а значением - массив правил валидации. Правило валидации является методом класса-валидатора. В массиве правил ключом является имя правила (название метода валидации), значением может быть либо строка с сообщением об ошибке валидации правила, или же массив с описанием. В этом массиве в ключе params задаются необходимые для валидации значения, а в ключе message задается строка с сообщением об ошибке. - -Можно также использовать отрицание правил, если добавить перед именем правила восклицательный знак: "!numeric" - поле пройдет валидацию, если его значение не является числом. - -Если нужно реализовать проверку только заполненных полей, то перед именем поля в списке правил нужно добавить восклицательный знак. В этом случае если значение поля пустое, правила будут проигнорированы. - -``` -{ - "имя поля 1": { - "правило 1" : "сообщение об ошибке", - "правило 2" : "сообщение об ошибке" - }, - "имя поля 2": { - "правило 1" : "сообщение об ошибке", - "правило 2" : { - "params" : значение, - "message" : "сообщение об ошибке" - } - }, - "!имя поля 3":{ - "правило 1" : "сообщение об ошибке" - } -} -``` -Стандартным классом валидации (\FormLister\Validator) предусмотрены правила: - -- required: поле заполнено; -- date: значение поля является датой в заданном формате; -- min: значение поля больше заданного или равно ему; -- max: значение поля меньше заданного или равно ему; -- greater: значение поля строго меньше заданного; -- less: значение поля строго больше заданного; -- between: значение поля входит в диапазон; -- equals: значение поля равно заданному; -- in: значение поля входит в заданный массив значений; -- alpha: значение поля содержит только буквы; -- numeric: значение поля содержит только цифры; -- alphaNumeric: значение поля содержит только буквы и цифры; -- slug: значение поля является частью url; -- decimal: значение поля является десятичным числом; -- phone: значение поля является номером телефона; -- matches: значение поля удовлетворяет регулярному выражению; -- url: значение поля является ссылкой; -- email: значение поля является email-адресом; -- length: длина значения поля равна заданному; -- minLength: длина значения поля больше заданного или равна ему; -- maxLength: длина значения поля меньше заданного или равна ему; -- lengthBetween: длина значения поля входит в диапазон; -- minCount: размер массива больше заданного; -- maxCount: размер массива меньше заданного; -- countBetween: размер массива входит в диапазон. - -Если требуется задать два значения для правила, то их следует задавать как массив: -``` -&rules=`{ - "field" : { - "lengthBetween" : { - "params" : [10,20], - "message" : "Длина должна быть от 10 до 20" - } - } -}` -``` - -Для правила in (и других правил, использующих массив) массив значений следует задавать следующим образом: -``` -&rules=`{ - "field" : { - "in" : { - "params" : [ [10,20,30] ], - "message" : "Значение поля field должно быть равно 10, 20 или 30" - } - } -}` -``` - -Это нужно, чтобы массив был передан в функцию одним аргументом. - -Предусмотрена также возможность использовать для валидации функции или статические методы загруженного класса: -``` -&rules=`{ - "myfield":{ - "required":"Required field", - "custom":{ - "function":"\\Namespace\\Classname::myCustomRule", - "params":[10,20,30], - "message":"Custom check failed" - } - } -}` -``` - -Метод должен принимать первым аргументом экземпляр контроллера из которого вызывается правило, вторым аргументом - значение проверяемого поля, далее - параметры передаваемые в ключе описания params: -``` -public static function myCustomRule($fl,$value,$a,$b,$c) { - $result = $fl->getField('field1') == $a && $fl->getField('field2') == $b && $value == $c; - return $result; -} -``` -В примере правило будет пройдено, если значение поля field1 = 10, значение поля field2 = 20, а значение поля, к которму применяется правило, = 30. - -Метод должен вернуть true, false или текст сообщения об ошибке (в этом случае можно не указывать message в списке правил). - -В примере используется название правила "сustom", но можно использовать любое название правила, которого нет в классе валидации. Таким образом можно использовать несколько правил данного типа. - -### Результаты валидации -Данные об ошибках хранятся в виде массива и могут быть получены вызовом метода getFormData('errors'): -``` -{ - "имя поля 1": { - "имя нарушенного правила" : "сообщение об ошибке" - }, - "имя поля 2": { - "имя нарушенного правила" : "сообщение об ошибке" - } -} -``` -Для добавления данных в этот массив используется метод addError(имя поля, имя правила, сообщение об ошибке). Таким образом, можно влиять на итоговый результат валидации, вручную добавляя записи в этот массив. Можно также объявить валидацию непройденной по умолчанию, вызвав метод setValid(false). - -В шаблонах результаты валидации для каждого поля выводятся с помощью плейсхолдера [+имя поля.error+]. Общий результат может быть выведен в плейсхолдер [+form.messages+], который задается шаблоном messagesTpl. В свою очередь, в этом шаблоне можно использовать плейсхолдеры: - -- [+required+] - сообщения о незаполенных полях; -- [+errors+] - сообщения о неверно заполненных полях. - -Получить сообщения об ошибках для определенного поля можно с помощью метода getErrorMessage(имя поля). diff --git "a/assets/snippets/FormLister/docs/ru/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\260\320\277\321\207\320\270.md" "b/assets/snippets/FormLister/docs/ru/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\260\320\277\321\207\320\270.md" deleted file mode 100755 index 99f61a25bf..0000000000 --- "a/assets/snippets/FormLister/docs/ru/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\320\272\320\260\320\277\321\207\320\270.md" +++ /dev/null @@ -1,175 +0,0 @@ -## Использование капчи - -По умолчанию FormLister может использовать модицифированную капчу MODX и Google Recaptcha. Также в наличии SmsCaptcha - для отправки формы необходимо ввести код, полученный в смс-сообщении (отправку сообщения необходимо реализовывать отдельно). - -Для подключения необходимо указать имя папки с файлами капчи (папки находятся в assets/snippets/FormLister/lib/captcha/) в параметре &captcha. - -В параметре &captchaParams задаются в виде массива настройки капчи. Например: -``` -&captchaParams=`{ -"width":200, -"height":120 -}` -``` - -Имя поля, в которое пользователь вводит значение капчи, задается параметром captchaField (по умолчанию - vericode). Правило валидации для этого поля создается автоматически. - -Капча выводится в шаблоне формы с помощью плейсхолдера [+captcha+]. - -### modxCaptcha - -Модификация стандартной капчи MODX. - -Настройки: -* width и height - ширина и высота картинки с капчей (значение по умолчанию - 100 и 60); -* inline - формат вывода. Если значение параметра равно 1, то в плейсхолдер [+captcha+] выводится картинка в base64-формате. Если 0, то выводится ссылка на файл connector.php, генерирующий картинку. Значение по умолчанию - 1; -* connectorDir - путь к папке с файлом connector.php, если параметр inline равен 0. Значение по умолчанию - assets/snippets/FormLister/lib/captcha/modxCaptcha/; -* errorEmptyCode - текст сообщения об ошибке, если поле со значением капчи не заполнено. Значение по умолчанию - "Введите проверочный код"; -* errorCodeFailed - текст сообщения об ошибке, если введено неверное значение капчи. Значение по умолчанию - "Неверный проверочный код" - -### reCaptcha - -Капча Google reCAPTCHA V2. На странице с формой должен быть подключен скрипт: -``` - -``` - -Значение параметра captchaField должно быть "g-recaptcha-response" (см. [документацию](https://developers.google.com/recaptcha/docs/verify)). - -Настройки: -* secretKey, siteKey - ключи для доступа к api reCAPTCHA; -* size, theme, badge, callback, expired_callback, tabIndex, type - см. [документацию](https://developers.google.com/recaptcha/docs/display#render_param); -* errorCodeFailed - текст сообщения об ошибке, если пользователь не прошел проверку. Значение по умолчанию - "Вы не прошли проверку" - -### smsCaptcha - -Настройки: -* codeLifeTime - срок действия введенного кода, секунд. Если пользователь попытается ввести код до истечения срока, то будет выведено сообщение errorCodeUsed. Значение по умолчанию - 86400 (сутки); -* errorEmptyCode - сообщение об ошибке, если пользователь получил, но не ввел код. Значение по умолчанию - "Введите код авторизации"; -* errorCodeRequired - сообщение об ошибке, если пользователь не запросил код. Значение по умолчанию - "Получите код авторизации"; -* errorCodeFailed - сообщение об ошибке, если пользователь ввел неверный код авторизации. Значение по умолчанию - "Неверный код авторизации"; -* errorCodeExpired - сообщение об ошибке, если пользователь не ввел полученный код в течение заданного времени. Значение по умолчанию - "Код авторизации истек, получите новый"; -* errorCodeUsed - сообщение об ошибке, если пользователь уже вводил код для текущей формы. Значение по умолчанию - "Код авторизации уже использовался". - -Чтобы использовать эту капчу необходимо предварительно создать таблицу в базе данных: -``` -createTable(); -``` - -Для отправки кода необходимо создать отдельную форму и указать в параметре prepareProcess сниппет: - ``` -setValid(false); - $FormLister->addError('phone','phone','Неверный номер телефона'); -} else { - //загружаем класс для работы с таблицей - $sms = $FormLister->loadModel('SmsModel','assets/snippets/FormLister/lib/captcha/smsCaptcha/model.php'); - $flag = false; - //проверяем, есть ли в таблице запись для заданного номера и идентификатора формы - $data = $sms->getData('+'.$rawPhone,$formid); - if ($data->getID()) { - //если есть и код не истек - if ($sms->get('expires') > time()) { - //смотрим, использован ли код - if ($sms->get('active')) { - $FormLister->addMessage('Вы уже использовали код.'); - } else { - $FormLister->addMessage('Код уже был отправлен. Подождите несколько минут прежде чем запросить новый.'); - } - //если код истек, то удаляем запись и разрешаем выдать новый - } else { - $sms->delete($sms->getID()); - $flag = true; - } - } else { - $flag = true; - } - //если можно выдать новый код - if ($flag) { - $code = mt_rand(1000,9999); - - //здесь отправляется смс и результат помещается в переменную $result - /** - * - */ - $result = array('status'=>true); - - //проверяем отправлена ли смс - if (is_array($result) && $result['status']) { - //создаем запись в таблице, время жизни кода - 3 минуты - $result = $sms->create()->fromArray(array( - 'phone'=>('+'.$rawPhone), - 'formid'=>$formid, - 'expires'=>(time() + 60*3), - 'ip'=> \APIhelpers::getUserIP(), - 'code'=>$code - ))->save(); - //если получилось записать, то сохраняем в сессию номер телефона - if ($result) { - $_SESSION[$session_key] = '+'.$rawPhone; - } else { - $FormLister->setValid(false); - $FormLister->addMessage('Не удалось отправить смс'); - } - } else { - //если нельзя выдать код, то запрещаем дальнейшую обработку формы - $FormLister->setValid(false); - } -} -?> -``` - -Полностью вызов FormLister: -``` -[!FormLister? -&formid=`code` -&submitLimit=`0` -&protectSubmit=`0` -&rules=`{ -"phone":{ - "required":"Обязательно введите номер телефона", - "phone":"Введите номер правильно" -} -}` -&prepareProcess=`setSmsCaptcha` -&captcha=`modxCaptcha` -&formTpl=`@CODE: -
-
-
-
- - -
- -
- - [+phone.error+] -
-
-[+form.messages+] -
-
- -
-
- - - [+vericode.error+] -
-
-
-
` -&successTpl=`@CODE:Код авторизации отправлен на номер [+phone.value+]. Срок действия кода - 3 минуты.` -!] -``` diff --git "a/assets/snippets/FormLister/docs/ru/040_\320\222\321\213\320\262\320\276\320\264_\320\264\320\260\320\275\320\275\321\213\321\205.md" "b/assets/snippets/FormLister/docs/ru/040_\320\222\321\213\320\262\320\276\320\264_\320\264\320\260\320\275\320\275\321\213\321\205.md" deleted file mode 100755 index 8dc1af8cf9..0000000000 --- "a/assets/snippets/FormLister/docs/ru/040_\320\222\321\213\320\262\320\276\320\264_\320\264\320\260\320\275\320\275\321\213\321\205.md" +++ /dev/null @@ -1,40 +0,0 @@ -## Вывод данных - -Для вывода в шаблоны данные экранируются, а массивы преобразовываются в строки. Кроме этого, для элементов управления устанавливаются специальные плейсхолдеры. - -Вывод неэкранированного значения поля: -[+имя поля+] - -Вывод значения поля: -``` -[+имя поля.value+] -``` - -Установка чекбокса: -``` -[+c.имя поля.значение поля+] -``` - -Установка выпадающего списка или радио-кнопки: -``` -[+s.имя поля.значение поля+] -``` - -Установка класса для незаполненного поля: -[+имя поля.requiredСlass+] - -Установка класса для неверно заполненного поля: -[+имя поля.errorClass+] - -Вывод сообщения об ошибке валидации: -[+имя поля.error+] - -Вывод сообщений обработчика: -[+form.messages+] - -В плейсхолдер [+form.messages+] могут выводиться три типа сообщений: нарушения правила required, нарушения остальных правил, произвольные сообщения, которые задаются методом addMessage. По умолчанию выводятся только последние, см. описание параметра messagesTpl. - -Вывод значений из лексиконов: -[%ключ лексикона%] - -При использовании плагина EvoTwig в шаблонах доступны переменные FormLister (объект контроллера), errors (массив formData['errors']), messages (массив formData['messages']). diff --git "a/assets/snippets/FormLister/docs/ru/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\320\277\320\270\321\201\320\265\320\274.md" "b/assets/snippets/FormLister/docs/ru/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\320\277\320\270\321\201\320\265\320\274.md" deleted file mode 100644 index 99b5a33802..0000000000 --- "a/assets/snippets/FormLister/docs/ru/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\320\277\320\270\321\201\320\265\320\274.md" +++ /dev/null @@ -1,237 +0,0 @@ -## Отправка писем - -Контроллер Form позволяет отправлять данные формы в письме. - -## Параметры отправки почты -### parseMailerParams -Разрешает использовать данные формы в параметрах отправки почты (&to=\`[+user.email.value+]\` и т.п.). - -Возможные значения - 1, 0. - -Значение по умолчанию - 0. - -### isHtml -Разрешает отправлять письмо в формате html. Проверка корректности кода письма возлагается на разработчика. - -Возможные значения - 1, 0. - -Значение по умолчанию - 1. - -### to -Адрес получателя. Если не указан, то письмо не отправляется, но считается успешно отправленным. - -Возможные значения - email-адрес. - -Значение по умолчанию - пусто. - -### from -Возможные значения - email-адрес. - -Значение по умолчанию - параметр конфигурации emailsender. - -### fromName -Имя отправителя. - -Возможное значение - строка. - -Значение по умолчанию - параметр конфигурации site_name. - -### replyTo -Заголовок replyTo. - -Возможные значения - email-адрес. - -Значение по умолчанию - пусто. - -### cc -Заголовок сс. - -Возможные значения - email-адрес. - -Значение по умолчанию - пусто. - -### bcc -Заголовок bcc. - -Возможные значения - email-адрес. - -Значение по умолчанию - пусто. - -### noemail -Если параметр задан, то письмо не отправляется, но считается успешно отправленным. - -Возможные значения - 1, 0. - -Значение по умолчанию - 0. - -### ignoreMailerResult -Если параметр задан, то письмо отправляется, но результат отправки игнорируется. - -Возможные значения - 1, 0. - -Значение по умолчанию - 0. - -### subject, ccSubject, autoSubject -Тема письма. - -Возможные значения - строка. - -Значение по умолчанию - пусто. - -### subjectTpl, ccSubjectTpl, autoSubjectTpl -Шаблон темы письма. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - значение параметра subject (ccSubject, autoSubject). - -### autosender -Адрес на который отправляется дополнительное письмо. - -Возможные значения - email-адрес. - -Значение по умолчанию - пусто. - -### autosenderFromName -Имя отправителя дополнительного письма. - -Возможные значения - строка. - -Значение по умолчанию - параметр конфигурации site_name. - -### ccSender -Если параметр задан, то на адрес указанный в поле формы отправляется письмо. - -Возможные значения - 1, 0. - -Значение по умолчанию - 0. - -### ccSenderField -Имя поля, в котором хранится адрес получателя. - -Возможные значения - имя поля формы. - -Значение по умолчанию - email. - -### ccSenderFromName -Имя отправителя письма на заданный в поле формы адрес. - -Возможные значения - строка. - -Значение по умолчанию - не указано. - -### ccMailConfig -Позволяет переопределить параметры отправки для писем, отправляемых по адресу из формы (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail). - -Возможные значения - json или php массив. - -Значение по умолчанию - не указано. - -### autoMailConfig -Позволяет переопределить параметры отправки для дополнительно отправляемых писем (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail). - -Возможные значения - json или php массив. - -Значение по умолчанию - не указано. - -## Защита от повторной отправки -### protectSubmit -Защита от повторной отправки письма. - -Возможные значения - 1, 0 или список полей, по которым определяется уникальность письма. Если список не задан, то используются поля, обязательные для заполнения. - -Значение по умолчанию - 1. - -### submitLimit -Защита от частой отправки писем. - -Значение - число секунд между повторной отправкой. - -Значение по умолчанию - 60. - -## Шаблоны -### reportTpl -Основной шаблон письма. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - список полей и их значений. - -### automessageTpl -Шаблон дополнительного письма. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. Обязательный параметр, если задан параметр autosender. - -Значение по умолчанию - пусто. - -### ccSenderTpl -Шаблон письма на заданный в поле формы адрес. Обязательный параметр, если задан параметр ccSender. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### successTpl -Шаблон сообщения об успешной отправке писем. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -## Отправка файлов -### attachments -Имена полей, в которых хранятся файлы. Поддерживаются только поля с одним файлом (name="field" type="file") и поля с одномерным массивом файлов (name="field[]" type="file" multiple). - -Значение по умолчанию - пусто. - -### attachFiles -Позволяет отправить произвольные файлы. - -Возможные значения - массив: -``` -&attachFiles=`{ -"имя поля1":{ - "filepath":"assets/images/logo.png", - "filename":"logo.png" -}, -"имя поля2":[ - { - "filepath":"assets/images/file1.jpg", - "filename":"отчет.jpg" - }, - { - "filepath":"assets/images/file2.jpg", - "filename":"отчет2.jpg" - } -] -}` -``` -### deleteAttachments -Позволяет удалить файлы вложений после успешной отправки. - -Возможные значения - 0 или 1. - -Значение по умолчанию - 0. - -### fileValidator -Имя класса для валидации файлов. Если задано, то класс должен быть загружен заранее. - -Значение по умолчанию - \FormLister\FileValidator - -### fileRules -Правила валидации (см. раздел "Валидация данных"). Стандартный валидатор поддерживает правила: - -- required: файлы успешно отправлены; -- optional: аналогично required, но выполняется и в том случае, если пользователь не загружал файлы (то есть поле с файлами не является обязательным); -- allowed: расширение файла входит в заданный массив; -- images: расширение файла jpg, jpeg, gif, png, bmp; -- minSize: размер файла в килобайтах больше заданного; -- maxSize: размер файла в килобайтах меньше заданного; -- sizeBetween: размер файла в килобайтах входит в диапазон; -- minCount: количество файлов больше заданного; -- maxCount: количество файлов меньше заданного; -- countBetween: количество файлов входит в диапазон. - -Использовать конструкцию "!имя поля" в правилах валидации файлов нет смысла, так как значение поля с файлом не будет пустым, даже если файл не загружен. Следует использовать правило optional. - -В шаблоне письма reportTpl доступен плейсхолдер [+attachments.value+] со списком всех приложенных к письму файлов. Можно также вывести по отдельности: [+имя поля.value+]. Файлы отправляются только в письме c шаблоном reportTpl. diff --git "a/assets/snippets/FormLister/docs/ru/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" "b/assets/snippets/FormLister/docs/ru/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" deleted file mode 100755 index 8a1203405e..0000000000 --- "a/assets/snippets/FormLister/docs/ru/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" +++ /dev/null @@ -1,204 +0,0 @@ -## Авторизация пользователей - -Авторизация пользователей в `FormLister` осуществляется с использованием контроллера `Login`. - -### Выбор поля для авторизации - -Поле для авторизации задается в параметре `loginField` и должно быть **уникальным** для каждого веб-пользователя. - -Авторизация может осуществляться: -* по **базовым** полям средствами класса `modUsers`: `id`, `username` и `email` -* по любому **другому полю** из учетной записи (с помощью плагина для события `OnWebAuthentication`) - - -Дополнительное использование плагина [userHelper](https://github.com/evolution-cms/evolution/blob/develop/assets/snippets/FormLister/plugin.userHelper.php) позволяет: - -* вести учет количества логинов -* определить время последней авторизации -* реализовать автологин и выход из учетной записи -* блокировать пользователей после определенного количества неудачных попыток авторизации - -Перед использованием плагина `userHelper` убедитесь что он включен: - -![Не забудьте включить userHelper](https://habrastorage.org/web/dbc/1e2/abd/dbc1e2abd8664a548f4eca254187fb60.png) - -## Пример вызова FormLister для авторизации веб-пользователей - -```javascript -[!FormLister? -&formid=`login` -&controller=`Login` -&loginField=`email` -&passwordField=`password` -&rules=`{ - "email":{ - "required":"Обязательно введите email" - } - }, - "password":{ - "required":"Обязательно введите пароль", - "minLength":{ - "params":6, - "message":"В пароле должно быть больше 6 символов" - } - }, -}` -&allowedFields=`email,password` -&formTpl=`@CODE: -
-
- -
- - - [+email.error+] -
-
- - - [+password.error+] -
- [+form.messages+] -
- -
-
-
-` -&messagesOuterTpl=`@CODE:` -&successTpl=`@CODE:
Поздравляем с успешной авторизацией, [+fullname.value+]!
` -&errorTpl=`@CODE:
[+message+]
` -&requiredClass=` has-error` -&errorClass=` has-error` -&requiredClass=` has-error` -!] -``` - -## Параметры контроллера - -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### loginField -Поле, содержащее имя пользователя. - -Возможные значения - имя поля. - -Значение по умолчанию - username. - -### passwordField -Поле, содержащее пароль пользователя. - -Возможные значения - имя поля. - -Значение по умолчанию - password. - -### rememberField -Поле для запоминания пользователя. Если значение поля приводится к true, то при успешной авторизации будет установлена кука с параметрами автологина. Имя куки и ее время жизни задаются параметрами cookieName и cookieLifetime. - -Можно также задать поле rememberme в параметре defaults, чтобы запоминание происходило без участия пользователя: -``` -&defaults=`{"rememberme":1}` -``` - -Возможные значения - имя поля. - -Значение по умолчанию - rememberme. - -### checkActivation -Включает проверку активации учетной записи пользователя (см. "Активация учетных записей"). - -Возможные значения - 0 или 1. - -Значение по умолчанию - 1. - -### context -Контекст авторизации. - -Возможные значения - mgr или web. - -Значение по умолчанию - web. - -### cookieName -Имя куки для хранения параметров автологина. - -Значение по умолчанию - WebLoginPE. - -### cookieLifetime -Время жизни вышеуказанной куки. - -Возможные значения - число секунд с момента последнего логина. - -Значение по умолчанию - 157680000 (5 лет). - -### redirectTo -Перенаправляет пользователя на страницу c указанным id после авторизации. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет уже авторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### successTpl -Шаблон сообщения об успешной авторизации. В шаблоне можно использовать данные пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Login с ключом [+login.default_successTpl+] - -### skipTpl -Шаблон сообщения о том, что пользователь уже авторизован. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Login с ключом [+login.default_skipTpl+] - -## Параметры плагина userHelper -### logoutKey -Имя GET-параметра для запуска выхода из учетной записи. Если в ссылке на страницу сайта указан параметр с соответствующим именем (например, http://sitename.ru/page.html?logout), будет произведен выход из учетной записи. - -Значение по умолчанию - logout. - -### cookieName -Имя куки для хранения параметров автологина. - -Значение по умолчанию - WebLoginPE. - -### cookieLifetime -Время жизни вышеуказанной куки. - -Возможные значения - число секунд с момента последнего логина. - -Значение по умолчанию - 157680000 (5 лет). - -### maxFails -Количество попыток для ввода учетных данных. - -Возможные значения - число больше 0. - -Значение по умолчанию - 3. - -### blockTime -Время блокировки пользователя. - -Возможные значения - число секунд с момента последнего логина. - -Значение по умолчанию - 3600 (1 час). - diff --git "a/assets/snippets/FormLister/docs/ru/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" "b/assets/snippets/FormLister/docs/ru/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" deleted file mode 100755 index 97e0de13cd..0000000000 --- "a/assets/snippets/FormLister/docs/ru/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" +++ /dev/null @@ -1,142 +0,0 @@ -## Регистрация пользователей - -Контроллер Register позволяет регистрировать пользователей в заданные группы и отправлять уведомления о регистрации. Контроллер является расширением контроллера Form, соответственно можно использовать соответствующие параметры для отправки писем при регистрации. - -Имена полей в форме должны соответствовать полям модели [modUsers](http://docs.evolution-cms.com/Extras/Snippets/DocLister/MODxAPI). - -Если в форме не задано поле username, то ему присваивается значение поля email. Таким образом можно регистрировать пользователей только по email. - -Если в форме не задано поле password, то значение поля генерируется автоматически. То есть регистрацию пользователя можно свести к указанию email. - -При регистрации с паролем, в форме может присутствовать поле repeatPassword. Если заданы правила валидации для полей password и repeatPassword, то при наличии для поля repeatPassword правила equals, оно будет автоматически скорректировано для проверки равенства значений полей password и repeatPassword: -``` -"repeatPassword":{ - "required":"Введите пароль еще раз", - "equals":{ - "params" : "Этот ключ в описании правила можно не задавать, он будет сформирован контроллером автоматически", - "message":"Пароли не совпадают" - } -} -``` - -При регистрации следует проверять уникальность имени пользователя и email. В контроллере предусмотрены соответствующие правила: -``` -&rules=`{ - "username":{ - "required":"Введите имя пользователя", - "alphaNumeric":"Только буквы и цифры", - "custom":{ - "function":"\\FormLister\\Register::uniqueUsername", - "message":"Имя уже занято" - } - }, - "email":{ - "required":"Введите email", - "email":"Неверный email", - "custom":{ - "function":"\\FormLister\\Register::uniqueEmail", - "message":"Этот email уже использует другой пользователь" - } - } -}` -``` -В шаблонах доступны все поля модели для созданной записи. Дополнительно задается поле user.password с незашифрованным паролем. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### allowedFields -Разрешенные для обработки поля. Поля, не указанные в списке, игнорируются. Поля username, email и password всегда разрешены. - -Если не задано, то разрешены все поля. - -Возможные значения - имена полей формы, разделенные запятой. - -Значение по умолчанию - пусто. - -### forbiddenFields -Запрещенные для обработки поля. Поля, указанные в списке, игнорируются. Поля username, email и password удаляются из списка запрещенных. - -Возможные значения - имена полей формы, разделенные запятой. - -Значение по умолчанию - пусто. - -### userGroups -Добавляет зарегистрированного пользователя в указанные группы. - -Возможные значения - имена групп, разделенные запятой (если имена содержат запятую в названии, то можно задать значение параметра массивом). - -Значение по умолчанию - пусто. - -### checkActivation -Включает проверку активации учетной записи пользователя (см. "Активация учетных записей"). При этом после сохранения записи будет установлено поле activate.url, содержащее ссылку на страницу с вызовом сниппета для активации учетной записи. - -Возможные значения - 1 или 0. - -Значение по умолчанию - 0. - -### activateTo -Если включена проверка активации, то в этом параметре необходимо указать id страницы, на которой вызывается сниппет для активации. - -Возможные значения - id страницы. - -Значение по умолчанию - значение $modx->config['site_start']. - -### uidName -Имя GET-параметра в ссылке для восстановления пароля, который содержит id пользователя. - -Значение по умолчанию - primary key для таблицы с пользователями. - -### preparePostProcess -Позволяет выполнить обработку данных после сохранения. - -Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов. - -Значение по умолчанию - пусто. - -### redirectTo -Перенаправляет пользователя на указанную страницу после регистрации. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет уже авторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для уже авторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Register с ключом [+register.default_skipTpl+] - -### successTpl -Шаблон сообщения об успешной регистрации. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Register с ключом [+register.default_successTpl+] - -### passwordLength -Длина пароля (если создается автоматически). - -Возможные значения - число символов больше 6. - -Значение по умолчанию - 6. diff --git "a/assets/snippets/FormLister/docs/ru/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\321\213\321\205_\320\267\320\260\320\277\320\270\321\201\320\265\320\271.md" "b/assets/snippets/FormLister/docs/ru/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\321\213\321\205_\320\267\320\260\320\277\320\270\321\201\320\265\320\271.md" deleted file mode 100755 index ee220f6804..0000000000 --- "a/assets/snippets/FormLister/docs/ru/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217_\321\203\321\207\320\265\321\202\320\275\321\213\321\205_\320\267\320\260\320\277\320\270\321\201\320\265\320\271.md" +++ /dev/null @@ -1,89 +0,0 @@ -## Активация учетных записей - -Контроллер Activate реализует активацию учетных записей. Таким образом появляется возможность требовать у пользователя подтверждение учетной записи путем перехода по специальной ссылке из письма, отправленного при регистрации. - -Если по какой-то причине пользователь не получил письмо, то c помощью контроллера Activate он может запросить его повторную отправку. - -Учетная запись пользователя считается неактивированной если в поле logincount записано -1. - -В вызовах сниппета для регистрации и авторизации пользователей должен присутствовать параметр &checkActivation=`1`. - -Поэтому если при регистрации пользователь указывал пароль самостоятельно, то обязательно нужно запрашивать пароль для отправки письма со ссылкой для активации. Иначе будет генерироваться новый пароль, потому что раз пользователь запрашивает письмо для активации вручную, значит письмо после регистрации он не получил и не знает созданный при регистрации пароль. - -В шаблонах доступны все поля модели для обрабатываемой записи. В шаблоне reportTpl задается поле user.password с незашифрованным паролем и поле activate.url со ссылкой для активации. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### uidName -Имя GET-параметра в ссылке для активации, который содержит id пользователя. - -Значение по умолчанию - primary key для таблицы с пользователями. - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### redirectTo -Перенаправляет пользователя на указанную страницу после активации. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет авторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для авторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Register с ключом [+register.default_skipTpl+] - -### reportTpl -Шаблон письма с информацией для активации учетной записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### reportTpl -Шаблон письма с информацией для активации учетной записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### successTpl -Шаблон сообщения об успешной отправке письма с данными для активации. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Activate с ключом [+activate.default_successTpl+] - -### activateSuccessTpl -Шаблон сообщения об успешной активации. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Activate с ключом [+activate.default_activateSuccessTpl+] - -### passwordLength -Длина создаваемого пароля. - -Возможные значения - число символов больше 6. - -Значение по умолчанию - 6. diff --git "a/assets/snippets/FormLister/docs/ru/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/assets/snippets/FormLister/docs/ru/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" deleted file mode 100755 index 1a6d503c7d..0000000000 --- "a/assets/snippets/FormLister/docs/ru/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" +++ /dev/null @@ -1,99 +0,0 @@ -## Редактирование профиля пользователя - -Контроллер Profile позволяет авторизованным пользователям редактировать свои профили, в том числе менять пароль. - -При изменении профиля следует проверять уникальность email. В контроллере предусмотрено соответствующее правило: -``` -&rules=`{ - "email":{ - "required":"Введите email", - "email":"Неверный email", - "custom":{ - "function":"\\FormLister\\Profile::uniqueEmail", - "message":"Этот email уже использует другой пользователь" - } - } -}` -``` -Аналогично с полем username: -``` -&rules=`{ - "username":{ - "required":"Введите имя пользователя", - "alphaNumeric":"Только буквы и цифры", - "custom":{ - "function":"\\FormLister\\Profile::uniqueUsername", - "message":"Имя уже занято" - } - } -}` -``` - -Если поле с паролем пустое, то пароль остается прежний. После изменения пароля пользователь должен авторизоваться с новым паролем. Новый пароль сохраняется в поле user.password. - - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### allowedFields -Разрешенные для обработки поля. Поля, не указанные в списке, игнорируются. Если пользователь меняет пароль, то в разрешенные поля добавляется поле password. Если у пользователей совпадают поля e-mail и username, то при изменении e-mail будет изменено и поле username, если значение этого поля не задано. В этом случае поле username будет добавлено в список разрешенных. - -Если не задано, то разрешены все поля. - -Возможные значения - имена полей формы, разделенные запятой. - -Значение по умолчанию - пусто. - -### forbiddenFields -Запрещенные для обработки поля. Поля, указанные в списке, игнорируются. Поля password и username исключаются из списка по аналогии с allowedFields. - -Возможные значения - имена полей формы, разделенные запятой. - -Значение по умолчанию - пусто. - -### preparePostProcess -Позволяет выполнить обработку данных после сохранения. - -Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов. - -Значение по умолчанию - пусто. - -### redirectTo -Перенаправляет пользователя на указанную страницу после сохранения профиля. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для неавторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Profile с ключом [+profile.default_skipTpl+] - -### successTpl -Шаблон сообщения об успешном обновлении профиля. Если не задан, то генерируется сообщение об успешном сохранении формы. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. diff --git "a/assets/snippets/FormLister/docs/ru/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/assets/snippets/FormLister/docs/ru/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" deleted file mode 100755 index bfe4041476..0000000000 --- "a/assets/snippets/FormLister/docs/ru/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\277\321\200\320\276\321\204\320\270\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" +++ /dev/null @@ -1,50 +0,0 @@ -## Удаление профиля пользователя - -Контроллер DeleteUser позволяет авторизованным пользователям удалять свои профили. Для подтверждения действия пользователю необходимо ввести свой пароль. - -Расширяет Form. - -В шаблонах доступны поля модели для удаляемой записи. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### redirectTo -Перенаправляет пользователя на указанную страницу после сохранения профиля. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для неавторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteUser с ключом [+deleteUser.default_skipTpl+] - -### successTpl -Шаблон сообщения об успешном удалении профиля. Если не задан, то генерируется сообщение об успешном сохранении формы. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. diff --git "a/assets/snippets/FormLister/docs/ru/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" "b/assets/snippets/FormLister/docs/ru/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" deleted file mode 100755 index 6a4c13828c..0000000000 --- "a/assets/snippets/FormLister/docs/ru/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_\320\277\320\260\321\200\320\276\320\273\320\265\320\271_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" +++ /dev/null @@ -1,148 +0,0 @@ -## Восстановление паролей пользователями - -Контроллер Reminder позволяет web-пользователям восстанавливать забытые пароли. Расширяет контроллер Form. - -Восстановление паролей происходит по следующей схеме: - -- пользователь вводит в форме свой идентификатор (им может быть имя пользователя или email); -- пользователь получает письмо, в котором содержится ссылка для восстановления; -- при переходе по ссылке пользователь получает возможность ввести новый пароль либо пароль будет сгенерирован автоматически; -- пользователю отправляется письмо с новым паролем и показыается сообщение (в сообщении можно также вывести новый пароль). - -Параметр to перезаписывается значением email пользователя. Обязательно должен быть задан параметр resetTo. - -## Параметры -### model -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### modelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### hashField -Имя поля для хранения хэша данных пользователя. - -Значение по умолчанию - hash. - -### userField -Имя поля для хранения уникального идентификатора пользователя (имя пользователя или email). - -Значение по умолчанию - email. - -### uidField -Имя поля, которое содержит числовой идентификатор пользователя (Primary Key в таблице БД). - -Значение по умолчанию - id. - -### uidName -Имя GET-параметра в ссылке для восстановления пароля, который содержит id пользователя. - -Значение по умолчанию - значение параметра uidField. - -### exitTo -Перенаправляет авторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### resetTo -Страница, на которую будет указывать ссылка для восстановления паролей. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - id документа, в котором вызван контроллер. - -### redirectTo -Перенаправляет на указанную страницу после успешного восстановления пароля. - -Возможные значения - id целевой страницы. - -Значение по умолчанию - пусто. - -### skipTpl -Шаблон сообщения для авторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_skipTpl+]. - -### formTpl -Шаблон формы для ввода идентификатора пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### resetTpl -Шаблон формы для ввода нового пароля. Если параметр не задан, то пароль будет сгенерирован автоматически. - -Поля для ввода паролей должны называться password и repeatPassword. В форме должны также присутствовать скрытые поля с именами из параметров uidField и hashField. Значение для поля hashField задается через плейсхолдер [+user.hash+], а для поля uidField - [+user.id+]. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### successTpl -Шаблон сообщения об успешной отправке письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.). - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_successTpl+]. - -### resetSuccessTpl -Шаблон сообщения об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_resetSuccessTpl+]. - -### reportTpl -Шаблон письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Ссылка для восстановлени пароля в письме задается через плейсхолдер [+reset.url+] - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_reportTpl+].. - -### resetReportTpl -Шаблон письма об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Если не задан, то письмо пользователю отправляться не будет. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. - -### rules -Правила валидации для формы идентификации пользователя. - -Возможные значения - см. раздел "Валидация данных". - -Значение по умолчанию - пусто. - -### resetRules -Правила валидации для формы установки нового пароля. Если заданы правила валидации для полей password и repeatPassword, то при наличии для поля repeatPassword правила equals, оно будет автоматически скорректировано для проверки равенства значений полей password и repeatPassword: -``` -"repeatPassword":{ - "required":"Введите пароль еще раз", - "equals":{ - "params" : "Этот ключ в описании правила можно не задавать, он будет сформирован контроллером автоматически", - "message":"Пароли не совпадают" - } -} -``` -Возможные значения - см. раздел "Валидация данных". - -Значение по умолчанию - пусто. - -### passwordLength -Длина пароля (если создается автоматически). - -Возможные значения - число символов больше 6. - -Значение по умолчанию - 6. diff --git "a/assets/snippets/FormLister/docs/ru/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\270_\321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" "b/assets/snippets/FormLister/docs/ru/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\270_\321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" deleted file mode 100755 index d383e93f47..0000000000 --- "a/assets/snippets/FormLister/docs/ru/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\270_\321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" +++ /dev/null @@ -1,166 +0,0 @@ -## Создание и редактирование документов пользователями - -Контроллер Content позволяет web-пользователям создавать и редактировать записи в таблицах MODxAPI. Расширяет контроллер Form, что позволяет отправлять письма после создания записи. При редактировании записей отправка почты отключена, при необходимости ее можно реализовать с помощью плагинов на событие сохранения (OnDocFormSave и т.п.). - -Данные формы передаются в объект MODxAPI как есть, соответственно разработчику нужно заботиться об их корректности самостоятельно. - -При редактировании записей можно запретить изменение отдельных полей, используя параметр keepDefaults. - -При создании новой записи вызывается событие OnMakeDocUrl, в которое передается id записи и массив data со значениями полей записи. Это позволяет вернуть ссылку на созданную запись, она будет доступна через плейсхолдер [+content.url+]. Ссылку можно использовать в письме c уведомлением о создании новой записи. - -Также можно использовать данные авторизованного пользователя, доступны через плейсхолдеры [+user.fullname+], [+user.email+] и т.д. - -## Параметры -### model -Класс MODxAPI. - -Возможные значения - имя класса MODxAPI. - -Значение по умолчанию - \modResource. - -### modelPath -Путь к файлу класса, если класс не загружается заранее. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modResource.php. - -### userModel -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### userModelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### onlyUsers -Разрешить добавление записей только для зарегистрированных пользователей. - -Возможные значения - 0, 1. - -Значение по умолчанию - 1. - -### userGroups -Группы пользователей, которым разрешено добавлять или изменять записи. - -Возможные значения - список групп через точку с запятой. - -Значение по умолчанию - пусто (разрешены любые группы). - -### onlyOwners -Разрешает редактирование записей только их авторами. Автор определяется по полю, указанному в параметре ownerField. - -Возможные значения - 0, 1. - -Значение по умолчанию - 1. - -### ownerField -Имя поля, определяющего владельца записи. Если работать с документами modResource, то это будет имя tv-параметра (в Evo не предусмотрено создание записей веб-пользователями). - -Возможные значения - имя поля. - -Значение по умолчанию - aid. - -### idField -Имя ключа массива $_REQUEST, по которому определяется id редактируемой записи. Если ключ не задан, то контроллер вызывается в режиме создания записей. Информацию о режиме контроллера можно получить с помощью метода getMode. - -В форме редактирования нужно предусмотреть скрытое поле с именем параметра, в котором будет сохраняться id записи. - -Значение по умолчанию - id. - -### contentFields -Задает сопоставление полей MODxAPI и полей формы. Можно не задавать, если имена полей совпадают. Если параметр не задан, то ограничить список передаваемых в модель полей можно с помощью параметров allowedFields и forbiddenFields. - -Возможные значения - массив вида: -``` -&contentFields=`{ - "поле MODxAPI":"поле формы", - "поле MODxAPI":"поле формы" -} -` -``` -Значение по умолчанию - пусто. - -### clearCache -Очищать кэш после сохранения записи. - -Возможные значения - 0, 1. - -Значение по умолчанию - 0. - -### redirectTo -Перенаправляет пользователя на указанную страницу после сохранения новой записи. В режиме редактирования не используется. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### editAfterCreate -Переправляет пользователя на страницу для редактирования созданной записи. Страница указывается в параметре redirectTo. - -Возможные значения - 1 или 0. - -Значение по умолчанию - 0. - -### editTpl -Шаблон формы для редактирования документа. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - значение параметра formTpl. - -### badOwnerTpl -Шаблон сообщения о том, что пользователь не является автором документа. Только режим редактирования. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+edit.default_badOwnerTpl+]. - -### badGroupTpl, badGroupEditTpl -Шаблон сообщения о том, что пользователь не входит в группу пользователей которым разрешено создавать и редактировать документы. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом -[+create.default_badGroupTpl+] или [+edit.default_badGroupTpl+]. - -### badRecordTpl -Шаблон сообщения о том, что пользователь не может редактировать запись: например, запись не существует. Только режим редактирования. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+edit.default_badRecordTpl+]. - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### skipTpl, skipEditTpl -Шаблон сообщения для неавторизованного пользователя. Для режима редактирования - skipEditTpl. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+create.default_skipTpl+] (edit.default_skipEditTpl). - -### successTpl -Шаблон сообщения об успешном сохранении новой записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона Content с ключом [+create.default_successTpl+] - -### editSuccessTpl -Шаблон сообщения об успешном обновлении записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - пусто. diff --git "a/assets/snippets/FormLister/docs/ru/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" "b/assets/snippets/FormLister/docs/ru/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" deleted file mode 100755 index 7cddeb4ad3..0000000000 --- "a/assets/snippets/FormLister/docs/ru/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" +++ /dev/null @@ -1,97 +0,0 @@ -## Удаление профиля пользователя - -Контроллер DeleteContent позволяет авторизованным пользователям удалять созданные ими документы. - -Расширяет Form. - -В шаблонах доступны поля модели для удаляемой записи. Информация о пользователе доступна в полях с префиксом user (user.fullname, user.email и т.д.) - -## Параметры -### model -Класс MODxAPI. - -Возможные значения - имя класса MODxAPI. - -Значение по умолчанию - \modResource. - -### modelPath -Путь к файлу класса, если класс не загружается заранее. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modResource.php. - -### userModel -Класс для работы с пользователями. - -Возможные значения - имя класса. - -Значение по умолчанию - \modUsers - -### userModelPath -Путь к файлу класса для работы с пользователями. - -Возможные значения - относительный путь к файлу. - -Значение по умолчанию - assets/lib/MODxAPI/modUsers.php - -### ownerField -Имя поля, определяющего владельца записи. Если работать с документами modResource, то это будет имя tv-параметра (в Evo не предусмотрено создание записей веб-пользователями). - -Возможные значения - имя поля. - -Значение по умолчанию - aid. - -### idField -Имя ключа массива $_REQUEST, по которому определяется id удаляемой записи. - -Значение по умолчанию - id. - -### redirectTo -Перенаправляет пользователя на указанную страницу после удаления записи. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### badOwnerTpl -Шаблон сообщения о том, что пользователь не является автором документа. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_badOwnerTpl+]. - -### badRecordTpl -Шаблон сообщения о том, что пользователь не может удалить запись: например, запись не существует. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_badRecordTpl+]. - -### skipTpl -Шаблон сообщения для неавторизованного пользователя. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_skipTpl+]. - -### successTpl -Шаблон сообщения об успешном сохранении новой записи. - -Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister. - -Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_successTpl+] - -### exitTo -Перенаправляет неавторизованного пользователя на указанную страницу. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. - -### badRecordTo -Перенаправление, если невозможно удалить запись. - -Возможные значения - id целевой страницы или массив. - -Значение по умолчанию - пусто. diff --git "a/assets/snippets/FormLister/docs/ru/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md" "b/assets/snippets/FormLister/docs/ru/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md" deleted file mode 100644 index fbb6ee3e31..0000000000 --- "a/assets/snippets/FormLister/docs/ru/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md" +++ /dev/null @@ -1,32 +0,0 @@ -## Лексиконы - -Для использования лексиконов необходимо создать папку с полным названием языка (russian-UTF8, english и т.д.), в ней создать файл название_лексикона.inc.php: -``` - -``` -Для загрузки лексиконов при вызове сниппета следует указать параметры: - -* langDir - путь к папке с лексиконами; -* lang - язык лексикона (если не указано, то используется параметр конфигурации manager_language); -* lexicon - название лексикона, можно указать несколько названий через запятую. Также можно задать значения непосредственно в параметре: -``` -&lexicon=`{ - "english":{ - "test":"Test lexicon value", - "foo":"Another lexicon value", - "bar":"And one more value" - }, - "russian-UTF8":{ - "test":"Проверка", - "foo":"Еще проверка", - "bar":"И еще" - } -}` -``` - -После этого в шаблонах можно использовать плейсхолдеры [%ключ%] для подстановки значений из загруженных языковых файлов. Кроме того поддерживаются лексиконы компонента EvoBabel. From d5d1704042a8bb8ea66a241326f096272706e464 Mon Sep 17 00:00:00 2001 From: Mr B Date: Wed, 13 Jun 2018 08:32:01 +0100 Subject: [PATCH 017/241] Add confirmation for purge plugins --- manager/actions/resources/tab5_plugins.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/actions/resources/tab5_plugins.inc.php b/manager/actions/resources/tab5_plugins.inc.php index b07db5ab55..dec9c5ac2c 100755 --- a/manager/actions/resources/tab5_plugins.inc.php +++ b/manager/actions/resources/tab5_plugins.inc.php @@ -27,9 +27,9 @@ hasPermission('delete_plugin') && $_SESSION['mgrRole'] == 1) { - $tbl_site_plugins = $modx->getFullTableName('site_plugins'); - if ($modx->db->getRecordCount($modx->db->query("SELECT id FROM {$tbl_site_plugins} t1 WHERE disabled = 1 AND name IN (SELECT name FROM {$tbl_site_plugins} t2 WHERE t1.name = t2.name AND t1.id != t2.id)"))) { ?> - + $tbl_site_plugins = $modx->getDatabase()->getFullTableName('site_plugins'); + if ($modx->getDatabase()->getRecordCount($modx->getDatabase()->query("SELECT id FROM {$tbl_site_plugins} t1 WHERE disabled = 1 AND name IN (SELECT name FROM {$tbl_site_plugins} t2 WHERE t1.name = t2.name AND t1.id != t2.id)"))) { ?> + From 62285b7b473f902d7b0e2001f95c941e0963ce28 Mon Sep 17 00:00:00 2001 From: Mr B Date: Wed, 13 Jun 2018 08:33:14 +0100 Subject: [PATCH 018/241] Update english.inc.php --- manager/includes/lang/english.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index 2175e29e9c..16449b2097 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -710,6 +710,7 @@ $_lang["plugin_priority_instructions"] = 'Drag to reorder the Plugins under each Event header. The first plugin to execute should go at the top.'; $_lang["plugin_priority_title"] = 'Plugin Execution Order'; $_lang["purge_plugin"] = 'Purge obsolete plugins'; +$_lang["purge_plugin_confirm"] = 'Are you sure you want to purge obsolete plugins?'; $_lang["plugin_title"] = 'Create/edit Plugin'; $_lang["preview"] = 'Preview'; $_lang["preview_msg"] = 'This is a preview of your last saved changes. Click here to Save and Refresh your current changes'; From 81d31d49ae46003799710c7595dc84a4e043867b Mon Sep 17 00:00:00 2001 From: Mr B Date: Tue, 19 Jun 2018 12:03:29 +0100 Subject: [PATCH 019/241] Update english.inc.php --- manager/includes/lang/english.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index 16449b2097..8cc450163d 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -970,6 +970,7 @@ $_lang["signupemail_message"] = 'Set the email message sent to users when creating accounts including their username and password.
Note: The following Placeholders are replaced by the Content Manager when the message is sent:

[+sname+] - Name of your web site,
[+saddr+] - Your web site email address,
[+surl+] - Your site url,
[+uid+] - User\'s Login name or id,
[+pwd+] - User\'s password,
[+ufn+] - User\'s full name.

Leave the [+uid+] and [+pwd+] in the e-mail, or else the username and password won\'t be sent in the mail and your users won\'t know their username or password!'; $_lang["signupemail_title"] = 'Signup e-mail'; $_lang["site"] = 'Site'; +$_lang["site_offline"] = 'Site Offline!'; $_lang["site_schedule"] = 'Schedule'; $_lang["sitename_message"] = 'Enter the name of your site here.'; $_lang["sitename_title"] = 'Site name'; From 118f69e47918976218f0fa895697b1bc2e84f7a4 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Sat, 16 Jun 2018 06:06:20 +0500 Subject: [PATCH 020/241] russian-UTF8.inc.php #728 --- manager/includes/lang/russian-UTF8.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/includes/lang/russian-UTF8.inc.php b/manager/includes/lang/russian-UTF8.inc.php index 1da7dd9fd0..ed0d84212a 100755 --- a/manager/includes/lang/russian-UTF8.inc.php +++ b/manager/includes/lang/russian-UTF8.inc.php @@ -704,6 +704,7 @@ $_lang["plugin_priority_instructions"] = 'Перетащите мышью для определения порядка выполнения плагинов для каждого события. Сначала выполняется первый в списке плагин.'; $_lang["plugin_priority_title"] = 'Порядок вызова плагинов'; $_lang["purge_plugin"] = 'Удаление старых плагинов'; +$_lang["purge_plugin_confirm"] = 'Вы действительно хотите удалить устаревшие плагины?'; $_lang["plugin_title"] = 'Создать / редактировать плагин'; $_lang["preview"] = 'Просмотр'; $_lang["preview_msg"] = 'Предпросмотр последних изменений. Сохранить и обновить последние изменения'; From 7132beb6b1b9fa5973d239d3e744189e0869c5e8 Mon Sep 17 00:00:00 2001 From: Mr B Date: Mon, 18 Jun 2018 10:06:37 +0100 Subject: [PATCH 021/241] [I] Add time to dashboard resource edit dates --- .../default/snippets/welcome/RecentInfo.php | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 manager/media/style/default/snippets/welcome/RecentInfo.php diff --git a/manager/media/style/default/snippets/welcome/RecentInfo.php b/manager/media/style/default/snippets/welcome/RecentInfo.php new file mode 100644 index 0000000000..e1ce811270 --- /dev/null +++ b/manager/media/style/default/snippets/welcome/RecentInfo.php @@ -0,0 +1,103 @@ +getDatabase()->select('*', $modx->getDatabase()->getFullTableName('site_content'), '', 'editedon DESC', 10); + +if ($modx->getDatabase()->getRecordCount($rs) < 1) { + return '[%no_activity_message%]'; +} +$tpl = ' + [+id+] + [+pagetitle+] + [+editedon:math("%s+[(server_offset_time)]"):dateFormat=`'.$modx->toDateFormat(0,'formatOnly').' %H:%M:%S`+] + [+username+] + [+edit_btn+][+preview_btn+][+delete_btn+][+publish_btn+][+info_btn+] + + + +
+
    +
  • [%long_title%]: [+longtitle+]
  • +
  • [%description%]: [+description+]
  • +
  • [%resource_summary%]: [+introtext+]
  • +
  • [%type%]: [+type:is(reference):then([%weblink%]):else([%resource%])+]
  • +
  • [%resource_alias%]: [+alias+]
  • +
  • [%page_data_cacheable%]: [+cacheable:is(1):then([%yes%]):else([%no%])+]
  • +
  • [%resource_opt_show_menu%]: [+hidemenu:is(0):then([%yes%]):else([%no%])+]
  • +
  • [%page_data_template%]: [+template:templatename+]
  • +
+
+ +'; + +$btntpl['edit'] = ' '; +$btntpl['preview_btn'] = ' '; + +$output = array(); +while ($ph = $modx->getDatabase()->getRow($rs)) { + $docid = $ph['id']; + $_ = $modx->getUserInfo($ph['editedby']); + $ph['username'] = $_['username']; + + if ($ph['deleted'] == 1) { + $ph['status'] = 'deleted text-danger'; + } elseif ($ph['published'] == 0) { + $ph['status'] = 'unpublished font-italic text-muted'; + } else { + $ph['status'] = 'published'; + } + + if ($modx->hasPermission('edit_document')) { + $ph['edit_btn'] = str_replace('[+id+]', $docid, $btntpl['edit']); + } else { + $ph['edit_btn'] = ''; + } + + $preview_disabled = ($ph['deleted'] == 1) ? 'disabled' : ''; + $ph['preview_btn'] = str_replace(array( + '[+id+]', + '[+preview_disabled+]' + ), array( + $docid, + $preview_disabled + ), $btntpl['preview_btn']); + + if ($modx->hasPermission('delete_document')) { + if ($ph['deleted'] == 0) { + $delete_btn = ' '; + } else { + $delete_btn = ' '; + } + $ph['delete_btn'] = str_replace('[+id+]', $docid, $delete_btn); + } else { + $ph['delete_btn'] = ''; + } + + if ($ph['deleted'] == 1 && $ph['published'] == 0) { + $publish_btn = ' '; + } elseif ($ph['deleted'] == 1 && $ph['published'] == 1) { + $publish_btn = ' '; + } elseif ($ph['deleted'] == 0 && $ph['published'] == 0) { + $publish_btn = ' '; + } else { + $publish_btn = ' '; + } + $ph['publish_btn'] = str_replace('[+id+]', $docid, $publish_btn); + + $ph['info_btn'] = str_replace('[+id+]', $docid, ''); + + if ($ph['longtitle'] == '') { + $ph['longtitle'] = '([%not_set%])'; + } + if ($ph['description'] == '') { + $ph['description'] = '([%not_set%])'; + } + if ($ph['introtext'] == '') { + $ph['introtext'] = '([%not_set%])'; + } + if ($ph['alias'] == '') { + $ph['alias'] = '([%not_set%])'; + } + + $output[] = $modx->parseText($tpl, $ph); +} + +return implode("\n", $output); From abe48b7e317c8aec9f90b6b739f40f41a771e9a2 Mon Sep 17 00:00:00 2001 From: Mr B Date: Tue, 19 Jun 2018 12:01:35 +0100 Subject: [PATCH 022/241] Add Site Offline Warning Icon to top Menu --- manager/frames/1.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manager/frames/1.php b/manager/frames/1.php index a34aa16e55..75865bfd03 100755 --- a/manager/frames/1.php +++ b/manager/frames/1.php @@ -323,6 +323,11 @@ + config['site_status']) { ?> +
  • + +
  • + '+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,76,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
    ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file +(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,76,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
    ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file From 1a4852408884adc6fa4db479c67b6da190f6fd57 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Fri, 22 Jun 2018 01:19:35 +0300 Subject: [PATCH 026/241] Revert " Add site offline warning icon to top menu" --- manager/frames/1.php | 5 ----- manager/includes/lang/english.inc.php | 1 - manager/media/style/default/css/mainmenu.css | 1 - manager/media/style/default/style.php | 1 - 4 files changed, 8 deletions(-) diff --git a/manager/frames/1.php b/manager/frames/1.php index 75865bfd03..a34aa16e55 100755 --- a/manager/frames/1.php +++ b/manager/frames/1.php @@ -323,11 +323,6 @@ - config['site_status']) { ?> -
  • - -
  • -
  • '+t+"
  • ")).style.height=t.style.lineHeight=e.autoCompltHint.height,t.style.padding=e.autoCompltHint.padding,t.style.margin=e.autoCompltHint.margin,t.style.overflow=e.autoCompltHint.overflow,t.style.listStyleType=e.autoCompltHint.listStyleType,t.style.color=e.autoCompltHint.color,t.style.backgroundColor=e.autoCompltHint.backgroundColor,t.style.cursor=e.autoCompltHint.cursor,t.style.fontSize=e.autoCompltHint.fontSize,t):null},buildList:function(t){var e=this.buildElem('
      ');return e.style.maxHeight=t.autoCompltList.maxHeight,e.style.border=t.autoCompltList.border,e.style.padding=t.autoCompltList.padding,e.style.margin=t.autoCompltList.margin,e.style.zIndex=t.autoCompltList.zIndex,e.style.overflowX=t.autoCompltList.overflowX,e.style.overflowY=t.autoCompltList.overflowY,e.style.display=t.autoCompltList.display,e.style.position=t.autoCompltList.position,e.style.backgroundColor=t.autoCompltList.backgroundColor,e}},u=function(t){this.uiElem=null,this.assocInput=t,this.mouseOnList=!1,this.onMouseSelectionListener=null,this.maxHintNum=o.maxHintNum,this.styles=JSON.parse(JSON.stringify(o.defaultStyles))};return u.prototype.genList=function(){if(!this.uiElem){var t=this;this.uiElem=r.buildList(this.styles),l(this.uiElem,"mouseover",function(e){e=i(e),t.isHint(e.target)&&(t.pick(e.target),t.autoScroll())}),l(this.uiElem,"mouseout",function(e){t.unpick()}),l(this.uiElem,"mousedown",function(e){t.mouseOnList=!0,setTimeout(function(){t.assocInput.focus()},50)}),l(this.uiElem,"mouseup",function(e){e=i(e),t.isHint(e.target)&&(t.pick(e.target),"function"==typeof t.onMouseSelectionListener&&t.onMouseSelectionListener())}),document.body.appendChild(this.uiElem)}},u.prototype.isHint=function(t){return!(!t||"object"!=typeof t||1!==t.nodeType)&&(" "+t.className+" ").indexOf(" "+o.autoCompltHintClass+" ")>=0},u.prototype.putHints=function(t){var e=0;if(t instanceof Array){var n,o,i=[];for(o=Math.min(t.length,this.maxHintNum),n=0;n0){var l=document.createDocumentFragment();for(n=0,e=i.length;n=0||-1===t)){var n=this.uiElem.querySelectorAll("."+o.autoCompltHintClass);n.length>0&&(e=n[e=-1===(e=+t)||e>n.length-1?n.length-1:e])}null!==e&&(this.unpick(),e.className+=" "+o.autoCompltHintSelectedClass,e.style.color=this.styles.autoCompltHintSelected.color,e.style.backgroundColor=this.styles.autoCompltHintSelected.backgroundColor)}},u.prototype.unpick=function(){if(this.uiElem){var t=this.getPicked();t&&(t.className=o.autoCompltHintClass,t.style.color=this.styles.autoCompltHint.color,t.style.backgroundColor=this.styles.autoCompltHint.backgroundColor)}},u.prototype.getPicked=function(){return this.uiElem&&this.uiElem.querySelector("."+o.autoCompltHintSelectedClass)||null},{enable:function(t,n){if(t&&"object"==typeof t&&"string"==typeof t.tagName&&"input"==t.tagName.toLowerCase()&&"text"==t.type&&1===t.nodeType&&!t.autoComplt){t.autoComplt={};var s=o.autoCompltDelay,r=!0,c="",d=null,m=null,p=new u(t),f=function(){if(t.value.length>0&&r&&"function"==typeof d&&c!==t.value){var e={that:t,compltTarget:c=t.value,compltTargetMatchCurrentTarget:function(){return e.compltTarget===c},call:function(){e.compltTargetMatchCurrentTarget()&&d.call(e.that,e.compltTarget,e.openHint)},openHint:function(t){e.compltTargetMatchCurrentTarget()&&(p.putHints(t)?p.open():e.that.autoComplt.close())}};setTimeout(e.call,s)}},h=function(){if(r){var e=p.getPicked();t.value=e?e.innerHTML:c}},g=function(e){p.mouseOnList?(t.focus(),p.mouseOnList=!1):p.isOpen()&&t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection)},y=function(n){if(e()!==o.modeMobile&&(n=i(n),r))if("keydown"!=n.type||!p.isOpen()||n.keyCode!==o.keyCode.up&&n.keyCode!==o.keyCode.down){if("keyup"==n.type){var l=!1;switch(n.keyCode){case o.keyCode.up:case o.keyCode.down:p.isOpen()||(l=!0);break;case o.keyCode.esc:p.isOpen()&&(t.value=c,t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection));break;case o.keyCode.enter:p.isOpen()&&(h(),t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection));break;default:l=!0}l&&(t.value.length>0?f():t.autoComplt.close())}}else{var a=p.getPicked();n.keyCode===o.keyCode.up?a?a.previousSibling?p.pick(a.previousSibling):p.unpick():p.pick(-1):n.keyCode===o.keyCode.down&&(a?a.nextSibling?p.pick(a.nextSibling):p.unpick():p.pick(0)),p.autoScroll(),h()}};return t.autoComplt.setHintsFetcher=function(t){return(null===t||"function"==typeof t)&&(d=t,!0)},t.autoComplt.setListener=function(t,e){return(null===e||"function"==typeof e)&&o.listenersSupported.indexOf(t)>=0&&(null==m&&(m={}),m[t]=e,!0)},t.autoComplt.setStyles=function(t,e){var n,i,l=!1;switch(t){case o.autoCompltListClass:n=p.styles.autoCompltList,i=o.adjStyleAttrs.autoCompltList;break;case o.autoCompltHintClass:n=p.styles.autoCompltHint,i=o.adjStyleAttrs.autoCompltHint;break;case o.autoCompltHintSelectedClass:n=p.styles.autoCompltHintSelected,i=o.adjStyleAttrs.autoCompltHintSelected}if(e instanceof Object&&n&&i)for(var a=0;a0&&(n||(n={}),s=n.delay=e),void 0!==t.maxHintNum&&(e=Math.floor(t.maxHintNum))>0&&(n||(n={}),p.maxHintNum=n.maxHintNum=e));return n},t.autoComplt.close=function(){var e;c="",p.close(),r&&""!==t.value&&arguments[0]===o.hiddenArg_close_list_n_make_final_selection&&(e="select",null!=m&&"function"==typeof m[e]&&m[e].call(t))},t.autoComplt.enable=function(){r=!0},t.autoComplt.disable=function(){r=!1,this.close()},t.autoComplt.destroy=function(){a(t,"blur",g),a(t,"keyup",y),a(t,"keydown",y),this.disable(),delete t.autoComplt},p.onMouseSelectionListener=function(){h(),t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection)},l(t,"blur",g),l(t,"keyup",y),l(t,"keydown",y),l(t,"input",function(n){e()!==o.modePC&&(t.value.length>0?f():t.autoComplt.close())}),n instanceof Object&&(t.autoComplt.config(n),t.autoComplt.setHintsFetcher(n.hintsFetcher)),t}return null}}}();tinymce.PluginManager.add("modxlink",function(t){function e(e){return function(){var n=t.settings.link_list;"string"==typeof n?tinymce.util.XHR.send({url:n,success:function(t){e(tinymce.util.JSON.parse(t))}}):"function"==typeof n?n(e):e(n)}}function n(t,e,n){return function t(n,o){return o=o||[],tinymce.each(n,function(n){var i={text:n.text||n.title};n.menu?i.menu=t(n.menu):(i.value=n.value,e&&e(i)),o.push(i)}),o}(t,n||[])}function o(e){parent.tree&&(parent.tree.ca="disabled",checkModxTreeUpdate.call(this));var o,i,l,a,s,r,u,c,d,m,p,f,h={},g=t.selection,y=t.dom;function C(t){var e=a.find("#text");(!e.value()||t.lastControl&&e.value()==t.lastControl.text())&&e.value(t.control.text()),a.find("#href").value(t.control.value())}function v(){!l&&0===h.text.length&&s&&this.parent().parent().find("#text")[0].value(this.value())}o=g.getNode(),i=y.getParent(o,"a[href]"),s=function(t){var e=g.getContent();if(/]+>[^<]+<\/a>$/.test(e)||-1==e.indexOf("href=")))return!1;if(t){var n,o=t.childNodes;if(0===o.length)return!1;for(n=o.length-1;n>=0;n--)if(3!=o[n].nodeType)return!1}return!0}(),h.text=l=i?i.innerText||i.textContent:g.getContent({format:"text"}),h.href=i?y.getAttrib(i,"href"):"",i?h.target=y.getAttrib(i,"target"):t.settings.default_link_target&&(h.target=t.settings.default_link_target),(f=y.getAttrib(i,"rel"))&&(h.rel=f),(f=y.getAttrib(i,"class"))&&(h.class=f),(f=y.getAttrib(i,"title"))&&(h.title=f),s&&(r={name:"text",type:"textbox",size:40,label:"Text to display",id:"text-to-display",onchange:function(){h.text=this.value()}}),e&&(u={type:"listbox",label:"Link list",values:n(e,function(e){e.value=t.convertURL(e.value||e.url,"href")},[{text:"None",value:""}]),onselect:C,value:t.convertURL(h.href,"href"),onPostRender:function(){u=this}}),!1!==t.settings.target_list&&(t.settings.target_list||(t.settings.target_list=[{text:"None",value:""},{text:"New window",value:"_blank"}]),d={name:"target",type:"listbox",label:"Target",values:n(t.settings.target_list)}),t.settings.rel_list&&(c={name:"rel",type:"listbox",label:"Rel",values:n(t.settings.rel_list)}),t.settings.link_class_list&&(m={name:"class",type:"listbox",label:"Class",values:n(t.settings.link_class_list,function(e){e.value&&(e.textStyle=function(){return t.formatter.getCssText({inline:"a",classes:[e.value]})})})}),!1!==t.settings.link_title&&(p={name:"title",type:"textbox",label:"Title",value:h.title}),a=t.windowManager.open({title:"Insert link",data:h,body:[{name:"href",type:"FileImagePicker",filetype:"file",size:40,autofocus:!0,label:"Url",id:"link-href",onchange:function(e){var n=e.meta||{};u&&u.value(t.convertURL(this.value(),"href")),tinymce.each(e.meta,function(t,e){a.find("#"+e).value(t)}),n.text||v.call(this)},onkeyup:v},{name:"search",type:"textbox",label:"Search in EVO",id:"link-search"},r,p,function(e){var n=[];if(tinymce.each(t.dom.select("a:not([href])"),function(t){var o=t.name||t.id;o&&n.push({text:o,value:"#"+o,selected:-1!=e.indexOf("#"+o)})}),n.length)return n.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:n,onselect:C}}(h.href),u,c,d,m],onSubmit:function(e){var n;function o(e,n){var o=t.selection.getRng();window.setTimeout(function(){t.windowManager.confirm(e,function(e){t.selection.setRng(o),n(e)})},0)}function a(){parent.tree&&(parent.tree.ca="",clearTimeout(checkModxTreeUpdateInterval));var e={href:n,target:h.target?h.target:null,rel:h.rel?h.rel:null,class:h.class?h.class:null,title:h.title?h.title:null};i?(t.focus(),s&&h.text!=l&&("innerText"in i?i.innerText=h.text:i.textContent=h.text),y.setAttribs(i,e),g.select(i),t.undoManager.add()):s?t.insertContent(y.createHTML("a",e,y.encode(h.text))):t.execCommand("mceInsertLink",!1,e)}h=tinymce.extend(h,e.data),(n=h.href)?n.indexOf("@")>0&&-1==n.indexOf("//")&&-1==n.indexOf("mailto:")?o("The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(t){t&&(n="mailto:"+n),a()}):t.settings.link_assume_external_targets&&!/^\w+:/i.test(n)||!t.settings.link_assume_external_targets&&/^\s*www\./i.test(n)?o("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(t){t&&(n="http://"+n),a()}):a():t.execCommand("unlink")},onClose:function(t){parent.tree&&(parent.tree.ca="",clearTimeout(checkModxTreeUpdateInterval))}});var x=document.querySelector("#link-search"),b={};autoComplt.enable(x,{hintsFetcher:function(t,e){b={};var n=new XMLHttpRequest,o=encodeURI(tinymce4_baseUrl+"tinymce/plugins/modxlink/search.php?q="+t);n.open("GET",o),n.onload=function(){if(200===n.status){for(var t=JSON.parse(n.responseText),i=[],l=0;l',e.classes.add("has-open"),'
      '+t+"
      "}}))}); \ No newline at end of file +if(typeof parent.modx!=='undefined' && typeof parent.modx.tree!=='undefined')var modxOldRessourceId=parent.modx.tree.itemToChange,modxLinkTitle="",checkModxTreeUpdateInterval=void 0,checkModxTreeUpdate=function(){checkModxTreeUpdateInterval=setTimeout(checkModxTreeUpdate,100),parent.modx.tree.itemToChange!=modxOldRessourceId&&(modxOldRessourceId=parent.modx.tree.itemToChange,modxLinkTitle=parent.modx.tree.selectedObjectName,document.getElementById("link-href-inp").value="[~"+modxOldRessourceId+"~]",document.getElementById("text-to-display").value||(document.getElementById("text-to-display").value=modxLinkTitle))};var autoComplt=function(){"use strict";Array.prototype.indexOf||(Array.prototype.indexOf=function(t,e){if(void 0===this||null===this)throw new TypeError('"this" is null or not defined');var n=this.length>>>0;for(e=+e||0,Math.abs(e)===1/0&&(e=0),e<0&&(e+=n)<0&&(e=0);e=0?o.modeMobile:function(){var t=-1;if("Microsoft Internet Explorer"==navigator.appName){var e=navigator.userAgent;null!=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})").exec(e)&&(t=+RegExp.$1)}return-1===t?NaN:t}()<=9?o.modePC:n().windowWidth>o.modeMobileW?o.modePC:o.modeMobile},n=function(){return window.innerWidth?{windowWidth:window.innerWidth,windowHeight:window.innerHeight}:document.documentElement.offsetHeight?{windowWidth:document.documentElement.offsetWidth,windowHeight:document.documentElement.offsetHeight}:document.body.offsetHeight?{windowWidth:document.body.offsetWidth,windowHeight:document.body.offsetHeight}:document.documentElement.clientHeight?{windowWidth:document.documentElement.clientWidth,windowHeight:document.documentElement.clientHeight}:document.body.clientHeight?{windowWidth:document.body.clientWidth,windowHeight:document.body.clientHeight}:{windowWidth:-1,windowHeight:-1}},o=(o=t={},t.modePC="modePC",t.modeMobile="modeMobile",t.modeMobileW=768,t.autoCompltListClass="autoComplt-list",t.autoCompltHintClass="autoComplt-hint",t.autoCompltHintSelectedClass="autoComplt-hint-selected",t.maxHintNum=e()===o.modePC?10:5,t.autoCompltDelay=250,t.hiddenArg_close_list_n_make_final_selection="hiddenArg_close_list_n_make_final_selection",t.listStatus={attr:"data-listStatus",open:"open"},t.keyCode={up:38,down:40,esc:27,enter:13},t.defaultStyles={autoCompltList:{maxHeight:"none",border:"1px solid #aaa",padding:"0",margin:"0",zIndex:99999,overflowX:"hidden",overflowY:"auto",display:"none",position:"absolute",backgroundColor:"#fff"},autoCompltHint:{height:"1.5em",padding:e()===o.modePC?"2px 6px 2px 10px":"6px 6px 6px 10px",margin:"6px 0",overflow:"hidden",listStyleType:"none",color:"#000",backgroundColor:"#fff",cursor:"default",fontSize:"1em"},autoCompltHintSelected:{color:"#fff",backgroundColor:"#3399ff"}},t.adjStyleAttrs={autoCompltList:["border","maxHeight","backgroundColor"],autoCompltHint:["height","padding","margin","color","backgroundColor","fontSize"],autoCompltHintSelected:["color","backgroundColor"]},t.listenersSupported=["select"],o),i=function(t){return t||(t=window.event),t.target||(t.target=t.srcElement),t.stopBubble=function(){this.cancelBubble=!0,this.stopPropagation&&this.stopPropagation()},t.stopDefault=function(){return this.preventDefault&&this.preventDefault(),this.returnValue=!1,!1},t},l=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent&&t.attachEvent("on"+e,n)},a=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n):t.detachEvent&&t.detachEvent("on"+e,n)},s=function(t,e){var n=null;if(window.getComputedStyle)n=window.getComputedStyle(t)[e]||null;else if(t.currentStyle){n=t.currentStyle&&t.currentStyle[e];var o,i,l=t.style;null==n&&l&&l[e]&&(n=l[e]),o=l.left,(i=t.runtimeStyle&&t.runtimeStyle.left)&&(t.runtimeStyle.left=t.currentStyle.left),l.left="fontSize"===e?"1em":n,n=l.pixelLeft+"px",l.left=o,i&&(t.runtimeStyle.left=i)}return n},r={buildElem:function(t){var e=document.createElement("DIV");return e.innerHTML=t,e.firstChild.cloneNode(!0)},buildHint:function(t,e){return"string"==typeof t&&t?((t=this.buildElem('
    • '+t+"
    • ")).style.height=t.style.lineHeight=e.autoCompltHint.height,t.style.padding=e.autoCompltHint.padding,t.style.margin=e.autoCompltHint.margin,t.style.overflow=e.autoCompltHint.overflow,t.style.listStyleType=e.autoCompltHint.listStyleType,t.style.color=e.autoCompltHint.color,t.style.backgroundColor=e.autoCompltHint.backgroundColor,t.style.cursor=e.autoCompltHint.cursor,t.style.fontSize=e.autoCompltHint.fontSize,t):null},buildList:function(t){var e=this.buildElem('
        ');return e.style.maxHeight=t.autoCompltList.maxHeight,e.style.border=t.autoCompltList.border,e.style.padding=t.autoCompltList.padding,e.style.margin=t.autoCompltList.margin,e.style.zIndex=t.autoCompltList.zIndex,e.style.overflowX=t.autoCompltList.overflowX,e.style.overflowY=t.autoCompltList.overflowY,e.style.display=t.autoCompltList.display,e.style.position=t.autoCompltList.position,e.style.backgroundColor=t.autoCompltList.backgroundColor,e}},u=function(t){this.uiElem=null,this.assocInput=t,this.mouseOnList=!1,this.onMouseSelectionListener=null,this.maxHintNum=o.maxHintNum,this.styles=JSON.parse(JSON.stringify(o.defaultStyles))};return u.prototype.genList=function(){if(!this.uiElem){var t=this;this.uiElem=r.buildList(this.styles),l(this.uiElem,"mouseover",function(e){e=i(e),t.isHint(e.target)&&(t.pick(e.target),t.autoScroll())}),l(this.uiElem,"mouseout",function(e){t.unpick()}),l(this.uiElem,"mousedown",function(e){t.mouseOnList=!0,setTimeout(function(){t.assocInput.focus()},50)}),l(this.uiElem,"mouseup",function(e){e=i(e),t.isHint(e.target)&&(t.pick(e.target),"function"==typeof t.onMouseSelectionListener&&t.onMouseSelectionListener())}),document.body.appendChild(this.uiElem)}},u.prototype.isHint=function(t){return!(!t||"object"!=typeof t||1!==t.nodeType)&&(" "+t.className+" ").indexOf(" "+o.autoCompltHintClass+" ")>=0},u.prototype.putHints=function(t){var e=0;if(t instanceof Array){var n,o,i=[];for(o=Math.min(t.length,this.maxHintNum),n=0;n0){var l=document.createDocumentFragment();for(n=0,e=i.length;n=0||-1===t)){var n=this.uiElem.querySelectorAll("."+o.autoCompltHintClass);n.length>0&&(e=n[e=-1===(e=+t)||e>n.length-1?n.length-1:e])}null!==e&&(this.unpick(),e.className+=" "+o.autoCompltHintSelectedClass,e.style.color=this.styles.autoCompltHintSelected.color,e.style.backgroundColor=this.styles.autoCompltHintSelected.backgroundColor)}},u.prototype.unpick=function(){if(this.uiElem){var t=this.getPicked();t&&(t.className=o.autoCompltHintClass,t.style.color=this.styles.autoCompltHint.color,t.style.backgroundColor=this.styles.autoCompltHint.backgroundColor)}},u.prototype.getPicked=function(){return this.uiElem&&this.uiElem.querySelector("."+o.autoCompltHintSelectedClass)||null},{enable:function(t,n){if(t&&"object"==typeof t&&"string"==typeof t.tagName&&"input"==t.tagName.toLowerCase()&&"text"==t.type&&1===t.nodeType&&!t.autoComplt){t.autoComplt={};var s=o.autoCompltDelay,r=!0,c="",d=null,m=null,p=new u(t),f=function(){if(t.value.length>0&&r&&"function"==typeof d&&c!==t.value){var e={that:t,compltTarget:c=t.value,compltTargetMatchCurrentTarget:function(){return e.compltTarget===c},call:function(){e.compltTargetMatchCurrentTarget()&&d.call(e.that,e.compltTarget,e.openHint)},openHint:function(t){e.compltTargetMatchCurrentTarget()&&(p.putHints(t)?p.open():e.that.autoComplt.close())}};setTimeout(e.call,s)}},h=function(){if(r){var e=p.getPicked();t.value=e?e.innerHTML:c}},g=function(e){p.mouseOnList?(t.focus(),p.mouseOnList=!1):p.isOpen()&&t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection)},y=function(n){if(e()!==o.modeMobile&&(n=i(n),r))if("keydown"!=n.type||!p.isOpen()||n.keyCode!==o.keyCode.up&&n.keyCode!==o.keyCode.down){if("keyup"==n.type){var l=!1;switch(n.keyCode){case o.keyCode.up:case o.keyCode.down:p.isOpen()||(l=!0);break;case o.keyCode.esc:p.isOpen()&&(t.value=c,t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection));break;case o.keyCode.enter:p.isOpen()&&(h(),t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection));break;default:l=!0}l&&(t.value.length>0?f():t.autoComplt.close())}}else{var a=p.getPicked();n.keyCode===o.keyCode.up?a?a.previousSibling?p.pick(a.previousSibling):p.unpick():p.pick(-1):n.keyCode===o.keyCode.down&&(a?a.nextSibling?p.pick(a.nextSibling):p.unpick():p.pick(0)),p.autoScroll(),h()}};return t.autoComplt.setHintsFetcher=function(t){return(null===t||"function"==typeof t)&&(d=t,!0)},t.autoComplt.setListener=function(t,e){return(null===e||"function"==typeof e)&&o.listenersSupported.indexOf(t)>=0&&(null==m&&(m={}),m[t]=e,!0)},t.autoComplt.setStyles=function(t,e){var n,i,l=!1;switch(t){case o.autoCompltListClass:n=p.styles.autoCompltList,i=o.adjStyleAttrs.autoCompltList;break;case o.autoCompltHintClass:n=p.styles.autoCompltHint,i=o.adjStyleAttrs.autoCompltHint;break;case o.autoCompltHintSelectedClass:n=p.styles.autoCompltHintSelected,i=o.adjStyleAttrs.autoCompltHintSelected}if(e instanceof Object&&n&&i)for(var a=0;a0&&(n||(n={}),s=n.delay=e),void 0!==t.maxHintNum&&(e=Math.floor(t.maxHintNum))>0&&(n||(n={}),p.maxHintNum=n.maxHintNum=e));return n},t.autoComplt.close=function(){var e;c="",p.close(),r&&""!==t.value&&arguments[0]===o.hiddenArg_close_list_n_make_final_selection&&(e="select",null!=m&&"function"==typeof m[e]&&m[e].call(t))},t.autoComplt.enable=function(){r=!0},t.autoComplt.disable=function(){r=!1,this.close()},t.autoComplt.destroy=function(){a(t,"blur",g),a(t,"keyup",y),a(t,"keydown",y),this.disable(),delete t.autoComplt},p.onMouseSelectionListener=function(){h(),t.autoComplt.close(o.hiddenArg_close_list_n_make_final_selection)},l(t,"blur",g),l(t,"keyup",y),l(t,"keydown",y),l(t,"input",function(n){e()!==o.modePC&&(t.value.length>0?f():t.autoComplt.close())}),n instanceof Object&&(t.autoComplt.config(n),t.autoComplt.setHintsFetcher(n.hintsFetcher)),t}return null}}}();tinymce.PluginManager.add("modxlink",function(t){function e(e){return function(){var n=t.settings.link_list;"string"==typeof n?tinymce.util.XHR.send({url:n,success:function(t){e(tinymce.util.JSON.parse(t))}}):"function"==typeof n?n(e):e(n)}}function n(t,e,n){return function t(n,o){return o=o||[],tinymce.each(n,function(n){var i={text:n.text||n.title};n.menu?i.menu=t(n.menu):(i.value=n.value,e&&e(i)),o.push(i)}),o}(t,n||[])}function o(e){parent.tree&&(parent.tree.ca="disabled",checkModxTreeUpdate.call(this));var o,i,l,a,s,r,u,c,d,m,p,f,h={},g=t.selection,y=t.dom;function C(t){var e=a.find("#text");(!e.value()||t.lastControl&&e.value()==t.lastControl.text())&&e.value(t.control.text()),a.find("#href").value(t.control.value())}function v(){!l&&0===h.text.length&&s&&this.parent().parent().find("#text")[0].value(this.value())}o=g.getNode(),i=y.getParent(o,"a[href]"),s=function(t){var e=g.getContent();if(/]+>[^<]+<\/a>$/.test(e)||-1==e.indexOf("href=")))return!1;if(t){var n,o=t.childNodes;if(0===o.length)return!1;for(n=o.length-1;n>=0;n--)if(3!=o[n].nodeType)return!1}return!0}(),h.text=l=i?i.innerText||i.textContent:g.getContent({format:"text"}),h.href=i?y.getAttrib(i,"href"):"",i?h.target=y.getAttrib(i,"target"):t.settings.default_link_target&&(h.target=t.settings.default_link_target),(f=y.getAttrib(i,"rel"))&&(h.rel=f),(f=y.getAttrib(i,"class"))&&(h.class=f),(f=y.getAttrib(i,"title"))&&(h.title=f),s&&(r={name:"text",type:"textbox",size:40,label:"Text to display",id:"text-to-display",onchange:function(){h.text=this.value()}}),e&&(u={type:"listbox",label:"Link list",values:n(e,function(e){e.value=t.convertURL(e.value||e.url,"href")},[{text:"None",value:""}]),onselect:C,value:t.convertURL(h.href,"href"),onPostRender:function(){u=this}}),!1!==t.settings.target_list&&(t.settings.target_list||(t.settings.target_list=[{text:"None",value:""},{text:"New window",value:"_blank"}]),d={name:"target",type:"listbox",label:"Target",values:n(t.settings.target_list)}),t.settings.rel_list&&(c={name:"rel",type:"listbox",label:"Rel",values:n(t.settings.rel_list)}),t.settings.link_class_list&&(m={name:"class",type:"listbox",label:"Class",values:n(t.settings.link_class_list,function(e){e.value&&(e.textStyle=function(){return t.formatter.getCssText({inline:"a",classes:[e.value]})})})}),!1!==t.settings.link_title&&(p={name:"title",type:"textbox",label:"Title",value:h.title}),a=t.windowManager.open({title:"Insert link",data:h,body:[{name:"href",type:"FileImagePicker",filetype:"file",size:40,autofocus:!0,label:"Url",id:"link-href",onchange:function(e){var n=e.meta||{};u&&u.value(t.convertURL(this.value(),"href")),tinymce.each(e.meta,function(t,e){a.find("#"+e).value(t)}),n.text||v.call(this)},onkeyup:v},{name:"search",type:"textbox",label:"Search in EVO",id:"link-search"},r,p,function(e){var n=[];if(tinymce.each(t.dom.select("a:not([href])"),function(t){var o=t.name||t.id;o&&n.push({text:o,value:"#"+o,selected:-1!=e.indexOf("#"+o)})}),n.length)return n.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:n,onselect:C}}(h.href),u,c,d,m],onSubmit:function(e){var n;function o(e,n){var o=t.selection.getRng();window.setTimeout(function(){t.windowManager.confirm(e,function(e){t.selection.setRng(o),n(e)})},0)}function a(){parent.tree&&(parent.tree.ca="",clearTimeout(checkModxTreeUpdateInterval));var e={href:n,target:h.target?h.target:null,rel:h.rel?h.rel:null,class:h.class?h.class:null,title:h.title?h.title:null};i?(t.focus(),s&&h.text!=l&&("innerText"in i?i.innerText=h.text:i.textContent=h.text),y.setAttribs(i,e),g.select(i),t.undoManager.add()):s?t.insertContent(y.createHTML("a",e,y.encode(h.text))):t.execCommand("mceInsertLink",!1,e)}h=tinymce.extend(h,e.data),(n=h.href)?n.indexOf("@")>0&&-1==n.indexOf("//")&&-1==n.indexOf("mailto:")?o("The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(t){t&&(n="mailto:"+n),a()}):t.settings.link_assume_external_targets&&!/^\w+:/i.test(n)||!t.settings.link_assume_external_targets&&/^\s*www\./i.test(n)?o("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(t){t&&(n="http://"+n),a()}):a():t.execCommand("unlink")},onClose:function(t){parent.tree&&(parent.tree.ca="",clearTimeout(checkModxTreeUpdateInterval))}});var x=document.querySelector("#link-search"),b={};autoComplt.enable(x,{hintsFetcher:function(t,e){b={};var n=new XMLHttpRequest,o=encodeURI(tinymce4_baseUrl+"tinymce/plugins/modxlink/search.php?q="+t);n.open("GET",o),n.onload=function(){if(200===n.status){for(var t=JSON.parse(n.responseText),i=[],l=0;l',e.classes.add("has-open"),'
        '+t+"
        "}}))}); From 5af0c3c4fbb2b7dfff4812e5872fdf68f5b95151 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Thu, 12 Jul 2018 02:16:01 +0300 Subject: [PATCH 041/241] cancel close tabs for components --- manager/media/style/default/js/modx.js | 2 +- manager/media/style/default/js/modx.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index 3cb1273cdb..77e3873ba7 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1491,7 +1491,7 @@ this.timer = null; this.olduid = ''; this.closeactions = [6, 61, 62, 63, 94]; - this.saveAndCloseActions = [3, 75, 76, 86, 99, 106]; + this.saveAndCloseActions = [3, 75, 86, 99, 106]; this.reload = typeof a.reload !== 'undefined' ? a.reload : 1; this.action = modx.getActionFromUrl(a.url); this.uid = modx.getActionFromUrl(a.url, 2) ? 'home' : modx.urlToUid(a.url); diff --git a/manager/media/style/default/js/modx.min.js b/manager/media/style/default/js/modx.min.js index 303f9969be..996dcc70b7 100755 --- a/manager/media/style/default/js/modx.min.js +++ b/manager/media/style/default/js/modx.min.js @@ -1 +1 @@ -(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML='
        '+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,76,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
        ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file +(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×'}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
        ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file From 5e0a3510ffbe8fad97af9849a9dfcd8fadfbc9ca Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Thu, 12 Jul 2018 02:28:20 +0300 Subject: [PATCH 042/241] fix #749 --- manager/processors/login.processor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/processors/login.processor.php b/manager/processors/login.processor.php index 5d0e1b0371..c6219bc2fa 100755 --- a/manager/processors/login.processor.php +++ b/manager/processors/login.processor.php @@ -182,7 +182,7 @@ if(!$matchPassword) { jsAlert($_lang['login_processor_wrong_password']); - incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $blocked_minutes); + incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $modx->config['blocked_minutes']); return; } @@ -192,7 +192,7 @@ return; } elseif($_SESSION['veriword'] != $captcha_code) { jsAlert($_lang['login_processor_bad_code']); - incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $blocked_minutes); + incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $modx->config['blocked_minutes']); return; } } From 6fc31e1971a902590d7e2ec2dd1ab2aefa6e86fb Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Thu, 12 Jul 2018 02:37:30 +0300 Subject: [PATCH 043/241] fix #749 --- manager/processors/login.processor.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/manager/processors/login.processor.php b/manager/processors/login.processor.php index c6219bc2fa..f7f4b0c4d0 100755 --- a/manager/processors/login.processor.php +++ b/manager/processors/login.processor.php @@ -20,7 +20,6 @@ if($manager_language !== 'english' && is_file("{$core_path}lang/{$manager_language}.inc.php")) { include_once("{$core_path}lang/{$manager_language}.inc.php"); } - // include the logger include_once("{$core_path}log.class.inc.php"); @@ -180,9 +179,11 @@ $matchPassword = true; } +$blocked_minutes = (int)$modx->config['blocked_minutes']; + if(!$matchPassword) { jsAlert($_lang['login_processor_wrong_password']); - incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $modx->config['blocked_minutes']); + incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $blocked_minutes); return; } @@ -192,7 +193,7 @@ return; } elseif($_SESSION['veriword'] != $captcha_code) { jsAlert($_lang['login_processor_bad_code']); - incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $modx->config['blocked_minutes']); + incrementFailedLoginCount($internalKey, $failedlogins, $failed_allowed, $blocked_minutes); return; } } From 5ad93fdce9919306bb81bd19e4c65e8a647b6add Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 21:16:35 +0300 Subject: [PATCH 044/241] revert --- manager/media/browser/mcpuk/core/uploader.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manager/media/browser/mcpuk/core/uploader.php b/manager/media/browser/mcpuk/core/uploader.php index 4afc2532e8..5cb9fef14f 100755 --- a/manager/media/browser/mcpuk/core/uploader.php +++ b/manager/media/browser/mcpuk/core/uploader.php @@ -294,11 +294,11 @@ protected function getTransaliasSettings() { $modx = evolutionCMS(); // Cleaning uploaded filename? - $setting = $modx->getDatabase()->select('count(*)', $modx->getDatabase()->getFullTableName('system_settings'), 'setting_name="clean_uploaded_filename" AND setting_value=1'); - if ($modx->getDatabase()->getValue($setting)>0) { + $setting = $modx->db->select('count(*)', $modx->getFullTableName('system_settings'), 'setting_name="clean_uploaded_filename" AND setting_value=1'); + if ($modx->db->getValue($setting)>0) { // Transalias plugin active? - $res = $modx->getDatabase()->select('properties', $modx->getDatabase()->getFullTableName('site_plugins'), 'name="TransAlias" AND disabled=0'); - if ($properties = $modx->getDatabase()->getValue($res)) { + $res = $modx->db->select('properties', $modx->getFullTableName('site_plugins'), 'name="TransAlias" AND disabled=0'); + if ($properties = $modx->db->getValue($res)) { $properties = $modx->parseProperties($properties, 'TransAlias', 'plugin'); } else { $properties = NULL; From d753660e09f9c1e5cd482d2b339436c1b376b3a2 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 21:31:36 +0300 Subject: [PATCH 045/241] add OnFileBrowserInit event --- install/setup.sql | 3 ++- manager/media/browser/mcpuk/config.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/install/setup.sql b/install/setup.sql index d67f21c70b..7c073c17fc 100755 --- a/install/setup.sql +++ b/install/setup.sql @@ -1108,7 +1108,8 @@ REPLACE INTO `{PREFIX}system_eventnames` ('1001','OnFileBrowserUpload','1','File Browser Events'), ('1002','OnBeforeFileBrowserUpload','1','File Browser Events'), ('1003','OnFileBrowserDelete','1','File Browser Events'), -('1004','OnBeforeFileBrowserDelete','1','File Browser Events'); +('1004','OnBeforeFileBrowserDelete','1','File Browser Events'), +('1005','OnFileBrowserInit','1','File Browser Events'); # ^ I don't think we need more than 1000 built-in events. Custom events will start at 1001 diff --git a/manager/media/browser/mcpuk/config.php b/manager/media/browser/mcpuk/config.php index 9ad05288c1..acae3c46a0 100755 --- a/manager/media/browser/mcpuk/config.php +++ b/manager/media/browser/mcpuk/config.php @@ -71,7 +71,7 @@ 'maxImageWidth' => $modx->config['maxImageWidth'], 'maxImageHeight' => $modx->config['maxImageHeight'], - 'clientResize' => $modx->config['clientResize'] && $modx->config['maxImageWidth'] && $modx->config['maxImageHeight'] ? array('maxWidth' => $modx->config['maxImageWidth'], + 'clientResize' => $modx->config['clientResize'] && ($modx->config['maxImageWidth'] || $modx->config['maxImageHeight']) ? array('maxWidth' => $modx->config['maxImageWidth'], 'maxHeight' => $modx->config['maxImageHeight'], 'quality' => $modx->config['jpegQuality'] / 100 ) : array(), @@ -97,3 +97,4 @@ //'_sessionDomain' => ".mysite.com", //'_sessionPath' => "/my/path", ); +$modx->invokeEvent('OnFileBrowserInit', array('config' => &$_CONFIG)); From 5223b3ab40a513151fb995ff6f5e6b4390f51753 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 12 Jul 2018 19:40:50 +0100 Subject: [PATCH 046/241] [I] alter recent info table stop username wrap if has spaces Add time to dashboard resource edit dates --- manager/actions/welcome.static.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/actions/welcome.static.php b/manager/actions/welcome.static.php index 181c97848d..fd309a9e80 100755 --- a/manager/actions/welcome.static.php +++ b/manager/actions/welcome.static.php @@ -603,8 +603,8 @@ function getRecentInfoRowTpl() { [+id+] [+pagetitle+] - [+editedon:math("%s+[(server_offset_time)]"):dateFormat+] - [+username+] + [+editedon:math("%s+[(server_offset_time)]"):dateFormat=`'.$modx->toDateFormat(0,'formatOnly').' %H:%M:%S`+] + [+username+] [+edit_btn+][+preview_btn+][+delete_btn+][+publish_btn+][+info_btn+] From ac3033f127f335024f44edd5b849f523e0ddf905 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 21:44:44 +0300 Subject: [PATCH 047/241] fix #233 --- manager/media/browser/mcpuk/lib/helper_dir.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/browser/mcpuk/lib/helper_dir.php b/manager/media/browser/mcpuk/lib/helper_dir.php index 2f61f2ebe8..ac7a950e81 100755 --- a/manager/media/browser/mcpuk/lib/helper_dir.php +++ b/manager/media/browser/mcpuk/lib/helper_dir.php @@ -27,7 +27,7 @@ static function isWritable($dir) { do { $file = "$dir/is_writable_" . md5($i++); } while (file_exists($file)); - if (!@touch($file)) + if (@file_put_contents($file, '') === false) return false; unlink($file); return true; From 86ecaec70c8845499c453e3f118f2bf5d9da3098 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 21:51:45 +0300 Subject: [PATCH 048/241] fix #300 --- manager/includes/document.parser.class.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index faa5b1b080..929b34b85b 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -1109,7 +1109,7 @@ public function updatePubStatus() $this->db->update($field, '[+prefix+]site_content', $where); if ($this->db->getRecordCount($result_pub) >= 1) { //Event unPublished doc while ($row_pub = $this->db->getRow($result_pub)) { - $this->invokeEvent("OnDocUnPublished", array( + $this->invokeEvent("OnDocPublished", array( "docid" => $row_pub['id'] )); } From b637d20ce9d33e3eaef09650b9aae6db3c5b767f Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 22:00:48 +0300 Subject: [PATCH 049/241] fix #556 --- index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.php b/index.php index 5322472776..d4daf929ee 100644 --- a/index.php +++ b/index.php @@ -135,6 +135,6 @@ } // execute the parser if index.php was not included -if (!MODX_API_MODE) { +if (!MODX_API_MODE && !MODX_CLI) { $modx->executeParser(); } From 553ff5332b26b2bdaa03800424010124ee2df1c6 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 22:16:56 +0300 Subject: [PATCH 050/241] fix #519 --- install/instprocessor.php | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/install/instprocessor.php b/install/instprocessor.php index 0db8a64b3e..349cfe319c 100755 --- a/install/instprocessor.php +++ b/install/instprocessor.php @@ -125,35 +125,6 @@ } } -if(!function_exists('parseProperties')) { - /** - * parses a resource property string and returns the result as an array - * duplicate of method in documentParser class - * - * @param string $propertyString - * @return array - */ - function parseProperties($propertyString) { - $parameter= array (); - if (!empty ($propertyString)) { - $tmpParams= explode("&", $propertyString); - $countParams = count($tmpParams); - for ($x= 0; $x < $countParams; $x++) { - if (strpos($tmpParams[$x], '=', 0)) { - $pTmp= explode("=", $tmpParams[$x]); - $pvTmp= explode(";", trim($pTmp[1])); - if ($pvTmp[1] == 'list' && $pvTmp[3] != "") - $parameter[trim($pTmp[0])]= $pvTmp[3]; //list default - else - if ($pvTmp[1] != 'list' && $pvTmp[2] != "") - $parameter[trim($pTmp[0])]= $pvTmp[2]; - } - } - } - return $parameter; - } -} - // check status of Inherit Parent Template plugin $auto_template_logic = 'parent'; if ($installMode != 0) { From 012cc06017cda5cd851e184ea83a37303a62fe1b Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 22:21:36 +0300 Subject: [PATCH 051/241] fix error --- manager/actions/welcome.static.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/actions/welcome.static.php b/manager/actions/welcome.static.php index fd309a9e80..a5055ade61 100755 --- a/manager/actions/welcome.static.php +++ b/manager/actions/welcome.static.php @@ -599,6 +599,7 @@ function getRecentInfoList() { } function getRecentInfoRowTpl() { + $modx = EvolutionCMS(); $tpl = ' [+id+] From 2d25712111b577c72619cf34d8feb5878a5cf534 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 12 Jul 2018 22:49:31 +0300 Subject: [PATCH 052/241] rename composer.json temporary --- composer.json => _composer.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename composer.json => _composer.json (100%) diff --git a/composer.json b/_composer.json similarity index 100% rename from composer.json rename to _composer.json From 7626ccfbd886a133d8cfaa2c6dbdad8c029b9023 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Fri, 13 Jul 2018 02:54:33 +0300 Subject: [PATCH 053/241] update FormLister --- .../lib/captcha/modxCaptcha/modxCaptcha.php | 8 ++++---- .../lib/captcha/modxCaptcha/noises/index.html | 2 ++ .../lib/captcha/modxCaptcha/noises/noise1.jpg | Bin 0 -> 9393 bytes .../lib/captcha/modxCaptcha/noises/noise2.jpg | Bin 0 -> 10565 bytes .../lib/captcha/modxCaptcha/noises/noise3.jpg | Bin 0 -> 6924 bytes .../lib/captcha/modxCaptcha/noises/noise4.jpg | Bin 0 -> 8259 bytes .../lib/captcha/modxCaptcha/ttf/ftb_____.ttf | Bin 0 -> 30820 bytes install/assets/snippets/FormLister.tpl | 2 +- 8 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/index.html create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise1.jpg create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise2.jpg create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise3.jpg create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise4.jpg create mode 100644 assets/snippets/FormLister/lib/captcha/modxCaptcha/ttf/ftb_____.ttf diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/modxCaptcha.php b/assets/snippets/FormLister/lib/captcha/modxCaptcha/modxCaptcha.php index 186529883a..73f7146632 100755 --- a/assets/snippets/FormLister/lib/captcha/modxCaptcha/modxCaptcha.php +++ b/assets/snippets/FormLister/lib/captcha/modxCaptcha/modxCaptcha.php @@ -11,9 +11,9 @@ class ModxCaptcha protected $modx = null; /* path to font directory*/ - protected $dir_font = "ttf/"; + protected $dir_font = "/ttf/"; /* path to background image directory*/ - protected $dir_noise = "noises/"; + protected $dir_noise = "/noises/"; public $word = ""; protected $im = null; protected $im_width = 0; @@ -28,8 +28,8 @@ class ModxCaptcha public function __construct(DocumentParser $modx, $width = 200, $height = 160) { $this->modx = $modx; - $this->dir_font = MODX_MANAGER_PATH . 'includes/' . $this->dir_font; - $this->dir_noise = MODX_MANAGER_PATH . 'includes/' . $this->dir_noise; + $this->dir_font = __DIR__ . $this->dir_font; + $this->dir_noise = __DIR__ . $this->dir_noise; $this->im_width = $width; $this->im_height = $height; $this->word = $this->pickWord(); diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/index.html b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/index.html new file mode 100644 index 0000000000..cfb7d0fe18 --- /dev/null +++ b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/index.html @@ -0,0 +1,2 @@ +

        Unauthorized access

        +You're not allowed to access file folder \ No newline at end of file diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise1.jpg b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59a06d65cde4d8c9a353435fa7e7f1fe1d9e516a GIT binary patch literal 9393 zcmY*-1yCHYv;M*1en)ZF;*`U!I2=-1++A9VI~14V?q0086g>`ir??(a+@W}j6du3# zfB!f0zRV=qO?L7nvy)`^dFgorK%gYAC=WnF1^_Hy3gGz!0FrgLu=NHY0Z;${z=s#r z830ep($U-sVA=hmL3&02LIKGC3*bu+i1JbcQBYC-15`BB{{|WwIyweAIvOS>78WKZ z&i@4x5C}v?LB&Kv!^FkL#Ky(PdjUTFe^2_K2Iv1t|JUw+rRQz{2;+s`Fc1j@Kn5WJ zK}gU2fQlD>s7OdiFFgMTsDKw@Xh`UoNC4pf8F-obAIby(BorhdG7uFN4Ty^QVuXzJ zq6Gs8(LnTckXJlX(hNju>gL4gX3jw_!Mur#Oa(njGJKnby&4v-vi!^-z>75s5FPnt z_rU+Gi39*4(*b$Zz$j8?LFdki1wHhHb<>*=b<_)&dWKih=D|sYyhP6{030CF3vnO_ zAOUzNwX$a;8sK0qXs@#~ev@bsEk9KOIgB>B0UVHg7~?FW35V6l&?i4R%B3Q*=$W#B zo}MGm0A9)B@0GL>)zJ;r#^z#akqtc5`7~+~2St9%9%O#g56jXp=)boWjuXXnSpuhR z&w$L$4{vZQS&@#h6|ifhMT5tkQ64Qz^!)J$HkU8twMWF-yg3!880K-ycV?7mR7yXs8oAN@ ziwx)831l}ba-d|~VC-C-`qj91*uVAh`Z-+$MG@jCvFp2*&kcH*v^6lDGN~=T&5R0e zr(>XGO_^JCnaFoh5U`R}_u%(O#9UcD=y72xefXPb>d^Okc}MzGdyeX+s-4jdILh#p zzh=lYV4K)>rSx(PM#9V4VTB7DaolM(Hk3y%`sNPli`Z(i!uB0Efn9T4w1s~j)%cN| zip@dff8zVc4OirqFmM}BZmJfqfw*b<0atUdLr8l2EUCPl0FGYb`E8F)RD8+iiGA=2H5 zD?TQ-~VcG8eWm+r=F zd|MQM=klog$VT`lwR((r+njf9r-NOdb6&rEH-1f&78rx*zmB+a$O(*#tx9`O7{`pC zQSRjh_U#IH6$_VT<|9fyZ8S%5M}D-u{gBQdZ!$o+0}FH-D0dvvjb{g~Dj=&3p$(_W z#8@Hr)&_jnI@PMR^!sk_Ou8;)UQdR7SLHsEbB}d1V2dhW*k!ZPfumt3SW>(%GU#R8 zP+HQYJ%D3ZFf6uFpM^C+mPfgmdI%E7R0{fCP~}3GXS4i<=pnPJ!uYd!vr&Ij!uro$ zVQAwKtz2Yo$K|~K#@{>@{$?@JLyNr2*c}~SH+7$A9VnwG4WZV>@#K&Y&4is)WqAhV z^8Il(!LpscOTa=z4n(z zlfjc&Dv{ZB3T&Ei*r|z99`XFO{ByuM!suc|ke6=6Hc4;x9(5w(ycZMgC@AdcJ|jL) zSEy(jo2IYYLhl*CU2$1Eq$#WJ6E|Wo=+KwA!W&}G=N=nM6ldQICrEQ9T8|^iCOqCo z#H9cYU*CLT&*2|_&&1xuUCI*f-_sm(k6w9#;DQsJVNZ{foP$ZX|2_lo<0TV9F<$Pj zN}dID%@t!#BRP75L@b%$gCYWoFS6k?9Ck9yL^=saUEnoz%BkxE1|3*LG(yS7`V zo2CTICdP)pdE*LdOhRjwyY8tRpTG)|_8ZL+!j{k+<2-xYCr!B?S7_1R`jK`0Uk8A` z-W#*iht|5+FhPh`mT~5106zk9E#+pIw$wMW>8#MyeVuKTQNl*cbo$^<&_)_RjIQzL zgIy%Uxmkk|9wX_RS_DUPpD?#pPn{%nR}cTB(=i|Cv<(IZ3TexZ4M~@NE|*bAq9Rrv zaE}#?$zp0fCds+;ao%TbJiHu(Ad;YFdNsp9Aiw)!{G$JSha$WBhbH;v@Ia!9W0FCv zOcG`Kou<;8#j}n?8gZk?&zMsGj zv2Teo;gcBNZt;n;N+S4^MlTK|@-TVxTWMqlFe3g$!lgjs8ZA1(jTxSh`DM|eay~`F z*2W@W%5HOZYi0HEOSP)^h0>ClYJ>^xR(s`PYTwWu<=x`6pv5pO6GG)$+ZWItIFc1< z?~Y6`gmIewRGQ67E5Y?PH<*F;x-Yz z?^;y%$fG(-qJS~-f18#%2DG(t%F?2Y9;ajUv9z)LndU7V`S$Kdzu4SA=QzjVP= z4j9?FQCK6Va!7q(6P5z6yN+CfK&S)2l@#lW#Z`<;)9a*xCJmvGhR%}LVBf-W)yF#T z)jc~?`6`V)jo4M z0A*SZ+I;fr-s_PytwxfCxVry{1l3zPTz2$~h8ezJEI4{v4DMwC2}*-eoU~4u1L*^I zuy@tRY6sH83RfLudD5q~*7l0-(6}QXYNZyU6FD)Ip>$gQGCX=7GG`1bKTsTnl&556 z`Xd88N;E9DiBc=}G;iHqYg9g}EzA>k)*J1x@=J3HF7EI0k&iUtopk&nW3o4~zf#@ejyp2-HWVbXTn9`x?IGf9srv>(4Y&}h0%(}1u3wog} z--eU~wy^?-=Z?jBlbu%{ppDHW^XI4g=07S-l4f0~CY*7bBNF1vvF_Yk5UM7t=6$JR zA3jli`1(^Q_IqO#24z~k{oKdZxPKZh*{sOh49Ss=Uz0X3+-}`8|8OgU*)Pea=Gil))Hx{@jku?rNL72&c zfBuq~Ddj3-l!scuam0OqL-rxOF`b(VXbaDbQGq6I{PcZwtTwinqlDwZJibfBV>V{W zB%gFLDAi!rD~T={(H0ny2)R6lp8OsjQ&AKaz!=a?_vhg#+Xy97-&)TM^$F7oj#@5~ zKab87i~AF86%|2nME6F^r9ekoKQ}qtQ4{qQWe}sZwC<7K-<@yxU0P3k{WOZx z-|%1UGAqH7ogd)5W*X~K&6%2B%d+82upHBR+JR~0Q^T(sZ6~vBO&#V-kVyO>x+Jig zpdXUbg|eGozL#F!6PvVZw&bP2RJaCYp!+gD)0r}wQ^n&lF~)5h(X1GVGwz}louOW* zJ<*YpR2)sW5y$#zx!2Wgb|j=1`=7B1Do5QrTdJHV3j&&!kiPVbBluM{+&`Gk@GHkN-;a^T5salpD5I)z~CiF{^6{E<9?!hy1L}fE0y< z_ATu&BC2bBR2x5qA%Zp&5(@AdJ7Dn7CPdSQhdR|1)N)HD2Tw_gpQQDrFvQ!136DVd%q(=-6dM}Fd($9bG0U}QmH7- zr4Ps_s7<^SX@eNGO;q;M@7oYG>zXe}%W7NBMvmOKI5H;U&obq>c733%D^XHx@WvYR zX9qDifdWQ`Vic%lhn@bZTK6Qj(CwK-XhJh02m=3c?|nEJ;{7L9zK<{YWmNjd50u1| zdq2%zZ^Z*1NY#gZyYNJgR~&bn$SrOXo|3?+#Od*BgWDaie*x}eEpYZrW|@hnCM9;DXTL-B-KR;9PV||qAGJvn5i38DS0Wn^W1@14!XBc` zrSU+R7#qgcL&je_b~u-3%UVzb66Qx8%RUA(1~n)mr2sxz(yMD+>ua^qhJUzLQtRUK$+9x?xD!X9A)&;nFrf`&LsyYA;X$*MMGngL z&jUtx_1HFoak4_e*kPQznO3_Ci)R$o6fP-c-MnVQ;G9V95|<-94I?Y%J~#>Wj!ylS z2(C_SrN6oykoS7)Zi~!s@_a#{+0$cRYj_xc_o2RQBEkES>!&*|;4728RtI)(%$(M$ zY7o`ZMqgdGdM~91jU$pfRN+(jiUhGtyJsR8PNkrdRfS1}ewnmdH+-p9kRTIeKja|9 z@%iVQzUFEAwWR)JuJu7e)d|0lv111*-)yHTm2~G?Z~T5nqr`S@{f-K+gU|AO(eb03 zgQRBCU%!9JPS+XSdQ*0IXw5IZHI@YC_!b5@j(s~b6vx?}cq!x4*yf`_>E17>J(33} zNw5>GjN^OMk}tr6ZTVI>vVJ}cD^fJ8WJ%5zJgZ^|gmec|(5ToXN6D=ebLGi)g~O;g z9O$qmD8F|{$%`p({hnUXv6!H?4!+68FQwAroinpw?#aILp7}wT+WIln@qM&|@4TaD zz}Wet$hZS1s0?~!cIxP$+aaUXc)8bk61iUMZTOCAN&X{^5Fy=9#UVl)XKb&!?c;EQ0q%#BOFjdJHUF}LaC9o^b4KGZCW9T1rW2D^6%|VS`xEWRu(Gite93=5);GiQ;FEWNWAvy zp!zFE4*PvogO(d2%6bV$M+b%q(FltEAbAH$8F2u$a@P8I1nJ(okyc^&@cNJPZ;;mV zebWYU0@OdK4mK3KdIdGA52CS6Ft^*;IZTJ z8)BEuoB$a0~UTVEmeXy?ybyNYr#Z$yiq-doOuX#V_x(D7C1K)i7Ds z4m5WNcGID@16_cm&C*O2ve3Ny~rmG{? z?fT8|d^!oy*#ZxFwUM^|r)~s|=I>$Q?`!jdC~{pa7-^~$UGSKEyA{Tu{;+c*U>sVf zQor7p8u*N|GzmW)CRe6(S>MShp>uf96gqAZtzjZ={RbYC6-G7@va+xCgithTrCh&z z3^6Pc5T6TctC8>9396A-tBL#&I4DX@d8jlTb~0^5JvAC-(y;vCmUDzhK%(>Lu8tli zMu25J@E)&KUtX9w1ln2_ZH85-RSa!zmi}m@e|#Df-Y*(&Q`I2m_xETZQi=RDxG!2w z2@;h{s76@9^+9Prylv=oCIbA`Ni#kEVz!bmD#1t-lV{cYVB^aAfwU?NWk7}Za_{Z* z2;VlnWR1;_9`W?$gsHcE`B(BR?^>}F%4*vc`7l7N=z5u9?#Mr*l7cZ6?W|jt#Xzr; zowAXo7={p0Y^8CHf#rY?UkWvvm96tm()3tP+s_5mb5>#)TPnkX6(assMkGB0aAk2K zn0~0rqj*+!vOY*y7uybvU1)Box&C@O<*lUQ9zdpJJWP6tw%vQzn0bB!3#N$pFE(AfM^?+31OzN+dX(>(E9yjJgI+1q5 z0#qMjuAqiz7EMF_9NIuy=7zq7fyks9p#cB9MecxKz*B*?VHr?^P1@IXVZJ7SrT0?@Q>^{>^iN3ukxye@In-r-4 zWiWSsuJN>#IZ=bNvBjG&GDX7WH181Ib1EjLIj3}B%51uu<~`!(-ECqEok+2=L9ZQ2 zRoTLnoAdI!>RzS*rerG%OLYdZdb{;Xj3L~rHGc2ka{s332+o{*oGDS9Vl$$MYF2Nu_Im9go>6ZFif7;Rc2-WEHiUzbd|R7e>r{uO~QY$|FHC7Rp6 zA7&|SwDRz-@-l{=5x3a|kM?NxDM=aGTa>dhyLytS1$~hWYqm`3@9?&27SM)QNOo(CITsJt_Sf%6R4YJs+(q>ug z`>@`{I^-iwPdd^FioIipe_}qdK7PVN;*eqAiBoIh@22uu8FLA2dl_$Wja2H}*cdp9 zzGc35U)Rhje?2UXHt0F61ld2ln*1kfr~iR|h4UntdTZD{F@cAA>CqIAK}X_`uyEKx zbLP49GvJ+Gr}geLpz4>tQpyg*Aga8HM5W=V0cV(bGM$UW%vz{#pq^;h2gSMi`ZW6; zDb6Q%g`Pn0GoT?AS&lMlJd)^JSydCxzJd6c2lb7p#wc@pIr)HAQ0+3k#79Yd51F8;ne~ z3@D}L9e|?57;;4jJu>CI7V6y;agIN{r1IkY_l>C&zLP%RO|ePLEB)^y5ZX*X$4-yq zL5c1s>!H6g=2@Bnxh1$g#CAd3@oOiq`(5zhu0~NejpvvZd~IjtGHjgWH}0`L68bi= zr5X3f_Gi=WehAW}VjLqp`V{0v5Q*==?ZD}aXHMNTC$=3QL^bM|i5b|8Q#X!0m6z=E zVV6zFGIc_;6MWn5M5Eq}M)o>fedX+-s76?IDddnld$y-Tr=a*i_sddyWZ9n?FH_aB z?as(&K*5|o@0F4@TA&ldi1u2<5{)b(ps^Dzn|fcwGYJhxcXj+r`pg$A&EDHsC%TvD zQyM(=6&!Ee^|4Lys6>)9-#y18D)sQv=8#qk+T{6V`amtqbO*i)Z&U zJ_B^Iif0m7F1-r5jmyhJLo;Fs+4HDxjw*l8%Mx_Y6)Q96|6zLu#O3IXDD$u9lGL`T ztH|o%22*`BAYUPzDiNk@rj{Dtg8DP8eNVTTj)f`QE9>jSS*Y<>#Xps!m2YWjCiz*i z3Zh&#SC{>4X~b41NiTFa^p)_BVp2BXSe9%MPR$6~@5z`pH9)|8or=4|wdN`fcA)0w^C$KHzQM^13 z{yUjM-l$G*xml4;v%uPucuSkum08r2&n!3GH5s3SblgBHo68KVHa?}_*SGbU;As;} zz!^d$ZM|}Nw9YwTaj{E*I7|fHO^WgCcAg6?B~L~}IM`i?+{P!tUgr>ZQil_iU-70gBXKuQGmD{$(XdW;u2= zHCQUg&Uoy4gt?sleA9Gs#C0~(wYzt~ukdcdPTV-m*r;s1*<7htW5ZtGQ;WO?K zH;FlWjo)I=EwowDFDCIJUL1~!xH*xX(p= zS3+moP+;`Z&(|l<02A(1@WzM!uw`^)IS!93JKNqn{g&1It=h~EX{xeMRWC8M1X(&o zBGsV_1$tp+eeOMbT#MT596u$1XOdE%85#n6GW+}%qN6ZDrl72)9}%xV)|3TV#lQ+T zFy>5(*jpxr`mC+Nm%fc4_NFgVl%xR)QRsv*y0bICq+FAiekQ*qd^b?%-TRtBn40uW zO=FmFsu~VNfQ>KL2{4 z$!)W$(OqGamgPudp>;|@lLl_#JII?N58^vUL|s>#I_rInwfw07X(0L{3DeUeAd9ML zMUahnU%K74ZtSalLd6FU6<{R%DQRX{iR8?ym)0jp3uP+6Dvp@mt-rQW2|0PY-28wS zXKwC~!pOb>?Qo;}sJrPa&1myu+xc@E-BNzc-&iSAa$f_(5H|uI4xItWoQ)nffWE1* z@%lm)S58x@MHNIg5YcDXSnO~90ZHnpwScHB5CfP)7&TH=Rt_r)AEsApOgwt3rOGTG zGeUVo=ti;$qV6<5$h4|PJKKeQ#80#=1o_~J%GiO(n~Fos*Ia{7eO!u~&wrTh3N%p9 zJQ)$J8U;B)k3xuy))@x!;CQn86jd(QP$<_Z0~03(5Q+1K@(~?2Q6lImIko@ZPmIuw zIwVL#ZE2)MO*y(;oyLo6Z!kESOksFpA?WY)5{G6)`?8Po<*_XS(Gb|Y58b#v?`tS$ zX*Z@BFcbZ>!^N+KbJm^R;+$a@qzpVx7*?anV4DB3TUB$$Z5V-OojI?;uKDN@9{1+j zUqTT%F?`Z_k5<7!NXSoYhZEz5^P{UX`z4wSQ-e!33)%Kf%z~bJh0u+AWwK#1sLwcp zFeY}dI|Lat(tG%ux~okNk(Bwd<`a_CsE{8%ca8qT=-*_IsWg=G4_gx~HKg0EQz}-s z^-rdpQZZR!@F&b8OOevx1#KGA1oaYqGudQuqpLwC2+uXeK{i%nxr+ z!Lrd*E<3edhE@Nl^j_3A?+LdMyFw2s#KS`kdSu_OMzUgKCE`y;CUmJRQg*1@E7k#y zM@RHk1=tTJ%r=H>(#;aSll!Qs;W1`ss4d$VH+=@_A2jfleL9bf`g_DzU+K9^u=Vvd z+qS4J^8Ca=vT@%HThd3;x&d(V`Z!bf|=L-Q$CAyT&r&L^3ss#2ma`oS<8R=|H+QMcsZB*zgB{= z=!ffEPFDKTv*UbC5i{>D_C0m4o8L5LW}~D*pZ9f)I~&<{eO*?TLbJJlizgPa-2Qc= ziKf%uv(`&cI{kI@N?%W%+*s86BT;7Ju^}w9-zD~Vm%?<;p%!X)UoOH5j~h_uPk4CpJ1iR++Lr?XR()=W+md;ZWyvECsr{1YW4qv(w`zm*DLDfNGkG?H!*X(% zgD5J+82L`w;v1#8>F_Y8+&yHxhf2t z*MBNhUI+h@;pTZr2Gi3~z5Jaf<1&G?)3f>wP@(;uDsqPgHyK;c%K$8<`5}CWs z7hA-Ra#5=~csH>8A`D1s|9G}A?HOHjryBja@h>jJZfW2mOw5%yS8K(oCxDvH_*86&uELOCKm+h3JE5T(r)qrK zl-)_%usKIH{CH`zA*lj&zeC69xKm^=Ec2!CE6}6R9~a|W-8{ zuYa`Nu`4nMDW%fb(NB@%{Y!Ir`?#9T*(P|n?lzOqVz-)=Q;>W&)h151&w~{wmWHFL+1%`}`aFDbugjCa<(!;t=aVbrh_scmL*dgw@5dhA>i` zkq3Wy7r75*I_2J}nA_(QbC5V&ot-YYpnBTd$s5l`auEO49E;?{FxJw#FVOR`b$_S! zUc_xwp7E{p?9CZNG}T&lVXt0}Cr*12qaHW%Luq`G>+M}P5CUMt6Z7w&qBRP5Uj8r5 C#jeHx literal 0 HcmV?d00001 diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise2.jpg b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22c6759d9e4b4d552ad1d5510f59632ed8d8528c GIT binary patch literal 10565 zcmY*a60MF+DAQ)=n><>TzpaTGa z*Z*7>073;@cWXOOE2L;qK!p<|%`2N;+b{{u`+EG%p+EKD36 zTwEL+{QnCSG&D2}bPOC!OdJ9{96SOd!hawl`kzVvZSeoU^?!N)YdsGEfY|@!O`xFw z0jNL}G$6|JD4_J8J`5BTlz%$^3k(!AbWAK%01gTO?f(q?oB1Ef!~hg@6f{&c%zwhs zF#eHH{}C`qfTWlJ5VH`Opn@U`IhL-Ko;Ac%m?A7(NuM>#X&>= zxA*_7h5`VhlAtjQDxm9HT|&Z2TR}pk7^%Z^J6C#bifNu?;Vk6OYXE#Slz)2BfB-qb zW1%~uu9h`HvbBlc--ME^WPWwVo%|WlPbfUxj6|4sc6as)TvCgVH^MvkifOl@)L}0Xt@z-4=fK#N z9cDW*Il{d}JSUC9&5>;HPm<>!t|xA0dTduC5{th?m!}z0nXK*-e!n@7)~?O)=IfvP!R6ij~4q^m=A^%r)m^HZeLip)RJ$ z>|<5ySlN@unCne`U1oz5pkVvhp^Fo@uC(>ZXd(oKLW;gW{f|4O^_rZC(73d_*g|PD z0J0SJWyIHE3VTdO+C=*Cz?)NI3CsQ)AQ>Tx}q5urk@KIX-h$BMqA%#;cf#@f7%4&*0(>RuQD`1kI0OuY@zF zcQ&V1$5g#R={VEVk;-yuQ`xNI>znnBfWJW_>Cb>8)5Lb)+8J}xP8T^&aZ2W2xWs}& zUxL^=&FBo1SA-|_#bzo}Ddajv^S!4BMk7PbC?-0Q4BucjS2qdA9`@%dCHFx%N=^46 z8^$l4Zz)dyn$~SrrV_9z*lTj#Wn&3jj6wXBr`Lxr zyed-gg{^c|TZ1zCU2M=|jDrN&kfeQwG(E1kJ;hNyyA~9bJ4kp|Kg7xNhLK;V4~ihv zp^X_zm0?yq&`Toox9QSRc0AEDvHfHyor>)i()-t~6;#rFhg8`CdNIylSFdc$gg&V? z&JWseg&$N#aLV(FRD@Q{J4H2RX;gNxrJ<5Mbd8PLB`5RIyTjk(2{P@i{w`e_Sd4?C z&&)L(jJcT*Q!Gily6|*Q0jRWK@=squ?~}I7dXLuU6FzGP2IS}Uf6((};jlG}cT6_< zj5C?bvs6_|xG_+5#*Mp6sv#BAWESMz`#g7lykxXU3U^OB%_E)VIX!6;;a_Q8%ilrO8N*kzSRcpdk{#i?8zRNjH zSI`Nad9iOT*D3pVE3f{t^Dl2_k%D z@P5l1CV%L+R5UXrjE9VAFu26w>OlGpCl^Ph{J-oB@oRd8ONw08du}WaRD}B28U;%H z@~$;f{Tlu@XmgiRrlTi8e6*?{R@ZvsHuEdqkI`u}7n^oLxa%`O^RX}qWbEG`0m}5e z24w`UB6@}PqJjGY+Fa^(M+fax)VI2?6yx~B*@i)anjeQB}G>UygFv7oC0W zU??`g6P@t=g&q_RdP)DL+ul$Oi+63+rizX>zmlq^rT+Z>?JLM`kZ&Mw?y9Qr7h5X9?7rIT;0lomFvl+ zYNm$XNf8;Xy(z@g+TGX1!OW?m%eyZMpv?i9okl7)Ywntsy=N1D2K2Bi)Oc3$2G;wf z+5A4Sqbn4;1=2N1>=j-A646RISw9>N;Jx5|bXD_EcQKT9dg?7p(LJG4_{H}Ex$D_) zJkGuL^YVC4*y02uIU{O$I%;pFXyWWfNGCG70rOaK6%z%Hp3UdwYJxQjtyD}Tiini< zd#B}TVi#@3u9@Qv7Wl(NRw29d_UHOoT3=daHRI@i$O8 zbyRnFJLWI#zMHJ+6&Nss%l((Alc}Sz@a1>gM#f9%OSJoTi1JMz`;s5|6ae76z1!eJ zWoF8Xs56MZh4Zy(vd{yAR=|J=gki}S(`{C-e8L`1v^=2~ILgPc~aPiC9@fWmq@F{pK zx3mx)dp=t{TXic3Ivq2@eLV~s|E+s%QlR(nXZI?ttL8^>5mj>OG0Hc}f2BAyUXT49 zSh8kk`SF|QEE6J~n+BS!ZiO6I+7WuMQR~qplNvU4U07P-JfMSJliiM!2ETVyF(*g! z$+}PbB7GGlFPR@DY&!;tl$W2RX4`Ixw5H!3ml?r=e=A2oRy`+S!JGmoGWi5BYYDDY zktJ3WBhFto%{hHm-e$}rww0coS?M)=rMd{3vsjM`K_hD?H6Arc8vyEYbi<+Zq(&;^T}BlqL)mIy<*!Gi@s^8uR)NVE6$#yJ`L z#`#Dy@~8@OsBMD&dS6wKGAxqez%+2{qC`1!+>m=&dRrKId~OAKp<26{ZA{Lmi*^of zPNf6q1O2~5NFH7~ECj2plKAY)R*2z&Hd?{emrC9Kwb%XxgS0b)m_Z-4Y_8%s7OY$? zFWg5qp`;F~BoB6F6f4EP8kHG=F_j_Y=|=YFJq1l0+|wr{a$VS#WI*w2AqAnBwpm{- zQ{XLCbvAr;_VnOLOZQ5$Bf(fi=IaIQ^uvW%J8i>~@HKXU`07gNcx9?{c`gz1)SAje zHT4+)^tDf20B zRgpFFzHjaCmp|#6yUwyd;K1~<&cLX+%Pm~z8Zj6hjgJ~QWqowr6H81p1qVXPuwxM` z_4Q)Qr}8kCj&TrEL%FciOkUMlVByNgSMtFrlzlijm7A`bn#_ro( zj-?0Iqg5K>J)Z$wwbn&m6;smh+1msQAp`9I=qnQ4;gFN1lodAuI2sO)RfNq?rM^_* zEJ(l!4n+t{Lo`o;V@u4>E)%HM-$PYYUQfB`Td3gLRzb+^Xx3cuATx(q<_^ZAH`ZI; z!F#t?iB9#5^O9{^@rkG`>#KyP{&@<2Hu-x+y75*!1%!Zzv4JA@bcO!kBvr!X8>c4v9inr|yQm zc4gKIN6~R^k%Ne`N~e`}T+UA z!Lh~%2@|_5{%->Q-QqC`iE8YRY z2|?GXh+Sx2EQMjM&slYMnM685^mVJJ5ti)4BFvTyR*zu2fna(}Evwdx6Fm+Z1hx!Y%bX~j!@ z*xu^|NolZJzE?8H?D$Sz2;XeTL%hb+fH%xVWPBw5<~aA@mJc>UeG1Y{dSQr!4@RgInUtN7VvNLN(l^csi!6qYmcDHe?oYeC16vs{hM#tVWC|C_rCavjdVn8-;HW23FDU?=!uTM+dG23SRsHYldZ+lEiejjy`2%> z@wH< z1g`f+^nm)D1M$)8ru4l1-!hlU)m=x577f{o~%4`5Xc(z_E!xTMVYs^{xYn zd5sbK9twg9@vYAQlBbaDcqZjce`j8hCrf$F?rU4-D=JZv;IemoBUV*kwa)Sh@K8gMTeraqde5Hk5Lig~_T~u&3 zWZq4-O~8~c!m{7@L+1^VDX`aNEwfj15rn5lCET5R<-489Nk+&rY2$gHH4{N%-74gj z#?cG4+>ux)g`zpNto=-#5CWdx__y8It;*h(;>b_Lje>2|zGV3p*L?CjNVAnnDUka8 zrEp8s4mIr)x<>9>0seBS#~X7T0CN_t?jM07PVJb1Lt~rlu?0ksn|RQdYt~*YlwZN- zSwj_yFGeKxPyNNbcuvNa-EmJYJ&;?n)6=f=`MSL_wkxxxju2t4!2XbOqAy9Gg45S?Zga?hg^w$u`P8i z7PtCFU(#S(G(|1%i|cF+$V`zlvt(#nup@3D$6lO1EZ2ZPb=jyf!6TdfgFWJ$It^ye z5}JeOL>qbh^y&MWK8cbi;$o0KSIAcim_zfTUr>_A`Q(G6c?PK+YquS3Qo*3CL`MT2 zHUMn{TWz<;Y_LCsQk&Rr*z+Ae+F=6$IF?MleAF>BVX_0>F7LB9a7fpF$lr{Q*N=Yp5)I`*+^hP5$s*+s2dTs88QR)NCX2;QrM_ z``v+AabL?*cqwcEhbx$ex{|0q+&~f;H27hA z1#+B~acA09bc`%(mx9*wDW_7+{AG3EPj=Q_@QuA1>l|U^Om&9eDb?d#eX{PlWWghY zkMC@*7#4J9bGk4%jrGbKcBQsB`GB)_Jfs&#ji>)(FqiXqE6y0!C@eJN>^bzyjt{kckGcBS_% zzSGH_{S5bq-KHsby+jvi z4Mj?~kP@Kx%)lrQm0rsl#LBnigfdvk~uSp0(=~aA)CBGnyiqAuc64o+cjE!lG*@7$hD7+dU00nb@_Yqk8gia5%Gf3#Djl8SU6$ zd3FRaO=H(qI1I;|j9zrvyk+bP`RI-FIiO+wCW(52tpS(NLd##mgd>h1@cx^b$_QA0 zI9+JIS87Ai(wgioJ!+%p=`*00q)~V4h3j$MoxD#_pu{skkgVO5v9wKY1m^oxyX>}f z_icgZ*dMBPul*9YVpGnpbVywZlSWf^H56eZa7_Xq)gthsSS7j8@gTZRZf~MZCCMM% zuEMZxHR&w;^|osAWB!1h*->0HE217-a#aZhi96(YuU79aVkzI^I${bYnA>fH z50^(tc1a|>KK;Rx5}<7`Ubgb3!{>wO%xGsOVb$<`1h?LZz%w9a!N!?kWT9=;`vTUa z(EWilLv2dH>Wt71l7nO^kF;|PcSSE7|6S|d zsOx}lb*Gg}WBh*k`oyHb#m0sWV6|^W@a&Lw2!u^x@BUF5IGFuq=KLB}1qqrET4`DN4BW^|3UJ_1$h=DOyj)E7J2b@n_~Z&?92 zQ$AJ3&4$=b@sv$wefB|`fwaRqZF{Y}m7|$ltJpsYa9h@8WQB8aF2Zff(sm;@o86QS z#ECP<65J;+(VCI7JR7s~nHFuN{cNXja*5RxU%)jmQNpBG9pPf^pVg`m}@(kmY_4k%zW*?Xv(26 zm|tKkkkorBK8tR+8v~ngu2s+?fY^t?&*p%ADl){=$-R! zyi$_#rO0et2w{4q^n7ogxRKQ@_XShPug-^Q6veh=*J%CyJC-r3l3jA>~$I^5;jd4D1*)8YjzKn1jZaD zl#dI7)w%L1{cXkNy3QCH8+Kv#KdF{-U%48%fv94hN{A^#ZL%VpVkyD1a0XA)SMhEN z9FGNj<>vFMoX{)RxWT3Am_}`H8=z$1Z-F!p?ugSg`#16E>9C8JzgWWXnvlck!25%i{5eUeH-0|S1bZWp8?AiZeT1<1wJmzEoG{9`n*|` z^3d1sUxi+%H|6yc9BM}QBeG;&?LFH=ZI)23Fi6H!EA~V?&~H*KI{a;MSz=#)3yP_d zE3sD#A-cZxb)P)Mh<=SWgn`OEw%h0DxXdifs-I0>g@U2MZBftrTmQ@NlkOG+(1;^X zp3cw3b1&F6qVcFF#n~PVJ}F(~0+T^>DL2ngu?R@i%g!F4Op{H@g5ehQ2G0Pu9AEx4 zO70@uJjaDOH4*!~xDB<|#cz&LtGAdScxYs3$yZ zm#-h0Ai=CrW8>3u9%dZcy%fJKiW0*H!c)Nhxbi@TV7trzpnS=TEKm__`Tnifr@K$bT;ei5jmo zYSg;E238Dj?8`6u2kdGsvz zgNZUMAQ9EDR_r4!YHax7BAE9d5eMe<#=D4e@Azqqy`@x`znf_KlNc6 zvA12Ae096O?VjI;G}pmaDTCfoDsO0*eZJ&+-}wwU%SLMV-#v0}CW5L1*Qv5YT|ml_-da+~#4Y*-g`Pyk zmH|jO(e!#!UEjX2{7vgxBP3dPLT@_L`{Vnf8>^j^m{|7m^ju%k2P)&lE96=x09-8g z7R*5X%Yz`?gPC$Cy%(Cm?jlK>$)}n#kzs$f9#oEs3IiEvO?3~f97_kA7Tnw>{a&p1 zt?kmL(@Ut+?+rZbAsdqlE%|+DD_G#aebRL-u^rx>u7Wnd2=-3>9vhMn|d)W3m7g)w*~~p3a#Pb1YS*bZ`^UXPa)4+-@Ez< z_t|MG08q6{J_*L|L}&Qgkq9U# zzJCTV$w!LnWF4uktdGU8%TI)=P+^Y6EM6bv^$eA7Yy5bzw^Xu!{0uNG&)U!HwtK0W zv^v7{HmMy7W*YsRQtZzn7n5+-stfi+e`9Tr_iGQTUE7Oc*TuBHQ zcIT43c@*h{EENheIrdfr$G1ett9+zp{>!#&E^E{Kk;D!6d;^%9Ra}<&vdYW?zqvAC z*ZYLvvkC6ozE5XD#gyyc>CWcQklDikS(avBTW?b{5)n`8iX1s(SZ4*=y#LXi6%@uEp8fjOfCf7#R};aIDoL z)qXs6)7hfiHk8mMjA4kP{=!Z^P4PC4fOT5YU_1!HkrnUl^zLgA=H(s5g~ z^f*P9H8~<}`M#xtiCh(}v|n^(AL3OCkjX6BE_0&vT8~(2A5-J0sJ*X+WxSX;h<@?E zJ9WQc_F|fxBeYeYWBD4!Ry$iI#;=?;9G@t)9v;b#DHV&u(HcN0V%?_GAJ`^GXC2N{ zq$-?T88P$H&VaiPzgvZG)koIbbri-zw~p}WL@J_qHIx^8cozwxc(+l1Cekc_AnLsV z-I768-1gUrGZ0&rU-aFS3NeWp_Wwp#>SyNLfTAs~v~z1-sKaHU9}}>gvJ>AJjy0zm z@9Ff4S=3OS^(~b6)4GQ2vlE>6_Lli39XVphYNN&1nZ7Z-rux-=Ht_%@o*nD5$2pJayvmjSEkCk^7ibDVgx@=j- zp(o0Ick`Y3>KDJ5L9uB9<`~!4*R7UfW+!-IE_sfNWPtQx{SqK6aXmz$nL5l7bU{Sl z7!7^FmhLgCVv=^}oO*a1Wmi0Qf7{V5j*reJWGzG!L<|q#1AJ2=b(>amFdYh;&!qjU zo7wl!1#$Bqc?bGChi=!ndDJ2W)~*Qc(W3*{!$(gNI!+}`%?LO4nyTP3+c~~(mq><) zUW%us(`ZKFd+buu^ihe7wTX;&ziHDxKa33A?wvMB4&M)oHRjPk#DPwT5zODulvQnU z>`Fd@iT_X6o-pr9dm%w?iYI?T*V3 z38RcQM=_ZOU*gnGfy(%-+Yux#w;QA-Me#$?c0abYYR)a^pvF4qZ=uvt)DMW$_bxsP znUx?R?N=>3Pnxc{$9{{i%}BRO8pmn5*vu~Irx)lJ`m_5jLR1I+6yp%ybHHI)w1lfQ z_)Wu^gY&l08rL6{K)>m($H$MkKcvu7ZOt|}Ut~9Jpt7r^ri7rYNgZa#T@{I*W+%Tk zc%3myWONMbWb}1?g?|_631geLfR%d%|J_O0SErT?AybyqF`%i81@7cWj$9XKB<7vP zPI?!4tKJ>jTI~JyJ~1s+2BWh&CB3Teo2gss#j%$~PaJ1(dgJYC>N-x375b3@3vDP& z=F6a+5W-npxpx6VF98ar3N0n+DUqm;N1BCX*T0ZRz<-^6e9E?>*p+ESqLt}Wj_cJR z<}Td)=tf*i^bnxJSJ;0jmOxLdJZ~{mQgM!oq5H10+IDv)T@s;QDR{){%Ff6`jTzxs z^(b#brrF8ApgeE9nVwQOP#r(v*jQ6lUy8fS(o&g@5s|MG9=2O(+dYY*+Jz=11*b6p`5ujRj)2QX4 zXjBh!LSV`p9?X}gp?dd+Xep%UQ?$jO;r7EA^XHT9)n zMo67bE+e)*S#|@hFltb?HC3$G(gSJh7sW}3V0su0#X_cZe>C4iAQbVzJ+R<`f%i*s zskgS~zXTdHM_&q;>i;It%)b2Nm47kry|(6Plodd2bG0k?ncuAN&NXw`b^}1(`St4NKv7BK5$u;g;qhwueG+yCFvgU6E8*}8&QV;cNwW5urW{bO+eeY~llyJSb}XxIdhSfL2)eE-|0 zOwa7{drwBeB9BS^dAd`3hB5Sqpi_7F3|I_dS1nRPP)meHea!cW2Z?Xdu%!ww2^hk=CpsBMeN>v zAaxMUo;+$PXDP7b+4~+>rgWX7tm9`buaE@~{X(R;Y<}_KnVg{so{#db^&$O3urBS3 z*v@Nauv6)oz#B?ld!b0wd4DF`2|lM2+d30#BPQlR6YK5vP8T)mK2paS=NFRTmwe~y zLhMsw@?uFsd!Gg?TiheV0rM;Z4w3r*4)u7@5b7E&jt0E9+MVK5Wp5o3ymQa@M%`&p z6uawem;H>J+d<1Zj;Ys&=Al)N+ciCdf|55*FCmmxt%dk#v_pg7&D9@GQ*A&R^{L|^O}61N=E90 zbk{)*G_fj8v#*v%N<9zTw}KG+S5(lMaVfQGDecvneIE=1b5#0$JSL-%!yINyiN}~v zbg!f`nV(=6LHszzQH{HDQf31|cQ(rt(X|dG5-^-JYiXX0_zs(hqz}@n%m_o}*~F>C z*4@Bw}xXMnaXI;zsnX0jsj+Dwm&&hPkiiA5wncWPSJJK+_}9J`hH d`i3JKrN@ua9_eaYPt+GrpJMiNQI?-q{~sPf1`z-N literal 0 HcmV?d00001 diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise3.jpg b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4d26d3ae23e58798a57906ac2ef75fc99973e2ff GIT binary patch literal 6924 zcmZ{G1ymfow(j6AgB2-Iyg-5CPK&$4;80v=aHl^G#TlT3Lvf1B;Lzd@g~7GJK#}4U zDSA2QzI)d?Z@u?rtt9(PcJ`O7tere9K5YPqRTPvJ04S&cfX#COJRJgna^BX?{s0sJ zIsgFBdZvy6gwi&yR<;0}?q>$&X$24gK>c5!J@?SipKCO94D^2i0~6!lz{JGD!p6eF z#KFPE#lgYH!9uslaaK}AQ!L4Ef7 z?|3MvKr{wk67=Wk?x6+sJ=2V&P?=3WE3#9a2L7{@!d@n8W{jt006rSZvtl$L;2q$u zDPx=yxG^=W;JL%dkr6ZnsT}jE$cule{4d;9cuY*#U8O z=&3LPYA zMPmL`=VqkWXt$(pHu`SGPWf;IgLXlq#Cj$4_H{Q0hd2cCx#(VaNtBJXBA0&+I)pi) zf)JaG@My#3IK)kG%Y0Wa^15(`)GaQ*gPes6I$sR;U7n_B;{QXvtn$xGu4PT{eDZGT>oB`p@1B(7@p%W z+A~MWa`Lf@^aU0-B$JU<;|T!db)VT8*~-&6mXo1k_*h7zaY}<%T+Jo727H@fH27W1 zr!16-mEZOqEj7MGwk;$2E>X19!H}QNly8!>x$Iq#*wNhTYfLuSNTruz4?h(dude$! zOW#;T5j*X0X^7xU3+fQ2vs=|p^B)?YhZjNa^BT{SUB{0$C%j9nro2y# zkW-CX7uR%as&9VW>HoE@NQj(9b+REQYS<#DnsuzM1=kvz?={VT-O^UoW!*W449KuM zMXbidK(R3>%y_Ku2L{hifMDv+!8;X4RUIh<)9#Fy6WB&P-U@@2FHB*=Y!n)L!#-FjYA)4U+y{O6SYE+Z(5b5#g7SSY><%odnJx1|vH0={;tk$jYMRF!C@z=HgxBJZJ1O;p%S=K?!_PEI~FMsi^+^FnpwuesJH^OjhT z<-MCPD)kO8SgY+b8~!QSs7%ZjvuYrYBaT#_kgKB7p&~OJEQNnn(3Nf$#3y9|Vz1~h zemOwI;4+EQ4588RsL@z(POw%8+Mwe^16@Bhvo}f$CN`7z_1KKQ;N6)OQ(&mKmHKkz znmyX%pYjOC=+A^YC**4^O>xsC4K;+FSg9t|aDO&8ZHgW*tj~A%g#-=WrBbDjDag5i zKy(7qqd{SxF;b41TVHm#q|&W_IY9cJ&nF7LZLJtKdMWiQod+l+6i7vtu|uqaxwYQo zoCu?e#`#@Nv_rl2Xf-Fr*uphOdm*xvFadUf%U{P)G0NCiLtm7l+)Y9^b(P$BGb{D?4I)JyKfBUJxVG@&;0-2MjWT!T z70}J2AP<(DmfJfuvlgLm+r66&P%E2jQaX%eJF(Y;rU99#t^I>hymFI0-uV?z0KX79 zua1*g(@zm+ly+D66B8kQ-K%_VR5{-$ECOD}v~r9LQeI66wb1Ryi~XUeiF$vjr8?tA zHn9c5{bZ7IYs=_^hZBmjz9K)8P}M&qn#{FZ+~O>uh`oHL-#aVay7NiD4~C2A(U0A2JfY=O(q<+Au-nhq@=y zcgOnTf$VRpeQ#)zWAZ&vU_6(>NBB|12JC2Y1(TlsbtK!PKKi>S||q|dFUOLGSwXKZ1LvQHRex-IGW6V;sOKK z;fgiOHfnZ^6cpZ!{OAZ90~N)OwtjVl+vP|^P8Mj23%KL3qUz1#TRk!=R;eN2r(1A- z#OL!dHUqc=9$zil?rt2hv^ld*u!)u_;5*Pec9orfDaG(-iv9Q!v>wPc*Hrc>K?=!g zuNx~cXyK-4bNbb!JW~fdRM>(T6Dsi=p6bby7*V%g&1MEes;h~{OFET5O0u}p2O6z> zcSX8S9XtUHETrkl9@PUn+Ogf6Q|DUar2ZOS(VEUwrY4e2SY@Es$?n8CuL4NuK!HWq zPBZKB##4pAHGlPq&8J;(T%G%R9~|!$a8Qh_h{&Y#yMQ}c*C#~L)3&D*l~#hKD%cuq zgx$UpAbkleB?ngOwcFU38`QVG1vu@7z&iIy69%0AsU#a~q*mH+ROvVjG%6SM`Um(? zIM#|gQ0NzVEhKj^jj4oV(|8wg;dRfRTwqe#y)G|uKG0Pk%wOZ>xg{OpP@07AI$B;) z)5gU8!#-Ext_C@$0ovGE`z6Shzq0|(>v264Ff>w6TeY+H8;3I8g_%pU#s?B_REjZ0 zByJFsz~G4Ut8}mSm~i9kzoaFd7aR18*-306*k}9#%Sq##V>GQ$DUJqDPV?W(1ji-A zi3EK9bF;*}2TgK9af1FzpGJ$L9=J?|)rGmNkJvq!N8{eHaWXXbYRC>Ny&^x~kRoNjJZvW^YJ z)_r@VSQU1F>Uu;}hycnLPH5vzP{c^Vm;k zI~+VyXUR}R%kAikt;Z}c9}54DKv97Pqs)7`AR@9ncdrkqzp}zhq<*xlnCTCuR2ZF6 zr!ugr*|+NuU$#xf>vM53FluMup{qHXXDwTqK90^P4Xwzh^LZ6SRb4Pp-d#G{$c#@G zq)@BAvT84Gu=!G2t!Bu6aSdA^`b8d*DOizZ)5Hr;VBRXJefX>d!>#hF uIgqjM? zltbG4s~SE=!oA-}EaB+DkXfi)LJX#*^(ISI20l z{wS;1C^(1`8P@ZdK}bohkPt@^}sQ(;5O0xu-tRRs5%)boUAK$N-a|;>gOIdkp$7+adA^AweV^B-5kJLO{ z<}?k6z)}ygd6>VS0QqfhejJ1OUZ9VzP{(jVDoU+i{bCIQb7)8)3WmB1&0r^C8pDpc zq;Ydew1y&o1i9syR2VqlZs&~@PR@U~YmVe#-jdl4SDjK|AjzmdO+2RZhF*C$uGTpzjf=G&@)(rJs!hIwWDj5<^_w@ADsAL{#9Nd`dnV0lfbBT0OHS_csIxH{c!z_!6e0F?(grfl0l7@Kb zF7-oRV%KJqm^lBqe8?)k20a?7s(iMfuEk8O1m%+uI%7a5Ag>XO$lQp(#seNL$%5qR zqC!9&j-rI$R>vGaw<8NJnj098xvc|M!L2P7-ys5;d9{j3FS_ToCBB0n-laz8M+|r0 zy4>SuJcOMC&OR=xS=*N?C!{RC@W~6?yJWZez8`zpCov&H>H``c1v}X@6Rxf*W=g!w zxNwE6L}PLCrQsrqcqs95)c8vRHPVE!p}=JuV|W9nGk@axB1v7g^T$%U(Q$VFKgfb8 zmVp+_ZMs)8IG8ACPk;;=z{)p~)njymR<2o1zE>UwGb3j{x^4w<`-KV#Y?@iRWMo+L#*MdLI3X)v zQe97Cy|yoI4}HLD^_E;i`iD^pB9^386EN^w-n5&~V=x!9uUHZtYOB8`3^ZgB*kyY{ zc)Bbptty{)RI1jP{-Mv=Dk8V*t%p?R@QQe_`>;)Wg_adAUio4@5>7++asX-Q?%)9gxG-{b%q(y|( zAK}W?_dl!^b$#G2K?89+)~q9-_a>^X<8sYZEwzz;nL*M#gON4W%f%HS?yc0hi1e&K zWXCz;OKB_NXwEjfR;T-pJlp4mvc$IZRF&H7h-BvP;U-aqvWM4QIeZD)2Zz@{(2mJh zg6*0#*>C9ThnBa#a*o32d^x^%RCSo|CWto)o4@|1fW3KQJs? zN)neCf{~y#FA~%Ztj1O&kz*Fzza;)$G0Rc!9kdrKdDPT0RScu7^?i5V{%0%NU1&K@ zOe42G@Golm>+KT?DM5;xlY)?{Jpy+85;8pt$JnEp=zWrTU|s&QrLVWrv?eYO_#NTJ z0%uKy-ud_*fxm845(yuF-@TVy20|1!bM{S7t|8{Xo}_?B{#85&c9Vkm#LNuxE+?+D!CfdD{N=k7~%d?tM8rQaYV$_e{PcM zUiOg>W%rD-)j5~y?Ww27>%% zkFf7{#Yt(QePui;F%+qc3LcocJ1h-%3n8HM4@7vam(E2-Rb@x)8M$k%yGpBkyxA$3 z+s5^}EXY^#PQ_s+3Ru>iuft-1qljAcbicUBfYu}f!R(_VoHeeWniryPS|$wmJ*|AH zt*0?)Z|>8A!Vzlio8H#aVW=$NH+vm(bAJQ4+8a#_IE-6T2}}$;1P!J`<3DS?t!^TU zG;a@1og2&N&IP;j7kehfkkVr^Q@++yawmZg#)puXQ=mCuW8W&|+ZBGWF8}|ZDQZv@ zE2~LARpB5v{(zbi*M!zJGTmKY99uk$WzNx5SSMFfEUg>4^gm0;L#arum15Yf_7E`T zB7ITiyw)<(0;%LyB{a(m4bvrE5cf=|$0ZQxG!ct0s3ZH{xewNu z=1fhhwRw0i$OTdkDZ|x;l_0QVsSw;>hTd&fOpkp@z7zGFotw$vS6AnF?=b@+XP!BJ z0wfj@b@0kU#L{Py1vf|A(;mi)^b^pcIsT!p0+$ad+tn+on__;!EXFJdnFh>;OwqAK ztpCmAy|%g5j7fKK&>YLOctk+COUPD5MFI&C`|%(V{?lc*C8?vQ_CTo+y5M75hMXgCv&F~i>Q}gx_EAsM z0rNF8TVW=rQ{#|JN(5^ys3(+&s)7VmW0L~=%HwLHS${P)<;NtYRL4O>rIWbC`f z>6VkUhhXyG5cSjP^RyhcR9M=HF|U(3dQNt6LdR&vch%p*%y7lcwV8#_pZ=Q%awo($Gv~Fm_);-mXAtCeUb9^OZ@=_)o z0JqMOzgDVw3>64A&{|uNEOe@e36`OMtG<~U6;Dvh%N_LJ(|rOold~JWhNEiPo%z4? zAZ+o(D;`qz{xl1rsY1%YyI95#gDieJ)m3y|niUfwPK*ynh5Ua&S=EB3l+I3{PcqeT$zvwBn*xm5fIWjm-eaT&9ei%TU)D~Qpm46GDD8J{Bqy4ayJ7V#blQuu3*9OE_ zQW8I5ZzRRXLZd_LRC2?vJsi-w`r7CPk&-Sb^-C0+!AHehdaoHUlgl<=>tf1u!tidC zkXq)tL*ztRLY#=8p)b2XS;6@Aj~y8c!1RHl?CfPItoJ8)V{ueo^}r!7u@ zCqZ=#a*^}6=8I5k=D2FJBxr7!X-c4+fCEhj?Y-8A2jQiR))g2x4+ae>z4vL&2j0q; z{v;iYc~e64ANu_WR2L5Tc>-meylZ+_yo-N-hPsY_Q5aILY{;az$IidKvS8b+!>fqL zGxAodY5fEzC&NM{q`^i#wrnvQ72d0$PT0n%pHCx)ox{iAi`|!Rzq*6cIBO54!nBdT z6sy*$jm?kZEU1?L9zQczMahLnrNZk7@gMV`+^ICN#h|s>_dbtvv^{Jz*=z31R@eB% zuhfFLH%4!q@s1ypLa>6>uh}YROd`C{L<8U9@V^xu!ObtLtx zy?9vVv+{^{XSll`JsB0$f1DUqMBIrDed(oj{h4z0oa8d)X-UlwOJm#o6zLsm$5*eF2}LINxKQG2ea zqqDJ;7B4YK0>Iv$M(r^KC6R>(>wR zz2CB9n=hKz>?y;%9^%4Al?GKZR)|3eXm3q=A`ndgc2;|IWC2j&K%URGEBe452-RzFd9Abo?7! zpUK;pI==+)KGLMkSeG*Nx|Nrsta{O_!dE=C~`>BYKe0pw!SLiVynf}Ln=R-t5 ep4_a+`EGe)Nrv!T`Flq#>SSs(YV_czrT+q%v%cp5 literal 0 HcmV?d00001 diff --git a/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise4.jpg b/assets/snippets/FormLister/lib/captcha/modxCaptcha/noises/noise4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27d103cf3dd0437104398c104d0af7bec13b7446 GIT binary patch literal 8259 zcmZu#cQhPMyI!mkL`#S+dRe`QB4Pl*`R@Q+?*Zr^2RnI% z0f+!V008jxFLeN*dEo2^b^$mK{$+@+ae$Wq;{O53-xCS&?@9tB1^x@9WTgLqjEtO| zf}EV}#tll!8#k!`6GS8=B&0yn8)RfRZc^Q#x=Bm(7qqnhDE;?F{cq_%?fyr)9t6-+ z{7r9+goqwMOix5YPjo#3fCB);Bt-wh-%S4vQW78;F%db%jeqF>bMd#7f8|W~w-zEG zF%b#y?c6VQ^d$5Eb->kE?0)|EN*vPa zYzd@L^KjN0k%0u41VDsxeNb!~REnxG5KglFuH6X{PU2YvfAI@vl#BF|x4ar50@C6| zdla1}M{sw}$8;E@*rBrCz=$%i(A{+YWM5^Ab+LH80{luE6`Ag+fZkV$PxZdGF#(Qt zM8{!x;#M*?_|^jl=BD4)UY=IH;md=nl#0^le*U|LCQLEp@OA1JLQ>`SVcb?(>7uX&kCT|lmI4QP2Q zAbuk1YuNqe@K;-KE`dVSCXrW`X2>avss*UzH|%sC2I?mFG8JojoYTrmGn{hoWpHxi zki4TuKTdXbDo~alq*?FWy!R{SY8v&@CDMEH#?z%H{Uc^k8mX1udY2=Hb*X!0x3b3v zn|^MH*v3Urw5m60x>rD4D6au2e4%QzC8jBM!W#$$HbERQ9bL4&~;?w6tl4?EH! zq~o=Jo{Yb4;UkDU)>1|-C%wmf-h1X7U3vvX&2!^joQm-;d7m1nHYO5UUk0#YE;Ki$OIR~#jik-XdXL8! zJd9g$EiHJAC~bNj|HUqULgzJLQHnd-fFJimgjS;KV%7#&sk!p2N~0{heq#Ah3ZlKt zr>G?MJ~wUhM!H;biz}Gy_cJCy+Hek(_l&@@sc>oR%puhAxd=))HxCTskkPsm=nKQ~~ zdwm*h`gP?OA^=6_?l^huV}vRUt?#?keGkl>tL46~xiXxaS&@aJjH$^M7Gbk`f}^E> z2R*qN&heENX8Wzb5Pd2ZjpA~Ubg+N*b3Vp8?(tb21HUDc$~Uv%fk?>|F}Vxi58C8}cjWnSr8D zH$=s&N-VZ$t4zXpK)rVB`CNN{2)$=Qq?#FJ7R#%+~BjmuCGHb5cEkm(U zCxqX(FZ;eydAj}^Up7q^+oF=aqWU-^kM@A4Tnl04i75lBQiSqpy*%czO98N&hnSRh zLjiU}Z~87*z6XyV`V_Lpn5QH%O~b7!h9fI&wweaF*t$ILj*L|DX40HrYC+0`9GGVl zs&X=~0m9(QF3U8-J=Jox5c}#WM1(xvf1TU#`LH1LyPiC)81#zfAY9a^kVUiY)N?M? zT8!j(veUD+BT=6loYg_1w0}^_+tnO}S4NvMD(|d&kv=1vBH-tc7VOTaXN8+fDsp>c zUCRi4k$IcQuhlXnq$X0E6f27#-kM=$&(5PpAF}?j?yPz%epbv!FX)VM{*H_1Rw`aV z+F9@hn>-+y=(q;J+GBv8Bqi4X8v6{hdm7SxY!CNA{$;$;z_zTh_S^LJ(x@#B>dA4RQaR-5bSb%lr9s~m|J!?? zd6^W1{pc630R_X(`o$0mXVK0_Y-X@tmCv54BQfKax(is^;lQ!B>;!>rxk>vwR{Ljj zqnoXa&(jJda;~&EDS`X7irM^owLK})U@b=!O zl#+<-fw&rBylvR*@_jDT4Zep6?u1iIVi+yckLV=JPSY&UFJ-FVN47~gx}=LXo!q6 zE-}|plW>cSLoVYec=v*09?6Zvw-LZoaAHIQ#`sRK89Yl*@)eip!#Hg&Kjr$y4KiEU za~-*4k(#a%4A5m(@<`HDf)}U({Iiq~P}?4ytM?gU?8wOt5^|@N|Cnj~E~`AXMomi? zGN8a^8n)c;`7Dw7Q&f*?`or3vCxQ?2h^UFkpGU^YGDMW$tq|AZvLlEFr=6^gIX`a9 zsNkz@x1a;e=2r-2zoe$}Cr`fE(b2WE!z@0Ro{3i~MLX7vE2Xh8?i!g#Fc814DyP#c_dY^?)>)|61F~!|ItrE|> zlX-G7LZzhk%T zX7@fT@r~-#4(VytIv^ddj_ikr^&-%vf{Yjd8!VU&7%VnFX4)7Ht!$$9@oP%DE6^7$g&vnoh8zs`)siQ#hqt~zgB55GS7w`ZOMRP~ zOx*|5cwGFVR>HwmaJ4-fPQOID8o`ehC08(SK`AKtxBLFn&|nkw9|(1V+{?^&gJR`p7#afxb4 zMO*_2Tv%&!FH4CH|IecfI!t%M2N0Z9mb5Pg(A~b#Wwv3fdHP*=@OC@rcat~6Y%G0h z3@Za=%XP)np{>d~j24GK(CMw5wYg%>_^@wQgES5IS zwRd(*Uqwkqv-qnl`QTjVo0+$VO7)}pcRTJ?v~(6no91R(E!hW}C$8~sQfv@-3OB=Y zB>mLue$Dp!;-L2=uK~LgNMxoj95;Iw0>2zNJ#sBOg#3JFS$A1i6|N-9fC16f?Kd5Y zGDy(!%z3|NRE2EPT<}{V8-=#(-)UVnl-T&1HCoAhDd=j|>z3E&uP7T?e4msNerw&W za1lV>5(yuBT$~@@dVF@7h?|C6yBWxa_v{RB?(RfLeWIczkGomwgIiIFeWHgZ;@5IhXH|XBQA=O~98x zLUuoXFWW(y?o1Kx z3qi-A%$@`gzHU?>D0n$J4Z1Nzcoo1bIeY@g_>6VyomY{>Cr-oU6r6~8|k z3!Lnf5Y}LiPo23ns&WSpIIKtRe1fr&M zQ8ti16}(@NyxDi`~{L34gsl=tqN`XuJNOtzLbb1Hi9h}rdt~(UteL} zVybtFFnfoC>*`9L_UXyZA%e=U+uPslCBka@_m;2*RgU_!rje?`rkUsAKT(bb@D$mb_>MU%! zJ0a1^u~6$=^TwkHb&fUa(uV_+gFA4jVYem+I{&MhLdagM=rT;jV$Ub9QLb()QHcr% zeI+@zmw9Bdm3)b5+Y;ZMEEIX$UUMDTF{|?y2^bn!10W%{` z*j+ZJ7wAbIEKgF2S<^lN^JDITESWW4!?8VYB>IF>QTdfB4N`Mv-n6HkBTmqX}2EZ2PnMh#G9C zM7D3`Kz+;Uu5!UvNn#`iJ8J`Ksbt}bX zFmru(5Z~cZgLiqzY1D+MZPJ@DSe*WA z7twtd-}^5Jhdrp4#@1IA8|ze7-3Rm&_=w4lovk{{A#rgUgkkIE&V=s7l+0NA&qqMS zb5YNoqQlhWU8Bn_AB-JSzuHtKrboshj#P4id z_d6$R)(^^8FBHiTtw`VSD3IL?!S1tFc9ok#k*d=bpLgyV3d0*q zFek+ZS_+R*KiZk<9>~>3iG5JFIY{`F#xT*!#>M-g^4o}8Om@=?+co7=%~h8i*Pjaw z79}dA7eS<7b0^v-7%UKGy*Z-$Unb~i1`n~o=K`Uxr2de+S?6z8164V+X5(XbZAz<^ zJ0wII_V-dX(e20`xm<(~7w>jU$s(QAMYr(ysf zX?j)Cy@)Hhqy*&wIZh=HaURwml(QPjOXjHpDPPF3eaY@)f>A@Ct(!J1a-L()1QeIV zj*w1_f^Vy8RIQgCLs_tz^g6=4#ESdd&xuI9yB)O)x3#{7QFl*&-cj^gnuiIS%YYNY zd{Ve6dHhw%pFb5^55arOU%0o>GR%u|jZC?;`@xU_HVvk)bxkOMj82VvA}tqhv{Vbt zT%}b?u3i##b?oVZr^r893LnJOc{bbuS=6|yyLcIOnDK6!!xXs_*Wwh&cW6>Nw7JKe zq?SDQO@tp(Lp2?ytR_7~U1IT^q7--!>*e%kW5H%qw_SH_qcQNBp{FI)u_BYR<|#cx zY#=`Ux99ht(bWvz4P96`T_3Xil9e%R_n0AAyjd*YSKW5B|LuDzyBP#MOp1b7vKj3^ zC`8qI*n+dN)m(3ayRlcI-bVHEgLo!6UXYvfid!`?!M!U9ljqE@p>6@!faaXoFpjIs z60QCaeen-UI>>f&7fAmwDA>!s5nM8UxLo5YpE_lkqZ+^qE#NRr1ac&+(X!u)cXKGnQpHbIq?TAaGy`*AeYX-FD_iST>XtSWt~=WdHK<5n-hm7R>k=otcw*Lt zTh02h-sW?)_V>%)_8#S-&wx@E^8Qy}*y9xt@r>Rx<6N2aMik=4<8|VD5zHg0Tp6G8 z2whh}C!_`8_J$=DVQ-r_-BPVic|t0PKw{c|Oe=vkiHYhc+IjQ$d$MIb9-@L~yGC1| z+t7>tDcDLoX}5(2o?Qtd&QUb2BRe^l*zw`eXtg0q(9H#->SC(5V zc!`gS!LWijBele)OZvXf#dWAJu26QWFfacBk&r3lG2jI?)nJ!6oj0EsL8H9ulf9*U zP&Cd|zB^fNY%g=6g|B9g@5dzEHJBZyUHzsOOMpb&^UX5<4$6r`4cSr3JG|iN)s2@?j?`CcasPjN!T$_IBJ%pw=ge45b?zQd^Tx0;0kxB(OXZbYrYwi`%E~L}h+fle%SbuY4|#g#idCfr*Cp?Y zhUUtSZ7l zo3Osp^NLqK7|o#x-$;^HUYavOmQv`4l>OEDc024(;id22spAxtqkVC#!3VeP6KeWtnT0vjmI%`mcxOwnR zUVt`KiH=GhC&cF)>4)%I=xO~Fw73((DE|q<^6{M^zcJgKC_117PO!s2;Z(X4)dQlf zRR^oRof$pu#PA)Q%to+F_9(e0mWoC{6Qv^U*#)t1C#xcO zU}NKrB7ELj>)Ws+!g>9!DyMCEklCj+orVSJel?994)mRDyX97vC%lb87js6#F*Eb|cBQ)HeOQNo(57F}m zYoM{*lX@pW;SgSv?!}DC*h(g(O!`UO%bKwndqwPbE(GKPW)22+a)9a@Sl(f5t=w*n z7wn1cc1d-#%^f&<wCd$vb*(JRmb+}(mW$-xJ8syAvwQdM-MKSo&Ybd{Gjj!`h2oc}I_xG;a zvU=lvzglz+A*zG;ykhl+-K&m?&sF2|M}(|8xMtU6&O0`2UcQvnzLzFs^A>#m#>S<)w&?y$uOwuf3)e?BE#0^> zc*lu9;BzC|^x>Ax+qTP#dfy^shYz3swq@(eEeE$<{6j*{HR1Cdl+T5yh?=lIp8nTB z^{1aW{nPl_JrRO`rR&9`qh;iM@hEwlUm;}ca)Dl`l?G5WDA}J=5eLHQb+Io+m0F|K z=?zAc*lWmR=eZC!msW0NE|x3spkcXW28 zyT|p6@0~EQZ_?x`Q>RUz(LZz6!0b752j|USuyAO2(c&db$+G1uR<2sTX6?H58#Zp* zyycv&+qUo6dG4;=d(PW?{skBAyXfLeF1>93frFP{apj@IN667*uQ$?RVUH*WKT^=id9idH;!Tkq5s0;6o38=aKI|`n~Tz_V^P|{@|$} zKK;zI&;96m^1_dQ^5RP`zw*&Zs4fovkzkGo$Ms%l3$ZuWDnU*&LiiOz2sZudU7GCxQ|>!PLX%X z1LS^kf_$IcN4`lOBNvlL$pP{+@?YdtwDTl+o&18lL4JuozXdM+725J^-1QXh`!0D; zxLtUSekNc}&?m_yLV}jl{lcfh3SkfZ6}_GsM_(7(X*;OgH2V4I`#64|G>%?7nxZ!H zQ(=IloivAKeY=oj_loM^7f=8W}yQAah9=R3T}#S|tjka%XSkVKLDg zU%JK@U$bO^8zJ07MIJ6TmpAD*x?G7-O=uyjpi z9;+zc{IHN<7p!caUxl_oHVMxPA7l1vNk=-URmnu7mZ@4LiGo%mQ6f--NSu^R*jXd{ zNLPDTJFRISX=jDlM%wYeuJ#cfQKuU0QF{`lTDZD;lf1?jv|7>#l88!G5~v25L$w-F6vFvdd)vFbX!nTnk7QfyM9r*J z9QG}`Z$rP4C#Zr-8GI%AQMpC;ZrzolHl0%TFO|k|hVwNlczejWvlTjyX zoz#-0?dh$|wf4++g0774OYw@HL@eqQ)yB0AC~=t=xj~MjG-y$*6d#0$ZGm@zZ9!yp zWLb1o1V`*sXmw~A$|uWw%ju^JE?e+8{_u7JfA3xf+LnT!KNmiOTuOpZu1!xXx0`jg zViK^p5}`_UG*)H{$u(ZtXO#7n$N{%a){%tds+82Rs894t0ly$pwa#U*+l-HG*ly#+!GZ5dgiEF}IxPV7&+ZipNT2m#3j#>Y$CK@t7vjK;wzR zFVV-bZ!24Rds|w1$G1+iN5T$!Bx0w>x-{UU*p!t-TInxA~%I)v0S#gC4H%+sgz9hk^{uB646aH+2QZXPfBz;H`v*s&W&_u zC#|lo1|^y_>Qur)K?4l9tPDG+iq?xUZg6S6@npRuC;3P_V;azcebHD--!Gq6yYkq? z@nv;;XZ3HK*m0rTwQcs!JKrsC4PGCwn9vZe2}hF+RZ_TQ_0rzCfyC6x=~HJ+ZRw9+ z9+^^h!K(cOKKFf|hInN={YOdIpNu$bqQ!A&TF4>t7?(rIv=t(VNR$#9MvuzSi>D(?L4_AS5Py6aaL?|zH554E@EYS%$P8YLAPsMG$(+8dN96z8<7*ga|b zl&QP>dM67fcb?jF{#$zvyn4a54_MnL(M9w%)NUb5(kZjaVA9m7P3VbEtI=uo_%CY( zt*BLLjXKCjot9c?$u6o=hJI&PyN~IT5kBv2Z`$6(_>YY|>BJw#9X*Dig@8-SN!goh z(8^w|S4&NkW-dM$zR0}Hyf1WcXeNDgSL^EVlGa0qq@nQYR6D46 zjRvi#k-2gp0z|fGWMoi@qGZrRNQr`7uS=dz@~l*9x1DOQV`4{3fbM_nvBAe4V^ndE9*50wDP{_I0;)}vphGnx37lSg0Z(`#som`dXK(oA z6a3x)JLylf7QgqUjbIs3z=+90F=PUp2cQTV;Eo&Kdym$x$Mxf2t-S(!O(fy8krL=_ zemm!wuFmluYxcN(74^GVEwnne%`g%&kkvTF6k z7q2RAUVL3`eP=x0*;!(I@z}AKUp}^W)65z=`@(aM4e6E~zY%?hokn*-OKV7d+9l8$ z%pVPr)GCz-E5=EM!mhwzfmR`4Dl|bWU@C&A8tn1Eozwf`j{Sme$-J9KR-(=%>ij)= zDbx|5q9Y^^Mxku=t=sUO-kb6Y!gZdvx+gv!QHV5i%^d_m_G7szasD?sb_ z(5iB>AYD~as@7?p9&3?aQ%Xv7)}&ma)yR6ir-aBQR@oy;QIq8NkPAQG@y9%!v^gq^Foc$|k2` zj*d-L$P+$Y5}2sbCTD{k#-xR6#RhvL{m%Z(Z@>K3+}BlV?QQoTIB?(`dUs~lDtbb1 zH)noJJ#IFW$Ajj7;WpqvI%zWMEj2#k*84R?cAHJIK_gqia1OI%ut)}@fw&sx|XZc1qAC7G{OHERysu&r`N zT#SudCbhP9>J44e)sL`}@24|~vBM@-hJ zi)52uvW6wSC|MoEh z6PNK!OhaeRneOYZTCj5G+6&j6dq-Jc$X?X=L``*NRc&>uO6WLeUOaT^(3)M}Jn-Nz zthx;rbLN)%=~HUzCQoFvZotd$_)M-!JK*?0<`G#?OW*)Dm9xT(PcSY8`6Q-jTC^$Z z7UOhr<_-GDpN5|fg? zO0ohRIbB#OHaDLwT_a<(sLczm)2t7!E@62vGxO`Vhjrx_$syB1lj1M=Jj{d1(5cKh(S#VeLJRMgZt9ZkuKX8K8Gye#E% zR>w-Ka#HuB>`3>e6A8WA0I5Z;k7&0U$Ac5Ey-yyTcD+(vZAW0s=9i3>u@}N z!IJem?>lhfZKH9c$x2sM^^LEpn>m%WnrkWgSB#97G^PFUGt~lwDp$x7_trFO0gh&N zptukO0bdexvs0_U>tD$z)RE4T}y=N$2=mJF_ zF_oZb1m?mrMa*vDZohm^{XwW>`Zm{=BuaYd&xMuHGjiI83Motp=wwk=>4~Hg)y82V zzKiVa+S%n}!idj$E`9iH*Me=FYImY3;l7WiGBfCR=&jjHujxjuMyqkh8>Qzj ztqn!esbo)uv1(b({0l3R$%<`7d-u}a(S~qYxx=~9>KGVoZmzCwZtdv>HETyd6;2BG z!!t>fHR%TGvU%$brMAWfgEQVK*9gsWd6_{jw#iR?`gAHdl(Y^kn-y%b=ms;NC5n?Z@#4~YS{ZZrww15l zaoeUHH(G5oY}S{qJ^bp4E2msl94L;>Z=Jm_=tc{Ai;jZESjV%y4plk8|SuUgGfKfeAIF! zRb5Ao*JOVEqvbc;AixHrYH9%w%|vU<&{`{WT9kCB<1vd`JO&WyFK@u3XlGCopDuXEgk&O)Dy||E))tzgb~w-NO?tJd$gT6UR?Onywp%O#+biFinB zI)J-6WrIsLm?gE-A(@O&ZbpNX8ncX@2k=;1*gx>F*9ZYs9}++rfm5bhh}&TUez4-o zJBq~vXorzZg|);z zE+}u6D8tW!{h@|uqX$KFYEi{uMO>JZ_6*Nr!d@9H$mDiK$1`6Cu%bKaX5LoR-A}K~ zeD(3i;L@8n-MR6RjoG_Chr8-YU%JFV)L>R2cRzOTg8S)DGuSzddD?CHJ+pU=vpd@R z={bM?;ChC1yOMi0ti3{~y=P12ni7R7!Wupn)6x|t5ww?~2vvenrv*mAAWQhXPzanlU=M($ z&b+slg(2CXVCsNG*#x>- zpjYcnM%x=N4BOt|3=GM~z)MaIZu&y>pK}pfspr`S-C}{ZU z-I>4A$b+;c^CD>Z0S#q-mbo!EuYQg8s!1wsXRa-LBtXeVWBC7QYMfEyHQN3Ey84Wi>6 z`Zl|RKVJ#n$YW_H{Jj3o34I%=Fsim$UHW*aA^MUf_cLx;kjFH z`N0p5Z@#zYD*Cgf*Ic`7@l`phOaN6JXj5A{thLELA2E8NuN`&}#A(v{R1V4Jb4n^B zf+%l5VJq5NF&>yW

        o#UWhhC!!(|(#$<`-6?XrxH(c7+6)koxxo(n2>N!Z;+Uh5^ zH}ybCuS(C>n=7jS_`}vv=Fjx)x{Ajt*c@sZ{gi$Lt1v>wr%Tjsb4X<)CYx-4DT}a$ z$!+pFi`B(ipn=|4)G2AB;6}!aXiW=`N7cZXP&_6tgbv3^viLJ|gSqbJULd?<<~9AX zruU8h%a_fWY>fAmRCc|(@Yu%k!E#gSq@k)Rd3npSMN0ykZ1&QM+C|+<*RHWycDX%h zB}9v00qwM;GaclfkqrF_Zv!5%q{XaNH%Qh0B<-Lcx^5gmD0Tr#t|` zWh{#_;6T{9|Ind>2fF%av>u?E%MTqqLXT&5&0fA{4!sz6WELlrwR&J_NwtJn5SOoN zNe?U<7A34t4NDQw>zq2ho@lj3Vt`%w1{a(!^Khe=Sp`gZGQl|lOR}!k34q$+Wk|Z= zn7ebn@WB4x-Xq-H{Z!^No#5b_1e6q?;9Pht-G2w6YDuMr5;96!qs1hdEoP%+1<+2c zYDqw(6Oy0lv3~}k-arjz!Nfa>eq`gZ>?kXj z^NNgH_WXrwH65O5fKM_3W_~@g| z^O?KY3}w8(10!Z36Vh=jRrhPCMz1kJGXv8`mWWBRD9t4ha|LrC%cn{Z0U;7Jf^>q+ zDcl$&?i6rydwk^cTV1mo1#xq<3nog!IdSMZJEEZ`$zHe8Ryi#bSXs` zSp(k)8WvtY!gxd@Yh|4iys8$};E_T`%}1>NGV*K}N|rv55>$<8Na3kRX>;av`gGmV=Bci0pjni7mG;R|VIZEFzf4M~1HSepH3xq$i`Zctl z{#CdQxJ7N+jT8h?V$dI~Mg(d^p)yYZ=3XjFjLRedB#4DL<4JA&zI*SwY|EBQh1)WZ z{PB;7Z+tPjSfHb?!vtVa6w0G0u$&^0<2gHD4d_syBcBVVJGY_@OOfl*B)o`UB-8Le zF`;-U&zm!qXk^n$@(c$wJOBzF5@)F7Gm%KKU><~yqE(nWqU4xD?smB}!4mSX_2X`wR z&RIMk3vKW=LIr7)fMwytfgU+uvMEW|c?W8zF1dQmgiRIGqpJQPd0EP)-kO*=Tpez0 zw@yx`W=t9C6*m?IHpimv9c`IYAB38U<8#|Ve1W7#zZBvacPFwSrliXwMD27soSI@; zC)mBRB_J7HB1DKpFj*Xu6I7&@0*j055Y`8H65REL6759f9)ng4U7}?$vJ%wB2r6-H z#R5z36U6$>%U3L2-!#J~?z*VCMUooi7KAe2G5P%AB}dk5xv8RZ`ez;Um$bGmT!i~3 zM!!P#&S#*$oGuE8YJCQgF820q0_C_>1TKL%+wn<7?==ad;k#TBrKp18AzwX z8nwe|cN(pJW09;E>{h3wv6unH6X5WY&1$t!KpCfxeV%R%rR4ZiZrDM)u~D!0mUh4d zN7TE}UOVcY(X@8;>Q!s%)%#St{~*h9YfEcO!|dwn;~Uprx3Hw~*CWp!`+Mu+p|;M2 z^Lcweqkp4c0ih@&bJA7CqS~qVZZ>T;3r?HaWs^xj)*#&B^>~QJEQuZoi5+?kkk`D! z2+R5}j8}7xA{%k06Nj_lavtVj)@3w==oiSU5gU}SLGrwV7oD?lvp_T7RnKZKo0t-& z|Mu;MhK5%2!M)qAzIuz%V{9Gg_iv8T#>R;gAT36}#LGhqEo0fVB0`IF(eZI+nHhmi=x?lo-zJ}kV1+9i+N-{ zaVA^i3zsj~JH69uV{x6!Q61Q_Wgk7fxOGw_9@VebjBi<-*~aNvC1@cBiV>?@n69aC ztBZvqA!yM+JBQp_gToq?9nO&CE|G|}NGc}5r0f$k23ZVJch#j~!&-kQ$!B9)fyt$ZP-C%7Umjqqum`krVA@>O$ zy#%Ws#)L`(P{C-RP6sl4ocVx*BCfMQ0?5o=odh5DVjxTnb}j&5*&htGcGm6N*SunR z-@Z>K&Rx;#|0xnAel=s;+RTS+PIUoMcwYDsWHXdbx>%<|3Kk-sDh0=2VSGdqFzkh4 zK}@226rqdD96Ky8cf5PwKH<_!>0dK;;YYiPF#6eO9eD+Hn_(BjJ8%Gh7xgO4RGVzE zTl6|)WZ0}oU$R<&X34~rk1Au3PP+#iB8FIb5hDe7*1^117ueh#uPQE9TceSElbbKS z^fk>et%}*{S0kSdEE2EUlclW*v^9|P(&Jk+wK{>NOPmQyXmvSQLIbNAjsaC*364qp zTu%W*Ah8$V8lc%X7(2i5#xR-$Jc1i;?VU_}{2Mre!eWxW43Izs#2J4^0FCar_VJT< zeF`)^Gw;PynUB%VG)CcBw3FjH$l7BWzsQ^@#2{deD4Nk8Pos{LBehEZ#A5mn*jQ`R za;#V#5{d=E<_HTOGo*`O3L5m1HY^20Qc>LYTE&=XW$(nO@lXCEdAuO0tsKDr_d0(Hkdl&T^McZ5M2U1IVUe zvoI?au9^z)gT*dcEpX?|u(O@iHr9UTR$)@}sSWAFCIz3)44#H*7injSoD24Ps8~P#qNAyE3OdBguASH*lZ$Erw z`}RYZb*9_8Iy>9b|J-);+U;A9T)kubij`gCRxal=aFibu{0^kQNH(GtY*tr+-L8-UgO=BD&>4ztfYB*14D4}dLF2}&&lg(O zE?c!?T}{7t-^ER>QgeL^#(nWs)8}5Zdh_*Vr9jc1?VP{3rEA_o*3JalX+%5S;J&Hp zikL=i5#Zj0Wj(MG5jcsaNU}JQfvzHw#f&l2^M>Z~(^&Y5jTh4nJetqYdqw=7E^zH} zSdZ=WG);WS)nC63nz*6gEAHL*eq+1T(%RbGFsriq_!h|5${8cQo{bG9%@3y+47YR) z&(CrfT?;$L1`MEBtrzu1D;0D=l_{_s_yjhhK?BdwWh1}*C1WKttqXHp$vSazCWroV zv(Q2@jrXdyi?;Ey%@c5rYuZN_Tzh^?pL&;e$;3C=ealDxK@WmX5z>+_Hiw7}@Q5Bs zM}S9)O~odSHw%quPJ>1i6Y49bopP{9L3Y5`V3CKS@^3Dj6>2Wg7uOcWny;R|XP`>1 z)I>Vx210?M;i*&fh9w5Qr>Lk=nlfXC(YV3pWNo9c?dA#R0pA-;*Z9P(wy6O&0Mu`fDf+Jujz?A~n z0h(mV;KDz0EU8FI2mXG#O2U=yDobCDAebTbae)3 zC-dCJskm>5+?pPiLNlBToO4|3o$6X^+PXv~0_d|!MypPz@<}dV2nJ86*e4Mef{aM# z(F2k&=!=U$B(*^Z>2-)5>mqTk z*wlbsn0|{^3rUNhg$n%(7#rkxH1~K{DD+z!|NX3>(`?DS-RWMe=E5!y#ndqL}N9JCauK;G*M;H zT3E)Cm0>R?enw@qN(Qqp0}njb@PB}1;6Z5PkPjis5*`4}Xoblohab4*`bb)}^uTrZ-}HoL zR~w}tH>}a!{c&cLjqzxWU_u}5WKVkh9U9uKrL~$nGy>AwVT?#RogO#<6rW18>4;u5 zA?ZRCMU&b}WD|#)1XED0g;}LjSyeix%E9_zL-^PWR0$)e_zMhaWd;AohLUj~9cIWG zY$_y1FfQb?BPn~zoBz%~FJo6l~{d zv|bPUE{@57kPzkuaxw*3B~XNzoPf=+Z~z#gP6srMH4bga(|4pDndoDO4nAU}}r0$eK~&_7PJ zg%=HaqG8{xS+$miurHDDxjLfrr3K$lR%z$!s!Ja4@0u5Eu-{nM==Vx>Xz!Dw^O1pk zQ-M_nIFv#W!uIY1$`AA6YC?z)dSM#D3{9*iIWI2HDNz%vC?We*`GguG=Kh8vYOn6 zHr9`p3(dg7YTymD$HIx~6!E8skGhRky;tL-8lT(hwVLGGD!Epa^(nA#LJlMB<&!jJ zQV}9wVWJPxqMVxHcp02?Mr0+Cg*m!Pnjg5FIqil2VZqlHv5-*S22)&2o*5cL%4{z0 zz92*mZ=T*<=5a=Xv1>}#6i%ejMMBe?AxO_KM6W+uQ&(i z>-hOsu!`(3&hr=`r*VCj#^-Yy^N0sO-<&zxGuJDTwTptUU)>aaKWp<>A#!)!f z4K={AWqllIsytKtTC!qYKjT92nRpbbf?j_mmB^vd|pG#^~O`3kLmwN5vuqh|nC zAEH2fG=NL-G3rys$Ub(KjgfM;Cre>=?bz9u3$Fc9{@NpsQPd0njRttVFDdmNK)s`X z!0~gu2IXuIKl?wpHdt`>Wqy`H)&b$is8_l6$U#A=7oG(hdt?}Zr(UVZwpS?SXJ;vQ zOO2gn?N!e9ob~L>(Xne;FO+MK#8@v%5cMvs_Z40Pw?z5f<|%h8V>Kve+1-@0J>_RR z`*Oiq#@EWVN6HzmRzueR5whM0U$2zI4lKzMW;RrX9!W54aRpMdVOwg{)L4L#aFwPQ z-q|oEv^~5j@R|uJ_+AzbK*A+M*IvK-?wxnt^;6;E72o^bijfQ8yT$24bgppfY`(3Y ziZ%JDz!{PKu|OsFaJAf}Rt#x6cVSoO!UbKOLsP3G;p(bLq*|ERHGh6r=e&8Hk;=+Q zw2Cc=|40SG7We|g&aPjx`J7et z?o`-Vo@%Vo#Hyyw8WVA+nx=2-B#*M4KHIOR*#oYkR=>M7Gz^E z;PtTBlC24SK)d<6Jel~s7(&_O)*vmz?{h0@xF-DM^o0!=umX&f8EdQqN-jIkOT}Oo zv6K@GB^%DhP63*G3^&E-*3X$d+1PqcZ?G|}O;yfpJbwH)E8m)E7(a7CxlX&$Hnd>k zTRfK|HCl!^{V7sKT0!@kgt79KI^%Ex4H}ugkd#~+dSUGWF=6=HCs*}<&EQ>M4 zc+QtB0CQu=tprP50M}vyk45nEFdOqvVK~4@%dK3n^1PV_o?d_)ptwC&>iP-wl&zSy zVn#oG>xHFX{YzAT^)LG226p#u9zS{uT6}4`25w$i(&6w}opQNHwie07HE~&VI!gVL zDI#f-rBWFwE<)NmwHCyXV7_n{nWf|dtml>)8&bxDNGZiDh*8d4m9Z|t1e)7(*+>PhaSukSguWMS(ZvwgwjW#_eg(qACdI0yqA>Bh&#+2!Bg(A*yuFPH zir&`25=rEGRA6fIfLvj^(rH~ivGl@SOMOj#U8+W&IJwPTRwM>$8qetH(Itx)uQuo= zd%NY<2|B}6t@gIBcM>iT4U6rt!?i#-FHQHF&31jA+hBAfmz60xS>UU^4M@=8**Qfz zy%Y!rECRIw_O#mqegvY_0x1e2dSK9MHL*PU$^CVX{bX}@I1I{1o1vl1RA*8)8|mfi z)qt<&vw9M;7_XsT7V!771+HBz4R704n%=%Z*etB;pJx~59z?FPN~N2A#R6e);>65L z@Aqc@`!9_hAJPk7j3+F1|67@h*!+A3G4E?&FYvXBSiH(s(KATjn~&|~1MV0TbQK(k z>}~6%2d4@z9b%etsW5;&EuKdWEHdL~q=1w`?3@!xV#!t-0UV7n7x^j~1L$&g)EMEX{w>p)kN(ZCm%%4(BQHUK7a$O0|1z<;yJ z$aZGS|J1|^tp*jAU1th=L&+In_$UaC>^EL;$X)B42J@mJ(Im@FhhOhSYf#u)F|o9f z{>hXXopp?Eq`%I5Wqto``v;k=w(Fkp3M^lJ)7={%-YB$(Gk>5y9addoZv0$$3N-a1 zW?sf@dkyiai7zCUCX20(h{+x?m1;twCRChsSd$K0&|NHBOJ&g%kxg!_O~RUScU;mZ zB}YiosOYdQu`3rB%q}p&Y+?TpI$;0cI70{){y)>D%gRVMC=I=g1+;mcmUHL4EMdS) zOGPdwlhi}ctsP3XcXU*hfBS}};qtDI?uz6CHxCU3sJ60m!LZqu`La&9-|L%RJH7V6 zwG?DbX7jqd8o$-+V_O|qE$9*P`yy6DiNE;`=6BcV0L{?%5dD~*E_3*;ZllxSRAD8c(}A8z zZWrHy0`>{u-oG?YaL>NR-f9W^LpY! zoXGm194m>-v5>3}%R0S1QQ~p?B()wfbF|qjVR2(3R+I<#`4S^Ox4Aw+oH-vB#93v* zPR;=2b`1JZimfA@nry_}%RL01KI3ucvnh~7!(hI@l{eOQFYPXihXRdWv88#^IC18V zfIXZH)FuakOWl~Pt!+-xqM*}0&6A#d|9qRhDnflHkuN9WZf<%ddds47LF8Qn|AV0| zi$H4ve%Y7HQV#lx3Rpas;KX%74*p{X_P@(l7SYVk#eI{8Ss5;c+Dw$h$_9YynI{a+ z@0&Pha8hYYOT4sM&U}bwu~8WPQfxpBlkMx#LT*e?^#?1P%1Xp~wNO$XN;K&bO}-k7 zP@o+kC6^?d z^}ygcVdso)RsY=XO2t=3vh4M)D2rpY^_>UX+fLR`=zB4onA0Xk6$-uv|2vYE z^4F#(eO=0{^zpL_dUICL3qi?VAnCRLR?_nYg=ZJ_pxYSH@;U(2EC2tM_Hs_zYdthk zHZIyGwMD~6wwLup+vSdM`0$R-F5?ril5~eg_hguk*jy8~FK*a= zbZEu6+Qe^tnTM8-_mz8o=ZB;Zj!wq%Mz+o~KxU*%EC##JOU-gHyHJps7Q}~zg4i1e zfhc=D<5K=&0fCx1pNs@=m6<%a`FYX*~Bbm{$l434Q;u!wkX<#g@P$V z<;u$W`|jEvq<=l{yv%`+6k_WHH(Bj-=CnN5Gam2{a`#8)kl)i!&`OqT9l)v~!~@v6 z3MgFUvSE>opjJf+Bn-TG*yBu=FnxnJE~<4*im*mu8=-gj7De=vy?e2O?bndKU=#Xt zfFXR{23xC<-Bn4TFi;9}CKO8qePru4WGwYT_BQ>_1;@|Ld~qE02&3BtJ<=qjWO2II zXY#s(8iPtJ$AYrk0H7UFVIoJucF`6lQZy_@>=M?*S=|OzDzAtXfJCtw6jiBA$n30R zLLGte6y<@HEZi$Q*%m@d1{C**v5}CL&g*jZFHKZA4FPj9VC-IR+UT(@oLf?5Hw6q; zMJDrh6WyPAX5DJTB0-R3+C6d8;GkiJpsH`}n+UpBlScX({UL~9Bt7XUl6#Tqf=o+< zj*ytDm#}XL(h0GU0@~M~Z+_Nl%$hyC8)z|efD?#cdE?3})ovck#Av_dlP1 z{wF^{VWVA&yZ(9Xu84&qAj?KsLTFUYwiaMX=-7S$I^ADrH!=-)=3QYXIvc#&IJ7ce z<>a2tTX(J5zI)5o-D~L&m3#gKe8t%8H-zoVp+#STnjz2LfcQNIRAn?^T@m0iz79)G zH7tQj#9E%b4j40&#~cK335&yEVI5yG%TY6cMcoH4Ie0PFL$g1I>ai&BLmW9*q76Mj z$dBdEGvr)3{|Z@NfSk|9c_2n;>nqr8?GR{IH<}R_!uxR{uDdi{>vGx*v_fyrA|NG&GnUSUEuL%a)m!BsXYwp={-wD;m zJ2pMCk@l~-NTe^QE(Fbij*1(R6%&GuQHMQ>nu>fR=!#g~m7=>c=n`Gla5-9DBb(wd zx?Pw*x>89WVOv*)-FB0pL3U$q)qGZwDYGZ5ySNNEU41bzjNa7i`Q9dD3JVrD$0efq zqyn*l&!^K;^ls}~6pb!u-gVWHot?8{J?k!6o_Ta?SJ{LTRdV*dFR4>?HO-lWU1{uo z*xu1?PE=QvAKta|NNLTSyRK~S_WL&2T(qfa{G`P_D^{h`D_1bzE>2#fpVLxM>1q*tbgwICI>=y!w()Z~Jo)MwcjlzQd}Zv$YG)=B1O(d%trXkq%tqz(eO@`FGku@@j@O;vr3Vcb3R=s@ z9kuc3XSSiNk*s};zSvcY{OR->u+S0I&bR2a8nTUH4PlL7Hbji; zw}2>IYr21M@Xqz?>EQbHOk(iZK0NqRGQ?vBM|kW6SslU-9y!AvJCF-U$OP;XNk`8c zeV=w>*E5b7Hz@lhcibaE`N`OADhU%b30Jw4 z!^Os=bMYH6Y4rj@LJgcdrrFoV-tK?_Z-Q%jN#*L#j#V!5;d7#AZ z!0DoKcDPK7m2Fh5iUsx8Nu*_v`HO)eW#W8lwGw&eM*JkL6S(K|O{j^(UD4rFt4&z^?O*_hdZS(zGEz^}7qWHacC zW!R4UdS-S?$@4uUL3=Fkm-X%=^p5S`w(lK{M;= z7k``XyYD_B_TYnyGPe)E{`xRo%D8+Sc8q<6GI=+)Q<(#R*%_H8sF{Vq#vObDCJi`x z^jh+#|MPxoOwO){n1zlSJx)*X-*X*xh8EFqEi$$}Oio9grbSqq6w@NntQNt}FxaXM zQW1MViXWY}2jn>9E^JP>vV9<1Bl7gd*u*M1UFsa$3zBUDncWX^%4DgdqFgGLrSU!g zVNXb=E?G27QJe4s!DqaTU>s($arjy$@Bh>8klw?NmA+?-|~Om zNwQtpTXOlN{N9pzE0yJaC|2srWErnYCHi(T3C8gk^0 zy|`A3-<~SCx@YuWezlUF!fH`$?8DgQm}Rq^dH!YC-mEoep6`Jl!Okn$EUX?So8>TB ztn`+x>*e=V&c94no%Q-2vXLCajDl}Mp5s0`=3zFEU--9q{8%r+geHEs1kr-y$cE5h zwRsT636WWfBRm;sEF_k4tIV4>PcV~m?h}lEria0<%D#K>EWPosdI#4pUo|Kk9k}vJ zkdw?1`sh8t&7Gtn?L}4=^5#g$23^nA(qo}vT|UB_tC$1eOco)MOO>Q7>{-clH!=mW zKPGMV4BOoSb)BlM%0Gl7v0ft!GfRB#n!W_}dm6^G`_2}&)7ymyAeBOCcxZfM1rZ~~ z(%)FDl}B6oq6WZhv*{FJdo##P$&k=NZxCL=x{+$+l3^Pp$;j4TARvSo%2)se5;F(r zp{W*T5CP9Z?j^%8(8zy|8_;)Xn-YmeU5BAx=$JCDBvp~<1iHXw4s?B?sSiOaC?DMuZ#BZ5QLn3$I)BHdPFAWeBo?Tow$rD@9MZU{0K z2G;&r-r8Euirwe4+r1tkrF_IGL^ge1yWNNOeu#`F?5mAAHIzLfWe`jp^3;G2NaIdm)US%&rkdZH% zV4FG830_CEishg=UBwP(EZ{^AnpD?)M#j+qXtV>oe3IL-T4cNjfeB#mXk{Pig2>g_ zFplYk9R8r=wkSz)&|Vs|CosrL5jj{5qwE|1yJVlY)# zl*z781>?!nW+j!(g2UiL0 zR}KtZiQ4f;*-j*8L=%#H<7;Aysw@cO2t+nF>UA=rb6|fY7T{JqtssYUaWe=vfltcL%8%n8NOD$Gw5NY18|rPTiNLy%lt6=H0p- zb(x?1s{(SD?;gSBD-zNn<$n&8gUMsQW&#qcl<5yh#h;&|I2#3(KI2z+WUsdKtJ(Rd zc`n(oay1J+6=dIPv4<-19+VC1C<~*CY|97WklFdJbO9(N-w_YP#CDKj`>?Q_+zT(H z-E{s}&(Jih)r^uHOc^?ek)Qknw00ImNx4MymNE~pnlf~>aM#QKJsMrNe(#a(JFYyu-D^xp2czpkJqb^Gytlo( zqocF4EiK%-u%TD}^?BP5UA1%DQK2$6uc6muRkdghnJK-?mUoX^xe{EX_}fgkEB^Lj z(#dtZ;+-=dQ@r!THa5PnZ}{FbHptrX>6jfBexuJTt3*4t-u3%1mV(BvY(8Tvz!mvS z;L9;V4aJH?e*+jpwm0h77`l}>FyMp!1GR1Qrd5aULZN3waNP3&JK`Bx)klq-DyAFyW$$a!bO5lfNhmmQ+?;y@ss{ zoBCt=T*t!2t)26+Dh&H1(i-f!xPMINV~H>jmos#J7C_;^2{04hFQqSsgZ?V%c(_-zArL7X}L(7me zLfeJAf#1%@>cV)5z0Tpb2KAa4iRi3svttB3tg<@@@Ln`YJ~xS!(pXNXattWjJorrt zkf6+Y-bRqVGzQWuro-5F$J*T1%o;6Avr-I<{n7gN@<=$@Szgpws|j@$r{~5)z3b9# zEgF92&ta;Yj+IzD6 zLLVAQh9~u}2>XK$M?V{^aa+sjB$g4!dbugvOE(aeqv`2xm*8t~UyMB)+QUh z9&Dl`yAilD+9jjXUo5@EE@bGeS2FroE-e-@TP4rgx{gjm6Y>l>hIBGAfY;eMmNb>? z{ul-PXHbA66*9{?PBzGe9T$ccefPF)(#JzWL5DZ@_fPs~rnmQY^fHv~WrCEGMk15P z(<>SQ3)ER^EtO8BXE7#qSp$qo!#Zn?vMD!_!=+Z)MWm(%v0iSht`aM1rHWE1StgYS zz`aFmKLycLRVh_SQbkR*)Feywbt$nTSt^#7dGbu1vtk%OGi8kFr(_8h_Mh1|$^{&6 z%CmfqBf$90XJ`Ce?xe!^d=o3qFQ-xK^r_I*+BFypVOm zumc=QsqhA=6dosSct%kLT~5mB3jW4bnb(7DD0q^7Jqob#AE{@WUl0;#3SWw2J zq)-}A*!OXMJ$_3+CsBNk;XQ_E)D$>|wYZl-SU_e9)A0Kz$YjA!`strZKW0yv@EDF8 z$y~Yz^z;*0>Hr|U!3+mPj&*AtIVi13XW4sF&;N64x z#wPs!QBsEYKHOhJKgW*PpCex{KuUy3B#kE(C4?zB_97=|Jo0pVaNJ9}DRx_+I;<|R z;+T@OIG=Rm`fh&hG}0yXkpw*#-#rLgor91`FX_M*00wa`?(4_>J=ksI1AhMi?)N0_ zKMC(z-f!0T>1aRtobMBBKWo!j3U4FY$J&@HXdl`*`UjN%LHT38ZLBYag|(}&_((O~ z&Btd7=vI%C66TQy@$N#Oy74%kT3%MefBT#~!)PU5I{GiryB62P1mEaC@H~kwx*GI) znRJTtl>1>^gLECnO&MzeeXB+(6(hh|{t5nMeP#vYCSFVG#H;Z;#wYKLeokKlonAvE z$%uC&c#+))^kZX49v?jqpY5~@?FP~$RFA$Z)T6L|Fn+}K?Dr}U=U)S-DZ3A&E#oQ1 zM~$PSc&8{@&NqyASYb5J7EaI4$r7}G2Fh%dA(R(Tu1EP0We4JjR=h6(KVrbqC-5E{ zf6ixYtTE2uUo)q_!hd=J`_N;oC-6RDSutG(3uYONh-D-s?j^}=31z1$LY8=n*jV{K z?&RZlB4R7%H;^-RC(1sQ-@w^|m8^Li&e$xJt5JT0@+BcUoYy^#4domt-z3Da2fN=E zpo8u%Ec(J5@Lf3Z955#j9xl!g7ZEB1@*cnqu^RM2=U&9@+U%kOHgpFA8qwNMMwY^df@lS<-~PC)K|0!1-~tRkdP4C5!Rug zFX8tHEEkmhC}>;MfP(wQLMSg05}$>K$O$Nq5|Y4iX&K7B1mXwfQbNiqQ9!rydK9#= zq8SBsreHEw;vSXXAf#$M$}5Cak0Yc8r55+A{g9A4)K`ys>e1%_h=QwD4WiD+wIKMIZ~EkMD&CvQT*eW%PrIhiegAY>{* z@u9p)$h7~);~vr9>76LJ$Mi1=nbC@}mw>HNa9w{b%2q;V?ngmAvx-puNyq@`Fna?E z?lt=ZLgt{3x#-K>dr_W7LH%<-CS*{95<-zsaPvXXa}f0p9!Gfq?P(CMQUM0#E zgv`gi=c66-Z$Wv3kOlbN0<>-6T$EP{8Nzi#`0a2BN;?W@GrSIE9}4cf=xRb1A4ItW z<@<%a>p(P9S6@>RWY?Fm3w>tZTzAb+Cg3q9bWov_$&{ z@;JVO6-z8wt)l2;Fd{xH$Jn|LpOj+(zs#aI_=Of2wsKwtlmd%d@Ec5R$h{faV-0eJ z=iy3=txCIXg+=>*O)p+pXb~LICX*cC~ zuS42p3tq7yDgSmYzFmsP{zb@a{9+3prnm~9m*YLc>)DEP)d<0FMd)C4_R0agZ^9!J z$KgI3AUvB8Nvk6gUK{c6?AJ!}SIoH=-VKc_YigC6hZsQ~_SXCZmPWpge1dtb7gjIGSWXnh3A;m}> zv7ZF+jwFaxjvRp$VlP$bd=2kjJ=WVaqN@_@?`Dv&6_#5&xUv&Gl!nF~2Xc)kz3Bc# z(ueiJld+a>Dw#&6gRlC*!L!H!NIZwkC4=Cu`D6hiMnhznEJ7@02?)xbXSsrtpAFes zJg0I!h`SLaVuN`OC)suk0((Z~E)3NkJfU(go>6%Lo=?f1PI)n6HSD>X`^f=v5YM^1 z0?*Yvgr{g8LFDBsat)q!c|Exm>%8y4vor4^cav|Bd-=00@n})BwshThFr)j>36{s&GXX~fr|MBUUuyQ{jza<}H zcKn|F59ahA5nKH;`H1|5d`$jIKEX38|3*H8&HDv`R7hK7S(2Pi0b}oS_0q$S)6vUz z_O2Q4`!28mlKQU5UsceQsqd-<_Nw8>T7InKuX_G!;8z;?tBJpw`FRU}wenXR|E--L zJNT=cpYiZlFF)hsuYP_e;9_?S^4B7MzL=j6@%qF3OoV?M<>zDkOq?H=@Z$tOF6GBb zeq6?1%lWS=_-l&4R`P4A__x*kwT7Rm<;QjWxSrp)fgd;W^G)m+^eX(1N%H>z@lzDx literal 0 HcmV?d00001 diff --git a/install/assets/snippets/FormLister.tpl b/install/assets/snippets/FormLister.tpl index eb79cd901b..b65debf02d 100644 --- a/install/assets/snippets/FormLister.tpl +++ b/install/assets/snippets/FormLister.tpl @@ -5,7 +5,7 @@ * Form processor * * @category snippet - * @version 1.7.19 + * @version 1.7.20 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL) * @internal @modx_category Content * @internal @installset base, sample From ce83e5411f2838601809fcf7a2a00a6b19dba131 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Fri, 13 Jul 2018 17:14:05 +0300 Subject: [PATCH 054/241] fix checkVersion --- assets/lib/MODxAPI/MODx.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/lib/MODxAPI/MODx.php b/assets/lib/MODxAPI/MODx.php index 3d5bf6a436..2ed2f9bd65 100644 --- a/assets/lib/MODxAPI/MODx.php +++ b/assets/lib/MODxAPI/MODx.php @@ -836,7 +836,7 @@ final protected function checkVersion($version, $dmi3yy = true) if (version_compare($tmp, $version, '>=')) { $flag = true; if ($dmi3yy) { - $flag = (boolean)preg_match('/^' . $tmp . '(.*)\-d/', $currentVer); + $flag = $flag || (boolean)preg_match('/^' . $tmp . '(.*)\-d/', $currentVer); } } From 841db700df0137608b809f70369809081c69e7ba Mon Sep 17 00:00:00 2001 From: Pathologic Date: Sat, 14 Jul 2018 17:49:10 +0300 Subject: [PATCH 055/241] fix #552 --- manager/processors/cache_sync.class.processor.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/manager/processors/cache_sync.class.processor.php b/manager/processors/cache_sync.class.processor.php index 678ada027a..2a4c73946a 100755 --- a/manager/processors/cache_sync.class.processor.php +++ b/manager/processors/cache_sync.class.processor.php @@ -313,9 +313,6 @@ public function buildCache($modx) $rs = $modx->db->select('*', '[+prefix+]site_htmlsnippets'); $content .= '$c=&$this->chunkCache;'; while ($doc = $modx->db->getRow($rs)) { - if ($modx->config['minifyphp_incache']) { - $doc['snippet'] = $this->php_strip_whitespace($doc['snippet']); - } $content .= '$c[\'' . $doc['name'] . '\']=\'' . ($doc['disabled'] ? '' : $this->escapeSingleQuotes($doc['snippet'])) . '\';'; } From 196e815beff1a1795d9c31e49191a6fcd9bbf59f Mon Sep 17 00:00:00 2001 From: Mr B Date: Sun, 15 Jul 2018 15:39:38 +0100 Subject: [PATCH 056/241] [F] Fix saving web users role back api as those commits are still only in dev. Keep fix for saving web user permissions --- .../processors/save_web_user.processor.php | 198 ++++++++++++++---- 1 file changed, 158 insertions(+), 40 deletions(-) diff --git a/manager/processors/save_web_user.processor.php b/manager/processors/save_web_user.processor.php index 66c3d31df4..a6121f346a 100755 --- a/manager/processors/save_web_user.processor.php +++ b/manager/processors/save_web_user.processor.php @@ -6,14 +6,14 @@ $modx->webAlertAndQuit($_lang["error_no_privileges"]); } -$tbl_web_users = $modx->getDatabase()->getFullTableName('web_users'); -$tbl_web_user_attributes = $modx->getDatabase()->getFullTableName('web_user_attributes'); -$tbl_web_groups = $modx->getDatabase()->getFullTableName('web_groups'); +$tbl_web_users = $modx->getFullTableName('web_users'); +$tbl_web_user_attributes = $modx->getFullTableName('web_user_attributes'); +$tbl_web_groups = $modx->getFullTableName('web_groups'); $input = $_POST; foreach($input as $k => $v) { if($k !== 'comment' && $k !=='user_groups') { - $v = $modx->getPhpCompat()->htmlspecialchars($v, ENT_NOQUOTES); + $v = sanitize($v); } $input[$k] = $v; } @@ -21,14 +21,14 @@ $id = (int)$input['id']; $oldusername = $input['oldusername']; $newusername = !empty ($input['newusername']) ? trim($input['newusername']) : "New User"; -$esc_newusername = $modx->getDatabase()->escape($newusername); +$esc_newusername = $modx->db->escape($newusername); $fullname = $input['fullname']; $genpassword = $input['newpassword']; $passwordgenmethod = $input['passwordgenmethod']; $passwordnotifymethod = $input['passwordnotifymethod']; $specifiedpassword = $input['specifiedpassword']; $email = trim($input['email']); -$esc_email = $modx->getDatabase()->escape($email); +$esc_email = $modx->db->escape($email); $oldemail = $input['oldemail']; $phone = $input['phone']; $mobilephone = $input['mobilephone']; @@ -51,45 +51,45 @@ // verify password if($passwordgenmethod == "spec" && $input['specifiedpassword'] != $input['confirmpassword']) { - webAlertAndQuit("Password typed is mismatched", 88); + webAlertAndQuit("Password typed is mismatched"); } // verify email if($email == '' || !preg_match("/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,24}$/i", $email)) { - webAlertAndQuit("E-mail address doesn't seem to be valid!", 88); + webAlertAndQuit("E-mail address doesn't seem to be valid!"); } switch($input['mode']) { case '87' : // new user // check if this user name already exist - $rs = $modx->getDatabase()->select('count(id)', $tbl_web_users, "username='{$esc_newusername}'"); - $limit = $modx->getDatabase()->getValue($rs); + $rs = $modx->db->select('count(id)', $tbl_web_users, "username='{$esc_newusername}'"); + $limit = $modx->db->getValue($rs); if($limit > 0) { - webAlertAndQuit("User name is already in use!", 88); + webAlertAndQuit("User name is already in use!"); } // check if the email address already exist if ($modx->config['allow_multiple_emails'] != 1) { - $rs = $modx->getDatabase()->select('count(id)', $tbl_web_user_attributes, "email='{$esc_email}' AND id!='{$id}'"); - $limit = $modx->getDatabase()->getValue($rs); + $rs = $modx->db->select('count(id)', $tbl_web_user_attributes, "email='{$esc_email}' AND id!='{$id}'"); + $limit = $modx->db->getValue($rs); if($limit > 0) { - webAlertAndQuit("Email is already in use!", 88); + webAlertAndQuit("Email is already in use!"); } } // generate a new password for this user if($specifiedpassword != "" && $passwordgenmethod == "spec") { if(strlen($specifiedpassword) < 6) { - webAlertAndQuit("Password is too short!", 88); + webAlertAndQuit("Password is too short!"); } else { $newpassword = $specifiedpassword; } } elseif($specifiedpassword == "" && $passwordgenmethod == "spec") { - webAlertAndQuit("You didn't specify a password for this user!", 88); + webAlertAndQuit("You didn't specify a password for this user!"); } elseif($passwordgenmethod == 'g') { $newpassword = generate_password(8); } else { - webAlertAndQuit("No password generation method specified!", 88); + webAlertAndQuit("No password generation method specified!"); } // invoke OnBeforeWUsrFormSave event @@ -101,14 +101,14 @@ $field = array(); $field['username'] = $esc_newusername; $field['password'] = md5($newpassword); - $internalKey = $modx->getDatabase()->insert($field, $tbl_web_users); + $internalKey = $modx->db->insert($field, $tbl_web_users); $field = compact('internalKey', 'fullname', 'role', 'email', 'phone', 'mobilephone', 'fax', 'zip', 'street', 'city', 'state', 'country', 'gender', 'dob', 'photo', 'comment', 'blocked', 'blockeduntil', 'blockedafter'); - $field = $modx->getDatabase()->escape($field); - $modx->getDatabase()->insert($field, $tbl_web_user_attributes); + $field = $modx->db->escape($field); + $modx->db->insert($field, $tbl_web_user_attributes); // Save User Settings - saveWebUserSettings($internalKey); + saveUserSettings($internalKey); // Set the item name for logger $_SESSION['itemname'] = $newusername; @@ -122,7 +122,7 @@ $f = array(); $f['webgroup'] = (int)$user_groups[$i]; $f['webuser'] = $internalKey; - $modx->getDatabase()->insert($f, $tbl_web_groups); + $modx->db->insert($f, $tbl_web_groups); } } } @@ -145,7 +145,7 @@ )); if($passwordnotifymethod == 'e') { - sendMailMessageForUser($email, $newusername, $newpassword, $fullname, $websignupemail_message, $site_url); + sendMailMessage($email, $newusername, $newpassword, $fullname); if($input['stay'] != '') { $a = ($input['stay'] == '2') ? "88&id={$internalKey}" : "87"; $header = "Location: index.php?a={$a}&r=2&stay=" . $input['stay']; @@ -193,35 +193,35 @@ if($genpassword == 1) { if($specifiedpassword != "" && $passwordgenmethod == "spec") { if(strlen($specifiedpassword) < 6) { - webAlertAndQuit("Password is too short!", 88); + webAlertAndQuit("Password is too short!"); } else { $newpassword = $specifiedpassword; } } elseif($specifiedpassword == "" && $passwordgenmethod == "spec") { - webAlertAndQuit("You didn't specify a password for this user!", 88); + webAlertAndQuit("You didn't specify a password for this user!"); } elseif($passwordgenmethod == 'g') { $newpassword = generate_password(8); } else { - webAlertAndQuit("No password generation method specified!", 88); + webAlertAndQuit("No password generation method specified!"); } } if($passwordnotifymethod == 'e') { - sendMailMessageForUser($email, $newusername, $newpassword, $fullname, $websignupemail_message, $site_url); + sendMailMessage($email, $newusername, $newpassword, $fullname); } // check if the username already exist - $rs = $modx->getDatabase()->select('count(id)', $tbl_web_users, "username='{$esc_newusername}' AND id!='{$id}'"); - $limit = $modx->getDatabase()->getValue($rs); + $rs = $modx->db->select('count(id)', $tbl_web_users, "username='{$esc_newusername}' AND id!='{$id}'"); + $limit = $modx->db->getValue($rs); if($limit > 0) { - webAlertAndQuit("User name is already in use!", 88); + webAlertAndQuit("User name is already in use!"); } // check if the email address already exists if ($modx->config['allow_multiple_emails'] != 1) { - $rs = $modx->getDatabase()->select('count(internalKey)', $tbl_web_user_attributes, "email='{$esc_email}' AND internalKey!='{$id}'"); - $limit = $modx->getDatabase()->getValue($rs); + $rs = $modx->db->select('count(internalKey)', $tbl_web_user_attributes, "email='{$esc_email}' AND internalKey!='{$id}'"); + $limit = $modx->db->getValue($rs); if($limit > 0) { - webAlertAndQuit("Email is already in use!", 88); + webAlertAndQuit("Email is already in use!"); } } @@ -237,13 +237,13 @@ if($genpassword == 1) { $field['password'] = md5($newpassword); } - $modx->getDatabase()->update($field, $tbl_web_users, "id='{$id}'"); + $modx->db->update($field, $tbl_web_users, "id='{$id}'"); $field = compact('fullname', 'role', 'email', 'phone', 'mobilephone', 'fax', 'zip', 'street', 'city', 'state', 'country', 'gender', 'dob', 'photo', 'comment', 'failedlogincount', 'blocked', 'blockeduntil', 'blockedafter'); - $field = $modx->getDatabase()->escape($field); - $modx->getDatabase()->update($field, $tbl_web_user_attributes, "internalKey='{$id}'"); + $field = $modx->db->escape($field); + $modx->db->update($field, $tbl_web_user_attributes, "internalKey='{$id}'"); // Save User Settings - saveWebUserSettings($id); + saveUserSettings($id); // Set the item name for logger $_SESSION['itemname'] = $newusername; @@ -253,13 +253,13 @@ // first, check that up_perms are switched on! if($use_udperms == 1) { // as this is an existing user, delete his/ her entries in the groups before saving the new groups - $modx->getDatabase()->delete($tbl_web_groups, "webuser='{$id}'"); + $modx->db->delete($tbl_web_groups, "webuser='{$id}'"); if(!empty($user_groups)) { for($i = 0; $i < count($user_groups); $i++) { $field = array(); $field['webgroup'] = (int)$user_groups[$i]; $field['webuser'] = $id; - $modx->getDatabase()->insert($field, $tbl_web_groups); + $modx->db->insert($field, $tbl_web_groups); } } } @@ -335,5 +335,123 @@ } break; default : - webAlertAndQuit("No operation set in request.", 88); + webAlertAndQuit("No operation set in request."); +} + +/** + * in case any plugins include a quoted_printable function + * + * @param string $string + * @return string + */ +function save_user_quoted_printable($string) { + $crlf = "\n"; + $string = preg_replace('!(\r\n|\r|\n)!', $crlf, $string) . $crlf; + $f[] = '/([\000-\010\013\014\016-\037\075\177-\377])/e'; + $r[] = "'=' . sprintf('%02X', ord('\\1'))"; + $f[] = '/([\011\040])' . $crlf . '/e'; + $r[] = "'=' . sprintf('%02X', ord('\\1')) . '" . $crlf . "'"; + $string = preg_replace($f, $r, $string); + return trim(wordwrap($string, 70, ' =' . $crlf)); +} + +/** + * Send an email to the user + * + * @param string $email + * @param string $uid + * @param string $pwd + * @param string $ufn + */ +function sendMailMessage($email, $uid, $pwd, $ufn) { + $modx = evolutionCMS(); global $_lang, $websignupemail_message; + global $emailsubject, $emailsender; + global $site_name, $site_url; + $message = sprintf($websignupemail_message, $uid, $pwd); // use old method + // replace placeholders + $message = str_replace("[+uid+]", $uid, $message); + $message = str_replace("[+pwd+]", $pwd, $message); + $message = str_replace("[+ufn+]", $ufn, $message); + $message = str_replace("[+sname+]", $site_name, $message); + $message = str_replace("[+saddr+]", $emailsender, $message); + $message = str_replace("[+semail+]", $emailsender, $message); + $message = str_replace("[+surl+]", $site_url, $message); + + $param = array(); + $param['from'] = "{$site_name}<{$emailsender}>"; + $param['subject'] = $emailsubject; + $param['body'] = $message; + $param['to'] = $email; + $param['type'] = 'text'; + $rs = $modx->sendmail($param); + if(!$rs) { + $modx->manager->saveFormValues(); + $modx->messageQuit("{$email} - {$_lang['error_sending_email']}"); + } +} + +// Save User Settings +function saveUserSettings($id) { + $modx = evolutionCMS(); + $tbl_web_user_settings = $modx->getFullTableName('web_user_settings'); + + $settings = array( + "login_home", + "allowed_ip", + "allowed_days" + ); + + $modx->db->delete($tbl_web_user_settings, "webuser='{$id}'"); + + foreach($settings as $n) { + $vl = $_POST[$n]; + if(is_array($vl)) { + $vl = implode(",", $vl); + } + if($vl != '') { + $f = array(); + $f['webuser'] = $id; + $f['setting_name'] = $n; + $f['setting_value'] = $vl; + $f = $modx->db->escape($f); + $modx->db->insert($f, $tbl_web_user_settings); + } + } +} + +// Web alert - sends an alert to web browser +function webAlertAndQuit($msg) { + global $id, $modx; + $mode = $_POST['mode']; + $modx->manager->saveFormValues($mode); + $modx->webAlertAndQuit($msg, "index.php?a={$mode}" . ($mode == '88' ? "&id={$id}" : '')); +} + +// Generate password +function generate_password($length = 10) { + $allowable_characters = "abcdefghjkmnpqrstuvxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"; + $ps_len = strlen($allowable_characters); + mt_srand((double) microtime() * 1000000); + $pass = ""; + for($i = 0; $i < $length; $i++) { + $pass .= $allowable_characters[mt_rand(0, $ps_len - 1)]; + } + return $pass; +} + +function sanitize($str = '', $safecount = 0) { + $modx = evolutionCMS(); + $safecount++; + if(1000 < $safecount) { + exit("error too many loops '{$safecount}'"); + } + if(is_array($str)) { + foreach($str as $i => $v) { + $str[$i] = sanitize($v, $safecount); + } + } else { + // $str = strip_tags($str); // LEAVE < and > intact + $str = htmlspecialchars($str, ENT_NOQUOTES, $modx->config['modx_charset']); + } + return $str; } From 3bed43eb91f3b278059f21a3edbc0abb7b9455c4 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Tue, 17 Jul 2018 23:45:55 +0300 Subject: [PATCH 057/241] fix text color in darkness mode --- manager/media/style/default/css/custom.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/manager/media/style/default/css/custom.css b/manager/media/style/default/css/custom.css index c18fc4be7c..92280cda2c 100755 --- a/manager/media/style/default/css/custom.css +++ b/manager/media/style/default/css/custom.css @@ -377,8 +377,7 @@ padding: .25rem .5rem; background: none; border: none !important; color: inherit .darkness .resourceTable ul.elements > li { border-left: 3px solid transparent; border-bottom: 1px solid #303338; } .darkness .resourceTable ul.elements > li:hover { background-color: #202329; } .darkness .elements_descr { color: #aaa; } -.darkness ul.elements_buttonbar li a { color: inherit; } -.darkness .msg-container { color: inherit } +.darkness ul.elements_buttonbar li a, .darkness .msg-container { color: inherit; } .darkness .evo-tooltip, .darkness .custom-tip { background-color: #343942; color: #eee; box-shadow: 0 0.5rem 3rem rgba(0, 0, 0, 0.4); } .darkness div#section-body-categories div.uncategorized_elements, .darkness div#section-body-categories div.drop { border: 1px solid #414449; background-color: #202329; } .darkness div#section-body-categories div.uncategorized_elements h2, .darkness div#section-body-categories div.drop h2 { color: #1976d2; border-bottom: 1px solid #1976d2; } @@ -387,7 +386,7 @@ padding: .25rem .5rem; background: none; border: none !important; color: inherit .darkness #helpPane ul + h1 { margin-top: 1rem; } .darkness #helpPane ul { margin: 0; } .darkness #helpPane .tab-page > img:first-of-type { content: url("../images/misc/logo-navbar-white.png"); } -.darkness #helpPane pre { border: 1px solid #414449; padding: 1em; color: #aaa; } +.darkness pre, .darkness #helpPane pre { border: 1px solid #414449; padding: 1em; color: #aaa; } .darkness code { background-color: #202329; border: 1px solid #414449; } .darkness .h, .darkness .e, .darkness .v { background-color: #202329; border-color: #414449; color: #eee; } .darkness .v { background-color: #282c34; } From 61cd0c0ebf4b2a64ae32fd717b2d2d5a4bde5d15 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Wed, 18 Jul 2018 00:13:00 +0300 Subject: [PATCH 058/241] fix #763 --- manager/media/style/default/css/custom.css | 1 - 1 file changed, 1 deletion(-) diff --git a/manager/media/style/default/css/custom.css b/manager/media/style/default/css/custom.css index 92280cda2c..570001399e 100755 --- a/manager/media/style/default/css/custom.css +++ b/manager/media/style/default/css/custom.css @@ -367,7 +367,6 @@ padding: .25rem .5rem; background: none; border: none !important; color: inherit .darkness .alert-warning { background-color: #6c591d; border-color: #6c591d; color: #c7bd9e; } .darkness .alert-success { background-color: #3d7544; border-color: #3d7544; color: #c4efc5; } .darkness .loginbox, .darkness .loginbox form { background-color: #202329 } -.darkness .loginbox .logo img { content: url("../images/misc/logo-navbar-white.png"); } .darkness #mainloader { background-color: transparent !important; } .darkness #FilesTable { border-bottom: 1px solid #202329 } .darkness #mce-modal-block { background-color: #000; } From 3130df11cf964be31b5e91ba69437f53e733e00e Mon Sep 17 00:00:00 2001 From: Pathologic Date: Wed, 18 Jul 2018 23:58:47 +0300 Subject: [PATCH 059/241] fix memory leak --- assets/snippets/DocLister/lib/DLphx.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/snippets/DocLister/lib/DLphx.class.php b/assets/snippets/DocLister/lib/DLphx.class.php index cc9099dcfb..ba725138fe 100644 --- a/assets/snippets/DocLister/lib/DLphx.class.php +++ b/assets/snippets/DocLister/lib/DLphx.class.php @@ -180,6 +180,7 @@ public function ParseValues($template = '') for ($i = 0; $i < $count; $i++) { $input = $matches[2][$i]; $modifiers = $matches[3][$i]; + if(empty($modifiers)) continue; $var_search[] = $matches[0][$i]; switch ($matches[1][$i]) { // Document / Template Variable eXtended From 4f762168ca5dba6aebd32c147312f09509f16f79 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 19 Jul 2018 12:24:38 +0100 Subject: [PATCH 060/241] [ --- manager/includes/lang/english.inc.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index 1dbca377a3..fb31626ca3 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -94,7 +94,7 @@ $_lang["cfg_manager_path"] = 'MODX_MANAGER_PATH'; $_lang["cfg_manager_url"] = 'MODX_MANAGER_URL'; $_lang["cfg_site_url"] = 'MODX_SITE_URL'; -$_lang["change_name"] = 'Change name'; +$_lang["change_name"] = 'Change username'; $_lang["change_password"] = 'Change Password'; $_lang["change_password_confirm"] = 'Confirm password'; $_lang["change_password_message"] = 'Please enter your new password, and then enter it again to confirm. Your password needs to be at least 6 characters long.'; @@ -176,7 +176,7 @@ $_lang["confirm_duplicate_record"] = 'Are you sure you want to duplicate this record?'; $_lang["confirm_empty_trash"] = 'This will permanently remove ALL deleted Resources?\n\nProceed?'; $_lang["confirm_load_depends"] = 'Are you sure you want to load the Manage Dependencies screen without saving your modifications?'; -$_lang["confirm_name_change"] = 'Changing the user name can affect other applications that are linked to the Content Manager.\n\nAre you sure you want to change this user name?'; +$_lang["confirm_name_change"] = 'Changing the username can affect other applications that are linked to the Content Manager.\n\nAre you sure you want to change this username?'; $_lang["confirm_publish"] = '\n\nPublishing this Resource now will remove any (un)publishing dates that may have been set. If you wish to set or keep publish or unpublish dates, please choose to \'edit\' the Resource instead.\n\nProceed?'; $_lang["confirm_remove_locks"] = 'Users sometimes close their browser while editing Resources, Templates, Snippets or parsers, possibly leaving the item they were editing in locked state. By pressing OK you can remove ALL locks currently in place.\n\nProceed?'; $_lang["confirm_reset_sort_order"] = 'Are you sure you want to reset the \"sort order/index\" of all listed elements to 0 ?'; @@ -596,7 +596,7 @@ $_lang["move_resource_message"] = 'Move a Resource and all its children by selecting a new parent in the Site Tree. If you select a Resource that is not already a Container, it will be changed into one. Please click on the new parent in the Site Tree.'; $_lang["move_resource_new_parent"] = 'Please select a new parent in the Site Tree.'; $_lang["move_resource_title"] = 'Move Resource'; -$_lang["name"] = 'Name'; +$_lang["name"] = 'Username'; $_lang["new_category"] = 'New Category'; $_lang["new_file_permissions_message"] = 'When uploading a new file in the File Manager, the File Manager will attempt to change the file permissions to those entered in this setting. This may not work on some setups, such as IIS, in which case you will need to manually change the permissions.'; $_lang["new_file_permissions_title"] = 'New File Permissions'; @@ -1295,7 +1295,7 @@ $_lang['smtp_auth_title'] = 'SMTP-AUTH'; $_lang['smtp_host_title'] = 'SMTP host'; $_lang['smtp_secure_title'] = 'Encrypted SMTP'; -$_lang['smtp_username_title'] = 'SMTP user name'; +$_lang['smtp_username_title'] = 'SMTP username'; $_lang['smtp_password_title'] = 'SMTP password'; $_lang['smtp_port_title'] = 'SMTP port'; From 83550c437052500b6cdfede9545cd7659f7b3861 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 19 Jul 2018 12:36:44 +0100 Subject: [PATCH 061/241] [I] Add username label --- manager/actions/mutate_web_user.dynamic.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manager/actions/mutate_web_user.dynamic.php b/manager/actions/mutate_web_user.dynamic.php index c070b64b76..cf6e565439 100755 --- a/manager/actions/mutate_web_user.dynamic.php +++ b/manager/actions/mutate_web_user.dynamic.php @@ -226,7 +226,9 @@ function showHide(what, onoff) { - "> htmlspecialchars(!empty($usernamedata['oldusername']) ? $usernamedata['oldusername'] : $usernamedata['username']); ?> - + : +   + "> htmlspecialchars(!empty($usernamedata['oldusername']) ? $usernamedata['oldusername'] : $usernamedata['username']); ?> - From 04863cd88d7b07843f1be745673ac8b2858eb278 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 19 Jul 2018 12:39:20 +0100 Subject: [PATCH 062/241] Update mutate_user.dynamic.php --- manager/actions/mutate_user.dynamic.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manager/actions/mutate_user.dynamic.php b/manager/actions/mutate_user.dynamic.php index cd01ac1009..f029af2e70 100755 --- a/manager/actions/mutate_user.dynamic.php +++ b/manager/actions/mutate_user.dynamic.php @@ -240,7 +240,9 @@ function showHide(what, onoff) { - "> htmlspecialchars(!empty($usernamedata['oldusername']) ? $usernamedata['oldusername'] : $usernamedata['username']); ?> - + : +   + "> htmlspecialchars(!empty($usernamedata['oldusername']) ? $usernamedata['oldusername'] : $usernamedata['username']); ?> - From 1d0ab7a4e088f12cc6c0cabbdfe9b43372ac8e7a Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 19 Jul 2018 17:55:52 +0100 Subject: [PATCH 063/241] Update english.inc.php --- manager/includes/lang/english.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index fb31626ca3..b7f2d26d65 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -639,11 +639,11 @@ $_lang["online"] = 'Online'; $_lang["onlineusers_action"] = 'Action'; $_lang["onlineusers_actionid"] = 'Action-ID'; -$_lang["onlineusers_ipaddress"] = 'User\'s IP address'; +$_lang["onlineusers_ipaddress"] = 'IP address'; $_lang["onlineusers_lasthit"] = 'Last hit'; $_lang["onlineusers_message"] = 'This list shows all users active within the last 20 minutes (current time is '; $_lang["onlineusers_title"] = 'Online users'; -$_lang["onlineusers_user"] = 'User'; +$_lang["onlineusers_user"] = 'Username'; $_lang["onlineusers_userid"] = 'User\'s ID'; $_lang["optimize_table"] = 'Click here to optimize this table'; $_lang["page_data_alias"] = 'Alias'; From a0c7f264cfb635e30cef82e4fe86ce82660b78ec Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Sat, 21 Jul 2018 13:13:06 +0300 Subject: [PATCH 064/241] fix for work with mysql 8.0 --- manager/actions/access_permissions.dynamic.php | 2 +- manager/actions/mutate_content.dynamic.php | 8 ++++---- manager/actions/web_access_permissions.dynamic.php | 4 ++-- manager/processors/save_content.processor.php | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manager/actions/access_permissions.dynamic.php b/manager/actions/access_permissions.dynamic.php index 0450f6ad9a..6ddb4ac389 100755 --- a/manager/actions/access_permissions.dynamic.php +++ b/manager/actions/access_permissions.dynamic.php @@ -97,7 +97,7 @@ function deletegroup(groupid, type) { db->select('groupnames.*, users.id AS user_id, users.username user_name', $tbl_membergroup_names . ' AS groupnames - LEFT JOIN ' . $tbl_member_groups . ' AS groups ON groups.user_group = groupnames.id + LEFT JOIN ' . $tbl_member_groups . ' AS groups_member ON groups_member.user_group = groupnames.id LEFT JOIN ' . $tbl_manager_users . ' AS users ON users.id = groups.member', '', 'groupnames.name, user_name'); if($modx->db->getRecordCount($rs) < 1) { ?> diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 20a170b0f4..095e76cd20 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -926,7 +926,7 @@ function SetUrl(url, width, height, alt) { } } - $field = "DISTINCT tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; + $field = "DISTINCT tv.*, cat.id, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; $vs = array( $tbl_site_tmplvars, $tbl_site_tmplvar_templates, @@ -948,7 +948,7 @@ function SetUrl(url, width, height, alt) { $field .= ', IFNULL(tv.category,0) as category_id, IFNULL(cat.category,"' . $_lang['no_category'] . '") AS category, IFNULL(cat.rank,0) AS category_rank'; $from .= ' LEFT JOIN ' . $tbl_categories . ' AS cat ON cat.id=tv.category'; - $sort = 'cat.rank,cat.id,' . $sort; + $sort = 'category_rank,cat.id,' . $sort; } $where = vsprintf("tvtpl.templateid='%s' AND (1='%s' OR ISNULL(tva.documentgroup) %s)", $vs); $rs = $modx->db->select($field, $from, $where, $sort); @@ -1384,8 +1384,8 @@ function SetUrl(url, width, height, alt) { $tbl_document_groups, $documentId ); - $from = vsprintf("%s AS dgn LEFT JOIN %s AS groups ON groups.document_group=dgn.id AND groups.document='%s'", $vs); - $rs = $modx->db->select('dgn.*, groups.id AS link_id', $from, '', 'name'); + $from = vsprintf("%s AS dgn LEFT JOIN %s AS groups_resource ON groups_resource.document_group=dgn.id AND groups_resource.document='%s'", $vs); + $rs = $modx->db->select('dgn.*, groups_resource.id AS link_id', $from, '', 'name'); } else { // Just load up the names, we're starting clean $rs = $modx->db->select('*, NULL AS link_id', $tbl_document_group_names, '', 'name'); diff --git a/manager/actions/web_access_permissions.dynamic.php b/manager/actions/web_access_permissions.dynamic.php index 38e71fd698..cf4a5b6789 100755 --- a/manager/actions/web_access_permissions.dynamic.php +++ b/manager/actions/web_access_permissions.dynamic.php @@ -89,8 +89,8 @@ function deletegroup(groupid, type) { db->select('groupnames.*, users.id AS user_id, users.username user_name ', $modx->getFullTableName('webgroup_names') . " AS groupnames - LEFT JOIN " . $modx->getFullTableName('web_groups') . " AS groups ON groups.webgroup = groupnames.id - LEFT JOIN " . $modx->getFullTableName('web_users') . " AS users ON users.id = groups.webuser", '', 'groupnames.name, user_name'); + LEFT JOIN " . $modx->getFullTableName('web_groups') . " AS groups_resource ON groups_resource.webgroup = groupnames.id + LEFT JOIN " . $modx->getFullTableName('web_users') . " AS users ON users.id = groups_resource.webuser", '', 'groupnames.name, user_name'); if($modx->db->getRecordCount($rs) < 1) { ?>

        diff --git a/manager/processors/save_content.processor.php b/manager/processors/save_content.processor.php index 749b34c2c4..f80d27cb44 100755 --- a/manager/processors/save_content.processor.php +++ b/manager/processors/save_content.processor.php @@ -190,7 +190,7 @@ } $rs = $modx->db->select( - "DISTINCT tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value", + "DISTINCT tv.*, cat.id, IF(tvc.value!='',tvc.value,tv.default_text) as value", "{$tbl_site_tmplvars} AS tv INNER JOIN {$tbl_site_tmplvar_templates} AS tvtpl ON tvtpl.tmplvarid = tv.id LEFT JOIN {$tbl_site_tmplvar_contentvalues} AS tvc ON tvc.tmplvarid=tv.id AND tvc.contentid = '{$id}' @@ -591,10 +591,10 @@ $isManager = $modx->hasPermission('access_permissions'); $isWeb = $modx->hasPermission('web_access_permissions'); $rs = $modx->db->select( - 'groups.id, groups.document_group', - "{$tbl_document_groups} AS groups - LEFT JOIN {$tbl_documentgroup_names} AS dgn ON dgn.id = groups.document_group", - "((1=".(int)$isManager." AND dgn.private_memgroup) OR (1=".(int)$isWeb." AND dgn.private_webgroup)) AND groups.document = '{$id}'" + 'groups_document.id, groups.document_group', + "{$tbl_document_groups} AS groups_document + LEFT JOIN {$tbl_documentgroup_names} AS dgn ON dgn.id = groups_document.document_group", + "((1=".(int)$isManager." AND dgn.private_memgroup) OR (1=".(int)$isWeb." AND dgn.private_webgroup)) AND groups_document.document = '{$id}'" ); $old_groups = array(); while ($row = $modx->db->getRow($rs)) $old_groups[$row['document_group']] = $row['id']; From 747985a47f9d3bac0d4ad87c09a80d3d39b73c84 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Sun, 22 Jul 2018 01:33:24 +0300 Subject: [PATCH 065/241] fix #368 --- assets/plugins/filesource/plugin.filesource.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/plugins/filesource/plugin.filesource.php b/assets/plugins/filesource/plugin.filesource.php index abd94a91c6..c920b05885 100755 --- a/assets/plugins/filesource/plugin.filesource.php +++ b/assets/plugins/filesource/plugin.filesource.php @@ -71,7 +71,10 @@ { case 'OnPluginFormPrerender': case 'OnSnipFormPrerender': - global $content; + global $content, $_lang; + if (preg_match('/\s' . $_lang['duplicated_el_suffix'] . '\s?\d*$/', $content['name'])) { + $content['file_binding'] = ''; + } if(substr(trim($content[$vals]),0,$count) == $include.' MODX_BASE_PATH.\'assets/'.$elm_name.'/') { $content['file_binding'] = str_replace(array(';','\''),'',trim(substr(trim($content[$vals]),$count,250))); From db41ba731e561902131cab9994d771910f594fe6 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Mon, 23 Jul 2018 09:56:04 +0300 Subject: [PATCH 066/241] fix #767 --- install/setup.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/setup.sql b/install/setup.sql index 7c073c17fc..b19bed32c8 100755 --- a/install/setup.sql +++ b/install/setup.sql @@ -13,7 +13,7 @@ CREATE TABLE `{PREFIX}active_users` ( `lasthit` int(20) NOT NULL default '0', `action` varchar(10) NOT NULL default '', `id` int(10) default NULL, - PRIMARY KEY (`sid`) + PRIMARY KEY (`sid`, `username`) ) ENGINE=MyISAM COMMENT='Contains data about last user action.'; DROP TABLE IF EXISTS `{PREFIX}active_user_locks`; From c8080596b4dca03f5bd36bdf7c10594ef69e0892 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Mon, 23 Jul 2018 09:58:00 +0300 Subject: [PATCH 067/241] update FormLister to 1.7.21 --- .../FormLister/core/FormLister.abstract.php | 3 + .../FormLister/core/controller/Form.php | 82 +++++++++---------- assets/snippets/FormLister/lib/Validator.php | 1 - .../snippets/FormLister/plugin.userHelper.php | 6 ++ install/assets/plugins/userHelper.tpl | 4 +- install/assets/snippets/FormLister.tpl | 2 +- 6 files changed, 50 insertions(+), 48 deletions(-) diff --git a/assets/snippets/FormLister/core/FormLister.abstract.php b/assets/snippets/FormLister/core/FormLister.abstract.php index 8d491bbc4a..b8d0428ef1 100644 --- a/assets/snippets/FormLister/core/FormLister.abstract.php +++ b/assets/snippets/FormLister/core/FormLister.abstract.php @@ -1101,6 +1101,9 @@ public function sendRedirect($url, $header = 'HTTP/1.1 307 Temporary Redirect') { if (!$this->getCFGDef('api', 0)) { $header = $header ? $header : 'HTTP/1.1 307 Temporary Redirect'; + if (!is_null($this->debug)) { + $this->debug->saveLog(); + } $this->modx->sendRedirect($url, 0, 'REDIRECT_HEADER', $header); } } diff --git a/assets/snippets/FormLister/core/controller/Form.php b/assets/snippets/FormLister/core/controller/Form.php index ab296be2bb..d0c1bcd459 100644 --- a/assets/snippets/FormLister/core/controller/Form.php +++ b/assets/snippets/FormLister/core/controller/Form.php @@ -175,7 +175,7 @@ public function validateForm() */ public function renderReport($tplParam = 'reportTpl') { - $tpl = $this->getCFGDef($tplParam); + $tpl = $this->getCFGDef($tplParam, 'reportTpl'); if (empty($tpl) && $tplParam == 'reportTpl') { $tpl = '@CODE:'; foreach ($this->getFormData('fields') as $key => $value) { @@ -306,27 +306,24 @@ public function sendReport() public function sendAutosender() { $to = $this->getCFGDef('autosender'); - if (empty($to)) { - $out = true; - } else { - $config = $this->getMailSendConfig($to, 'autosenderFromName', 'autoSubject'); - $asConfig = $this->config->loadArray($this->getCFGDef('autoMailConfig')); - if (!empty($asConfig) && is_array($asConfig)) { - $asConfig = $this->parseMailerParams($asConfig); - $config = array_merge($config, $asConfig); - } - $mailer = new Mailer($this->modx, $config); - $report = $this->renderReport('automessageTpl'); - $out = $mailer->send($report); - $this->log( - 'Mail autosender report', - array( - 'report' => $report, - 'mailer_config' => $mailer->config, - 'result' => $out - ) - ); + + $config = $this->getMailSendConfig($to, 'autosenderFromName', 'autoSubject'); + $asConfig = $this->config->loadArray($this->getCFGDef('autoMailConfig')); + if (!empty($asConfig) && is_array($asConfig)) { + $asConfig = $this->parseMailerParams($asConfig); + $config = array_merge($config, $asConfig); } + $mailer = new Mailer($this->modx, $config); + $report = $this->renderReport('automessageTpl'); + $out = empty($to) ? true : $mailer->send($report); + $this->log( + 'Mail autosender report', + array( + 'report' => $report, + 'mailer_config' => $mailer->config, + 'result' => $out + ) + ); return $out; } @@ -338,30 +335,27 @@ public function sendAutosender() public function sendCCSender() { $to = $this->getField($this->getCFGDef('ccSenderField', 'email')); - if (empty($to)) { - $out = true; - } else { - if ($this->getCFGDef('ccSender', 0)) { - $config = $this->getMailSendConfig($to, 'ccSenderFromName', 'ccSubject'); - $ccConfig = $this->config->loadArray($this->getCFGDef('ccMailConfig')); - if (!empty($ccConfig) && is_array($ccConfig)) { - $ccConfig = $this->parseMailerParams($ccConfig); - $config = array_merge($config, $ccConfig); - } - $mailer = new Mailer($this->modx, $config); - $report = $this->renderReport('ccSenderTpl'); - $out = $mailer->send($report); - $this->log( - 'Mail CC report', - array( - 'report' => $report, - 'mailer_config' => $mailer->config, - 'result' => $out - ) - ); - } else { - $out = true; + + if ($this->getCFGDef('ccSender', 0)) { + $config = $this->getMailSendConfig($to, 'ccSenderFromName', 'ccSubject'); + $ccConfig = $this->config->loadArray($this->getCFGDef('ccMailConfig')); + if (!empty($ccConfig) && is_array($ccConfig)) { + $ccConfig = $this->parseMailerParams($ccConfig); + $config = array_merge($config, $ccConfig); } + $mailer = new Mailer($this->modx, $config); + $report = $this->renderReport('ccSenderTpl'); + $out = empty($to) ? true : $mailer->send($report); + $this->log( + 'Mail CC report', + array( + 'report' => $report, + 'mailer_config' => $mailer->config, + 'result' => $out + ) + ); + } else { + $out = true; } return $out; diff --git a/assets/snippets/FormLister/lib/Validator.php b/assets/snippets/FormLister/lib/Validator.php index ff9630096a..6103622c55 100644 --- a/assets/snippets/FormLister/lib/Validator.php +++ b/assets/snippets/FormLister/lib/Validator.php @@ -113,7 +113,6 @@ public static function alpha($value) */ public static function numeric($value) { - //var_dump($value); return (bool) is_scalar($value) && preg_match('#^[0-9]*$#',$value); } diff --git a/assets/snippets/FormLister/plugin.userHelper.php b/assets/snippets/FormLister/plugin.userHelper.php index 3b646abd79..c893be8ff7 100644 --- a/assets/snippets/FormLister/plugin.userHelper.php +++ b/assets/snippets/FormLister/plugin.userHelper.php @@ -38,6 +38,12 @@ if ($e->name == 'OnWebPageInit' || $e->name == 'OnPageNotFound') { $user = new \modUsers($modx); if ($uid = $modx->getLoginUserID('web')) { + if ($trackWebUserActivity == 'Yes') { + $sid = $modx->sid = session_id(); + $pageId = (int)$modx->documentIdentifier; + $q = $modx->db->query("REPLACE INTO {$modx->getFullTableName('active_users')} (`sid`, `internalKey`, `username`, `lasthit`, `action`, `id`) values('{$sid}',-{$uid}, '{$_SESSION['webShortname']}', '{$modx->time}', 998, {$pageId})"); + $modx->updateValidatedUserSession(); + } if (isset($_REQUEST[$logoutKey])) { $user->logOut($cookieName, true); $page = $modx->config['site_url'] . (isset($_REQUEST['q']) ? $_REQUEST['q'] : ''); diff --git a/install/assets/plugins/userHelper.tpl b/install/assets/plugins/userHelper.tpl index e3f2e6fb52..80ef704c0d 100644 --- a/install/assets/plugins/userHelper.tpl +++ b/install/assets/plugins/userHelper.tpl @@ -5,8 +5,8 @@ * addition to FormLister * * @category plugin - * @version 1.7.19 - * @internal @properties &logoutKey=Request key;text;logout &cookieName=Cookie Name;text;WebLoginPE &cookieLifetime=Cookie Lifetime, seconds;text;157680000 &maxFails=Max failed logins;text;3 &blockTime=Block for, seconds;text;3600 + * @version 1.7.21 + * @internal @properties &logoutKey=Request key;text;logout &cookieName=Cookie Name;text;WebLoginPE &cookieLifetime=Cookie Lifetime, seconds;text;157680000 &maxFails=Max failed logins;text;3 &blockTime=Block for, seconds;text;3600 &trackWebUserActivity=Track web user activity;list;No,Yes;No * @internal @events OnWebAuthentication,OnWebPageInit,OnPageNotFound,OnWebLogin * @internal @modx_category Content * @internal @disabled 1 diff --git a/install/assets/snippets/FormLister.tpl b/install/assets/snippets/FormLister.tpl index b65debf02d..772e8fbabd 100644 --- a/install/assets/snippets/FormLister.tpl +++ b/install/assets/snippets/FormLister.tpl @@ -5,7 +5,7 @@ * Form processor * * @category snippet - * @version 1.7.20 + * @version 1.7.21 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL) * @internal @modx_category Content * @internal @installset base, sample From 26a430eb660066fb3ff9d17631a0672a7de72df3 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Mon, 23 Jul 2018 10:42:23 +0300 Subject: [PATCH 068/241] fix #730 --- assets/modules/store/installer/instprocessor-fast.php | 7 ++++--- assets/modules/store/installer/instprocessor.php | 7 ++++--- install/instprocessor.php | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/assets/modules/store/installer/instprocessor-fast.php b/assets/modules/store/installer/instprocessor-fast.php index 95f1fa23fa..d517dce684 100755 --- a/assets/modules/store/installer/instprocessor-fast.php +++ b/assets/modules/store/installer/instprocessor-fast.php @@ -401,10 +401,11 @@ function parseProperties($propertyString) { if ($ds) { $row = $modx->db->getRow($ds,'assoc'); $id = $row["id"]; - // remove existing events - $modx->db->query('DELETE FROM ' . $dbase . '.`' . $table_prefix . 'site_plugin_events` WHERE pluginid = \'' . $id . '\''); + $_events = implode("','", $events); // add new events - $modx->db->query("INSERT INTO `" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM `" . $table_prefix . "system_eventnames` se WHERE name IN ('" . implode("','", $events) . "')"); + $modx->db->query("INSERT IGNORE INTO `" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM `" . $table_prefix . "system_eventnames` se WHERE name IN ('" . $_events . "')"); + // remove existing events + $modx->db->query("DELETE `pe` FROM `{$table_prefix}site_plugin_events` `pe` LEFT JOIN `{$table_prefix}system_eventnames` `se` ON `pe`.`evtid`=`se`.`id` AND `name` IN ('{$_events}') WHERE ISNULL(`name`) AND `pluginid` = {$id}"); } } } diff --git a/assets/modules/store/installer/instprocessor.php b/assets/modules/store/installer/instprocessor.php index b39b0b3dd0..b0457d8f18 100755 --- a/assets/modules/store/installer/instprocessor.php +++ b/assets/modules/store/installer/instprocessor.php @@ -363,10 +363,11 @@ function parseProperties($propertyString) { if ($ds) { $row = $modx->db->getRow($ds,'assoc'); $id = $row["id"]; - // remove existing events - $modx->db->query("DELETE FROM $dbase.`" . $table_prefix . "site_plugin_events` WHERE pluginid = '$id';"); + $_events = implode("','", $events); // add new events - $modx->db->query("INSERT INTO `" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM `" . $table_prefix . "system_eventnames` se WHERE name IN ('" . implode("','", $events) . "')"); + $modx->db->query("INSERT IGNORE INTO `" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM `" . $table_prefix . "system_eventnames` se WHERE name IN ('" . $_events . "')"); + // remove existing events + $modx->db->query("DELETE `pe` FROM `{$table_prefix}site_plugin_events` `pe` LEFT JOIN `{$table_prefix}system_eventnames` `se` ON `pe`.`evtid`=`se`.`id` AND `name` IN ('{$_events}') WHERE ISNULL(`name`) AND `pluginid` = {$id}"); } } } diff --git a/install/instprocessor.php b/install/instprocessor.php index 349cfe319c..ca03a1712d 100755 --- a/install/instprocessor.php +++ b/install/instprocessor.php @@ -580,10 +580,11 @@ if ($ds) { $row = mysqli_fetch_assoc($ds); $id = $row["id"]; - // remove existing events - mysqli_query($sqlParser->conn, 'DELETE FROM ' . $dbase . '.`' . $table_prefix . 'site_plugin_events` WHERE pluginid = \'' . $id . '\''); + $_events = implode("','", $events); // add new events - mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM $dbase.`" . $table_prefix . "system_eventnames` se WHERE name IN ('" . implode("','", $events) . "')"); + mysqli_query($sqlParser->conn, "INSERT IGNORE INTO $dbase.`" . $table_prefix . "site_plugin_events` (pluginid, evtid) SELECT '$id' as 'pluginid',se.id as 'evtid' FROM $dbase.`" . $table_prefix . "system_eventnames` se WHERE name IN ('{$_events}')"); + // remove absent events + mysqli_query($sqlParser->conn, "DELETE `pe` FROM {$dbase}.`{$table_prefix}site_plugin_events` `pe` LEFT JOIN {$dbase}.`{$table_prefix}system_eventnames` `se` ON `pe`.`evtid`=`se`.`id` AND `name` IN ('{$_events}') WHERE ISNULL(`name`) AND `pluginid` = {$id}"); } } } From a1c3d37ab920538f23e3eb5c9f310ea5eb918b6b Mon Sep 17 00:00:00 2001 From: Pathologic Date: Mon, 23 Jul 2018 11:05:19 +0300 Subject: [PATCH 069/241] fix #769 --- assets/modules/store/installer/instprocessor-fast.php | 3 +-- assets/modules/store/installer/instprocessor.php | 3 +-- install/instprocessor.php | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/assets/modules/store/installer/instprocessor-fast.php b/assets/modules/store/installer/instprocessor-fast.php index d517dce684..f504a46c90 100755 --- a/assets/modules/store/installer/instprocessor-fast.php +++ b/assets/modules/store/installer/instprocessor-fast.php @@ -379,8 +379,7 @@ function parseProperties($propertyString) { } } if($insert === true) { - $properties = $modx->db->escape(parseProperties($properties, true)); - if(!@$modx->db->query("INSERT INTO `".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$properties','$guid','0','$category');",$sqlParser->conn)) { + if(!@$modx->db->query("INSERT INTO `".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$props','$guid','0','$category');",$sqlParser->conn)) { echo "

        ".mysql_error()."

        "; return; } diff --git a/assets/modules/store/installer/instprocessor.php b/assets/modules/store/installer/instprocessor.php index b0457d8f18..aafaa0f1c2 100755 --- a/assets/modules/store/installer/instprocessor.php +++ b/assets/modules/store/installer/instprocessor.php @@ -341,8 +341,7 @@ function parseProperties($propertyString) { } } if($insert === true) { - $properties = $modx->db->escape(parseProperties($properties, true)); - if(!@$modx->db->query("INSERT INTO `".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$properties','$guid','0','$category');" )) { + if(!@$modx->db->query("INSERT INTO `".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$props','$guid','0','$category');" )) { echo "

        ".mysql_error()."

        "; return; } diff --git a/install/instprocessor.php b/install/instprocessor.php index ca03a1712d..fe9a947c8c 100755 --- a/install/instprocessor.php +++ b/install/instprocessor.php @@ -559,8 +559,7 @@ } } if($insert === true) { - $properties = mysqli_real_escape_string($conn, propUpdate($properties,$row['properties'])); - if(!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$properties','$guid','0',$category);")) { + if(!mysqli_query($sqlParser->conn, "INSERT INTO $dbase.`".$table_prefix."site_plugins` (name,description,plugincode,properties,moduleguid,disabled,category) VALUES('$name','$desc','$plugin','$props','$guid','0',$category);")) { echo "

        ".mysqli_error($sqlParser->conn)."

        "; return; } From 6198dc5acb8c1abe8dffaaf92809757c4fcf9296 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Mon, 23 Jul 2018 11:28:39 +0300 Subject: [PATCH 070/241] fix #624 --- manager/index.php | 2 +- manager/media/style/common/manager.lockout.tpl | 2 +- manager/media/style/default/manager.lockout.tpl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/index.php b/manager/index.php index 2d134aefe9..b2282a42cb 100755 --- a/manager/index.php +++ b/manager/index.php @@ -210,7 +210,7 @@ } // check if user is allowed to access manager interface -if(isset($allow_manager_access) && $allow_manager_access==0) { +if(isset($allow_manager_access) && $allow_manager_access==0 && !(isset($_GET['a']) && $_GET['a'] == 8)) { include_once "manager.lockout.inc.php"; } diff --git a/manager/media/style/common/manager.lockout.tpl b/manager/media/style/common/manager.lockout.tpl index e9edc1a609..9e0da4d181 100755 --- a/manager/media/style/common/manager.lockout.tpl +++ b/manager/media/style/common/manager.lockout.tpl @@ -64,7 +64,7 @@
        [+manager_lockout_message+]
        -   +  
        diff --git a/manager/media/style/default/manager.lockout.tpl b/manager/media/style/default/manager.lockout.tpl index 6d62485d02..925bbbc8d1 100755 --- a/manager/media/style/default/manager.lockout.tpl +++ b/manager/media/style/default/manager.lockout.tpl @@ -50,7 +50,7 @@

        [(site_name)]

        [+manager_lockout_message+]
        - +  
        From 71120fd07ee4d177e405b20da6a6ffefa70f23e6 Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Wed, 25 Jul 2018 21:12:29 +0300 Subject: [PATCH 071/241] bug fix mysql 8 --- manager/actions/mutate_content.dynamic.php | 2 +- manager/processors/save_template.processor.php | 2 +- manager/processors/save_tmplvars.processor.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 095e76cd20..5e758ceee3 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -926,7 +926,7 @@ function SetUrl(url, width, height, alt) { } } - $field = "DISTINCT tv.*, cat.id, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; + $field = "DISTINCT tv.*, cat.id AS category_id, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; $vs = array( $tbl_site_tmplvars, $tbl_site_tmplvar_templates, diff --git a/manager/processors/save_template.processor.php b/manager/processors/save_template.processor.php index ed4dca716c..f4ee95894d 100755 --- a/manager/processors/save_template.processor.php +++ b/manager/processors/save_template.processor.php @@ -154,7 +154,7 @@ function saveTemplateAccess($id) $newAssignedTvs = $_POST['assignedTv']; // Preserve rankings of already assigned TVs - $rs = $modx->db->select("tmplvarid, rank", $modx->getFullTableName('site_tmplvar_templates'), "templateid='{$id}'", ""); + $rs = $modx->db->select("`tmplvarid`, `rank`", $modx->getFullTableName('site_tmplvar_templates'), "templateid='{$id}'", ""); $ranksArr = array(); $highest = 0; diff --git a/manager/processors/save_tmplvars.processor.php b/manager/processors/save_tmplvars.processor.php index 8d05b975e0..7260cabd83 100755 --- a/manager/processors/save_tmplvars.processor.php +++ b/manager/processors/save_tmplvars.processor.php @@ -191,7 +191,7 @@ function saveTemplateVarAccess() $getRankArray = array(); - $getRank = $modx->db->select("templateid, rank", $tbl_site_tmplvar_templates, "tmplvarid='{$id}'"); + $getRank = $modx->db->select("`templateid`, `rank`", $tbl_site_tmplvar_templates, "tmplvarid='{$id}'"); while ($row = $modx->db->getRow($getRank)) { $getRankArray[$row['templateid']] = $row['rank']; From b219ec85e32ea9042fd941cc3429f05324f958de Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Fri, 27 Jul 2018 18:29:46 +0300 Subject: [PATCH 072/241] add fix mysql 8.0 --- manager/actions/mutate_content.dynamic.php | 6 +++--- manager/processors/save_content.processor.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 5e758ceee3..ade724b161 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -1567,16 +1567,16 @@ function getDefaultTemplate() { if(!isset($_GET['pid']) || empty($_GET['pid'])) { $site_start = $modx->config['site_start']; $where = "sc.isfolder=0 AND sc.id!='{$site_start}'"; - $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 1, 0, 'template', $where, 'menuindex', 'ASC', 1); + $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 1, 0, 'template,menuindex', $where, 'menuindex', 'ASC', 1); if(isset($sibl[0]['template']) && $sibl[0]['template'] !== '') { $default_template = $sibl[0]['template']; } } else { - $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 1, 0, 'template', 'isfolder=0', 'menuindex', 'ASC', 1); + $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 1, 0, 'template,menuindex', 'isfolder=0', 'menuindex', 'ASC', 1); if(isset($sibl[0]['template']) && $sibl[0]['template'] !== '') { $default_template = $sibl[0]['template']; } else { - $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 0, 0, 'template', 'isfolder=0', 'menuindex', 'ASC', 1); + $sibl = $modx->getDocumentChildren($_REQUEST['pid'], 0, 0, 'template,menuindex', 'isfolder=0', 'menuindex', 'ASC', 1); if(isset($sibl[0]['template']) && $sibl[0]['template'] !== '') { $default_template = $sibl[0]['template']; } diff --git a/manager/processors/save_content.processor.php b/manager/processors/save_content.processor.php index f80d27cb44..40d8be9cf7 100755 --- a/manager/processors/save_content.processor.php +++ b/manager/processors/save_content.processor.php @@ -190,7 +190,7 @@ } $rs = $modx->db->select( - "DISTINCT tv.*, cat.id, IF(tvc.value!='',tvc.value,tv.default_text) as value", + "DISTINCT tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value", "{$tbl_site_tmplvars} AS tv INNER JOIN {$tbl_site_tmplvar_templates} AS tvtpl ON tvtpl.tmplvarid = tv.id LEFT JOIN {$tbl_site_tmplvar_contentvalues} AS tvc ON tvc.tmplvarid=tv.id AND tvc.contentid = '{$id}' From 08aad44823d87a6f711cc6045e30b367800e3bf5 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Sat, 28 Jul 2018 03:26:31 +0300 Subject: [PATCH 073/241] fix doclister --- assets/snippets/DocLister/core/DocLister.abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/snippets/DocLister/core/DocLister.abstract.php b/assets/snippets/DocLister/core/DocLister.abstract.php index 2d0aa0459d..563a40b81f 100644 --- a/assets/snippets/DocLister/core/DocLister.abstract.php +++ b/assets/snippets/DocLister/core/DocLister.abstract.php @@ -1001,7 +1001,7 @@ public function renderWrap($data) { $out = $data; $docs = count($this->_docs) - $this->skippedDocs; - if ((($this->getCFGDef("noneWrapOuter", "1") && $docs == 0) || $docs > 0) && !empty($this->ownerTPL)) { + if ((($this->getCFGDef("noneWrapOuter", "1") && $docs == 0) || $docs > 0) && !empty($this->ownerTPL) || !empty($this->getCFGDef('prepareWrap'))) { $this->debug->debug("", "renderWrapTPL", 2); $parse = true; $plh = array($this->getCFGDef("sysKey", "dl") . ".wrap" => $data); From 41b68de152f60f68e86b1cad6fcb35e8b33e25df Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Fri, 3 Aug 2018 11:51:08 +0300 Subject: [PATCH 074/241] Revert "rename composer.json temporary" This reverts commit 2d25712111b577c72619cf34d8feb5878a5cf534. --- _composer.json => composer.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _composer.json => composer.json (100%) diff --git a/_composer.json b/composer.json similarity index 100% rename from _composer.json rename to composer.json From 55602a6080d322ef29697953b2067f9142e6e2b5 Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Sat, 4 Aug 2018 13:40:52 +0300 Subject: [PATCH 075/241] fix bug group tv --- manager/actions/mutate_content.dynamic.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index ade724b161..7d92a2e8ed 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -926,7 +926,7 @@ function SetUrl(url, width, height, alt) { } } - $field = "DISTINCT tv.*, cat.id AS category_id, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; + $field = "DISTINCT tv.*, IF(tvc.value!='',tvc.value,tv.default_text) as value, tvtpl.rank as tvrank"; $vs = array( $tbl_site_tmplvars, $tbl_site_tmplvar_templates, @@ -945,7 +945,7 @@ function SetUrl(url, width, height, alt) { ); $sort = 'tvtpl.rank,tv.rank, tv.id'; if ($group_tvs) { - $field .= ', IFNULL(tv.category,0) as category_id, IFNULL(cat.category,"' . $_lang['no_category'] . '") AS category, IFNULL(cat.rank,0) AS category_rank'; + $field .= ', IFNULL(cat.id,0) AS category_id, IFNULL(cat.category,"' . $_lang['no_category'] . '") AS category, IFNULL(cat.rank,0) AS category_rank'; $from .= ' LEFT JOIN ' . $tbl_categories . ' AS cat ON cat.id=tv.category'; $sort = 'category_rank,cat.id,' . $sort; From d2e84f89ad4f9008f023378ef17eb794fe13ba27 Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Sat, 4 Aug 2018 13:44:58 +0300 Subject: [PATCH 076/241] more one fix 8.0 --- manager/actions/mutate_content.dynamic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 7d92a2e8ed..95e8f97740 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -948,7 +948,7 @@ function SetUrl(url, width, height, alt) { $field .= ', IFNULL(cat.id,0) AS category_id, IFNULL(cat.category,"' . $_lang['no_category'] . '") AS category, IFNULL(cat.rank,0) AS category_rank'; $from .= ' LEFT JOIN ' . $tbl_categories . ' AS cat ON cat.id=tv.category'; - $sort = 'category_rank,cat.id,' . $sort; + $sort = 'category_rank,category_id,' . $sort; } $where = vsprintf("tvtpl.templateid='%s' AND (1='%s' OR ISNULL(tva.documentgroup) %s)", $vs); $rs = $modx->db->select($field, $from, $where, $sort); From a6fc60de7f5844f5d9a77cac9fb28e8c8c4a1636 Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Sat, 4 Aug 2018 22:53:12 +0300 Subject: [PATCH 077/241] fix #755 --- install/setup.data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/setup.data.sql b/install/setup.data.sql index 1b50219ed0..886a88bbad 100755 --- a/install/setup.data.sql +++ b/install/setup.data.sql @@ -18,7 +18,7 @@ REPLACE INTO `{PREFIX}site_content` VALUES ('1','document','text/html','Home','W REPLACE INTO `{PREFIX}site_content` VALUES ('2','document','text/html','Blog','My Blog','','blog','','1','0','0','0','1','','[[DocLister? \n &jotcount=`1`\n &parents=`2` \n &display=`2`\n &tvPrefix=``\n &tvList=`image`\n &prepare=`prepareBlog`\n &summary=`notags,len:350` \n &tpl=`@CODE:\n
        \n [+blog-image+] \n

        [+e.title+]

        \n
        \n By [+author+] on [+date+].\n Comments [+jotcount+]\n
        \n [+summary+]\n

        [+link+]

        \n
        ` \n &paginate=`1` \n]]\n\n

        Showing [+current+] of [+totalPages+] Pages

        \n
        [+pages+]
        \n

         

        ','0','4','1','0','1','1','1144904400','1','1507727477','0','0','0','0','0','Blog','0','0','0','0','0','1'); -REPLACE INTO `{PREFIX}site_content` VALUES ('4','document','text/html','Profile','User profile','','profile','','1','0','0','0','1','','[!FormLister?\n&debug=`1`\n&formid=`login`\n&controller=`Login`\n&loginField=`email`\n&redirectTo=`49`\n&defaults=`{\"rememberme\":1}`\n&rules=`{\n \"email\":{\n \"required\":\"Enter your Email\"\n },\n \"password\":{\n \"required\":\"Enter your password\"\n }\n}`\n&formTpl=`@CODE:\n\n

        In order to comment on blog entries, you must be a registered user of [(site_name)]. If you haven\'t already registered, you can request an account.

        \n\n\n [+form.messages+]\n \n
        \n
        \n \n \n
        \n
        \n
        \n
        \n \n \n
        \n
        \n\n
        \n \n
        \n \n
        \n
        \n\n`\n&skipTpl=`@CODE:\n
        Hello!
        \n `\n\n&allowedFields=`email,password`\n&errorTpl=`@CODE:

        [+message+]

        `\n&messagesOuterTpl=`@CODE:\n
        [+messages+]
        `\n\n&errorClass=` has-error` \n&requiredClass=` has-warning`\n!] \n','0','4','6','0','1','1','1144904400','1','1509817775','0','0','0','0','0','','0','0','0','0','0','0'); +REPLACE INTO `{PREFIX}site_content` VALUES ('4','document','text/html','Profile','User profile','','profile','','1','0','0','0','1','','[!FormLister?\n&formid=`login`\n&controller=`Login`\n&loginField=`email`\n&redirectTo=`49`\n&defaults=`{\"rememberme\":1}`\n&formControls=`rememberme`\n&rules=`{\n \"email\":{\n \"required\":\"Enter your Email\",\n \"email\":\"You should enter correct Email\"\n },\n \"password\":{\n \"required\":\"Enter your password\"\n }\n}`\n&formTpl=`@CODE:\n\n

        In order to comment on blog entries, you must be a registered user of [(site_name)]. If you haven\'t already registered, you can request an account.

        \n\n
        \n [+form.messages+]\n \n
        \n
        \n \n \n
        \n
        \n
        \n
        \n \n \n
        \n
        \n
        \n
        \n
        \n \n
        \n
        \n
        \n
        \n \n
        \n \n
        \n
        \n \n
        \n`\n&skipTpl=`@CODE:\n
        Hello!
        \n `\n&errorTpl=`@CODE:

        [+message+]

        `\n&messagesOuterTpl=`@CODE:\n
        [+messages+]
        `\n&errorClass=` has-error` \n&requiredClass=` has-warning`\n!]','0','4','6','0','1','1','1144904400','1','1533412259','0','0','0','0','0','','0','0','0','0','0','0'); REPLACE INTO `{PREFIX}site_content` VALUES ('5','document','text/html','Request an Account','Sign Up for Full Site Privileges','','request-an-account','','1','0','0','4','0','',' [!FormLister?\n &formid=`registerForm`\n &controller=`Register`\n &requiredClass=`has-warning`\n &errorClass=`has-error`\n &errorTpl=`@CODE:[+message+]`\n &allowedFields=`email,username,fullname,country`\n &rules=`{\n \"username\":{\n \"required\":\"Enter your username\",\n \"alphaNumeric\":\"Only letters and numbers\",\n \"custom\":{\n \"function\":\"\\\\FormLister\\\\Register::uniqueUsername\",\n \"message\":\"Name already taken\"\n }\n },\n \"email\":{\n \"required\":\"Enter email\",\n \"email\":\"Incorrect email\",\n \"custom\":{\n \"function\":\"\\\\FormLister\\\\Register::uniqueEmail\",\n \"message\":\"This email is already in use by another user\"\n }\n },\n \"password\":{\n \"required\":\"Enter password\"\n },\n \"repeatPassword\":{\n \"required\":\"Retype password\",\n \"equals\":{\n \"message\":\"Passwords do not match\"\n }\n }\n }`\n &captcha=`modxCaptcha`\n &formTpl=`@CODE: \n\n
        \n \n

        User Details

        \n
        \n \n Items marked by * are required\n
        \n \n
        \n \n \n [+username.error+]\n
        \n \n
        \n \n \n [+fullname.error+]\n
        \n \n
        \n \n \n [+email.error+]\n
        \n\n
        \n

        Password

        \n \n \n [+password.error+]\n
        \n
        \n \n \n [+repeatPassword.error+]\n
        \n \n
        \n

        Optional Account Profile Info

        \n \n \n [+country.error+]\n
        \n \n
        \n

        Bot-Patrol

        \n

        Enter the word/number combination shown in the image below.

        \n \n

        \"If

        \n \n [+vericode.error+]\n
        \n \n
        \n \n
        \n\n
        \n\n\n\n `\n &successTpl=`@CODE:\n

        Signup completed successfully!
        \n Your account was created. A copy of your signup information was sent to your email address.

        \n `\n &subject=`New registration, [(site_name)]`\n &ccSender=`1`\n &ccSenderTpl=`@CODE:\n

        [+fullname.value+], signup completed successfully!

        \n Login: [+email.value+]
        \n Password: [+user.password+]
        \n `\n !]','0','4','1','0','1','1','1144904400','1','1515584252','0','0','0','0','0','','0','0','0','0','1','1'); From 618f4313f1f9458418439c316e2a524a1b5c46a4 Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Sat, 4 Aug 2018 23:16:00 +0300 Subject: [PATCH 078/241] fix #692 Manager left menu charset issue --- manager/media/style/default/ajax.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/manager/media/style/default/ajax.php b/manager/media/style/default/ajax.php index 4ef51b2d3d..a2ec73ac3f 100755 --- a/manager/media/style/default/ajax.php +++ b/manager/media/style/default/ajax.php @@ -33,6 +33,8 @@ // set limit sql query $limit = !empty($modx->config['number_of_results']) ? (int) $modx->config['number_of_results'] : 100; +header('Content-Type: text/html; charset='.$modx->config['modx_charset'], true); + if (isset($action)) { switch ($action) { From fb58f1d609cbc2536f38a80426faeea458363ffd Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Sat, 4 Aug 2018 23:31:46 +0300 Subject: [PATCH 079/241] 1.4.5 RC3 --- manager/includes/version.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/includes/version.inc.php b/manager/includes/version.inc.php index d05dc58f7c..4bf2e3e269 100755 --- a/manager/includes/version.inc.php +++ b/manager/includes/version.inc.php @@ -1,5 +1,5 @@ Date: Sun, 5 Aug 2018 00:19:00 +0300 Subject: [PATCH 080/241] add more events --- install/setup.sql | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/install/setup.sql b/install/setup.sql index b19bed32c8..81a9c564c6 100755 --- a/install/setup.sql +++ b/install/setup.sql @@ -1109,7 +1109,13 @@ REPLACE INTO `{PREFIX}system_eventnames` ('1002','OnBeforeFileBrowserUpload','1','File Browser Events'), ('1003','OnFileBrowserDelete','1','File Browser Events'), ('1004','OnBeforeFileBrowserDelete','1','File Browser Events'), -('1005','OnFileBrowserInit','1','File Browser Events'); +('1005','OnFileBrowserInit','1','File Browser Events'), +('1006','OnFileBrowserMove','1','File Browser Events'), +('1007','OnBeforeFileBrowserMove','1','File Browser Events'), +('1008','OnFileBrowserCopy','1','File Browser Events'), +('1009','OnBeforeFileBrowserCopy','1','File Browser Events'), +('1010','OnBeforeFileBrowserRename','1','File Browser Events'), +('1011','OnFileBrowserRename','1','File Browser Events'); # ^ I don't think we need more than 1000 built-in events. Custom events will start at 1001 From f11a627fb5afefe7da42cd001f90f23886ff7828 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Sun, 5 Aug 2018 00:21:35 +0300 Subject: [PATCH 081/241] add file browser events --- manager/media/browser/mcpuk/core/browser.php | 58 +++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/manager/media/browser/mcpuk/core/browser.php b/manager/media/browser/mcpuk/core/browser.php index 1eb63eb362..0c84a37408 100755 --- a/manager/media/browser/mcpuk/core/browser.php +++ b/manager/media/browser/mcpuk/core/browser.php @@ -283,6 +283,11 @@ protected function act_renameDir() $dir = $this->postDir(); $newName = $this->normalizeDirname(trim($this->post['newName'])); + $evtOut = $this->modx->invokeEvent('OnBeforeFileBrowserRename', array( + 'element' => 'dir', + 'filepath' => realpath($dir), + 'newname' => &$newName + )); if (!strlen($newName)) { $this->errorMsg("Please enter new folder name."); } @@ -292,6 +297,9 @@ protected function act_renameDir() if (substr($newName, 0, 1) == ".") { $this->errorMsg("Folder name shouldn't begins with '.'"); } + if (is_array($evtOut) && !empty($evtOut)) { + $this->errorMsg(implode('\n', $evtOut)); + } if (!@rename($dir, dirname($dir) . "/$newName")) { $this->errorMsg("Cannot rename the folder."); } @@ -299,6 +307,11 @@ protected function act_renameDir() if (is_dir($thumbDir)) { @rename($thumbDir, dirname($thumbDir) . "/$newName"); } + $this->modx->invokeEvent('OnFileBrowserRename', array( + 'element' => 'dir', + 'filepath' => realpath($dir), + 'newname' => $newName + )); return json_encode(array('name' => $newName)); } @@ -422,6 +435,12 @@ protected function act_rename() } $newName = $this->normalizeFilename(trim($this->post['newName'])); + $evtOut = $this->modx->invokeEvent('OnBeforeFileBrowserRename', array( + 'element' => 'file', + 'filepath' => $dir, + 'filename' => $this->post['file'], + 'newname' => &$newName + )); if (!strlen($newName)) { $this->errorMsg("Please enter new file name."); } @@ -431,6 +450,7 @@ protected function act_rename() if (substr($newName, 0, 1) == ".") { $this->errorMsg("File name shouldn't begins with '.'"); } + $_newName = $newName; $newName = "$dir/$newName"; if (file_exists($newName)) { $this->errorMsg("A file or folder with that name already exists."); @@ -439,10 +459,18 @@ protected function act_rename() if (!$this->validateExtension($ext, $this->type)) { $this->errorMsg("Denied file extension."); } + if (is_array($evtOut) && !empty($evtOut)) { + $this->errorMsg(implode('\n', $evtOut)); + } if (!@rename($file, $newName)) { $this->errorMsg("Unknown error."); } - + $this->modx->invokeEvent('OnFileBrowserRename', array( + 'element' => 'file', + 'filepath' => $dir, + 'filename' => $this->post['file'], + 'newname' => $_newName + )); $thumbDir = "{$this->thumbsTypeDir}/{$this->post['dir']}"; $thumbFile = "$thumbDir/{$this->post['file']}"; @@ -526,7 +554,14 @@ protected function act_cp_cbd() $base = basename($file); $replace = array('file' => $base); $ext = file::getExtension($base); - if (!file_exists($path)) { + $evtOut = $this->modx->invokeEvent('OnBeforeFileBrowserCopy', array( + 'oldpath' => $path, + 'filename' => $base, + 'newpath' => realpath($dir) + )); + if (is_array($evtOut) && !empty($evtOut)) { + $error[] = implode("\n", $evtOut); + } elseif (!file_exists($path)) { $error[] = $this->label("The file '{file}' does not exist.", $replace); } elseif (substr($base, 0, 1) == ".") { $error[] = "$base: " . $this->label("File name shouldn't begins with '.'"); @@ -542,6 +577,11 @@ protected function act_cp_cbd() if (function_exists("chmod")) { @chmod("$dir/$base", $this->config['filePerms']); } + $this->modx->invokeEvent('OnFileBrowserCopy', array( + 'oldpath' => $path, + 'filename' => $base, + 'newpath' => realpath($dir) + )); $fromThumb = "{$this->thumbsDir}/$file"; if (is_file($fromThumb) && is_readable($fromThumb)) { $toThumb = "{$this->thumbsTypeDir}/{$this->post['dir']}"; @@ -590,7 +630,14 @@ protected function act_mv_cbd() $base = basename($file); $replace = array('file' => $base); $ext = file::getExtension($base); - if (!file_exists($path)) { + $evtOut = $this->modx->invokeEvent('OnBeforeFileBrowserMove', array( + 'oldpath' => $path, + 'filename' => $base, + 'newpath' => realpath($dir) + )); + if (is_array($evtOut) && !empty($evtOut)) { + $error[] = implode("\n", $evtOut); + } elseif (!file_exists($path)) { $error[] = $this->label("The file '{file}' does not exist.", $replace); } elseif (substr($base, 0, 1) == ".") { $error[] = "$base: " . $this->label("File name shouldn't begins with '.'"); @@ -615,6 +662,11 @@ protected function act_mv_cbd() $toThumb .= "/$base"; @rename($fromThumb, $toThumb); } + $this->modx->invokeEvent('OnFileBrowserMove', array( + 'oldpath' => $path, + 'filename' => $base, + 'newpath' => realpath($dir) + )); } } if (count($error)) { From c4a06df627201df0c002635aecdc0518ec360bc4 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 6 Aug 2018 21:48:19 +0300 Subject: [PATCH 082/241] fix tree update "Save and Quit" --- manager/includes/active_user_locks.inc.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/manager/includes/active_user_locks.inc.php b/manager/includes/active_user_locks.inc.php index 3ff7f1861e..e23b0e527a 100755 --- a/manager/includes/active_user_locks.inc.php +++ b/manager/includes/active_user_locks.inc.php @@ -3,9 +3,7 @@ die("INCLUDE_ORDERING_ERROR

        Please use the EVO Content Manager instead of accessing this file directly."); } -$lockElementId = (int)$lockElementId; - -if ($lockElementId > 0) { +if (is_numeric($lockElementId) && ($lockElementId > 0 || $lockElementId == 0)) { ?> - + [(site_name)] (Evolution CMS Manager Login) + + + + + + - - -
        -
        - -
        - [+logo_slogan+] -
        - -
        -

        [(site_name)]

        -
        [+manager_lockout_message+]
        -
        - -   - -
        -
        -
        -
        + +
        +
        +
        + + + + +
        +

        [(site_name)]

        + + [+manager_lockout_message+] +
        + + +
        + + +
        + +
        +
        + + +
        +

        +
        © 2005-2018 by the EVO. EVO™ is licensed under the GPL.
        +
        - - -

        EVO™ is licensed under the GPL license. © 2005-2018 EVO.

        + + - + \ No newline at end of file From 18627a8769a35455e34f6adfc5f3fdf4fc503ba0 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 6 Aug 2018 23:24:42 +0300 Subject: [PATCH 084/241] fix #693 --- manager/media/script/main.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/manager/media/script/main.js b/manager/media/script/main.js index 46ed94d449..13e312d001 100644 --- a/manager/media/script/main.js +++ b/manager/media/script/main.js @@ -73,21 +73,24 @@ evo.sortable = function(a, b) { function onmousedown(e) { o.el = this; - o.x = e.pageX; - o.y = e.pageY; + o.x = e.pageX || e.touches[0].pageX; + o.y = e.pageY || e.touches[0].pageY; o.marginX = parseFloat(getComputedStyle(o.el).marginLeft) + parseFloat(getComputedStyle(o.el).marginRight); o.marginY = parseFloat(getComputedStyle(o.el).marginTop) + parseFloat(getComputedStyle(o.el).marginBottom); o.el.classList.add(o.handleClass); o.el.ownerDocument.addEventListener('mousemove', onmousemove); o.el.ownerDocument.addEventListener('mouseup', onmouseup); + o.el.ownerDocument.addEventListener('touchmove', onmousemove); + o.el.ownerDocument.addEventListener('touchend', onmouseup); o.el.ownerDocument.onselectstart = function(e) { e.preventDefault(); }; + o.el.ownerDocument.body.style.overflow = 'hidden'; } function onmousemove(e) { if (o.position === 'vertical') { - var y = (e.pageY - o.y); + var y = ((e.pageY || e.touches[0].pageY) - o.y); if (y >= o.el.offsetHeight && o.el.nextElementSibling) { o.y += o.el.offsetHeight + o.marginY; o.el.parentNode.insertBefore(o.el, o.el.nextElementSibling.nextElementSibling); @@ -104,7 +107,7 @@ evo.sortable = function(a, b) { o.el.style.webkitTransform = 'translateY(' + y + 'px)'; o.el.style.transform = 'translateY(' + y + 'px)'; } else { - var x = (e.pageX - o.x); + var x = ((e.pageX || e.touches[0].pageX) - o.x); if (x >= o.el.offsetWidth && o.el.nextElementSibling) { o.x += o.el.offsetWidth + o.marginX; o.el.parentNode.insertBefore(o.el, o.el.nextElementSibling.nextElementSibling); @@ -129,12 +132,16 @@ evo.sortable = function(a, b) { o.el.classList.remove(o.handleClass); o.el.ownerDocument.removeEventListener('mousemove', onmousemove); o.el.ownerDocument.removeEventListener('mouseup', onmouseup); + o.el.ownerDocument.removeEventListener('touchmove', onmousemove); + o.el.ownerDocument.removeEventListener('touchend', onmouseup); o.el.ownerDocument.onselectstart = null; + o.el.ownerDocument.body.style.overflow = ''; o.complete(o.el); } for (var i = 0; i < a.length; i++) { a[i].addEventListener('mousedown', onmousedown); + a[i].addEventListener('touchstart', onmousedown); } }; From ff814c44dd3df67a163635f80e7dcc55eb43e1b0 Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Tue, 7 Aug 2018 01:11:38 +0300 Subject: [PATCH 085/241] fix emtpy tabs --- manager/actions/mutate_content.dynamic.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 95e8f97740..8762ea4122 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -914,6 +914,7 @@ function SetUrl(url, width, height, alt) { manager->action == '4') || ($content['type'] == 'reference' || $modx->manager->action == 72)) { $template = $default_template; @@ -1087,7 +1088,7 @@ function SetUrl(url, width, height, alt) { $i++; } } - + if ($templateVariablesGeneral) { echo '' . $templateVariablesGeneral . '
        '; } @@ -1147,7 +1148,7 @@ function SetUrl(url, width, height, alt) { } // Template Variables - if ($group_tvs < 3) { + if ($group_tvs < 3 && $templateVariablesOutput) { echo $templateVariables; } ?> @@ -1360,7 +1361,7 @@ function SetUrl(url, width, height, alt) { config['group_tvs'] > 2) { + if ($modx->config['group_tvs'] > 2 && $templateVariablesOutput) { echo $templateVariables; } ?> From fb74a6dd4752be550820f72dd7984d56c8512e6f Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Tue, 7 Aug 2018 01:13:08 +0300 Subject: [PATCH 086/241] code style fix --- manager/actions/mutate_content.dynamic.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 8762ea4122..6b2513baa4 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -914,7 +914,7 @@ function SetUrl(url, width, height, alt) { manager->action == '4') || ($content['type'] == 'reference' || $modx->manager->action == 72)) { $template = $default_template; @@ -1088,7 +1088,7 @@ function SetUrl(url, width, height, alt) { $i++; } } - + if ($templateVariablesGeneral) { echo '' . $templateVariablesGeneral . '
        '; } From 3291aca47551d0312997e15b04bb4b5c88716cb8 Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Tue, 7 Aug 2018 13:47:43 +0300 Subject: [PATCH 087/241] v1.4.5 --- manager/includes/version.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/includes/version.inc.php b/manager/includes/version.inc.php index 4bf2e3e269..c6a2e9d392 100755 --- a/manager/includes/version.inc.php +++ b/manager/includes/version.inc.php @@ -1,5 +1,5 @@ Date: Tue, 7 Aug 2018 14:26:05 +0300 Subject: [PATCH 088/241] Update plugin.filesource.php --- assets/plugins/filesource/plugin.filesource.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/plugins/filesource/plugin.filesource.php b/assets/plugins/filesource/plugin.filesource.php index c920b05885..9a17e665dc 100755 --- a/assets/plugins/filesource/plugin.filesource.php +++ b/assets/plugins/filesource/plugin.filesource.php @@ -72,9 +72,6 @@ case 'OnPluginFormPrerender': case 'OnSnipFormPrerender': global $content, $_lang; - if (preg_match('/\s' . $_lang['duplicated_el_suffix'] . '\s?\d*$/', $content['name'])) { - $content['file_binding'] = ''; - } if(substr(trim($content[$vals]),0,$count) == $include.' MODX_BASE_PATH.\'assets/'.$elm_name.'/') { $content['file_binding'] = str_replace(array(';','\''),'',trim(substr(trim($content[$vals]),$count,250))); @@ -106,6 +103,9 @@ else $content['file_binding'] = ''; $_SESSION['itemname']=$content['name']; } + if (preg_match('/\s' . $_lang['duplicated_el_suffix'] . '\s?\d*$/', $content['name'])) { + $content['file_binding'] = ''; + } //else $_SESSION['itemname']="New snippet"; break; case 'OnSnipFormRender': From d601db995de1efbf511fa7d22303c330ea6b9310 Mon Sep 17 00:00:00 2001 From: dmi3yy Date: Tue, 7 Aug 2018 14:43:50 +0300 Subject: [PATCH 089/241] 1.4.5 --- assets/docs/changelog.txt | 63 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/assets/docs/changelog.txt b/assets/docs/changelog.txt index be3e4b2c10..23b2ae74eb 100755 --- a/assets/docs/changelog.txt +++ b/assets/docs/changelog.txt @@ -1,6 +1,69 @@ This file shows the changes in recent releases of Evolution CMS. The most current release is usually the development release, and is only shown to give an idea of what's currently in the pipeline. +Evolution CMS 1.4.5 (Aug 07, 2018) +* [GitHub:#18627a876] - [F] fix #693 Drag/drop sortable lists (Serg) +* [GitHub:#9cdf9e173] - [F] fix #770 Restyle manager lockout page (Serg) +* [GitHub:#c4a06df62] - [F] fix tree update "Save and Quit" (Serg) +* [GitHub:#f11a627fb] - [I] add file browser events (Pathologic) +* [GitHub:#6ef91bc82] - [I] add more events (Pathologic) +* [GitHub:#618f4313f] - [F] fix #692 Manager left menu charset issue (dmi3yy) +* [GitHub:#a6fc60de7] - [F] fix #755 cookie context and lifetime (dmi3yy) +* [GitHub:#08aad4482] - [F] fix doclister (Pathologic) +* [GitHub:#b219ec85e] - [I] add support mysql 8.0 (Ser1ous) +* [GitHub:#6198dc5ac] - [F] fix #624 Issues for manager with no 'Interface Access' setting (Pathologic) +* [GitHub:#a1c3d37ab] - [F] fix #769 plugin settings get lost while upgrading to newer version (Pathologic) +* [GitHub:#26a430eb6] - [F] fix #730 Retain Plugin Event Execution Order When Upgrading (Pathologic) +* [GitHub:#c8080596b] - [F] update FormLister to 1.7.21 (Pathologic) +* [GitHub:#db41ba731] - [F] fix #767 Web Users not showing in Online Users (Pathologic) +* [GitHub:#747985a47] - [F] fix #368 problem with dublicete snippet (Pathologic) +* [GitHub:#a0c7f264c] - [F] fix for work with mysql 8.0 (Ser1ous) +* [GitHub:#04863cd88] - [I] Update mutate_user.dynamic.php (Mr B) +* [GitHub:#83550c437] - [I] Add username label (Mr B) +* [GitHub:#3130df11c] - [F] fix memory leak (Pathologic) +* [GitHub:#61cd0c0eb] - [F] fix #763 Evolution 1.4.5RC2 Does not work logo replacement(Serg) +* [GitHub:#3bed43eb9] - [F] fix text color in darkness mode (Serg) +* [GitHub:#196e815be] - [F] Fix saving web users (Mr B) +* [GitHub:#841db700d] - [F] fix #552 Weird Chunk Rendering When minifyphp_incache is enabled (Pathologic) +* [GitHub:#ce83e5411] - [F] fix checkVersion (Pathologic) +* [GitHub:#7626ccfbd] - [I] update FormLister (Pathologic) +* [GitHub:#553ff5332] - [F] fix #519 2 functions parseProperties (Pathologic) +* [GitHub:#b637d20ce] - [F] fix #556 Cli mode (Pathologic) +* [GitHub:#86ecaec70] - [F] fix #300 OnDocPublished add automatic start (Pathologic) +* [GitHub:#ac3033f12] - [F] fix #233 Disabling function touch generates error "Cannot access or create thumbnails folder." in media manager (Pathologic) +* [GitHub:#5223b3ab4] - [I] alter recent info table (Mr B) +* [GitHub:#d753660e0] - [I] add OnFileBrowserInit event (Pathologic) +* [GitHub:#5e0a3510f] - [F] fix #749 not bloced user (Serg) +* [GitHub:#5af0c3c4f] - [I] cancel close tabs for components (Serg) +* [GitHub:#b8a27cad0] - [F] fix #758 modxlink plugin (Pathologic) +* [GitHub:#3db936dab] - [I] events of directory delete (Pathologic) +* [GitHub:#57da95fee] - [F] fix #736 backup button back into the dashboard (dmi3yy) +* [GitHub:#63b229bf3] - [F] fix #750 tinymce 4 - link to images folder, not only to files (Pathologic) +* [GitHub:#3032cd717] - [I] stop username wrap if has spaces (Mr B) +* [GitHub:#f3639c642] - [F] Fix saving web user permissions (Mr B) +* [GitHub:#8e083becb] - [I] add File Browser events, skip thumbnails creation (Pathologic) +* [GitHub:#471b9e41a] - [I] add more File Browser events (Pathologic) +* [GitHub:#8ad6402a6] - [F] Fix #737 (Serg) +* [GitHub:#4a1f6972d] - [I] Update mainmenu.css (Mr B) +* [GitHub:#bc539c054] - [I] Update style.php (Mr B) +* [GitHub:#7132beb6b] - [I] Add time to dashboard resource edit dates (Mr B) +* [GitHub:#118f69e47] - [R] russian-UTF8.inc.php #728 (Agel_Nash) +* [GitHub:#62285b7b4] - [R] Update english.inc.php (Mr B) +* [GitHub:#d5d170404] - [I] Add confirmation for purge plugins (Mr B) +* [GitHub:#4143fea6b] - [F] remove docs from core FormLister #366 (dmi3yy) +* [GitHub:#3d178f654] - [F] fix #727 Ampersand (&) in Site Name escaped infinitely (Serg) +* [GitHub:#b5b88d912] - [F] Save and close global tabs (Serg) +* [GitHub:#239fda8a2] - [F] Fix html (Serg) +* [GitHub:#4d909750f] - [F] fix validator in FormLister (dmi3yy) +* [GitHub:#44ff0ff10] - [F] Fix #722 Issues with managing users (Serg) +* [GitHub:#9a64f25aa] - [F] Fix style left-menu position (Serg) +* [GitHub:#51f9102e0] - [F] Fix theme ajax.php (Serg) +* [GitHub:#3eda7b7d6] - [F] Fix add images in settings (Serg) +* [GitHub:#005993658] - [F] Fix notice variables (Serg) +* [GitHub:#952c85d0a] - [I] Action name for dashboard (Mr B) +* [GitHub:#25140784a] - [I] Add date to active users hit time (Mr B) + + Evolution CMS 1.4.4 (Jun 08, 2018) * [GitHub:#5d177a4ea] - [I] Auto set Sender (Евгений Борисов) * [GitHub:#f13d19d60] - [I] Move color switcher icon (Mr B) From 79edb9ef507a327ada7acdcad3ebbaca661cecbd Mon Sep 17 00:00:00 2001 From: thalegion Date: Thu, 9 Aug 2018 09:38:22 +0300 Subject: [PATCH 090/241] Change checking of manager mode $modx->getLoginUserType() returned empty string --- assets/lib/class.modxRTEbridge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/lib/class.modxRTEbridge.php b/assets/lib/class.modxRTEbridge.php index 448c5fa28b..b798e9a007 100755 --- a/assets/lib/class.modxRTEbridge.php +++ b/assets/lib/class.modxRTEbridge.php @@ -966,7 +966,7 @@ public function getTemplateChunkList() $templatesArr = array(); - if ($modx->getLoginUserType() === 'manager') { + if (IN_MANAGER_MODE) { $modx->getSettings(); $ids = $modx->config[$this->editorKey.'_template_docs']; From 1845b64b2d4ebe3416b8b95815ca2f1865381613 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Wed, 22 Aug 2018 23:28:18 +0000 Subject: [PATCH 091/241] html_escape function --- manager/includes/protect.inc.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/manager/includes/protect.inc.php b/manager/includes/protect.inc.php index f868ed98b8..2134c4cc13 100755 --- a/manager/includes/protect.inc.php +++ b/manager/includes/protect.inc.php @@ -69,6 +69,13 @@ function getSanitizedValue($value = '') return $value; } +if (! function_exists('html_escape')) { + function html_escape($str, $charset = 'UTF-8') + { + return htmlentities($str, ENT_COMPAT | ENT_SUBSTITUTE, $charset, false); + } +} + modx_sanitize_gpc($_GET); if (!defined('IN_MANAGER_MODE') || IN_MANAGER_MODE !== true) { modx_sanitize_gpc($_POST); From 2b8aaa6224997155de0fe9440ad106bd98dc4f4b Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Wed, 22 Aug 2018 23:28:59 +0000 Subject: [PATCH 092/241] Fix #788 --- manager/actions/document_data.static.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/manager/actions/document_data.static.php b/manager/actions/document_data.static.php index 84b7e291ee..1b6a9017af 100755 --- a/manager/actions/document_data.static.php +++ b/manager/actions/document_data.static.php @@ -188,9 +188,9 @@ //$class .= ($children['hidemenu'] ? ' text-muted' : ' text-primary'); //$class .= ($children['isfolder'] ? ' font-weight-bold' : ''); if($modx->hasPermission('edit_document')) { - $title = '' . $icon . '' . '' . $children['pagetitle'] . ''; + $title = '' . $icon . '' . '' . html_escape($children['pagetitle'], $modx->config['modx_charset']) . ''; } else { - $title = '' . $icon . '' . $children['pagetitle'] . ''; + $title = '' . $icon . '' . html_escape($children['pagetitle'], $modx->config['modx_charset']) . ''; } $icon_pub_unpub = (!$children['published']) ? '' : ''; @@ -257,7 +257,7 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '')

        - config['modx_charset']) . (iconv_strlen($content['pagetitle'], $modx->config['modx_charset']) > 50 ? '...' : '') . ' (' . $_REQUEST['id'] . ')' ?> + config['modx_charset']), $modx->config['modx_charset']) . (iconv_strlen($content['pagetitle'], $modx->config['modx_charset']) > 50 ? '...' : '') . ' (' . (int)$_REQUEST['id'] . ')' ?>

        @@ -279,21 +279,21 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '') : - + config['modx_charset']) ?> : - " . $_lang['not_set'] . ")" ?> + config['modx_charset']) : "(" . $_lang['not_set'] . ")" ?> : - " . $_lang['not_set'] . ")" ?> + config['modx_charset']) : "(" . $_lang['not_set'] . ")" ?> : - " . $_lang['not_set'] . ")" ?> + config['modx_charset']) : "(" . $_lang['not_set'] . ")" ?> : @@ -301,7 +301,7 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '') : - " . $_lang['not_set'] . ")" ?> + config['modx_charset']) : "(" . $_lang['not_set'] . ")" ?>   @@ -349,7 +349,7 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '') : - + config['modx_charset']) ?> : @@ -371,7 +371,7 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '') : - + config['modx_charset']) ?> : @@ -393,7 +393,7 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '')
        0) : ?>
        - () + (config['modx_charset']) ?>)
        From b59d1f57be37ab752d65be4bc4d3546c36b69415 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Wed, 22 Aug 2018 23:43:28 +0000 Subject: [PATCH 093/241] Fix #789 --- manager/actions/search.static.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/manager/actions/search.static.php b/manager/actions/search.static.php index 86f76bafcd..b2e40438d1 100755 --- a/manager/actions/search.static.php +++ b/manager/actions/search.static.php @@ -31,7 +31,7 @@
        - +
        @@ -58,14 +58,14 @@
        URL
        - +
        - +
        @@ -422,14 +422,15 @@ */ function highlightingCoincidence($text, $search) { + global $modx; $regexp = '!(' . str_replace(array( '(', ')' ), array( '\(', '\)' - ), trim($search)) . ')!isu'; - return preg_replace($regexp, '$1', $text); + ), html_escape(trim($search), $modx->config['modx_charset'])) . ')!isu'; + return preg_replace($regexp, '$1', html_escape($text, $modx->config['modx_charset'])); } /** From a7fe1cfbc5d06ac29f08569059f561026e3b98ec Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Wed, 22 Aug 2018 23:55:52 +0000 Subject: [PATCH 094/241] Security Fix --- manager/actions/mutate_content.dynamic.php | 8 +++--- manager/processors/save_content.processor.php | 26 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 6b2513baa4..9c58136537 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -568,15 +568,15 @@ function SetUrl(url, width, height, alt) { - - + +

        config['modx_charset']) . (iconv_strlen($content['pagetitle'], $modx->config['modx_charset']) > 50 ? '...' : '') . '(' . $_REQUEST['id'] . ')'; + echo html_escape(iconv_substr($content['pagetitle'], 0, 50, $modx->config['modx_charset']), $modx->config['modx_charset']) . (iconv_strlen($content['pagetitle'], $modx->config['modx_charset']) > 50 ? '...' : '') . '(' . (int)$_REQUEST['id'] . ')'; } else { if ($modx->manager->action == '4') { echo $_lang['add_resource']; @@ -702,7 +702,7 @@ function SetUrl(url, width, height, alt) { " onclick="enableLinkSelection(!allowLinkSelection);"> - + diff --git a/manager/processors/save_content.processor.php b/manager/processors/save_content.processor.php index 40d8be9cf7..82bd272c21 100755 --- a/manager/processors/save_content.processor.php +++ b/manager/processors/save_content.processor.php @@ -14,30 +14,30 @@ $description = $modx->db->escape($_POST['description']); $alias = $modx->db->escape($_POST['alias']); $link_attributes = $modx->db->escape($_POST['link_attributes']); -$isfolder = $_POST['isfolder']; -$richtext = $_POST['richtext']; -$published = $_POST['published']; -$parent = $_POST['parent'] != '' ? $_POST['parent'] : 0; -$template = $_POST['template']; -$menuindex = !empty($_POST['menuindex']) ? $_POST['menuindex'] : 0; -$searchable = $_POST['searchable']; -$cacheable = $_POST['cacheable']; -$syncsite = $_POST['syncsite']; +$isfolder = (int)$_POST['isfolder']; +$richtext = (int)$_POST['richtext']; +$published = (int)$_POST['published']; +$parent = $_POST['parent'] != '' ? (int)$_POST['parent'] : 0; +$template = (int)$_POST['template']; +$menuindex = !empty($_POST['menuindex']) ? (int)$_POST['menuindex'] : 0; +$searchable = (int)$_POST['searchable']; +$cacheable = (int)$_POST['cacheable']; +$syncsite = (int)$_POST['syncsite']; $pub_date = $_POST['pub_date']; $unpub_date = $_POST['unpub_date']; $document_groups = (isset($_POST['chkalldocs']) && $_POST['chkalldocs'] == 'on') ? array() : $_POST['docgroups']; -$type = $_POST['type']; +$type = $modx->db->escape($_POST['type']); $contentType = $modx->db->escape($_POST['contentType']); $contentdispo = (int)$_POST['content_dispo']; $longtitle = $modx->db->escape($_POST['longtitle']); $donthit = (int)$_POST['donthit']; $menutitle = $modx->db->escape($_POST['menutitle']); $hidemenu = (int)$_POST['hidemenu']; -$aliasvisible = $_POST['alias_visible']; +$aliasvisible = (int)$_POST['alias_visible']; /************* webber ********/ -$sd=isset($_POST['dir'])?'&dir='.$_POST['dir']:'&dir=DESC'; -$sb=isset($_POST['sort'])?'&sort='.$_POST['sort']:'&sort=pub_date'; +$sd=isset($_POST['dir']) && strtolower($_POST['dir']) === 'asc' ? '&dir=ASC' : '&dir=DESC'; +$sb=isset($_POST['sort'])?'&sort='.html_escape($_POST['sort'], $modx->config['modx_charset']):'&sort=pub_date'; $pg=isset($_POST['page'])?'&page='.(int)$_POST['page']:''; $add_path=$sd.$sb.$pg; From 8e30682a4700e93258c5783ad1a5585d299c5e0a Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Thu, 23 Aug 2018 00:24:57 +0000 Subject: [PATCH 095/241] Fix some XSS --- manager/actions/document_data.static.php | 4 +-- manager/actions/welcome.static.php | 14 ++++---- manager/frames/1.php | 10 +++--- manager/media/style/default/ajax.php | 44 ++++++++++++------------ 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/manager/actions/document_data.static.php b/manager/actions/document_data.static.php index 1b6a9017af..055338f260 100755 --- a/manager/actions/document_data.static.php +++ b/manager/actions/document_data.static.php @@ -311,13 +311,13 @@ class="' . $_style["icons_move_document"] . '">' . $icon_pub_unpub : '') : - toDateFormat($content['createdon'] + $server_offset_time) ?> () + toDateFormat($content['createdon'] + $server_offset_time) ?> (config['modx_charset']) ?>) : - toDateFormat($content['editedon'] + $server_offset_time) ?> () + toDateFormat($content['editedon'] + $server_offset_time) ?> (config['modx_charset']) ?>) diff --git a/manager/actions/welcome.static.php b/manager/actions/welcome.static.php index a5055ade61..805457043c 100755 --- a/manager/actions/welcome.static.php +++ b/manager/actions/welcome.static.php @@ -603,23 +603,23 @@ function getRecentInfoRowTpl() { $tpl = ' [+id+] - [+pagetitle+] + [+pagetitle:htmlentities+] [+editedon:math("%s+[(server_offset_time)]"):dateFormat=`'.$modx->toDateFormat(0,'formatOnly').' %H:%M:%S`+] - [+username+] + [+username:htmlentities+] [+edit_btn+][+preview_btn+][+delete_btn+][+publish_btn+][+info_btn+]
          -
        • [%long_title%]: [+longtitle+]
        • -
        • [%description%]: [+description+]
        • -
        • [%resource_summary%]: [+introtext+]
        • +
        • [%long_title%]: [+longtitle:htmlentities+]
        • +
        • [%description%]: [+description:htmlentities+]
        • +
        • [%resource_summary%]: [+introtext:htmlentities+]
        • [%type%]: [+type:is(reference):then([%weblink%]):else([%resource%])+]
        • -
        • [%resource_alias%]: [+alias+]
        • +
        • [%resource_alias%]: [+alias:htmlentities+]
        • [%page_data_cacheable%]: [+cacheable:is(1):then([%yes%]):else([%no%])+]
        • [%resource_opt_show_menu%]: [+hidemenu:is(0):then([%yes%]):else([%no%])+]
        • -
        • [%page_data_template%]: [+template:templatename+]
        • +
        • [%page_data_template%]: [+template:templatename:htmlentities+]
        diff --git a/manager/frames/1.php b/manager/frames/1.php index a34aa16e55..665e84582a 100755 --- a/manager/frames/1.php +++ b/manager/frames/1.php @@ -143,7 +143,7 @@ MODX_MANAGER_URL: '', user: { role: , - username: '' + username: "config['modx_charset']) ?>" }, config: { mail_check_timeperiod: config['mail_check_timeperiod'] ?>, @@ -153,8 +153,8 @@ session_timeout: config['session_timeout'] ?>, site_start: config['site_start'] ?>, tree_page_click: config['tree_page_click']) ? (int)$modx->config['tree_page_click'] : 27) ?>, - theme: 'config['manager_theme'] ?>', - theme_mode: 'config['manager_theme_mode'] ?>', + theme: "config['manager_theme'], $modx->config['modx_charset']) ?>", + theme_mode: "config['manager_theme_mode'], $modx->config['modx_charset']) ?>", which_browser: '', layout: , textdir: '', @@ -325,9 +325,9 @@
      • ' . $row['name'] . ' (' . $row['id'] . ')
      • ' . "\n"; + $items .= '
      • ' . html_escape($row['name'], $modx->config['modx_charset']) . ' (' . $row['id'] . ')
      • ' . "\n"; } } @@ -192,7 +192,7 @@ $output .= '
      • '; } while ($row = $modx->db->getRow($sql)) { - $items .= '
      • ' . $row['name'] . ' (' . $row['id'] . ')
      • '; + $items .= '
      • ' . html_escape($row['name'], $modx->config['modx_charset']) . ' (' . $row['id'] . ')
      • '; } } @@ -265,7 +265,7 @@ $row = $modx->db->getRow($sql); $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $row['name'] + 'innerHTML' => ' ' . html_escape($row['name'], $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['edit'], @@ -275,17 +275,17 @@ if (!empty($row['description'])) { $contextmenu['seperator'] = ''; $contextmenu['description'] = array( - 'innerHTML' => ' ' . $row['description'] + 'innerHTML' => ' ' . html_escape($row['description'], $modx->config['modx_charset']) ); } } else { $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $name + 'innerHTML' => ' ' . html_escape($name, $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['new_snippet'], - 'url' => "index.php?a=23&itemname=" . $name + 'url' => "index.php?a=23&itemname=" . html_escape($name, $modx->config['modx_charset']) ) ); } @@ -303,7 +303,7 @@ $row = $modx->db->getRow($sql); $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $row['name'] + 'innerHTML' => ' ' . html_escape($row['name'], $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['edit'], @@ -313,17 +313,17 @@ if (!empty($row['description'])) { $contextmenu['seperator'] = ''; $contextmenu['description'] = array( - 'innerHTML' => ' ' . $row['description'] + 'innerHTML' => ' ' . html_escape($row['description'], $modx->config['modx_charset']) ); } } else { $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $name + 'innerHTML' => ' ' . html_escape($name, $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['new_htmlsnippet'], - 'url' => "index.php?a=77&itemname=" . $name + 'url' => "index.php?a=77&itemname=" . html_escape($name, $modx->config['modx_charset']) ) ); } @@ -340,7 +340,7 @@ $row = $modx->db->getRow($sql); $contextmenu = array( 'header' => array( - 'innerText' => $row['name'] + 'innerText' => html_escape($row['name'], $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['edit'], @@ -350,7 +350,7 @@ if (!empty($row['description'])) { $contextmenu['seperator'] = ''; $contextmenu['description'] = array( - 'innerHTML' => ' ' . $row['description'] + 'innerHTML' => ' ' . html_escape($row['description'], $modx->config['modx_charset']) ); } } else { @@ -364,7 +364,7 @@ $row = $modx->db->getRow($sql); $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $row['name'] + 'innerHTML' => ' ' . html_escape($row['name'], $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['edit'], @@ -374,21 +374,21 @@ if (!empty($row['description'])) { $contextmenu['seperator'] = ''; $contextmenu['description'] = array( - 'innerHTML' => ' ' . $row['description'] + 'innerHTML' => ' ' . html_escape($row['description'], $modx->config['modx_charset']) ); } } else { $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $name + 'innerHTML' => ' ' . html_escape($name, $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['new_htmlsnippet'], - 'url' => "index.php?a=77&itemname=" . $name + 'url' => "index.php?a=77&itemname=" . html_escape($name, $modx->config['modx_charset']) ), 'item2' => array( 'innerHTML' => ' ' . $_lang['new_snippet'], - 'url' => "index.php?a=23&itemname=" . $name + 'url' => "index.php?a=23&itemname=" . html_escape($name, $modx->config['modx_charset']) ) ); } @@ -452,7 +452,7 @@ $row = $modx->db->getRow($sql); $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $row['name'] + 'innerHTML' => ' ' . html_escape($row['name'], $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['edit'], @@ -462,17 +462,17 @@ if (!empty($row['description'])) { $contextmenu['seperator'] = ''; $contextmenu['description'] = array( - 'innerHTML' => ' ' . $row['description'] + 'innerHTML' => ' ' . html_escape($row['description'], $modx->config['modx_charset']) ); } } else { $contextmenu = array( 'header' => array( - 'innerHTML' => ' ' . $name + 'innerHTML' => ' ' . html_escape($name, $modx->config['modx_charset']) ), 'item' => array( 'innerHTML' => ' ' . $_lang['new_tmplvars'], - 'url' => "index.php?a=300&itemname=" . $name + 'url' => "index.php?a=300&itemname=" . html_escape($name, $modx->config['modx_charset']) ) ); } @@ -616,7 +616,7 @@ $output = !!$row['locked']; } } - + echo $output; break; From a176c043ecee46989e19fef2efec45f8cc2b20b6 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 25 Aug 2018 13:31:30 +0300 Subject: [PATCH 096/241] fix notice php7 --- manager/includes/document.parser.class.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 929b34b85b..ef9764d573 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -5862,7 +5862,7 @@ public function cleanUpMODXTags($content = '') list($left, $right) = explode(' ', $brackets); if (strpos($content, $left) !== false) { $matches = $this->getTagsFromContent($content, $left, $right); - $content = str_replace($matches[0], '', $content); + $content = isset($matches[0]) ? str_replace($matches[0], '', $content) : $content; } } $this->config['enable_filter'] = $enable_filter; From 86eebdd5ca02f0a08ce2d76516c1e8b0c44d3efc Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 25 Aug 2018 13:43:39 +0300 Subject: [PATCH 097/241] fix #792 --- manager/media/style/default/js/modx.js | 2 +- manager/media/style/default/js/modx.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index 77e3873ba7..4560027cc6 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1491,7 +1491,7 @@ this.timer = null; this.olduid = ''; this.closeactions = [6, 61, 62, 63, 94]; - this.saveAndCloseActions = [3, 75, 86, 99, 106]; + this.saveAndCloseActions = [75, 86, 99, 106]; this.reload = typeof a.reload !== 'undefined' ? a.reload : 1; this.action = modx.getActionFromUrl(a.url); this.uid = modx.getActionFromUrl(a.url, 2) ? 'home' : modx.urlToUid(a.url); diff --git a/manager/media/style/default/js/modx.min.js b/manager/media/style/default/js/modx.min.js index 996dcc70b7..700d94cb3e 100755 --- a/manager/media/style/default/js/modx.min.js +++ b/manager/media/style/default/js/modx.min.js @@ -1 +1 @@ -(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[3,75,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×

        '}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
        ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file +(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[75,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×
        '}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
        ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file From 149fdb0a20b5bb33f20ebbb8fb5922b9941afbbd Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 25 Aug 2018 13:48:58 +0300 Subject: [PATCH 098/241] Revert "fix #792" This reverts commit 86eebdd --- manager/media/style/default/js/modx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index 4560027cc6..77e3873ba7 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1491,7 +1491,7 @@ this.timer = null; this.olduid = ''; this.closeactions = [6, 61, 62, 63, 94]; - this.saveAndCloseActions = [75, 86, 99, 106]; + this.saveAndCloseActions = [3, 75, 86, 99, 106]; this.reload = typeof a.reload !== 'undefined' ? a.reload : 1; this.action = modx.getActionFromUrl(a.url); this.uid = modx.getActionFromUrl(a.url, 2) ? 'home' : modx.urlToUid(a.url); From 85094c9e5872eecf11064087f45f67915011537d Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sat, 25 Aug 2018 13:51:18 +0300 Subject: [PATCH 099/241] fix #780 --- manager/media/style/default/js/modx.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index 77e3873ba7..4560027cc6 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1491,7 +1491,7 @@ this.timer = null; this.olduid = ''; this.closeactions = [6, 61, 62, 63, 94]; - this.saveAndCloseActions = [3, 75, 86, 99, 106]; + this.saveAndCloseActions = [75, 86, 99, 106]; this.reload = typeof a.reload !== 'undefined' ? a.reload : 1; this.action = modx.getActionFromUrl(a.url); this.uid = modx.getActionFromUrl(a.url, 2) ? 'home' : modx.urlToUid(a.url); From dc005e5cd14f43a3375fe74abfebfa3bf0fc8d32 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Tue, 28 Aug 2018 19:34:48 +0300 Subject: [PATCH 100/241] fix #794 --- manager/media/style/default/css/custom.css | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/media/style/default/css/custom.css b/manager/media/style/default/css/custom.css index 570001399e..297f116648 100755 --- a/manager/media/style/default/css/custom.css +++ b/manager/media/style/default/css/custom.css @@ -130,6 +130,7 @@ table.actionButtons .searchtext { padding: 5px; height: 24px; width: 150px; } } /* [ TABLES ] */ /* table */ +table { font-size: 0.8125rem } .table th, .table td { padding: 0.15rem 0.25rem; } /* table-data */ .table.data { width: 100%; max-width: 100%; margin-bottom: 0; border-bottom: 1px solid #eceeef } From 473725d08715ed8ba16a32a91b2b28f42c47bc1f Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Tue, 28 Aug 2018 20:18:58 +0300 Subject: [PATCH 101/241] fixed #794 --- manager/media/style/default/css/custom.css | 1 - manager/media/style/default/css/fonts.css | 3 +++ manager/media/style/default/css/index.css | 2 +- manager/processors/execute_module.processor.php | 7 +------ 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/manager/media/style/default/css/custom.css b/manager/media/style/default/css/custom.css index 297f116648..570001399e 100755 --- a/manager/media/style/default/css/custom.css +++ b/manager/media/style/default/css/custom.css @@ -130,7 +130,6 @@ table.actionButtons .searchtext { padding: 5px; height: 24px; width: 150px; } } /* [ TABLES ] */ /* table */ -table { font-size: 0.8125rem } .table th, .table td { padding: 0.15rem 0.25rem; } /* table-data */ .table.data { width: 100%; max-width: 100%; margin-bottom: 0; border-bottom: 1px solid #eceeef } diff --git a/manager/media/style/default/css/fonts.css b/manager/media/style/default/css/fonts.css index 0b6dd0686d..f083024daf 100755 --- a/manager/media/style/default/css/fonts.css +++ b/manager/media/style/default/css/fonts.css @@ -5,6 +5,9 @@ html { font-size: 16px; } @media (max-width: 400px) { html { font-size: 16px; } } +@supports (-webkit-overflow-scrolling: touch) { +html, body { -webkit-overflow-scrolling: touch; overflow: auto; height: 100%; /* ios iframe scroll jumping to top fix */ } +} body { font-weight: normal; font-style: normal; font-size: 0.8125rem; line-height: 1.5; font-family: sans-serif; -webkit-font-smoothing: subpixel-antialiased } /* For Arabic Font */ html[lang="ar"] body, html[lang="ary"] body, html[lang="azb"] body, html[lang="fa-IR"] body, html[lang="haz"] body, html[lang="ps"] body, html[lang="ur"] body { font-family: Tahoma, Arial, sans-serif; } diff --git a/manager/media/style/default/css/index.css b/manager/media/style/default/css/index.css index ce4ddf94fc..782f848d23 100755 --- a/manager/media/style/default/css/index.css +++ b/manager/media/style/default/css/index.css @@ -1,5 +1,5 @@ @supports (-webkit-overflow-scrolling: touch) { -html, body { height: 100%; overflow: auto; -webkit-overflow-scrolling: touch; /* ios iframe scroll jumping to top fix */ } +html, body { -webkit-overflow-scrolling: touch; overflow: auto; height: 100%; /* ios iframe scroll jumping to top fix */ } } #frameset { position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; } #mainMenu, #tree, #main { position: absolute; } diff --git a/manager/processors/execute_module.processor.php b/manager/processors/execute_module.processor.php index ee31459948..6ef338771c 100755 --- a/manager/processors/execute_module.processor.php +++ b/manager/processors/execute_module.processor.php @@ -59,12 +59,7 @@ // Set the item name for logger $_SESSION['itemname'] = $content['name']; - -$output = evalModule($content["modulecode"],$parameter); -if (strpos(trim($output),'<')===0 && strpos(trim($output),'@supports (-webkit-overflow-scrolling: touch) {body,html {-webkit-overflow-scrolling: touch;overflow:auto!important;height:100%!important}}"; // for iframe scroller -} -echo $output; +echo evalModule($content["modulecode"], $parameter); include MODX_MANAGER_PATH."includes/sysalert.display.inc.php"; /** From 841ac1ff973db44ed4d75b4072915c2d26ec1c57 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 30 Aug 2018 13:35:41 +0300 Subject: [PATCH 102/241] fix not working clientResize option --- manager/media/browser/mcpuk/tpl/tpl_javascript.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/browser/mcpuk/tpl/tpl_javascript.php b/manager/media/browser/mcpuk/tpl/tpl_javascript.php index 76ac4dade6..afc7365c60 100755 --- a/manager/media/browser/mcpuk/tpl/tpl_javascript.php +++ b/manager/media/browser/mcpuk/tpl/tpl_javascript.php @@ -25,7 +25,7 @@ browser.siteURL = "config['siteURL']) ?>"; browser.assetsURL = "config['assetsURL']) ?>"; browser.thumbsURL = browser.assetsURL + "/config['thumbsDir']) ?>"; -browser.clientResize = "config['clientResize'])) ?>"; +browser.clientResize = config['clientResize'])) ?>; browser.allowedExts = /types[$this->type]))) ?>$/; browser.deniedExts = /config['deniedExts']))) ?>$/; browser.maxFileSize = config['maxfilesize']) ?>; From 6385ac4ba678ed4fcc4b7c7510047dc46b48b6c1 Mon Sep 17 00:00:00 2001 From: luigif Date: Thu, 30 Aug 2018 13:23:05 +0200 Subject: [PATCH 103/241] Update mutate_categories.dynamic.php Was using the name "Categories Manager" instead of the proper translation --- manager/actions/mutate_categories.dynamic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/actions/mutate_categories.dynamic.php b/manager/actions/mutate_categories.dynamic.php index f58cede882..ea7b934e61 100755 --- a/manager/actions/mutate_categories.dynamic.php +++ b/manager/actions/mutate_categories.dynamic.php @@ -13,7 +13,7 @@ 'module_id' => $_GET['id'], 'package_name' => 'Module_Categories_Manager', 'native_language' => 'de', - 'name' => 'Categories Manager', + 'name' => $_lang['manage_categories'], 'dirname' => $site_manager_url, 'url' => 'index.php?a=120&id=' . $_GET['id'], 'path' => realpath( dirname(__FILE__) ) . DIRECTORY_SEPARATOR . 'category_mgr' . DIRECTORY_SEPARATOR, From bc457c79a2455a6ca6e3de9a1abc191527b9d254 Mon Sep 17 00:00:00 2001 From: luigif Date: Thu, 30 Aug 2018 15:06:25 +0200 Subject: [PATCH 104/241] Rename 01About_EVO.php to 01About_Title.php File name should refer to the string to be used for translation --- manager/actions/help/{01About_EVO.php => 01About_Title.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename manager/actions/help/{01About_EVO.php => 01About_Title.php} (100%) diff --git a/manager/actions/help/01About_EVO.php b/manager/actions/help/01About_Title.php similarity index 100% rename from manager/actions/help/01About_EVO.php rename to manager/actions/help/01About_Title.php From 373c31cfea6341b72f40b3baa7b07e21df6fa605 Mon Sep 17 00:00:00 2001 From: luigif Date: Thu, 30 Aug 2018 16:17:47 +0200 Subject: [PATCH 105/241] Update search.static.php --- manager/actions/search.static.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/actions/search.static.php b/manager/actions/search.static.php index b2e40438d1..04314e1451 100755 --- a/manager/actions/search.static.php +++ b/manager/actions/search.static.php @@ -40,7 +40,7 @@
        db->select('*', $modx->getFullTableName('site_templates')); - $option[] = ''; + $option[] = ''; $templateid = (isset($_REQUEST['templateid']) && $_REQUEST['templateid'] !== '') ? (int)$_REQUEST['templateid'] : ''; $selected = $templateid === 0 ? ' selected="selected"' : ''; $option[] = ''; From f99b291dd86a880ea4ae712377e8db17109fc08c Mon Sep 17 00:00:00 2001 From: luigif Date: Thu, 30 Aug 2018 16:21:17 +0200 Subject: [PATCH 106/241] Update search.static.php "No selected" untraslated string was used --- manager/actions/search.static.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/actions/search.static.php b/manager/actions/search.static.php index 04314e1451..43fab88c8c 100755 --- a/manager/actions/search.static.php +++ b/manager/actions/search.static.php @@ -40,7 +40,7 @@
        db->select('*', $modx->getFullTableName('site_templates')); - $option[] = ''; + $option[] = ''; $templateid = (isset($_REQUEST['templateid']) && $_REQUEST['templateid'] !== '') ? (int)$_REQUEST['templateid'] : ''; $selected = $templateid === 0 ? ' selected="selected"' : ''; $option[] = ''; From 9201cd8ea0e32c5b3ba2bbf32db850e1c05a347e Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sun, 2 Sep 2018 15:07:24 +0300 Subject: [PATCH 107/241] fix view svg --- manager/media/browser/mcpuk/js/browser/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/media/browser/mcpuk/js/browser/files.js b/manager/media/browser/mcpuk/js/browser/files.js index 7754f83269..18a04b7b6c 100755 --- a/manager/media/browser/mcpuk/js/browser/files.js +++ b/manager/media/browser/mcpuk/js/browser/files.js @@ -78,7 +78,7 @@ browser.showFiles = function(callBack, selected) { } else { if (file.thumb) var icon = browser.baseGetData('thumb') + '&file=' + encodeURIComponent(file.name) + '&dir=' + encodeURIComponent(browser.dir) + '&stamp=' + stamp; - else if (file.smallThumb) { + else if (file.smallThumb || _.getFileExtension(file.name) === 'svg') { var icon = browser.siteURL + browser.assetsURL + '/' + browser.dir + '/' + file.name; icon = _.escapeDirs(icon).replace(/\'/g, "%27"); } else { From f6d50671e9c65ba84e0c22c0f14a3babcf8a2d79 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sun, 9 Sep 2018 13:47:28 +0300 Subject: [PATCH 108/241] fix escape search result --- manager/actions/search.static.php | 168 +++++++++++++++++++----------- 1 file changed, 107 insertions(+), 61 deletions(-) diff --git a/manager/actions/search.static.php b/manager/actions/search.static.php index b2e40438d1..8833012f03 100755 --- a/manager/actions/search.static.php +++ b/manager/actions/search.static.php @@ -1,5 +1,5 @@
        - +
        @@ -45,9 +46,11 @@ $selected = $templateid === 0 ? ' selected="selected"' : ''; $option[] = ''; while ($row = $modx->db->getRow($rs)) { - $templatename = htmlspecialchars($row['templatename'], ENT_QUOTES, $modx->config['modx_charset']); + $templatename = htmlspecialchars($row['templatename'], ENT_QUOTES, + $modx->config['modx_charset']); $selected = $row['id'] == $templateid ? ' selected="selected"' : ''; - $option[] = sprintf('', $row['id'], $selected, $templatename, $row['id']); + $option[] = sprintf('', $row['id'], $selected, + $templatename, $row['id']); } $tpls = sprintf('', implode("\n", $option)); ?> @@ -58,21 +61,24 @@
        URL
        - +
        - +
        "> - "> + "> +
        @@ -113,31 +119,31 @@ // Handle Input "Search in main fields" if ($searchfields != '') { - /*start search by TV. Added Rising13*/ - $tbl_site_tmplvar_contentvalues = $modx->getFullTableName('site_tmplvar_contentvalues'); - $articul_query = "SELECT `contentid` FROM {$tbl_site_tmplvar_contentvalues} WHERE `value` LIKE '%{$searchfields}%'"; - $articul_result = $modx->db->query($articul_query); - $articul_id_array = $modx->db->makeArray($articul_result); - if(count($articul_id_array)>0){ - $articul_id = ''; - $i = 1; - foreach( $articul_id_array as $articul ) { - $articul_id.=$articul['contentid']; - if($i !== count($articul_id_array)){ - $articul_id.=','; - } - $i++; - } - $articul_id_query = " OR sc.id IN ({$articul_id})"; - }else{ - $articul_id_query = ''; - } - /*end search by TV*/ + /*start search by TV. Added Rising13*/ + $tbl_site_tmplvar_contentvalues = $modx->getFullTableName('site_tmplvar_contentvalues'); + $articul_query = "SELECT `contentid` FROM {$tbl_site_tmplvar_contentvalues} WHERE `value` LIKE '%{$searchfields}%'"; + $articul_result = $modx->db->query($articul_query); + $articul_id_array = $modx->db->makeArray($articul_result); + if (count($articul_id_array) > 0) { + $articul_id = ''; + $i = 1; + foreach ($articul_id_array as $articul) { + $articul_id .= $articul['contentid']; + if ($i !== count($articul_id_array)) { + $articul_id .= ','; + } + $i++; + } + $articul_id_query = " OR sc.id IN ({$articul_id})"; + } else { + $articul_id_query = ''; + } + /*end search by TV*/ if (ctype_digit($searchfields)) { $sqladd .= "sc.id='{$searchfields}'"; if (strlen($searchfields) > 3) { - $sqladd .= $articul_id_query;//search by TV + $sqladd .= $articul_id_query;//search by TV $sqladd .= " OR sc.pagetitle LIKE '%{$searchfields}%'"; } } @@ -160,7 +166,7 @@ $sqladd .= $articul_id_query;//search by TV $sqladd .= ")"; } - } else if ($idFromAlias) { + } elseif ($idFromAlias) { $sqladd .= " sc.id='{$idFromAlias}'"; } @@ -178,7 +184,8 @@ // get document groups for current user if (!empty($modx->config['use_udperms']) && $sqladd) { - $docgrp = (isset($_SESSION['mgrDocgroups']) && is_array($_SESSION['mgrDocgroups'])) ? implode(',', $_SESSION['mgrDocgroups']) : ''; + $docgrp = (isset($_SESSION['mgrDocgroups']) && is_array($_SESSION['mgrDocgroups'])) ? implode(',', + $_SESSION['mgrDocgroups']) : ''; $mgrRole = (isset ($_SESSION['mgrRole']) && $_SESSION['mgrRole'] == 1) ? 1 : 0; $docgrp_cond = $docgrp ? " OR dg.document_group IN ({$docgrp})" : ''; $fields .= ', MAX(IF(1=' . $mgrRole . ' OR sc.privatemgr=0' . $docgrp_cond . ',1,0)) AS hasAccess'; @@ -192,7 +199,8 @@ $where = $sqladd; if ($where) { - $rs = $modx->db->select($fields, $tbl_site_content . ' AS sc LEFT JOIN ' . $tbldg . ' AS dg ON dg.document=sc.id', $where, 'sc.id'); + $rs = $modx->db->select($fields, + $tbl_site_content . ' AS sc LEFT JOIN ' . $tbldg . ' AS dg ON dg.document=sc.id', $where, 'sc.id'); $limit = $modx->db->getRecordCount($rs); } else { $limit = 0; @@ -263,7 +271,8 @@ ?> - + + @@ -271,14 +280,20 @@ if (function_exists('mb_strlen') && function_exists('mb_substr')) { ?> > - 70 ? mb_substr($row['pagetitle'], 0, 70, $modx_manager_charset) . "..." : $row['pagetitle'] ?> + 70 ? mb_substr($row['pagetitle'], 0, 70, + $modx_manager_charset) . "..." : $row['pagetitle'] ?> - > 70 ? mb_substr($row['description'], 0, 70, $modx_manager_charset) . "..." : $row['description'] ?> + > 70 ? mb_substr($row['description'], 0, 70, + $modx_manager_charset) . "..." : $row['description'] ?> - > 20 ? substr($row['pagetitle'], 0, 20) . '...' : $row['pagetitle'] ?> - > 35 ? substr($row['description'], 0, 35) . '...' : $row['description'] ?> + > 20 ? substr($row['pagetitle'], 0, + 20) . '...' : $row['pagetitle'] ?> + > 35 ? substr($row['description'], + 0, 35) . '...' : $row['description'] ?> @@ -300,14 +315,18 @@ if ($docscounts > 0) { $output .= '
      • ' . $_lang["manage_documents"] . ' (' . $docscounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['pagetitle'] . ' (' . $row['id'] . ')', $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['pagetitle'], + $_REQUEST['searchfields']) . ' (' . highlightingCoincidence($row['id'], + $_REQUEST['searchfields']) . ')' . $_style['icons_external_link'] . ''; } } } //templates if ($modx->hasPermission('edit_template')) { - $rs = $modx->db->select("id,templatename,locked", $modx->getFullTableName('site_templates'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,templatename,locked", $modx->getFullTableName('site_templates'), + "`id` like '%" . $searchfields . "%' OR `templatename` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `content` like '%" . $searchfields . "%'"); @@ -315,14 +334,16 @@ if ($templatecounts > 0) { $output .= '
      • ' . $_lang["manage_templates"] . ' (' . $templatecounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['templatename'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['templatename'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } //tvs if ($modx->hasPermission('edit_template') && $modx->hasPermission('edit_snippet') && $modx->hasPermission('edit_chunk') && $modx->hasPermission('edit_plugin')) { - $rs = $modx->db->select("id,name,locked", $modx->getFullTableName('site_tmplvars'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,name,locked", $modx->getFullTableName('site_tmplvars'), + "`id` like '%" . $searchfields . "%' OR `name` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `type` like '%" . $searchfields . "%' @@ -334,14 +355,16 @@ if ($tvscounts > 0) { $output .= '
      • ' . $_lang["settings_templvars"] . ' (' . $tvscounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['name'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['name'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } //Chunks if ($modx->hasPermission('edit_chunk')) { - $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_htmlsnippets'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_htmlsnippets'), + "`id` like '%" . $searchfields . "%' OR `name` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `snippet` like '%" . $searchfields . "%'"); @@ -349,14 +372,17 @@ if ($chunkscounts > 0) { $output .= '
      • ' . $_lang["manage_htmlsnippets"] . ' (' . $chunkscounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['name'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['name'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } //Snippets if ($modx->hasPermission('edit_snippet')) { - $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_snippets'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_snippets'), + "`id` like '%" . $searchfields . "%' OR `name` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `snippet` like '%" . $searchfields . "%' @@ -366,14 +392,17 @@ if ($snippetscounts > 0) { $output .= '
      • ' . $_lang["manage_snippets"] . ' (' . $snippetscounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['name'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['name'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } //plugins if ($modx->hasPermission('edit_plugin')) { - $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_plugins'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_plugins'), + "`id` like '%" . $searchfields . "%' OR `name` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `plugincode` like '%" . $searchfields . "%' @@ -383,14 +412,17 @@ if ($pluginscounts > 0) { $output .= '
      • ' . $_lang["manage_plugins"] . ' (' . $pluginscounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['name'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['name'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } //modules if ($modx->hasPermission('edit_module')) { - $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_modules'), "`id` like '%" . $searchfields . "%' + $rs = $modx->db->select("id,name,locked,disabled", $modx->getFullTableName('site_modules'), + "`id` like '%" . $searchfields . "%' OR `name` like '%" . $searchfields . "%' OR `description` like '%" . $searchfields . "%' OR `modulecode` like '%" . $searchfields . "%' @@ -401,7 +433,9 @@ if ($modulescounts > 0) { $output .= '
      • ' . $_lang["modules"] . ' (' . $modulescounts . ')
      • '; while ($row = $modx->db->getRow($rs)) { - $output .= '' . highlightingCoincidence($row['name'], $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; + $output .= '' . highlightingCoincidence($row['name'], + $_REQUEST['searchfields']) . $_style['icons_external_link'] . ''; } } } @@ -420,17 +454,26 @@ * @param string $search * @return string */ -function highlightingCoincidence($text, $search) -{ +function highlightingCoincidence( + $text, + $search +) { global $modx; - $regexp = '!(' . str_replace(array( - '(', - ')' - ), array( - '\(', - '\)' - ), html_escape(trim($search), $modx->config['modx_charset'])) . ')!isu'; - return preg_replace($regexp, '$1', html_escape($text, $modx->config['modx_charset'])); + if (is_numeric($search) && $text == $search) { + $out = '' . $search . ''; + } else { + $regexp = '!(' . str_replace(array( + '(', + ')' + ), array( + '\(', + '\)' + ), html_escape(trim($search), $modx->config['modx_charset'])) . ')!isu'; + $out = preg_replace($regexp, '$1', + html_escape($text, $modx->config['modx_charset'])); + } + + return $out; } /** @@ -439,8 +482,11 @@ function highlightingCoincidence($text, $search) * @param string $deleted * @return string */ -function addClassForItemList($locked = '', $disabled = '', $deleted = '') -{ +function addClassForItemList( + $locked = '', + $disabled = '', + $deleted = '' +) { $class = ''; if ($locked) { $class .= 'locked'; From f4632e57138af93122ecc5263803bc840e3b66db Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sun, 9 Sep 2018 14:35:56 +0300 Subject: [PATCH 109/241] fix escape for widget docs --- manager/actions/welcome.static.php | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/manager/actions/welcome.static.php b/manager/actions/welcome.static.php index 805457043c..dc5db1df90 100755 --- a/manager/actions/welcome.static.php +++ b/manager/actions/welcome.static.php @@ -580,18 +580,10 @@ function getRecentInfoList() { $ph['info_btn'] = str_replace('[+id+]', $docid, ''); - if($ph['longtitle'] == '') { - $ph['longtitle'] = '([%not_set%])'; - } - if($ph['description'] == '') { - $ph['description'] = '([%not_set%])'; - } - if($ph['introtext'] == '') { - $ph['introtext'] = '([%not_set%])'; - } - if($ph['alias'] == '') { - $ph['alias'] = '([%not_set%])'; - } + $ph['longtitle'] = $ph['longtitle'] == '' ? '([%not_set%])' : html_escape($ph['longtitle']); + $ph['description'] = $ph['description'] == '' ? '([%not_set%])' : html_escape($ph['description']); + $ph['introtext'] = $ph['introtext'] == '' ? '([%not_set%])' : html_escape($ph['introtext']); + $ph['alias'] = $ph['alias'] == '' ? '([%not_set%])' : html_escape($ph['alias']); $output[] = $modx->parseText($tpl, $ph); } @@ -612,11 +604,11 @@ function getRecentInfoRowTpl() {
          -
        • [%long_title%]: [+longtitle:htmlentities+]
        • -
        • [%description%]: [+description:htmlentities+]
        • -
        • [%resource_summary%]: [+introtext:htmlentities+]
        • +
        • [%long_title%]: [+longtitle+]
        • +
        • [%description%]: [+description+]
        • +
        • [%resource_summary%]: [+introtext+]
        • [%type%]: [+type:is(reference):then([%weblink%]):else([%resource%])+]
        • -
        • [%resource_alias%]: [+alias:htmlentities+]
        • +
        • [%resource_alias%]: [+alias+]
        • [%page_data_cacheable%]: [+cacheable:is(1):then([%yes%]):else([%no%])+]
        • [%resource_opt_show_menu%]: [+hidemenu:is(0):then([%yes%]):else([%no%])+]
        • [%page_data_template%]: [+template:templatename:htmlentities+]
        • From 5471839a9707f6ed2205de98f215dc50126f8711 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Sun, 9 Sep 2018 15:06:48 +0300 Subject: [PATCH 110/241] fix escape name components --- manager/processors/cache_sync.class.processor.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manager/processors/cache_sync.class.processor.php b/manager/processors/cache_sync.class.processor.php index 2a4c73946a..8d6b9c8efc 100755 --- a/manager/processors/cache_sync.class.processor.php +++ b/manager/processors/cache_sync.class.processor.php @@ -252,7 +252,7 @@ public function buildCache($modx) $config = array(); $content .= '$c=&$this->config;'; while (list($key, $value) = $modx->db->getRow($rs, 'num')) { - $content .= '$c[\'' . $key . '\']="' . $this->escapeDoubleQuotes($value) . '";'; + $content .= '$c[\'' . $modx->db->escape($key) . '\']="' . $this->escapeDoubleQuotes($value) . '";'; $config[$key] = $value; } @@ -313,7 +313,7 @@ public function buildCache($modx) $rs = $modx->db->select('*', '[+prefix+]site_htmlsnippets'); $content .= '$c=&$this->chunkCache;'; while ($doc = $modx->db->getRow($rs)) { - $content .= '$c[\'' . $doc['name'] . '\']=\'' . ($doc['disabled'] ? '' : $this->escapeSingleQuotes($doc['snippet'])) . '\';'; + $content .= '$c[\'' . $modx->db->escape($doc['name']) . '\']=\'' . ($doc['disabled'] ? '' : $this->escapeSingleQuotes($doc['snippet'])) . '\';'; } // WRITE snippets to cache file @@ -322,7 +322,7 @@ public function buildCache($modx) $rs = $modx->db->select($f, $from); $content .= '$s=&$this->snippetCache;'; while ($row = $modx->db->getRow($rs)) { - $key = $row['name']; + $key = $modx->db->escape($row['name']); if ($row['disabled']) { $content .= '$s[\'' . $key . '\']=\'return false;\';'; } else { @@ -348,7 +348,7 @@ public function buildCache($modx) $rs = $modx->db->select($f, $from, 'sp.disabled=0'); $content .= '$p=&$this->pluginCache;'; while ($row = $modx->db->getRow($rs)) { - $key = $row['name']; + $key = $modx->db->escape($row['name']); $value = trim($row['plugincode']); if ($modx->config['minifyphp_incache']) { $value = $this->php_strip_whitespace($value); From 9799c7e13d6660ef9c3831e4e869d59b8f6e0150 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Sun, 16 Sep 2018 01:44:35 +0300 Subject: [PATCH 111/241] fix browser resize issues of kcfinder --- manager/media/browser/mcpuk/js/browser/uploader.js | 5 +++++ manager/media/browser/mcpuk/tpl/tpl_javascript.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/manager/media/browser/mcpuk/js/browser/uploader.js b/manager/media/browser/mcpuk/js/browser/uploader.js index d35c61e0e8..45483dc069 100755 --- a/manager/media/browser/mcpuk/js/browser/uploader.js +++ b/manager/media/browser/mcpuk/js/browser/uploader.js @@ -89,6 +89,11 @@ browser.uploadFiles = function(files) { dir: browser.dir }, imageAutoOrientation: false, + prepare: function (file/**Object*/, options/**Object*/){ + if (file.type !== 'image/jpeg' && file.type !== 'image/png') { + options.imageTransform = false; + } + }, upload: function() { $('#loading').html(browser.label("Uploading file {number} of {count}... {progress}", { number: uploaded++, diff --git a/manager/media/browser/mcpuk/tpl/tpl_javascript.php b/manager/media/browser/mcpuk/tpl/tpl_javascript.php index afc7365c60..e75c16f88c 100755 --- a/manager/media/browser/mcpuk/tpl/tpl_javascript.php +++ b/manager/media/browser/mcpuk/tpl/tpl_javascript.php @@ -25,7 +25,7 @@ browser.siteURL = "config['siteURL']) ?>"; browser.assetsURL = "config['assetsURL']) ?>"; browser.thumbsURL = browser.assetsURL + "/config['thumbsDir']) ?>"; -browser.clientResize = config['clientResize'])) ?>; +browser.clientResize = config['clientResize']) ?>; browser.allowedExts = /types[$this->type]))) ?>$/; browser.deniedExts = /config['deniedExts']))) ?>$/; browser.maxFileSize = config['maxfilesize']) ?>; From f786a4180fb4b9f4db3702429f1dac805b6b6e84 Mon Sep 17 00:00:00 2001 From: Mr B Date: Thu, 27 Sep 2018 10:11:34 +0100 Subject: [PATCH 112/241] [F] Fix unable to uncheck permissions --- manager/processors/save_content.processor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/processors/save_content.processor.php b/manager/processors/save_content.processor.php index 82bd272c21..b3a854388a 100755 --- a/manager/processors/save_content.processor.php +++ b/manager/processors/save_content.processor.php @@ -591,7 +591,7 @@ $isManager = $modx->hasPermission('access_permissions'); $isWeb = $modx->hasPermission('web_access_permissions'); $rs = $modx->db->select( - 'groups_document.id, groups.document_group', + 'groups_document.id, groups_document.document_group', "{$tbl_document_groups} AS groups_document LEFT JOIN {$tbl_documentgroup_names} AS dgn ON dgn.id = groups_document.document_group", "((1=".(int)$isManager." AND dgn.private_memgroup) OR (1=".(int)$isWeb." AND dgn.private_webgroup)) AND groups_document.document = '{$id}'" From f4e8d1b765ca7df592e3935d50e2b5d73fdcbab1 Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 12:13:12 +0200 Subject: [PATCH 113/241] Login form style Settings #800 --- .../tab4_manager_settings.inc.php | 17 +++++-- manager/includes/accesscontrol.inc.php | 2 + manager/includes/default_config.php | 1 + manager/includes/lang/english.inc.php | 3 ++ manager/media/style/default/login.tpl | 48 +++++++++++-------- 5 files changed, 47 insertions(+), 24 deletions(-) diff --git a/manager/actions/mutate_settings/tab4_manager_settings.inc.php b/manager/actions/mutate_settings/tab4_manager_settings.inc.php index e013186110..78069daad7 100755 --- a/manager/actions/mutate_settings/tab4_manager_settings.inc.php +++ b/manager/actions/mutate_settings/tab4_manager_settings.inc.php @@ -70,7 +70,7 @@
          - +
          [(manager_theme_mode)] @@ -140,7 +140,18 @@
          - + +
          [(login_form_style)] + +
          +
          + + + + +
          + +
          [(manager_menu_position)] @@ -683,4 +694,4 @@ function SetUrl(url, width, height, alt) { return; } } - \ No newline at end of file + diff --git a/manager/includes/accesscontrol.inc.php b/manager/includes/accesscontrol.inc.php index c793e61628..7de125cb48 100755 --- a/manager/includes/accesscontrol.inc.php +++ b/manager/includes/accesscontrol.inc.php @@ -115,6 +115,8 @@ $modx->setPlaceholder('manager_theme_style', 'darkness'); break; } + // set form style css class + $modx->setPlaceholder('login_form_style_class', 'loginbox-' . $modx->config['login_form_style']); // andrazk 20070416 - notify user of install/update if (isset($_GET['installGoingOn'])) { diff --git a/manager/includes/default_config.php b/manager/includes/default_config.php index 33bbc3ba9b..d31129cf12 100755 --- a/manager/includes/default_config.php +++ b/manager/includes/default_config.php @@ -109,5 +109,6 @@ $c['global_tabs'] = 1; $c['manager_theme_mode'] = '3'; $c['login_form_position'] = 'left'; +$c['login_form_style'] = 'dark'; $c['manager_menu_position'] = 'top'; $c['tinymce4_skin'] = 'lightgray'; diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index b7f2d26d65..662a4558f4 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -1500,6 +1500,9 @@ $_lang['login_form_position_left'] = 'left'; $_lang['login_form_position_center'] = 'center'; $_lang['login_form_position_right'] = 'right'; +$_lang["login_form_style"] = 'Login form style:'; +$_lang["login_form_style_dark"] = 'dark'; +$_lang["login_form_style_light"] = 'light'; $_lang['login_logo_title'] = 'Login page logo image'; $_lang['login_logo_message'] = 'Recomended login logo image width: 360px, type .png'; $_lang['login_bg_title'] = 'Login page background image'; diff --git a/manager/media/style/default/login.tpl b/manager/media/style/default/login.tpl index 99a074005e..3365ad3cec 100755 --- a/manager/media/style/default/login.tpl +++ b/manager/media/style/default/login.tpl @@ -11,13 +11,13 @@ html { font-size: 16px; } - + html, body { min-height: 100%; height: 100%; } - + body.loginbox-center { min-height: 1px; height: auto; @@ -44,7 +44,7 @@ background-image: none !important; } } - + /* page div */ .page { @@ -68,11 +68,11 @@ margin-bottom: 20vh; } } - + .darkness .page { background-color: transparent; } - + /* loginbox */ .loginbox { @@ -117,13 +117,19 @@ min-height: 1px; } } - + .loginbox, .dark .loginbox, .darkness .loginbox { background-color: rgba(0,0,0,0.85); transition: background ease-in-out .3s; } + .loginbox.loginbox-light { + background-color: rgba(255,255,255,0.85); + } + .loginbox.loginbox-dark { + background-color: rgba(0,0,0,0.85); + } @media (max-width: 479px) { .loginbox, .dark .loginbox, @@ -131,17 +137,17 @@ background-color: transparent; } } - + /* form */ .loginbox form a { color: #818a91; } - + .darkness .loginbox form { background-color: transparent; } - + /* container */ .container-body { @@ -225,7 +231,7 @@ .copyrights a { color: #fff } - + /* buttons */ .btn, @@ -259,14 +265,14 @@ #submitButton{ float: right; } - + /* onManagerLoginFormRender */ #onManagerLoginFormRender { margin-top: 3rem; color: #fff; } - + /* FMP - forgot password */ @media (min-width: 768px) { @@ -289,7 +295,7 @@ #FMP-email_button { float: right; } - + /* form controls */ .form-control, @@ -323,7 +329,7 @@ outline: 0 none !important; background-color: rgba(255,255,255,.3) !important; } - + /* form groups */ .form-group--logo { @@ -403,7 +409,7 @@ } /* loginbox keyframes */ - + @-webkit-keyframes anim-loginbox { from { opacity: 0; @@ -425,7 +431,7 @@ transform: translate3d(0,0,0); } } - + @-webkit-keyframes anim-loginbox-right { from { opacity: 0; @@ -443,7 +449,7 @@ opacity: 1; } } - + @-webkit-keyframes anim-loginbox-center { from { opacity: 0; @@ -469,7 +475,7 @@
          -
          +
          @@ -481,7 +487,7 @@
          - +
          @@ -510,7 +516,7 @@ [+OnManagerLoginFormRender+] - +
          @@ -560,4 +566,4 @@ /* ]]> */ - \ No newline at end of file + From 9d2a81ada1fcf7c6c1242aa991fc0d32bde814ea Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 12:30:02 +0200 Subject: [PATCH 114/241] Updated extrascheck plugin v1.4.5 CHANGED: Show widget for - AdminOnly is now the default setting ADDED: check outdated modx rss news feed --- assets/plugins/extrascheck/lang/english.php | 3 + assets/plugins/extrascheck/lang/italian.php | 2 + .../plugins/extrascheck/lang/russian-UTF8.php | 2 + assets/plugins/extrascheck/lang/spanish.php | 2 + .../assets/plugins/OutdatedExtrasCheck.tpl | 81 ++++++++++--------- 5 files changed, 54 insertions(+), 36 deletions(-) diff --git a/assets/plugins/extrascheck/lang/english.php b/assets/plugins/extrascheck/lang/english.php index 2ea1b2d593..7e9da9b124 100755 --- a/assets/plugins/extrascheck/lang/english.php +++ b/assets/plugins/extrascheck/lang/english.php @@ -13,9 +13,12 @@ // $_oec_lang['title'] = 'Extras compatibility check'; +$_oec_lang['outdated'] = 'is outdated'; $_oec_lang['isoutdated'] = 'is outdated and no longer compatible with'; +$_oec_lang['no'] = 'is outdated and no longer compatible with'; $_oec_lang['please_update'] = 'Please update'; $_oec_lang['please_delete'] = 'Please delete'; +$_oec_lang['please_download_and_install'] = 'Please download and install'; $_oec_lang["to_latest"] = 'to the latest version'; $_oec_lang['min _required'] = 'min required'; $_oec_lang['from'] = 'from'; diff --git a/assets/plugins/extrascheck/lang/italian.php b/assets/plugins/extrascheck/lang/italian.php index b7543e566d..b62e4d1402 100755 --- a/assets/plugins/extrascheck/lang/italian.php +++ b/assets/plugins/extrascheck/lang/italian.php @@ -13,9 +13,11 @@ // $_oec_lang['title'] = 'Controllo Compatibilità Extras'; +$_oec_lang['outdated'] = 'è obsoleto'; $_oec_lang['isoutdated'] = 'è obsoleto e non compatibile con'; $_oec_lang['please_update'] = 'Aggiorna'; $_oec_lang['please_delete'] = 'Per favore cancellalo'; +$_oec_lang['please_download_and_install'] = 'Per favore scarica e installa'; $_oec_lang["to_latest"] = 'all\'ultima versione'; $_oec_lang['min _required'] = 'minima richiesta '; $_oec_lang['from'] = 'dal'; diff --git a/assets/plugins/extrascheck/lang/russian-UTF8.php b/assets/plugins/extrascheck/lang/russian-UTF8.php index 56ec6ec348..8caa689221 100755 --- a/assets/plugins/extrascheck/lang/russian-UTF8.php +++ b/assets/plugins/extrascheck/lang/russian-UTF8.php @@ -13,9 +13,11 @@ // $_oec_lang['title'] = 'Проверка совместимости дополнений'; +$_oec_lang['outdated'] = 'устаревший'; $_oec_lang['isoutdated'] = ' устаревший и больше не совместим с'; $_oec_lang['please_update'] = 'Обновить'; $_oec_lang['please_delete'] = 'Пожалуйста, удалите'; +$_oec_lang['please_download_and_install'] = 'скачать и установить'; $_oec_lang["to_latest"] = 'до последней версии'; $_oec_lang['min required'] = 'минимально необходимый'; $_oec_lang['from'] = 'from'; diff --git a/assets/plugins/extrascheck/lang/spanish.php b/assets/plugins/extrascheck/lang/spanish.php index 82794901fd..e0598a7fb0 100755 --- a/assets/plugins/extrascheck/lang/spanish.php +++ b/assets/plugins/extrascheck/lang/spanish.php @@ -13,9 +13,11 @@ // $_oec_lang['title'] = 'Comprobación de compatibilidad de extras'; +$_oec_lang['outdated'] = 'está obsoleto'; $_oec_lang['isoutdated'] = 'está obsoleto y ya no es compatible con'; $_oec_lang['please_update'] = 'Por favor actualice'; $_oec_lang['please_delete'] = 'Por favor elimínelo'; +$_oec_lang['please_download_and_install'] = 'Por favor descargue e instale'; $_oec_lang["to_latest"] = 'a la última versión'; $_oec_lang['min _required'] = 'mínimo requerido'; $_oec_lang['from'] = 'de'; diff --git a/install/assets/plugins/OutdatedExtrasCheck.tpl b/install/assets/plugins/OutdatedExtrasCheck.tpl index e1fe43acb8..b1da472a2b 100755 --- a/install/assets/plugins/OutdatedExtrasCheck.tpl +++ b/install/assets/plugins/OutdatedExtrasCheck.tpl @@ -1,15 +1,15 @@ /** * OutdatedExtrasCheck * - * Check for Outdated critical extras not compatible with EVO 1.4.0 + * Check for Outdated critical extras not compatible with EVO 1.4.5 * * @category plugin - * @version 1.4.0 + * @version 1.4.5 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL) * @package evo * @author Author: Nicola Lambathakis * @internal @events OnManagerWelcomeHome - * @internal @properties &wdgVisibility=Show widget for:;menu;All,AdminOnly,AdminExcluded,ThisRoleOnly,ThisUserOnly;All &ThisRole=Run only for this role:;string;;;(role id) &ThisUser=Run only for this user:;string;;;(username) &DittoVersion=Min Ditto version:;string;2.1.3 &EformVersion=Min eForm version:;string;1.4.9 &AjaxSearchVersion=Min AjaxSearch version:;string;1.11.0 &WayfinderVersion=Min Wayfinder version:;string;2.0.5 &WebLoginVersion=Min WebLogin version:;string;1.2 &WebSignupVersion=Min WebSignup version:;string;1.1.2 &WebChangePwdVersion=Min WebChangePwd version:;string;1.1.2 &BreadcrumbsVersion=Min Breadcrumbs version:;string;1.0.5 &ReflectVersion=Min Reflect version:;string;2.2 &JotVersion=Min Jot version:;string;1.1.5 &MtvVersion=Min multiTV version:;string;2.0.13 &badthemes=Outdated Manager Themes:;string;MODxRE2_DropdownMenu,MODxRE2,MODxRE,MODxCarbon,D3X,MODxFLAT,wMOD,ScienceStyle + * @internal @properties &wdgVisibility=Show widget for:;menu;All,AdminOnly,AdminExcluded,ThisRoleOnly,ThisUserOnly;AdminOnly &ThisRole=Run only for this role:;string;;;(role id) &ThisUser=Run only for this user:;string;;;(username) &DittoVersion=Min Ditto version:;string;2.1.3 &EformVersion=Min eForm version:;string;1.4.9 &AjaxSearchVersion=Min AjaxSearch version:;string;1.11.0 &WayfinderVersion=Min Wayfinder version:;string;2.0.5 &WebLoginVersion=Min WebLogin version:;string;1.2 &WebSignupVersion=Min WebSignup version:;string;1.1.2 &WebChangePwdVersion=Min WebChangePwd version:;string;1.1.2 &BreadcrumbsVersion=Min Breadcrumbs version:;string;1.0.5 &ReflectVersion=Min Reflect version:;string;2.2 &JotVersion=Min Jot version:;string;1.1.5 &MtvVersion=Min multiTV version:;string;2.0.13 &badthemes=Outdated Manager Themes:;string;MODxRE2_DropdownMenu,MODxRE2,MODxRE,MODxCarbon,D3X,MODxFLAT,wMOD,ScienceStyle * @internal @modx_category Manager and Admin * @internal @installset base * @internal @disabled 0 @@ -46,7 +46,7 @@ include($plugin_path . 'lang/' . $modx->config['manager_language'] . '.php'); //run the plugin // get globals global $modx,$_lang; -//function to extract snippet version from description tags +//function to extract snippet version from description tags if (!function_exists('getver')) { function getver($string, $tag) { @@ -74,9 +74,18 @@ if (file_exists($indexajax)){ $oldthemes = explode(",","$badthemes"); foreach ($oldthemes as $oldtheme){ if (file_exists('media/style/'.$oldtheme)){ - $output .= '
          '.$oldtheme.' '.$_lang["manager_theme"].', '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_delete'].' '.$_oec_lang['from_folder'].' ' . MODX_MANAGER_PATH . 'media/style/.
          '; + $output .= '
          '.$oldtheme.' '.$_lang["manager_theme"].', '.$_oec_lang['isoutdated'].' '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_delete'].' '.$_oec_lang['from_folder'].' ' . MODX_MANAGER_PATH . 'media/style/.
          '; } } +//check outdated modx rss news feed +$url_security = $modx->config['rss_url_security']; +if($url_security == 'http://feeds.feedburner.com/modxsecurity'){ +$output .= '
          '.$_lang["settings_config"].' > '.$_lang["rss_url_security_title"].' (http://feeds.feedburner.com/modxsecurity) '.$_oec_lang['outdated'].'. '.$_oec_lang['please_download_and_install'].' UpdateEvoRss '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'
          '; +} +$url_news = $modx->config['rss_url_news']; +if($url_news == 'http://feeds.feedburner.com/modx-announce'){ +$output .= '
          '.$_lang["settings_config"].' > '.$_lang["rss_url_news_title"].' (http://feeds.feedburner.com/modx-announce) '.$_oec_lang['outdated'].'. '.$_oec_lang['please_download_and_install'].' UpdateEvoRss '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'
          '; +} //get site snippets table $table = $modx->getFullTableName('site_snippets'); //check ditto @@ -86,14 +95,14 @@ $minDittoVersion = $DittoVersion; $CheckDitto = $modx->db->select( "id, name, description", $table, "name='Ditto'" ); if($CheckDitto != ''){ while( $row = $modx->db->getRow( $CheckDitto ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_ditto_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_ditto_version,$minDittoVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_ditto_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minDittoVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].' '.$_oec_lang['or_move_to'].' DocLister
          '; } } -} +} //end check ditto //check eform @@ -103,16 +112,16 @@ $minEformVersion = $EformVersion; $CheckEform = $modx->db->select( "id, name, description", $table, "name='eForm'" ); if($CheckEform != ''){ while( $row = $modx->db->getRow( $CheckEform ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_Eform_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_Eform_version,$minEformVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_Eform_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minEformVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].' '.$_oec_lang['or_move_to'].' FormLister
          '; } } -} +} //end check eform - + //check AjaxSearch //get min version from config $minAjaxSearchVersion = $AjaxSearchVersion; @@ -120,16 +129,16 @@ $minAjaxSearchVersion = $AjaxSearchVersion; $CheckAjaxSearch = $modx->db->select( "id, name, description", $table, "name='AjaxSearch'" ); if($CheckAjaxSearch != ''){ while( $row = $modx->db->getRow( $CheckAjaxSearch ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_AjaxSearch_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_AjaxSearch_version,$minAjaxSearchVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_AjaxSearch_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minAjaxSearchVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'.
          '; } } -} -//end check AjaxSearch - +} +//end check AjaxSearch + //check Wayfinder //get min version from config $minWayfinderVersion = $WayfinderVersion; @@ -137,16 +146,16 @@ $minWayfinderVersion = $WayfinderVersion; $CheckWayfinder = $modx->db->select( "id, name, description", $table, "name='Wayfinder'" ); if($CheckWayfinder != ''){ while( $row = $modx->db->getRow( $CheckWayfinder ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_Wayfinder_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_Wayfinder_version,$minWayfinderVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_Wayfinder_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minWayfinderVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'.
          '; } } -} +} //end check Wayfinder - + //check WebLogin //get min version from config $minWebLoginVersion = $WebLoginVersion; @@ -154,14 +163,14 @@ $minWebLoginVersion = $WebLoginVersion; $CheckWebLogin = $modx->db->select( "id, name, description", $table, "name='WebLogin'" ); if($CheckWebLogin != ''){ while( $row = $modx->db->getRow( $CheckWebLogin ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_WebLogin_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_WebLogin_version,$minWebLoginVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_WebLogin_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minWebLoginVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].' '.$_oec_lang['or_move_to'].' FormLister
          '; } } -} +} //end check WebLogin //check WebChangePwd @@ -171,16 +180,16 @@ $minWebChangePwdVersion = $WebChangePwdVersion; $CheckWebChangePwd = $modx->db->select( "id, name, description", $table, "name='WebChangePwd'" ); if($CheckWebLogin != ''){ while( $row = $modx->db->getRow( $CheckWebChangePwd ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_WebChangePwd_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_WebChangePwd_version,$minWebChangePwdVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_WebChangePwd_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minWebChangePwdVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].' '.$_oec_lang['or_move_to'].' FormLister
          '; } } -} +} //end check WebChangePwd - + //check WebSignup //get min version from config $minWebSignupVersion = $WebSignupVersion; @@ -188,14 +197,14 @@ $minWebSignupVersion = $WebSignupVersion; $CheckWebSignup = $modx->db->select( "id, name, description", $table, "name='WebSignup'" ); if($CheckWebSignup != ''){ while( $row = $modx->db->getRow( $CheckWebSignup ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_WebSignup_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_WebSignup_version,$minWebSignupVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_WebSignup_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minWebSignupVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].' '.$_oec_lang['or_move_to'].' FormLister
          '; } } -} +} //end check WebSignup //check Breadcrumbs @@ -205,14 +214,14 @@ $minBreadcrumbsVersion = $BreadcrumbsVersion; $CheckBreadcrumbs = $modx->db->select( "id, name, description", $table, "name='Breadcrumbs'" ); if($CheckBreadcrumbs != ''){ while( $row = $modx->db->getRow( $CheckBreadcrumbs ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_Breadcrumbs_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_Breadcrumbs_version,$minBreadcrumbsVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_Breadcrumbs_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minBreadcrumbsVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'.
          '; } } -} +} //end check Breadcrumbs //check Reflect @@ -222,14 +231,14 @@ $minReflectVersion = $ReflectVersion; $CheckReflect = $modx->db->select( "id, name, description", $table, "name='Reflect'" ); if($CheckReflect != ''){ while( $row = $modx->db->getRow( $CheckReflect ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_Reflect_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_Reflect_version,$minReflectVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_Reflect_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minReflectVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'.
          '; } } -} +} //end check Reflect //check Jot @@ -239,16 +248,16 @@ $minJotVersion = $JotVersion; $CheckJot = $modx->db->select( "id, name, description", $table, "name='Jot'" ); if($CheckJot != ''){ while( $row = $modx->db->getRow( $CheckJot ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_Jot_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_Jot_version,$minJotVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_Jot_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minJotVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'.
          '; } } -} +} //end check Jot - + //check Multitv //get min version from config $minMtvVersion = $MtvVersion; @@ -256,14 +265,14 @@ $minMtvVersion = $MtvVersion; $CheckMtv = $modx->db->select( "id, name, description", $table, "name='multiTV'" ); if($CheckMtv != ''){ while( $row = $modx->db->getRow( $CheckMtv ) ) { -//extract snippet version from description tags +//extract snippet version from description tags $curr_mtv_version = getver($row['description'],"strong"); //check snippet version and return an alert if outdated if (version_compare($curr_mtv_version,$minMtvVersion,'lt')){ $output .= '
          ' . $row['name'] . ' '.$_lang["snippet"].' (version ' . $curr_mtv_version . ') '.$_oec_lang['isoutdated'].' Evolution '.$EVOversion.'. '.$_oec_lang['please_update'].' ' . $row['name'] . ' '.$_oec_lang["to_latest"].' ('.$_oec_lang['min _required'].' '.$minMtvVersion.') '.$_oec_lang['from'].' '.$_oec_lang['extras_module'].'
          '; } } -} +} //end check Multitv if($output != ''){ @@ -274,15 +283,15 @@ $widgets['xtraCheck'] = array( 'menuindex' =>'0', 'id' => 'xtraCheck'.$pluginid.'', 'cols' => 'col-12', - 'headAttr' => 'style="background-color:#B60205; color:#FFFFFF;"', + 'headAttr' => 'style="color:#E84B39;"', 'bodyAttr' => '', 'icon' => 'fa-warning', 'title' => ''.$wdgTitle.' '.$button_pl_config.'', 'body' => '
          '.$out.'
          ', 'hide' => '0' - ); + ); $e->output(serialize($widgets)); return; } } -} \ No newline at end of file +} From 128e35b88f072824fc73be6ff13680b05dde3859 Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 13:16:50 +0200 Subject: [PATCH 115/241] fix light login fields https://github.com/evolution-cms/evolution/issues/800#issuecomment-425402588 --- manager/media/style/default/login.tpl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/manager/media/style/default/login.tpl b/manager/media/style/default/login.tpl index 3365ad3cec..a1cc9c44ad 100755 --- a/manager/media/style/default/login.tpl +++ b/manager/media/style/default/login.tpl @@ -143,7 +143,18 @@ .loginbox form a { color: #818a91; } - + .loginbox.loginbox-light form a { + color: #000; + } + .loginbox.loginbox-light label.text-muted { + color: #444!important; + } + .loginbox.loginbox-light label#FMP-email_label{ + color: #000!important; + } + .loginbox.loginbox-light input#FMP-email{ + background-color: #fafafa!important; + } .darkness .loginbox form { background-color: transparent; } From cc47a7c1c24e5878982524ba562a77f9ddb8c115 Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 15:36:44 +0200 Subject: [PATCH 116/241] fix light login styles fix light login styles : - firefox input fix https://github.com/evolution-cms/evolution/issues/800#issuecomment-425427503 - added some general styles improvements to the light login box --- manager/media/style/login.tpl | 592 ++++++++++++++++++++++++++++++++++ 1 file changed, 592 insertions(+) create mode 100644 manager/media/style/login.tpl diff --git a/manager/media/style/login.tpl b/manager/media/style/login.tpl new file mode 100644 index 0000000000..83a7c4b235 --- /dev/null +++ b/manager/media/style/login.tpl @@ -0,0 +1,592 @@ + + + + [(site_name)] (Evolution CMS Manager Login) + + + + + + + + +
          +
          +
          + + + [+OnManagerLoginFormPrerender+] + + + + + +
          + + +
          + + +
          + + +
          + + +
          +
          [+login_captcha_message+]
          +

          [+captcha_image+]

          + [+captcha_input+] +
          + + +
          + + +
          + + + [+OnManagerLoginFormRender+] + +
          +
          + + +
          +

          +
          © 2005-2018 by the EVO. EVO™ is licensed under the GPL.
          +
          +
          + + +
          + + + + + From c824e55f1e0c3f77dc28606ce740a1ff6c905c25 Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 15:44:32 +0200 Subject: [PATCH 117/241] manager_theme_mode_message #818 $_lang['manager_theme_mode_message'] = 'This setting is used as the "default" and can be overridden by the manager when using the theme color mode switch button in the Resource Tree: '; --- manager/includes/lang/english.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index 662a4558f4..910c632223 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -517,6 +517,7 @@ $_lang["manager_theme_mode2"] = 'the header is dark'; $_lang["manager_theme_mode3"] = 'header and sidebar are dark'; $_lang["manager_theme_mode4"] = 'everything is dark'; +$_lang['manager_theme_mode_message'] = 'This setting is used as the "default" and can be overridden by the manager when using the theme color mode switch button in the Resource Tree: '; $_lang["messages"] = 'Messages'; $_lang["messages_all"] = 'Everyone'; $_lang["messages_compose"] = 'Compose a message'; From 4e9a1200741f026965a6c3e19ff0cc4322121c12 Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 15:54:26 +0200 Subject: [PATCH 118/241] wrong position --- manager/media/style/login.tpl | 592 ---------------------------------- 1 file changed, 592 deletions(-) delete mode 100644 manager/media/style/login.tpl diff --git a/manager/media/style/login.tpl b/manager/media/style/login.tpl deleted file mode 100644 index 83a7c4b235..0000000000 --- a/manager/media/style/login.tpl +++ /dev/null @@ -1,592 +0,0 @@ - - - - [(site_name)] (Evolution CMS Manager Login) - - - - - - - - -
          -
          -
          - - - [+OnManagerLoginFormPrerender+] - - - - - -
          - - -
          - - -
          - - -
          - - -
          -
          [+login_captcha_message+]
          -

          [+captcha_image+]

          - [+captcha_input+] -
          - - -
          - - -
          - - - [+OnManagerLoginFormRender+] - -
          -
          - - -
          -

          -
          © 2005-2018 by the EVO. EVO™ is licensed under the GPL.
          -
          -
          - - -
          - - - - - From 5abf6da336c3ebc2cf4dfecd3786e05dc88f450f Mon Sep 17 00:00:00 2001 From: Nicola Date: Fri, 28 Sep 2018 15:54:51 +0200 Subject: [PATCH 119/241] fix style on login light --- manager/media/style/default/login.tpl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/manager/media/style/default/login.tpl b/manager/media/style/default/login.tpl index a1cc9c44ad..83a7c4b235 100755 --- a/manager/media/style/default/login.tpl +++ b/manager/media/style/default/login.tpl @@ -144,16 +144,28 @@ color: #818a91; } .loginbox.loginbox-light form a { - color: #000; + color: #666; } .loginbox.loginbox-light label.text-muted { color: #444!important; } - .loginbox.loginbox-light label#FMP-email_label{ - color: #000!important; + .loginbox.loginbox-light label#FMP-email_label, + .loginbox.loginbox-light .form-control:active, + .loginbox.loginbox-light .captcha input:focus, + .loginbox.loginbox-light .captcha input:active, + .loginbox.loginbox-light .form-control:focus, + .loginbox.loginbox-light input#username, + .loginbox.loginbox-light input#password, + .loginbox.loginbox-light input#FMP-email, + .loginbox.loginbox-light #FMP-email:active, + .loginbox.loginbox-light #FMP-email:focus{ + color: #444!important; } + + .loginbox.loginbox-light input#username, + .loginbox.loginbox-light input#password, .loginbox.loginbox-light input#FMP-email{ - background-color: #fafafa!important; + background-color: rgba(255, 255, 255, 0.5)!important; } .darkness .loginbox form { background-color: transparent; From 9a956458d0ce97b7f2aa909e8dc0038336b1525a Mon Sep 17 00:00:00 2001 From: Mr B Date: Fri, 28 Sep 2018 15:24:37 +0100 Subject: [PATCH 120/241] [I] Add title for theme mode icon --- manager/includes/lang/english.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/manager/includes/lang/english.inc.php b/manager/includes/lang/english.inc.php index 910c632223..a9877ff55b 100755 --- a/manager/includes/lang/english.inc.php +++ b/manager/includes/lang/english.inc.php @@ -518,6 +518,7 @@ $_lang["manager_theme_mode3"] = 'header and sidebar are dark'; $_lang["manager_theme_mode4"] = 'everything is dark'; $_lang['manager_theme_mode_message'] = 'This setting is used as the "default" and can be overridden by the manager when using the theme color mode switch button in the Resource Tree: '; +$_lang['manager_theme_mode_title'] = 'Theme color mode switch'; $_lang["messages"] = 'Messages'; $_lang["messages_all"] = 'Everyone'; $_lang["messages_compose"] = 'Compose a message'; From 082db999264830583e2821230f1df4505d36bdbd Mon Sep 17 00:00:00 2001 From: Mr B Date: Fri, 28 Sep 2018 15:26:32 +0100 Subject: [PATCH 121/241] Update tree.php --- manager/frames/tree.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/frames/tree.php b/manager/frames/tree.php index 7520ba7796..c3005a0941 100755 --- a/manager/frames/tree.php +++ b/manager/frames/tree.php @@ -46,7 +46,7 @@ - +
          From 0ca34ccf0ce0e878e454c41fcf27822e0a7b493d Mon Sep 17 00:00:00 2001 From: Nicola Date: Sat, 29 Sep 2018 15:57:21 +0200 Subject: [PATCH 122/241] improved loginbox styles - better input style for light loginbox - checkbox animation like manager checkbox - yellow checkbox for dark lightbox https://github.com/evolution-cms/evolution/issues/800#issuecomment-425643538 --- manager/media/style/default/login.tpl | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/manager/media/style/default/login.tpl b/manager/media/style/default/login.tpl index 83a7c4b235..f8654ae1a4 100755 --- a/manager/media/style/default/login.tpl +++ b/manager/media/style/default/login.tpl @@ -159,17 +159,27 @@ .loginbox.loginbox-light input#FMP-email, .loginbox.loginbox-light #FMP-email:active, .loginbox.loginbox-light #FMP-email:focus{ - color: #444!important; + color: #555!important; } - .loginbox.loginbox-light input#username, .loginbox.loginbox-light input#password, .loginbox.loginbox-light input#FMP-email{ - background-color: rgba(255, 255, 255, 0.5)!important; + background-color: rgba(250,255,255,0.4)!important; + border: 1px solid rgb(113,116,117,0.1)!important; } .darkness .loginbox form { background-color: transparent; - } + } + input[type=checkbox] { width: 0.9125rem !important; height: 0.9125rem !important; margin-right: 0.25em; vertical-align: -0.15em; border-radius: .1rem; border: 1px solid #9ba9bf; background: rgba(250,255,255,0.8) no-repeat 50% -1em; outline: none; transition: border-color .2s, background-position .1s; } + input[type=checkbox] { background-image: url("data:image/svg+xml;utf8,%3Csvg%20viewBox%3D%270%200%201792%201792%27%20xmlns%3D%27http%3A//www.w3.org/2000/svg%27%3E%3Cpath%20d%3D%27M1671%20566q0%2040-28%2068l-724%20724-136%20136q-28%2028-68%2028t-68-28l-136-136-362-362q-28-28-28-68t28-68l136-136q28-28%2068-28t68%2028l294%20295%20656-657q28-28%2068-28t68%2028l136%20136q28%2028%2028%2068z%27%20fill%3D%27%23444%27/%3E%3C/svg%3E"); background-size: .875em; } + input[type=checkbox]:hover { border-color: #bcbcbc } + input[type=checkbox]:active { background-color: #fafafa; } + input[type=checkbox]:focus { border-color: #4d8ef9 !important; box-shadow: 0 0 0 1px rgba(77, 142, 249, 0.5) } + input[type=checkbox]:checked { background-color: #fff; background-position: 50% 50% } + .loginbox.loginbox-dark input[type=checkbox] { background-color: #FFC107;} + .loginbox.loginbox-dark input[type=checkbox]:hover { border-color: #FFC107 } + .loginbox.loginbox-dark input[type=checkbox]:checked { background-color: #FFC107;} + /* container */ @@ -333,10 +343,7 @@ .form-control:focus, .captcha input, .captcha input:active, - .captcha input:focus, - #FMP-email, - #FMP-email:active, - #FMP-email:focus { + .captcha input:focus { font-size: 1rem !important; color: #fff !important; background-color: rgba(255,255,255,.2) !important; @@ -346,9 +353,7 @@ .form-control:active, .captcha input:focus, .captcha input:active, - .form-control:focus, - #FMP-email:active, - #FMP-email:focus { + .form-control:focus { outline: 0 none !important; background-color: rgba(255,255,255,.3) !important; } From 27dce74cc78441e7beca6bd4a3537d70098cac7a Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 2 Oct 2018 16:51:00 +0000 Subject: [PATCH 123/241] resolve #819 --- install/actions/action_connection.php | 3 +- install/actions/action_mode.php | 3 +- install/actions/action_options.php | 3 +- install/actions/action_summary.php | 3 +- install/cli-install.php | 34 ++++++++++--------- install/connection.collation.php | 3 +- install/connection.databasetest.php | 3 +- install/connection.servertest.php | 5 +-- install/functions.php | 3 +- install/instprocessor.php | 3 +- install/sqlParser.class.php | 3 +- .../extenders/dbapi.mysqli.class.inc.php | 3 +- 12 files changed, 41 insertions(+), 28 deletions(-) diff --git a/install/actions/action_connection.php b/install/actions/action_connection.php index 8f89954a52..e97479c3bb 100755 --- a/install/actions/action_connection.php +++ b/install/actions/action_connection.php @@ -16,7 +16,8 @@ // We need to have all connection settings - but prefix may be empty so we have to ignore it if ($dbase) { $database_name = trim($dbase, '`'); - if (!$conn = mysqli_connect($database_server, $database_user, $database_password)) + $host = explode(':', $database_server, 2); + if (!$conn = mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null)) $upgradeable = (isset($_POST['installmode']) && $_POST['installmode']=='new') ? 0 : 2; elseif (! mysqli_select_db($conn, trim($dbase, '`'))) $upgradeable = (isset($_POST['installmode']) && $_POST['installmode']=='new') ? 0 : 2; diff --git a/install/actions/action_mode.php b/install/actions/action_mode.php index 385464fadb..32a855388e 100755 --- a/install/actions/action_mode.php +++ b/install/actions/action_mode.php @@ -5,7 +5,8 @@ include_once $base_path . MGR_DIR . '/includes/config.inc.php'; // We need to have all connection settings - tho prefix may be empty so we have to ignore it if (isset($dbase)) { - if (!$conn = @mysqli_connect($database_server, $database_user, $database_password)) + $host = explode(':', $database_server, 2); + if (!$conn = @mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null)) $upgradeable = isset($_POST['installmode']) && $_POST['installmode'] == 'new' ? 0 : 2; elseif (!@mysqli_select_db($conn, trim($dbase, '`'))) $upgradeable = isset($_POST['installmode']) && $_POST['installmode'] == 'new' ? 0 : 2; diff --git a/install/actions/action_options.php b/install/actions/action_options.php index c94fdc158f..84e0e9b47f 100755 --- a/install/actions/action_options.php +++ b/install/actions/action_options.php @@ -195,7 +195,8 @@ function getSnippets($presets = array()) break; case 1: include $base_path . MGR_DIR . '/includes/config.inc.php'; - if (@ $conn = mysqli_connect($database_server, $database_user, $database_password)) { + $host = explode(':', $database_server, 2); + if (@ $conn = mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null)) { if (@ mysqli_query($conn, "USE {$dbase}")) { if (!$rs = mysqli_query($conn, "show session variables like 'collation_database'")) { $rs = mysqli_query($conn, "show session variables like 'collation_server'"); diff --git a/install/actions/action_summary.php b/install/actions/action_summary.php index ad7a5911aa..f72b874f4e 100755 --- a/install/actions/action_summary.php +++ b/install/actions/action_summary.php @@ -200,7 +200,8 @@ function f_owc($path, $data, $mode = null){ $table_prefix = $_POST['tableprefix']; } echo '

          '.$_lang['creating_database_connection']; -if (!$conn = mysqli_connect($database_server, $database_user, $database_password)) { +$host = explode(':', $database_server, 2); +if (!$conn = mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null)) { $errors++; echo ''.$_lang['database_connection_failed'].'

          '.$_lang['database_connection_failed_note'].'

          '; } else { diff --git a/install/cli-install.php b/install/cli-install.php index 43ca96421a..c11ba6ee70 100644 --- a/install/cli-install.php +++ b/install/cli-install.php @@ -1,7 +1,7 @@ '.$_lang['status_failed'].''; } else { diff --git a/install/connection.servertest.php b/install/connection.servertest.php index d81e9dabc5..920c69abbc 100755 --- a/install/connection.servertest.php +++ b/install/connection.servertest.php @@ -16,7 +16,8 @@ $output = $_lang["status_connecting"]; if (function_exists('mysqli_connect')) { - if (!$conn = @mysqli_connect($host, $uid, $pwd)) { + $h = explode(':', $host, 2); + if (!$conn = @mysqli_connect($h[0], $uid, $pwd,'', isset($h[1]) ? $h[1] : null)) { $output .= ' '.$_lang['status_failed'].''; } else { $output .= ' '.$_lang['status_passed_server'].''; @@ -43,4 +44,4 @@ } else { $output .= ' '.$_lang['status_failed_mysqli'].''; } -echo $output; \ No newline at end of file +echo $output; diff --git a/install/functions.php b/install/functions.php index f13d4606cd..ec3be7e5bd 100755 --- a/install/functions.php +++ b/install/functions.php @@ -98,7 +98,8 @@ function get_installmode() if (!isset($dbase) || empty($dbase)) { $installmode = 0; } else { - $conn = mysqli_connect($database_server, $database_user, $database_password); + $host = explode(':', $database_server, 2); + $conn = mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null); if ($conn) { $_SESSION['database_server'] = $database_server; $_SESSION['database_user'] = $database_user; diff --git a/install/instprocessor.php b/install/instprocessor.php index fe9a947c8c..cd16c35343 100755 --- a/install/instprocessor.php +++ b/install/instprocessor.php @@ -73,7 +73,8 @@ // connect to the database echo "

          ". $_lang['setup_database_create_connection']; -if (!$conn = mysqli_connect($database_server, $database_user, $database_password)) { +$host = explode(':', $database_server, 2); +if (!$conn = mysqli_connect($host[0], $database_user, $database_password,'', isset($host[1]) ? $host[1] : null)) { echo ''.$_lang["setup_database_create_connection_failed"]."

          ".$_lang['setup_database_create_connection_failed_note']."

          "; return; } else { diff --git a/install/sqlParser.class.php b/install/sqlParser.class.php index f94f7f3841..bc6918ab16 100755 --- a/install/sqlParser.class.php +++ b/install/sqlParser.class.php @@ -45,7 +45,8 @@ public function __construct($host, $user, $password, $db, $prefix='modx_', $admi } public function connect() { - $this->conn = mysqli_connect($this->host, $this->user, $this->password); + $host = explode(':', $this->host, 2); + $this->conn = mysqli_connect($host[0], $this->user, $this->password,'', isset($host[1]) ? $host[1] : null); mysqli_select_db($this->conn, $this->dbname); if (function_exists('mysqli_set_charset')) mysqli_set_charset($this->conn, $this->connection_charset); diff --git a/manager/includes/extenders/dbapi.mysqli.class.inc.php b/manager/includes/extenders/dbapi.mysqli.class.inc.php index 8596b6f091..2e720bc484 100755 --- a/manager/includes/extenders/dbapi.mysqli.class.inc.php +++ b/manager/includes/extenders/dbapi.mysqli.class.inc.php @@ -60,7 +60,8 @@ public function connect($host = '', $dbase = '', $uid = '', $pwd = '') $tstart = $modx->getMicroTime(); $safe_count = 0; do { - $this->conn = new mysqli($host, $uid, $pwd, $dbase); + $host = explode(':', $host, 2); + $this->conn = new mysqli($host[0], $uid, $pwd, $dbase, isset($host[1]) ? $host[1] : null); if ($this->conn->connect_error) { $this->conn = null; if (isset($modx->config['send_errormail']) && $modx->config['send_errormail'] !== '0') { From 288068bb12dc14ce82d7f4af3ecc5750798a3448 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 2 Oct 2018 16:54:07 +0000 Subject: [PATCH 124/241] Fix #535 --- .../extenders/dbapi.mysql.class.inc.php | 774 ------------------ manager/includes/extenders/ex_dbapi.inc.php | 2 +- 2 files changed, 1 insertion(+), 775 deletions(-) delete mode 100755 manager/includes/extenders/dbapi.mysql.class.inc.php diff --git a/manager/includes/extenders/dbapi.mysql.class.inc.php b/manager/includes/extenders/dbapi.mysql.class.inc.php deleted file mode 100755 index 6f5b60b78a..0000000000 --- a/manager/includes/extenders/dbapi.mysql.class.inc.php +++ /dev/null @@ -1,774 +0,0 @@ -config['host'] = $host ? $host : $GLOBALS['database_server']; - $this->config['dbase'] = $dbase ? $dbase : $GLOBALS['dbase']; - $this->config['user'] = $uid ? $uid : $GLOBALS['database_user']; - $this->config['pass'] = $pwd ? $pwd : $GLOBALS['database_password']; - $this->config['charset'] = $charset ? $charset : $GLOBALS['database_connection_charset']; - $this->config['connection_method'] = $this->_dbconnectionmethod = (isset($GLOBALS['database_connection_method']) ? $GLOBALS['database_connection_method'] : $connection_method); - $this->config['table_prefix'] = ($pre !== null) ? $pre : $GLOBALS['table_prefix']; - $this->initDataTypes(); - } - - /** - * @name: initDataTypes - * @desc: called in the constructor to set up arrays containing the types - * of database fields that can be used with specific PHP types - */ - public function initDataTypes() - { - $this->dataTypes['numeric'] = array( - 'INT', - 'INTEGER', - 'TINYINT', - 'BOOLEAN', - 'DECIMAL', - 'DEC', - 'NUMERIC', - 'FLOAT', - 'DOUBLE PRECISION', - 'REAL', - 'SMALLINT', - 'MEDIUMINT', - 'BIGINT', - 'BIT' - ); - $this->dataTypes['string'] = array( - 'CHAR', - 'VARCHAR', - 'BINARY', - 'VARBINARY', - 'TINYBLOB', - 'BLOB', - 'MEDIUMBLOB', - 'LONGBLOB', - 'TINYTEXT', - 'TEXT', - 'MEDIUMTEXT', - 'LONGTEXT', - 'ENUM', - 'SET' - ); - $this->dataTypes['date'] = array( - 'DATE', - 'DATETIME', - 'TIMESTAMP', - 'TIME', - 'YEAR' - ); - } - - /** - * @name: connect - * - */ - public function connect($host = '', $dbase = '', $uid = '', $pwd = '', $persist = 0) - { - $modx = evolutionCMS(); - $uid = $uid ? $uid : $this->config['user']; - $pwd = $pwd ? $pwd : $this->config['pass']; - $host = $host ? $host : $this->config['host']; - $dbase = $dbase ? $dbase : $this->config['dbase']; - $charset = $this->config['charset']; - $connection_method = $this->config['connection_method']; - $tstart = $modx->getMicroTime(); - $safe_count = 0; - while (!$this->conn && $safe_count < 3) { - if ($persist != 0) { - $this->conn = mysql_pconnect($host, $uid, $pwd); - } else { - $this->conn = mysql_connect($host, $uid, $pwd, true); - } - - if (!$this->conn) { - if (isset($modx->config['send_errormail']) && $modx->config['send_errormail'] !== '0') { - if ($modx->config['send_errormail'] <= 2) { - $logtitle = 'Failed to create the database connection!'; - $request_uri = $modx->htmlspecialchars($_SERVER['REQUEST_URI']); - $ua = $modx->htmlspecialchars($_SERVER['HTTP_USER_AGENT']); - $referer = $modx->htmlspecialchars($_SERVER['HTTP_REFERER']); - - $modx->sendmail(array( - 'subject' => 'Missing to create the database connection! from ' . $modx->config['site_name'], - 'body' => "{$logtitle}\n{$request_uri}\n{$ua}\n{$referer}", - 'type' => 'text' - ) - ); - } - } - sleep(1); - $safe_count++; - } - } - if (!$this->conn) { - $modx->messageQuit("Failed to create the database connection!"); - exit; - } else { - $dbase = trim($dbase, '`'); // remove the `` chars - if (!@ mysql_select_db($dbase, $this->conn)) { - $modx->messageQuit("Failed to select the database '" . $dbase . "'!"); - exit; - } - @mysql_query("{$connection_method} {$charset}", $this->conn); - $tend = $modx->getMicroTime(); - $totaltime = $tend - $tstart; - if ($modx->dumpSQL) { - $modx->queryCode .= "
          Database connection" . sprintf("Database connection was created in %2.4f s", - $totaltime) . "

          "; - } - if (function_exists('mysql_set_charset')) { - mysql_set_charset($this->config['charset']); - } else { - @mysql_query("SET NAMES {$this->config['charset']}", $this->conn); - } - $this->isConnected = true; - // FIXME (Fixed by line below): - // this->queryTime = this->queryTime + $totaltime; - $modx->queryTime += $totaltime; - } - } - - /** - * @name: disconnect - * - */ - public function disconnect() - { - @ mysql_close($this->conn); - $this->conn = null; - $this->isConnected = false; - } - - public function escape($s, $safecount = 0) - { - - $safecount++; - if (1000 < $safecount) { - exit("Too many loops '{$safecount}'"); - } - - if (empty ($this->conn) || !is_resource($this->conn)) { - $this->connect(); - } - - if (is_array($s)) { - if (count($s) === 0) { - $s = ''; - } else { - foreach ($s as $i => $v) { - $s[$i] = $this->escape($v, $safecount); - } - } - } else { - $s = mysql_real_escape_string($s, $this->conn); - } - - return $s; - } - - /** - * @name: query - * @desc: Mainly for internal use. - * Developers should use select, update, insert, delete where possible - */ - public function query($sql, $watchError = true) - { - $modx = evolutionCMS(); - if (empty ($this->conn) || !is_resource($this->conn)) { - $this->connect(); - } - $tstart = $modx->getMicroTime(); - if (is_array($sql)) { - $sql = implode("\n", $sql); - } - $this->lastQuery = $sql; - if (!$result = @ mysql_query($sql, $this->conn)) { - if (!$watchError) { - return; - } - switch (mysql_errno()) { - case 1054: - case 1060: - case 1061: - case 1062: - case 1091: - break; - default: - $modx->messageQuit('Execution of a query to the database failed - ' . $this->getLastError(), $sql); - } - } else { - $tend = $modx->getMicroTime(); - $totaltime = $tend - $tstart; - $modx->queryTime = $modx->queryTime + $totaltime; - if ($modx->dumpSQL) { - $debug = debug_backtrace(); - array_shift($debug); - $debug_path = array(); - foreach ($debug as $line) { - $debug_path[] = $line['function']; - } - $debug_path = implode(' > ', array_reverse($debug_path)); - $modx->queryCode .= "
          Query " . ($modx->executedQueries + 1) . " - " . sprintf("%2.2f ms", - $totaltime * 1000) . ""; - $modx->queryCode .= $sql . '

          '; - if ($modx->event->name) { - $modx->queryCode .= 'Current Event => ' . $modx->event->name . '
          '; - } - if ($modx->event->activePlugin) { - $modx->queryCode .= 'Current Plugin => ' . $modx->event->activePlugin . '
          '; - } - if ($modx->currentSnippet) { - $modx->queryCode .= 'Current Snippet => ' . $modx->currentSnippet . '
          '; - } - if (stripos($sql, 'select') === 0) { - $modx->queryCode .= 'Record Count => ' . $this->getRecordCount($result) . '
          '; - } else { - $modx->queryCode .= 'Affected Rows => ' . $this->getAffectedRows() . '
          '; - } - $modx->queryCode .= 'Functions Path => ' . $debug_path . '
          '; - $modx->queryCode .= "

          "; - } - $modx->executedQueries = $modx->executedQueries + 1; - - return $result; - } - } - - /** - * @name: delete - * - */ - public function delete($from, $where = '', $orderby = '', $limit = '') - { - $modx = evolutionCMS(); - if (!$from) { - $modx->messageQuit("Empty \$from parameters in DBAPI::delete()."); - } else { - $from = $this->replaceFullTableName($from); - $where = trim($where); - $orderby = trim($orderby); - $limit = trim($limit); - if ($where !== '' && stripos($where, 'WHERE') !== 0) { - $where = "WHERE {$where}"; - } - if ($orderby !== '' && stripos($orderby, 'ORDER BY') !== 0) { - $orderby = "ORDER BY {$orderby}"; - } - if ($limit !== '' && stripos($limit, 'LIMIT') !== 0) { - $limit = "LIMIT {$limit}"; - } - - return $this->query("DELETE FROM {$from} {$where} {$orderby} {$limit}"); - } - } - - /** - * @name: select - * - */ - public function select($fields = "*", $from = "", $where = "", $orderby = "", $limit = "") - { - $modx = evolutionCMS(); - - if (is_array($fields)) { - $fields = $this->_getFieldsStringFromArray($fields); - } - if (is_array($from)) { - $from = $this->_getFromStringFromArray($from); - } - if (is_array($where)) { - $where = implode(' ', $where); - } - - if (!$from) { - $modx->messageQuit("Empty \$from parameters in DBAPI::select()."); - exit; - } - - $fields = $this->replaceFullTableName($fields); - $from = $this->replaceFullTableName($from); - $where = trim($where); - $orderby = trim($orderby); - $limit = trim($limit); - if ($where !== '' && stripos($where, 'WHERE') !== 0) { - $where = "WHERE {$where}"; - } - if ($orderby !== '' && stripos($orderby, 'ORDER') !== 0) { - $orderby = "ORDER BY {$orderby}"; - } - if ($limit !== '' && stripos($limit, 'LIMIT') !== 0) { - $limit = "LIMIT {$limit}"; - } - - return $this->query("SELECT {$fields} FROM {$from} {$where} {$orderby} {$limit}"); - } - - /** - * @name: update - * - */ - public function update($fields, $table, $where = "") - { - $modx = evolutionCMS(); - if (!$table) { - $modx->messageQuit("Empty \$table parameter in DBAPI::update()."); - } else { - $table = $this->replaceFullTableName($table); - if (is_array($fields)) { - foreach ($fields as $key => $value) { - if (is_null($value) || strtolower($value) === 'null') { - $flds = 'NULL'; - } else { - $flds = "'" . $value . "'"; - } - $fields[$key] = "`{$key}` = " . $flds; - } - $fields = implode(",", $fields); - } - $where = trim($where); - if ($where !== '' && stripos($where, 'WHERE') !== 0) { - $where = "WHERE {$where}"; - } - - return $this->query("UPDATE {$table} SET {$fields} {$where}"); - } - } - - /** - * @name: insert - * @desc: returns either last id inserted or the result from the query - */ - public function insert($fields, $intotable, $fromfields = "*", $fromtable = "", $where = "", $limit = "") - { - $modx = evolutionCMS(); - if (!$intotable) { - $modx->messageQuit("Empty \$intotable parameters in DBAPI::insert()."); - } else { - $intotable = $this->replaceFullTableName($intotable); - if (!is_array($fields)) { - $this->query("INSERT INTO {$intotable} {$fields}"); - } else { - if (empty($fromtable)) { - $fields = "(`" . implode("`, `", array_keys($fields)) . "`) VALUES('" . implode("', '", - array_values($fields)) . "')"; - $rt = $this->query("INSERT INTO {$intotable} {$fields}"); - } else { - if (version_compare($this->getVersion(), "4.0.14") >= 0) { - $fromtable = $this->replaceFullTableName($fromtable); - $fields = "(" . implode(",", array_keys($fields)) . ")"; - $where = trim($where); - $limit = trim($limit); - if ($where !== '' && stripos($where, 'WHERE') !== 0) { - $where = "WHERE {$where}"; - } - if ($limit !== '' && stripos($limit, 'LIMIT') !== 0) { - $limit = "LIMIT {$limit}"; - } - $rt = $this->query("INSERT INTO {$intotable} {$fields} SELECT {$fromfields} FROM {$fromtable} {$where} {$limit}"); - } else { - $ds = $this->select($fromfields, $fromtable, $where, '', $limit); - while ($row = $this->getRow($ds)) { - $fields = "(" . implode(",", array_keys($fields)) . ") VALUES('" . implode("', '", - $row) . "')"; - $rt = $this->query("INSERT INTO {$intotable} {$fields}"); - } - } - } - } - if (($lid = $this->getInsertId()) === false) { - $modx->messageQuit("Couldn't get last insert key!"); - } - - return $lid; - } - } - - public function save($fields, $table, $where = '') - { - - if ($where === '') { - $mode = 'insert'; - } elseif ($this->getRecordCount($this->select('*', $table, $where)) == 0) { - $mode = 'insert'; - } else { - $mode = 'update'; - } - - if ($mode === 'insert') { - return $this->insert($fields, $table); - } else { - return $this->update($fields, $table, $where); - } - } - - /** - * @name: isResult - * - */ - public function isResult($rs) - { - return is_resource($rs); - } - - /** - * @name: freeResult - * - */ - public function freeResult($rs) - { - mysql_free_result($rs); - } - - /** - * @name: numFields - * - */ - public function numFields($rs) - { - return mysql_num_fields($rs); - } - - /** - * @name: fieldName - * - */ - public function fieldName($rs, $col = 0) - { - return mysql_field_name($rs, $col); - } - - /** - * @name: selectDb - * - */ - public function selectDb($name) - { - mysql_select_db($name); - } - - - /** - * @name: getInsertId - * - */ - public function getInsertId($conn = null) - { - if (!is_resource($conn)) { - $conn =& $this->conn; - } - - return mysql_insert_id($conn); - } - - /** - * @name: getAffectedRows - * - */ - public function getAffectedRows($conn = null) - { - if (!is_resource($conn)) { - $conn =& $this->conn; - } - - return mysql_affected_rows($conn); - } - - /** - * @name: getLastError - * - */ - public function getLastError($conn = null) - { - if (!is_resource($conn)) { - $conn =& $this->conn; - } - - return mysql_error($conn); - } - - /** - * @name: getRecordCount - * - */ - public function getRecordCount($ds) - { - return (is_resource($ds)) ? mysql_num_rows($ds) : 0; - } - - /** - * @name: getRow - * @desc: returns an array of column values - * @param: $dsq - dataset - * - */ - public function getRow($ds, $mode = 'assoc') - { - if (is_resource($ds)) { - if ($mode == 'assoc') { - return mysql_fetch_assoc($ds); - } elseif ($mode == 'num') { - return mysql_fetch_row($ds); - } elseif ($mode == 'object') { - return mysql_fetch_object($ds); - } elseif ($mode == 'both') { - return mysql_fetch_array($ds, MYSQL_BOTH); - } else { - $modx = evolutionCMS(); - $modx->messageQuit("Unknown get type ($mode) specified for fetchRow - must be empty, 'assoc', 'num' or 'both'."); - } - } - } - - /** - * @name: getColumn - * @desc: returns an array of the values found on colun $name - * @param: $dsq - dataset or query string - */ - public function getColumn($name, $dsq) - { - if (!is_resource($dsq)) { - $dsq = $this->query($dsq); - } - if ($dsq) { - $col = array(); - while ($row = $this->getRow($dsq)) { - $col[] = $row[$name]; - } - - return $col; - } - } - - /** - * @name: getColumnNames - * @desc: returns an array containing the column $name - * @param: $dsq - dataset or query string - */ - public function getColumnNames($dsq) - { - if (!is_resource($dsq)) { - $dsq = $this->query($dsq); - } - if ($dsq) { - $names = array(); - $limit = mysql_num_fields($dsq); - for ($i = 0; $i < $limit; $i++) { - $names[] = mysql_field_name($dsq, $i); - } - - return $names; - } - } - - /** - * @name: getValue - * @desc: returns the value from the first column in the set - * @param: $dsq - dataset or query string - */ - public function getValue($dsq) - { - if (!is_resource($dsq)) { - $dsq = $this->query($dsq); - } - if ($dsq) { - $r = $this->getRow($dsq, "num"); - - return $r[0]; - } - } - - /** - * @name: getTableMetaData - * @desc: returns an array of MySQL structure detail for each column of a - * table - * @param: $table: the full name of the database table - */ - public function getTableMetaData($table) - { - $metadata = false; - if (!empty ($table)) { - $sql = "SHOW FIELDS FROM $table"; - if ($ds = $this->query($sql)) { - while ($row = $this->getRow($ds)) { - $fieldName = $row['Field']; - $metadata[$fieldName] = $row; - } - } - } - - return $metadata; - } - - /** - * @name: prepareDate - * @desc: prepares a date in the proper format for specific database types - * given a UNIX timestamp - * @param: $timestamp: a UNIX timestamp - * @param: $fieldType: the type of field to format the date for - * (in MySQL, you have DATE, TIME, YEAR, and DATETIME) - */ - public function prepareDate($timestamp, $fieldType = 'DATETIME') - { - $date = ''; - if (!$timestamp === false && $timestamp > 0) { - switch ($fieldType) { - case 'DATE' : - $date = date('Y-m-d', $timestamp); - break; - case 'TIME' : - $date = date('H:i:s', $timestamp); - break; - case 'YEAR' : - $date = date('Y', $timestamp); - break; - default : - $date = date('Y-m-d H:i:s', $timestamp); - break; - } - } - - return $date; - } - - /** - * @name: makeArray - * @desc: turns a recordset into a multidimensional array - * @return: an array of row arrays from recordset, or empty array - * if the recordset was empty, returns false if no recordset - * was passed - * @param: $rs Recordset to be packaged into an array - */ - public function makeArray($rs = '', $index = false) - { - if (!$rs) { - return false; - } - $rsArray = array(); - $iterator = 0; - while ($row = $this->getRow($rs)) { - $returnIndex = $index !== false && isset($row[$index]) ? $row[$index] : $iterator; - $rsArray[$returnIndex] = $row; - $iterator++; - } - - return $rsArray; - } - - /** - * @name getVersion - * @desc returns a string containing the database server version - * - * @return string - */ - public function getVersion() - { - return mysql_get_server_info(); - } - - /** - * @name replaceFullTableName - * @desc Get full table name. Append table name and table prefix. - * - * @param string $str - * @return string - */ - public function replaceFullTableName($str, $force = null) - { - - $str = trim($str); - $dbase = trim($this->config['dbase'], '`'); - $prefix = $this->config['table_prefix']; - if (!empty($force)) { - $result = "`{$dbase}`.`{$prefix}{$str}`"; - } elseif (strpos($str, '[+prefix+]') !== false) { - $result = preg_replace('@\[\+prefix\+\]([0-9a-zA-Z_]+)@', "`{$dbase}`.`{$prefix}$1`", $str); - } else { - $result = $str; - } - - return $result; - } - - public function optimize($table_name) - { - $rs = $this->query("OPTIMIZE TABLE {$table_name}"); - if ($rs) { - $rs = $this->query("ALTER TABLE {$table_name}"); - } - - return $rs; - } - - public function truncate($table_name) - { - $rs = $this->query("TRUNCATE {$table_name}"); - - return $rs; - } - - public function dataSeek($result, $row_number) - { - return mysql_data_seek($result, $row_number); - } - - public function _getFieldsStringFromArray($fields = array()) - { - - if (empty($fields)) { - return '*'; - } - - $_ = array(); - foreach ($fields as $k => $v) { - if ($k !== $v) { - $_[] = "{$v} as {$k}"; - } else { - $_[] = $v; - } - } - - return implode(',', $_); - } - - public function _getFromStringFromArray($tables = array()) - { - $_ = array(); - foreach ($tables as $k => $v) { - $_[] = $v; - } - - return implode(' ', $_); - } -} - diff --git a/manager/includes/extenders/ex_dbapi.inc.php b/manager/includes/extenders/ex_dbapi.inc.php index 949109de89..06b09468c6 100755 --- a/manager/includes/extenders/ex_dbapi.inc.php +++ b/manager/includes/extenders/ex_dbapi.inc.php @@ -7,7 +7,7 @@ global $database_type; -if (empty($database_type)) $database_type = 'mysql'; +if (empty($database_type)) $database_type = 'mysqli'; $out = false; $class = 'DBAPI'; From af38bca4292e48b50a4e41174ef7728fff46a5b7 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 2 Oct 2018 17:00:46 +0000 Subject: [PATCH 125/241] Fix #797 --- manager/actions/access_permissions.dynamic.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/actions/access_permissions.dynamic.php b/manager/actions/access_permissions.dynamic.php index 6ddb4ac389..d6929264a2 100755 --- a/manager/actions/access_permissions.dynamic.php +++ b/manager/actions/access_permissions.dynamic.php @@ -98,8 +98,8 @@ function deletegroup(groupid, type) { db->select('groupnames.*, users.id AS user_id, users.username user_name', $tbl_membergroup_names . ' AS groupnames LEFT JOIN ' . $tbl_member_groups . ' AS groups_member ON groups_member.user_group = groupnames.id - LEFT JOIN ' . $tbl_manager_users . ' AS users ON users.id = groups.member', '', 'groupnames.name, user_name'); - if($modx->db->getRecordCount($rs) < 1) { + LEFT JOIN ' . $tbl_manager_users . ' AS users ON users.id = groups_member.member', '', 'groupnames.name, user_name'); + if($modx->db->getRecordCount($rs) < 1) { ?>
          Date: Tue, 2 Oct 2018 17:13:22 +0000 Subject: [PATCH 126/241] Fix #784 --- manager/actions/mutate_content.dynamic.php | 4 ++-- manager/processors/save_settings.processor.php | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/manager/actions/mutate_content.dynamic.php b/manager/actions/mutate_content.dynamic.php index 9c58136537..a474d1039a 100755 --- a/manager/actions/mutate_content.dynamic.php +++ b/manager/actions/mutate_content.dynamic.php @@ -827,8 +827,8 @@ function SetUrl(url, width, height, alt) { } ?> " onclick="enableParentSelection(!allowParentSelection);"> - () - + () + diff --git a/manager/processors/save_settings.processor.php b/manager/processors/save_settings.processor.php index 1c98a301fe..01894cfd42 100755 --- a/manager/processors/save_settings.processor.php +++ b/manager/processors/save_settings.processor.php @@ -69,9 +69,6 @@ $data['mail_check_timeperiod'] = (int)$data['mail_check_timeperiod'] < 60 ? 60 : $data['mail_check_timeperiod']; // updateMail() in mainMenu no faster than every minute foreach ($data as $k => $v) { switch ($k) { - case 'site_name': - $v = htmlentities($v, ENT_COMPAT | ENT_SUBSTITUTE, $modx->config['modx_charset'], false); - break; case 'settings_version':{ if($modx->getVersionData('version')!=$data['settings_version']){ $modx->logEvent(17,2,'
          '.var_export($data['settings_version'],true).'
          ','fake settings_version'); From 6fa6950f082bf4de2a8ecbde301061d162fd26f2 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 2 Oct 2018 19:17:49 +0000 Subject: [PATCH 127/241] Fix #790 --- manager/includes/document.parser.class.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index ef9764d573..95a8716c23 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -2790,7 +2790,7 @@ public function executeParser() if ($this->config['aliaslistingfolder'] == 1) { $tbl_site_content = $this->getFullTableName('site_content'); - $parentId = $this->getIdFromAlias($this->virtualDir); + $parentId = empty($this->virtualDir) ? 0 : $this->getIdFromAlias($this->virtualDir); $parentId = ($parentId > 0) ? $parentId : '0'; $docAlias = $this->db->escape($this->documentIdentifier); @@ -6493,7 +6493,7 @@ public function getHiddenIdFromAlias($parentid, $alias) } if ($child['children_count'] > 0) { - $id = $this->getHiddenIdFromAlias($child['id'], $alias); + $id = $this->getHiddenIdFromAlias($child['child_id'], $alias); if ($id) { return $id; } From 615841010c1817cc5b091dd9814cd6a7edba044b Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 2 Oct 2018 19:31:37 +0000 Subject: [PATCH 128/241] Refactoring DocumentParser::getHiddenIdFromAlias() --- .../includes/document.parser.class.inc.php | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 95a8716c23..01efaf70a9 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -6480,27 +6480,31 @@ public function nicesize($size) */ public function getHiddenIdFromAlias($parentid, $alias) { - $table = $this->getFullTableName('site_content'); - $query = $this->db->query("SELECT sc.id, children.id AS child_id, children.alias, COUNT(children2.id) AS children_count - FROM {$table} sc - JOIN {$table} children ON children.parent = sc.id - LEFT JOIN {$table} children2 ON children2.parent = children.id - WHERE sc.parent = {$parentid} AND sc.alias_visible = '0' GROUP BY children.id;"); - - while ($child = $this->db->getRow($query)) { - if ($child['alias'] == $alias || $child['child_id'] == $alias) { - return $child['child_id']; - } - - if ($child['children_count'] > 0) { - $id = $this->getHiddenIdFromAlias($child['child_id'], $alias); - if ($id) { - return $id; + $out = false; + if ($alias !== '') { + $table = $this->getFullTableName('site_content'); + $query = $this->db->query("SELECT + `sc`.`id` AS `hidden_id`, + `children`.`id` AS `child_id`, + children.alias AS `child_alias`, + COUNT(`grandsons`.`id`) AS `grandsons_count` + FROM " . $table ." AS `sc` + JOIN " . $table . " AS `children` ON `children`.`parent` = `sc`.`id` + LEFT JOIN " . $table . " AS `grandsons` ON `grandsons`.`parent` = `children`.`id` + WHERE `sc`.`parent` = '" . (int)$parentid . "' AND `sc`.`alias_visible` = '0' + GROUP BY `children`.`id`"); + + while ($child = $this->db->getRow($query)) { + if ($child['child_alias'] == $alias || $child['child_id'] == $alias) { + $out = $child['child_id']; + break; + } else if ($child['grandsons_count'] > 0 && ($id = $this->getHiddenIdFromAlias($child['child_id'], $alias))) { + $out = $id; + break; } } } - - return false; + return $out; } /** From 270ae36c56028b03c618d3c5b4f6868d4d58f2bf Mon Sep 17 00:00:00 2001 From: Ser1ous Date: Wed, 3 Oct 2018 22:47:59 +0300 Subject: [PATCH 129/241] Fix mysql 8.0 bug with copy tv #809 --- manager/processors/duplicate_tmplvars.processor.php | 8 ++++---- manager/processors/save_plugin.processor.php | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/manager/processors/duplicate_tmplvars.processor.php b/manager/processors/duplicate_tmplvars.processor.php index 74d80a4c52..cdf8c82e0f 100755 --- a/manager/processors/duplicate_tmplvars.processor.php +++ b/manager/processors/duplicate_tmplvars.processor.php @@ -26,12 +26,12 @@ 'description'=>'', 'default_text'=>'', 'elements'=>'', - 'rank'=>'', + '`rank`'=>'', 'display'=>'', 'display_params'=>'', 'category'=>'', ), $modx->getFullTableName('site_tmplvars'), // Insert into - "type, CONCAT(name, ' {$_lang['duplicated_el_suffix']}{$count}') AS name, CONCAT(caption, ' Duplicate{$count}') AS caption, description, default_text, elements, rank, display, display_params, category", $modx->getFullTableName('site_tmplvars'), "id='{$id}'"); // Copy from + "type, CONCAT(name, ' {$_lang['duplicated_el_suffix']}{$count}') AS name, CONCAT(caption, ' Duplicate{$count}') AS caption, description, default_text, elements, `rank`, display, display_params, category", $modx->getFullTableName('site_tmplvars'), "id='{$id}'"); // Copy from // duplicate TV Template Access Permissions @@ -39,9 +39,9 @@ array( 'tmplvarid'=>'', 'templateid'=>'', - 'rank'=>'', + '`rank`'=>'', ), $modx->getFullTableName('site_tmplvar_templates'), // Insert into - "'{$newid}', templateid, rank", $modx->getFullTableName('site_tmplvar_templates'), "tmplvarid='{$id}'"); // Copy from + "'{$newid}', templateid, `rank`", $modx->getFullTableName('site_tmplvar_templates'), "tmplvarid='{$id}'"); // Copy from // duplicate TV Access Permissions $modx->db->insert( diff --git a/manager/processors/save_plugin.processor.php b/manager/processors/save_plugin.processor.php index 1d25a72b8e..8d2805ac81 100755 --- a/manager/processors/save_plugin.processor.php +++ b/manager/processors/save_plugin.processor.php @@ -189,6 +189,7 @@ function saveEventListeners($id, $sysevents, $mode) } else { $priority = isset($prevPriority) ? $prevPriority : 1; } + $priority = (int)$priority; $formEventList[] = array('pluginid' => $id, 'evtid' => $evtId, 'priority' => $priority); } From 3c5aa9b8add59e494c74364e5cfc3fb2020d018b Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Thu, 11 Oct 2018 19:10:37 +0000 Subject: [PATCH 130/241] Fix #828 --- assets/modules/docmanager/tv.ajax.php | 10 ++++---- manager/includes/tmplvars.inc.php | 8 +++--- manager/media/browser/mcpuk/lib/class_gd.php | 3 +-- manager/media/rss/extlib/Snoopy.class.inc | 25 ++++++++++--------- manager/processors/save_content.processor.php | 2 +- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/assets/modules/docmanager/tv.ajax.php b/assets/modules/docmanager/tv.ajax.php index b51ce802df..bf3d2f7dbd 100755 --- a/assets/modules/docmanager/tv.ajax.php +++ b/assets/modules/docmanager/tv.ajax.php @@ -93,7 +93,7 @@ function renderFormElement($field_type, $field_id, $default_text, $field_element case "dropdown": // handler for select boxes $field_html .= ''; $index_list = ParseIntputOptions(ProcessTVCommand($field_elements, $field_id)); - while (list($item, $itemvalue) = each($index_list)) { + foreach($index_list as $item => $itemvalue) { list($item, $itemvalue) = (is_array($itemvalue)) ? $itemvalue : explode("==", $itemvalue); if (strlen($itemvalue) == 0) { $itemvalue = $item; @@ -118,7 +118,7 @@ function renderFormElement($field_type, $field_id, $default_text, $field_element $field_value = explode("||", $field_value); $field_html .= ''; $index_list = ParseIntputOptions(ProcessTVCommand($field_elements, $field_id, '', 'tvform', $tvsArray)); - while(list($item, $itemvalue) = each($index_list)) { + foreach($index_list as $item => $itemvalue) { list($item, $itemvalue) = (is_array($itemvalue)) ? $itemvalue : explode("==", $itemvalue); if(strlen($itemvalue) == 0) { $itemvalue = $item; @@ -76,7 +76,7 @@ function renderFormElement($field_type, $field_id, $default_text = '', $field_el case "listbox": // handler for select boxes $field_html .= ''; $index_list = ParseIntputOptions(ProcessTVCommand($field_elements, $field_id, '', 'tvform', $tvsArray)); - while(list($item, $itemvalue) = each($index_list)) { + foreach($index_list as $item => $itemvalue) { list($item, $itemvalue) = (is_array($itemvalue)) ? $itemvalue : explode("==", $itemvalue); if(strlen($itemvalue) == 0) { $itemvalue = $item; @@ -151,7 +151,7 @@ function renderFormElement($field_type, $field_id, $default_text = '', $field_el case "option": // handles radio buttons $index_list = ParseIntputOptions(ProcessTVCommand($field_elements, $field_id, '', 'tvform', $tvsArray)); static $i = 0; - while(list($item, $itemvalue) = each($index_list)) { + foreach($index_list as $item => $itemvalue) { list($item, $itemvalue) = (is_array($itemvalue)) ? $itemvalue : explode("==", $itemvalue); if(strlen($itemvalue) == 0) { $itemvalue = $item; diff --git a/manager/media/browser/mcpuk/lib/class_gd.php b/manager/media/browser/mcpuk/lib/class_gd.php index c9ed6f04af..4c0ed4d8bb 100755 --- a/manager/media/browser/mcpuk/lib/class_gd.php +++ b/manager/media/browser/mcpuk/lib/class_gd.php @@ -52,8 +52,7 @@ protected function build_image($image) { $height = @imagesy($image); } elseif (is_array($image)) { - list($key, $width) = each($image); - list($key, $height) = each($image); + $height = $width = end($image); $image = imagecreatetruecolor($width, $height); } elseif (false !== (list($width, $height, $type) = @getimagesize($image))) { diff --git a/manager/media/rss/extlib/Snoopy.class.inc b/manager/media/rss/extlib/Snoopy.class.inc index 2ac3487757..9bf7e493f9 100755 --- a/manager/media/rss/extlib/Snoopy.class.inc +++ b/manager/media/rss/extlib/Snoopy.class.inc @@ -173,7 +173,7 @@ class Snoopy $frameurls = $this->_frameurls; $this->_frameurls = array(); - while (list(, $frameurl) = each($frameurls)) { + foreach ($frameurls as $frameurl) { if ($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; @@ -269,7 +269,7 @@ class Snoopy $frameurls = $this->_frameurls; $this->_frameurls = array(); - while (list(, $frameurl) = each($frameurls)) { + foreach ($frameurls as $frameurl) { if ($this->_framedepth < $this->maxframes) { $this->fetch($frameurl); $this->_framedepth++; @@ -467,12 +467,12 @@ class Snoopy // catenate the non-empty matches from the conditional subpattern - while (list($key, $val) = each($links[2])) { + foreach ($links[2] as $key => $val) { if (!empty($val)) $match[] = $val; } - while (list($key, $val) = each($links[3])) { + foreach ($links[3] as $key => $val) { if (!empty($val)) $match[] = $val; } @@ -666,8 +666,9 @@ class Snoopy if (!empty($this->rawheaders)) { if (!is_array($this->rawheaders)) $this->rawheaders = (array)$this->rawheaders; - while (list($headerKey, $headerVal) = each($this->rawheaders)) + foreach ($this->rawheaders as $headerKey => $headerVal) { $headers .= $headerKey . ": " . $headerVal . "\r\n"; + } } if (!empty($content_type)) { $headers .= "Content-type: $content_type"; @@ -935,9 +936,9 @@ class Snoopy switch ($this->_submit_type) { case "application/x-www-form-urlencoded": reset($formvars); - while (list($key, $val) = each($formvars)) { + foreach($formvars as $key => $val) { if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { + foreach($val as $cur_key => $cur_val) { $postdata .= urlencode($key) . "[]=" . urlencode($cur_val) . "&"; } } else @@ -949,9 +950,9 @@ class Snoopy $this->_mime_boundary = "Snoopy" . md5(uniqid(microtime())); reset($formvars); - while (list($key, $val) = each($formvars)) { + foreach ($formvars as $key => $val) { if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { + foreach ($val as $cur_key => $cur_val) { $postdata .= "--" . $this->_mime_boundary . "\r\n"; $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; $postdata .= "$cur_val\r\n"; @@ -964,9 +965,9 @@ class Snoopy } reset($formfiles); - while (list($field_name, $file_names) = each($formfiles)) { - settype($file_names, "array"); - while (list(, $file_name) = each($file_names)) { + foreach ($formfiles as $field_name => $file_names) { + $file_names = (array)$file_names; + foreach($file_names as $file_name) { if (!is_readable($file_name)) continue; $fp = fopen($file_name, "r"); diff --git a/manager/processors/save_content.processor.php b/manager/processors/save_content.processor.php index b3a854388a..d9dd58977c 100755 --- a/manager/processors/save_content.processor.php +++ b/manager/processors/save_content.processor.php @@ -222,7 +222,7 @@ // handles checkboxes & multiple selects elements $feature_insert = array (); $lst = $_POST["tv" . $row['id']]; - while (list ($featureValue, $feature_item) = each($lst)) { + foreach($lst as $featureValue => $feature_item) { $feature_insert[count($feature_insert)] = $feature_item; } $tmplvar = implode("||", $feature_insert); From e4231e872cb006a098d02d7394f0f12bf8f95b08 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Thu, 11 Oct 2018 19:13:47 +0000 Subject: [PATCH 131/241] Fix #793 --- manager/includes/document.parser.class.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 01efaf70a9..92a7bd1f1d 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -3524,7 +3524,7 @@ public function logEvent($evtid, $type, $msg, $source = 'Parser') if (isset($this->config['send_errormail']) && $this->config['send_errormail'] !== '0') { if ($this->config['send_errormail'] <= $type) { $this->sendmail(array( - 'subject' => 'MODX System Error on ' . $this->config['site_name'], + 'subject' => 'Evolution CMS System Error on ' . $this->config['site_name'], 'body' => 'Source: ' . $source . ' - The details of the error could be seen in the MODX system events log.', 'type' => 'text' )); From 46eaa39e63d0280c9848ac3d09ee92c967788ee5 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Fri, 12 Oct 2018 16:20:24 +0000 Subject: [PATCH 132/241] Resolve review in PR #779 --- assets/lib/class.modxRTEbridge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/lib/class.modxRTEbridge.php b/assets/lib/class.modxRTEbridge.php index b798e9a007..d30084c051 100755 --- a/assets/lib/class.modxRTEbridge.php +++ b/assets/lib/class.modxRTEbridge.php @@ -966,7 +966,7 @@ public function getTemplateChunkList() $templatesArr = array(); - if (IN_MANAGER_MODE) { + if ($modx->getLoginUserType() === 'manager' || IN_MANAGER_MODE) { $modx->getSettings(); $ids = $modx->config[$this->editorKey.'_template_docs']; From be22213f07a1f7789b56246b928143edb08ce4ca Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Fri, 12 Oct 2018 16:25:00 +0000 Subject: [PATCH 133/241] Change checking of manager mode / Part 2 --- assets/lib/class.modxRTEbridge.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/lib/class.modxRTEbridge.php b/assets/lib/class.modxRTEbridge.php index d30084c051..59bd7063c0 100755 --- a/assets/lib/class.modxRTEbridge.php +++ b/assets/lib/class.modxRTEbridge.php @@ -1017,7 +1017,7 @@ public function saveContentProcessor($rid, $ppPluginName, $ppEditableIds='editab { global $modx; - if ($rid > 0 && $modx->getLoginUserType() === 'manager') + if ($rid > 0 && ($modx->getLoginUserType() === 'manager' || IN_MANAGER_MODE)) { if(!isset($_POST['secHash']) || !isset($_SESSION['modxRTEbridge']['secHash'][$rid]) || From e8025d5018ffbf971634fb2755bc7337df19bef1 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Fri, 12 Oct 2018 16:48:59 +0000 Subject: [PATCH 134/241] Fix #26 --- .../includes/document.parser.class.inc.php | 64 ++++++++++++++----- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 92a7bd1f1d..22e4ec1454 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -2859,6 +2859,7 @@ public function executeParser() if ($this->config['seostrict'] === '1') { $this->sendStrictURI(); } + $this->webAlertAndQuit('asd', '#'); $this->prepareResponse(); } @@ -3164,7 +3165,21 @@ public function getChildIds($id, $depth = 10, $children = array()) */ public function webAlertAndQuit($msg, $url = '') { - global $modx_manager_charset; + global $modx_manager_charset, $modx_lang_attribute, $modx_textdir, $lastInstallTime; + + if(empty($modx_manager_charset)) { + $modx_manager_charset = $this->getConfig('modx_charset'); + } + + if(empty($modx_lang_attribute)) { + $modx_lang_attribute = $this->getConfig('lang_code'); + } + + if(empty($modx_textdir)) { + $modx_textdir = $this->getConfig('manager_direction'); + } + $textdir = $modx_textdir === 'rtl' ? 'rtl' : 'ltr'; + switch (true) { case (0 === stripos($url, 'javascript:')): $fnc = substr($url, 11); @@ -3179,21 +3194,38 @@ public function webAlertAndQuit($msg, $url = '') $fnc = "window.location.href='" . addslashes($url) . "';"; } - echo " - MODX :: Alert - - - -

          {$msg}

          - "; + $style = ''; + if (IN_MANAGER_MODE) { + if (empty($lastInstallTime)) { + $lastInstallTime = time(); + } + + $path = 'media/style/' . $this->getConfig('manager_theme') . '/'; + $css = file_exists(MODX_MANAGER_PATH . $path . '/css/styles.min.css') ? '/css/styles.min.css' : 'style.css'; + $style = ''; + } + + ob_get_clean(); + echo " + + + MODX :: Alert + + {$style} + + + +

          {$msg}

          + + "; exit; } From 05a80d9f88cad9b12440156313d0aa8e22638095 Mon Sep 17 00:00:00 2001 From: esszett <893278+esszett@users.noreply.github.com> Date: Thu, 18 Oct 2018 10:34:40 +0200 Subject: [PATCH 135/241] =?UTF-8?q?Fix=20JS=20error=20=E2=80=93=20typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../managermanager/widgets/mm_hidefields/mm_hidefields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/plugins/managermanager/widgets/mm_hidefields/mm_hidefields.php b/assets/plugins/managermanager/widgets/mm_hidefields/mm_hidefields.php index 8272af6fa8..d93283cef4 100755 --- a/assets/plugins/managermanager/widgets/mm_hidefields/mm_hidefields.php +++ b/assets/plugins/managermanager/widgets/mm_hidefields/mm_hidefields.php @@ -37,7 +37,7 @@ function mm_hideFields($fields, $roles = '', $templates = ''){ break; case 'metatags': - $output .= '$j("select[name*\'=metatags\']").parent("td").hide()'."\n"; + $output .= '$j("select[name*=\'metatags\']").parent("td").hide()'."\n"; break; //case 'hidemenu': From 3d15cb1c7ecfe95640e259368506d347360cd7f9 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Sat, 20 Oct 2018 08:24:25 +0000 Subject: [PATCH 136/241] removing debug statement --- manager/includes/document.parser.class.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 22e4ec1454..b3c1d86556 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -2859,7 +2859,6 @@ public function executeParser() if ($this->config['seostrict'] === '1') { $this->sendStrictURI(); } - $this->webAlertAndQuit('asd', '#'); $this->prepareResponse(); } From 1e59390d43057231828c3b77eea950e84733c911 Mon Sep 17 00:00:00 2001 From: mnoskov Date: Mon, 22 Oct 2018 09:52:11 +0500 Subject: [PATCH 137/241] events stack --- .../includes/document.parser.class.inc.php | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index b3c1d86556..dff560b915 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -5443,6 +5443,13 @@ public function invokeEvent($evtName, $extParams = array()) return false; } + if ($this->event->activePlugin != '') { + $event = new SystemEvent; + $event->setPreviousEvent($this->event); + $this->event = $event; + $this->Event = &$this->event; + } + $results = null; foreach ($this->pluginEvent[$evtName] as $pluginName) { // start for loop if ($this->dumpPlugins) { @@ -5492,7 +5499,16 @@ public function invokeEvent($evtName, $extParams = array()) } } - $e->activePlugin = ''; + $event = $this->event->getPreviousEvent(); + + if ($event) { + unset($this->event); + $this->event = $event; + $this->Event = &$this->event; + } else { + $this->event->activePlugin = ''; + } + return $results; } @@ -6759,6 +6775,12 @@ class SystemEvent public $activePlugin = ''; public $params = array(); + /** + * Previous event object + * @var SystemEvent + */ + private $previousEvent; + /** * @param string $name Name of the event */ @@ -6832,4 +6854,17 @@ public function _resetEventObject() $this->_propagate = true; $this->activated = false; } + + /** + * @param SystemEvent $event + */ + public function setPreviousEvent($event) + { + $this->previousEvent = $event; + } + + public function getPreviousEvent() + { + return $this->previousEvent; + } } From ab1c9ec5ae83f97de0592e6c4970e7c17d68be41 Mon Sep 17 00:00:00 2001 From: mnoskov Date: Mon, 22 Oct 2018 09:52:11 +0500 Subject: [PATCH 138/241] events stack --- .../includes/document.parser.class.inc.php | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index b3c1d86556..dff560b915 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -5443,6 +5443,13 @@ public function invokeEvent($evtName, $extParams = array()) return false; } + if ($this->event->activePlugin != '') { + $event = new SystemEvent; + $event->setPreviousEvent($this->event); + $this->event = $event; + $this->Event = &$this->event; + } + $results = null; foreach ($this->pluginEvent[$evtName] as $pluginName) { // start for loop if ($this->dumpPlugins) { @@ -5492,7 +5499,16 @@ public function invokeEvent($evtName, $extParams = array()) } } - $e->activePlugin = ''; + $event = $this->event->getPreviousEvent(); + + if ($event) { + unset($this->event); + $this->event = $event; + $this->Event = &$this->event; + } else { + $this->event->activePlugin = ''; + } + return $results; } @@ -6759,6 +6775,12 @@ class SystemEvent public $activePlugin = ''; public $params = array(); + /** + * Previous event object + * @var SystemEvent + */ + private $previousEvent; + /** * @param string $name Name of the event */ @@ -6832,4 +6854,17 @@ public function _resetEventObject() $this->_propagate = true; $this->activated = false; } + + /** + * @param SystemEvent $event + */ + public function setPreviousEvent($event) + { + $this->previousEvent = $event; + } + + public function getPreviousEvent() + { + return $this->previousEvent; + } } From 3261911f42a390684264aff1930682803b6a0836 Mon Sep 17 00:00:00 2001 From: Anton Kanopkin <39925338+kanstudio@users.noreply.github.com> Date: Tue, 23 Oct 2018 16:16:33 +0200 Subject: [PATCH 139/241] Update snippet.docinfo.php (#806) * Update snippet.docinfo.php Imagine you have a catalog of products, which are graded by categories. Categories are represented by parental documents. And you need to show the name of the category (or other parent's TV's) on the product's page. You can't use &docid of the DocInfo snippet in the product's template, because ID is different for different categories, but the template is only one. With the new parameter &templid you can get field's value of the document, which has the template's ID set to the &templid. Script finds that document among all parents of &docid - beginning from document with &docid and upper and upper. books (catalog - id: 1, template: 1) --romance (category - id: 2, template: 2) ----book1 (product - template: 4) ----book2 (product - template: 4) --fantasy (category - id: 3, template: 2) ----for children (subcategory - id: 5, template: 3) ------book5 (product - template: 4) ----book3 (product - template: 4) ----book4 (product - template: 4) --thriller (category - id: 4, template: 2) In the template with ID 4 (for book) we can get `pagetitle` of categories: [[DocInfo? &templid=`2`]] it will return "romance" for the book1 and book2, "fantasy" for the book3, book4 and book5! (subcategory "for children" hasn't template's ID = 2) To get any TV of category: [[DocInfo? &templid=`2` &field=`tvname`]] The same in the chunk with placeholders (for example, DocLister's template): [[DocInfo? &docid=`[+id+]` &templid=`2` &field=`tvname`]] Note you don't need to add the field `tvname` to the &tvList in the DL call for using in the DocInfo only. * Update snippet.docinfo.php 1. The &limit parameter was added 2. Fix false value of $modx->getDocument * Update snippet.docinfo.php * Update snippet.docinfo.php --- assets/snippets/docinfo/snippet.docinfo.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/assets/snippets/docinfo/snippet.docinfo.php b/assets/snippets/docinfo/snippet.docinfo.php index d843a3ed16..d525d5d2df 100755 --- a/assets/snippets/docinfo/snippet.docinfo.php +++ b/assets/snippets/docinfo/snippet.docinfo.php @@ -3,10 +3,12 @@ * DocInfo * * @category parser - * @version 0.3 + * @version 0.5 * @license GNU General Public License (GPL), http://www.gnu.org/copyleft/gpl.html * @param string $field Значение какого поля необходимо достать * @param int $docid ID документа + * @param int $templid ID шаблона документа + * @param int $limit Максимальная глубина вложенности для поиска по шаблону документа * @param int $tv является ли поле TV параметром (0 - нет || 1 - да) * @param int $render Преобразовывать ли значение TV параметра в соответствии с его визуальным компонентом * @return string Значение поля документа или его TV параметра @@ -18,10 +20,23 @@ * [[DocInfo? &docid=`15` &field=`pagetitle`]] * [[DocInfo? &docid=`10` &field=`tvname`]] * [[DocInfo? &docid=`3` &field=`tvname` &render=`1`]] +* [[DocInfo? &docid=`3` &templid=`2` &field=`tvname` &limit=`2`]] */ if(!defined('MODX_BASE_PATH')){die('What are you doing? Get out of here!');} $default_field = array('type','contentType','pagetitle','longtitle','description','alias','link_attributes','published','pub_date','unpub_date','parent','isfolder','introtext','content','richtext','template','menuindex','searchable','cacheable','createdon','createdby','editedon','editedby','deleted','deletedon','deletedby','publishedon','publishedby','menutitle','donthit','privateweb','privatemgr','content_dispo','hidemenu','alias_visible'); $docid = (isset($docid) && (int)$docid>0) ? (int)$docid : $modx->documentIdentifier; +if(isset($templid) && (int)$templid>=0) { + $doc['parent'] = $docid; + $limit = (isset($limit) && (int)$limit>=0) ? (int)$limit : 10; + do { + $doc = $modx->getDocument($doc['parent'], 'id, parent, template'); + if($doc === false) return ''; + if($doc['template'] == (int)$templid) $docid = $doc['id']; + $limit--; + } + while($doc['template'] != (int)$templid && (int)$doc['parent'] > 0 && $limit >= 0); + if($doc['template'] != (int)$templid) return ''; +} $field = (isset($field)) ? $field : 'pagetitle'; $render = (isset($render)) ? $render : 0; $output = ''; @@ -38,4 +53,3 @@ } } return $output; -?> \ No newline at end of file From 402a5e99ddd0c5a72196a54d9f836d750828c68d Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 23 Oct 2018 14:52:46 +0000 Subject: [PATCH 140/241] Fix #806 --- assets/snippets/docinfo/snippet.docinfo.php | 74 +++++++++++++-------- install/assets/snippets/docinfo.tpl | 6 +- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/assets/snippets/docinfo/snippet.docinfo.php b/assets/snippets/docinfo/snippet.docinfo.php index d525d5d2df..2545c6af07 100755 --- a/assets/snippets/docinfo/snippet.docinfo.php +++ b/assets/snippets/docinfo/snippet.docinfo.php @@ -3,7 +3,7 @@ * DocInfo * * @category parser - * @version 0.5 + * @version 0.4 * @license GNU General Public License (GPL), http://www.gnu.org/copyleft/gpl.html * @param string $field Значение какого поля необходимо достать * @param int $docid ID документа @@ -14,42 +14,58 @@ * @return string Значение поля документа или его TV параметра * @author akool, Agel_Nash * - * @TODO getTemplateVarOutput не применяет визуальный компонент к TV параметрам у которых значение совпадает со значением по умолчанию - * + * @TODO getTemplateVarOutput не применяет визуальный компонент к TV параметрам у которых значение совпадает со + * значением по умолчанию + * * @example -* [[DocInfo? &docid=`15` &field=`pagetitle`]] -* [[DocInfo? &docid=`10` &field=`tvname`]] -* [[DocInfo? &docid=`3` &field=`tvname` &render=`1`]] -* [[DocInfo? &docid=`3` &templid=`2` &field=`tvname` &limit=`2`]] -*/ -if(!defined('MODX_BASE_PATH')){die('What are you doing? Get out of here!');} -$default_field = array('type','contentType','pagetitle','longtitle','description','alias','link_attributes','published','pub_date','unpub_date','parent','isfolder','introtext','content','richtext','template','menuindex','searchable','cacheable','createdon','createdby','editedon','editedby','deleted','deletedon','deletedby','publishedon','publishedby','menutitle','donthit','privateweb','privatemgr','content_dispo','hidemenu','alias_visible'); -$docid = (isset($docid) && (int)$docid>0) ? (int)$docid : $modx->documentIdentifier; -if(isset($templid) && (int)$templid>=0) { - $doc['parent'] = $docid; - $limit = (isset($limit) && (int)$limit>=0) ? (int)$limit : 10; - do { - $doc = $modx->getDocument($doc['parent'], 'id, parent, template'); - if($doc === false) return ''; - if($doc['template'] == (int)$templid) $docid = $doc['id']; - $limit--; - } - while($doc['template'] != (int)$templid && (int)$doc['parent'] > 0 && $limit >= 0); - if($doc['template'] != (int)$templid) return ''; + * [[DocInfo? &docid=`15` &field=`pagetitle`]] + * [[DocInfo? &docid=`10` &field=`tvname`]] + * [[DocInfo? &docid=`3` &field=`tvname` &render=`1`]] + * [[DocInfo? &docid=`3` &templid=`2` &field=`tvname` &limit=`2`]] + */ +if (!defined('MODX_BASE_PATH')) { + die('What are you doing? Get out of here!'); +} +$default_field = array( + 'type', 'contentType', 'pagetitle', 'longtitle', 'description', 'alias', 'link_attributes', 'published', 'pub_date', + 'unpub_date', 'parent', 'isfolder', 'introtext', 'content', 'richtext', 'template', 'menuindex', 'searchable', + 'cacheable', 'createdon', 'createdby', 'editedon', 'editedby', 'deleted', 'deletedon', 'deletedby', 'publishedon', + 'publishedby', 'menutitle', 'donthit', 'privateweb', 'privatemgr', 'content_dispo', 'hidemenu', 'alias_visible' +); +$docid = (isset($docid) && (int)$docid > 0) ? (int)$docid : $modx->documentIdentifier; +$templid = isset($templid) ? (int)$templid : null; +$doc = array(); +if ($templid >= 0) { + $doc['parent'] = $docid; + $limit = (isset($limit) && (int)$limit >= 0) ? (int)$limit : 10; + do { + $doc = $modx->getDocument($doc['parent'], 'id, parent, template'); + if ($doc === false) { + return ''; + } + if ($doc['template'] == (int)$templid) { + $docid = $doc['id']; + } + $limit--; + } while ($doc['template'] != (int)$templid && (int)$doc['parent'] > 0 && $limit >= 0); + if ($doc['template'] != (int)$templid) { + return ''; + } } $field = (isset($field)) ? $field : 'pagetitle'; -$render = (isset($render)) ? $render : 0; +$render = (isset($render)) ? (bool)$render : false; $output = ''; if (in_array($field, $default_field)) { - $doc = $modx->getPageInfo($docid,'1',$field); + $doc = $modx->getPageInfo($docid, '1', $field); $output = $doc[$field]; -}else{ - if(isset($render) && 1==$render){ +} else { + if (isset($render) && true === $render) { $tv = $modx->getTemplateVarOutput($field, $docid); $output = $tv[$field]; - }else{ - $tv = $modx->getTemplateVar($field,'*',$docid); - $output = ($tv['value']!='') ? $tv['value'] : $tv['defaultText']; + } else { + $tv = $modx->getTemplateVar($field, '*', $docid); + $output = ($tv['value'] != '') ? $tv['value'] : $tv['defaultText']; } } + return $output; diff --git a/install/assets/snippets/docinfo.tpl b/install/assets/snippets/docinfo.tpl index b82aad245c..7f11673dca 100755 --- a/install/assets/snippets/docinfo.tpl +++ b/install/assets/snippets/docinfo.tpl @@ -1,13 +1,13 @@ // Date: Sat, 27 Oct 2018 11:59:58 +0300 Subject: [PATCH 141/241] up ajaxSearch version to 1.12.0 in OutdatedExtrasCheck --- install/assets/plugins/OutdatedExtrasCheck.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/assets/plugins/OutdatedExtrasCheck.tpl b/install/assets/plugins/OutdatedExtrasCheck.tpl index b1da472a2b..bbcd93360f 100755 --- a/install/assets/plugins/OutdatedExtrasCheck.tpl +++ b/install/assets/plugins/OutdatedExtrasCheck.tpl @@ -9,7 +9,7 @@ * @package evo * @author Author: Nicola Lambathakis * @internal @events OnManagerWelcomeHome - * @internal @properties &wdgVisibility=Show widget for:;menu;All,AdminOnly,AdminExcluded,ThisRoleOnly,ThisUserOnly;AdminOnly &ThisRole=Run only for this role:;string;;;(role id) &ThisUser=Run only for this user:;string;;;(username) &DittoVersion=Min Ditto version:;string;2.1.3 &EformVersion=Min eForm version:;string;1.4.9 &AjaxSearchVersion=Min AjaxSearch version:;string;1.11.0 &WayfinderVersion=Min Wayfinder version:;string;2.0.5 &WebLoginVersion=Min WebLogin version:;string;1.2 &WebSignupVersion=Min WebSignup version:;string;1.1.2 &WebChangePwdVersion=Min WebChangePwd version:;string;1.1.2 &BreadcrumbsVersion=Min Breadcrumbs version:;string;1.0.5 &ReflectVersion=Min Reflect version:;string;2.2 &JotVersion=Min Jot version:;string;1.1.5 &MtvVersion=Min multiTV version:;string;2.0.13 &badthemes=Outdated Manager Themes:;string;MODxRE2_DropdownMenu,MODxRE2,MODxRE,MODxCarbon,D3X,MODxFLAT,wMOD,ScienceStyle + * @internal @properties &wdgVisibility=Show widget for:;menu;All,AdminOnly,AdminExcluded,ThisRoleOnly,ThisUserOnly;AdminOnly &ThisRole=Run only for this role:;string;;;(role id) &ThisUser=Run only for this user:;string;;;(username) &DittoVersion=Min Ditto version:;string;2.1.3 &EformVersion=Min eForm version:;string;1.4.9 &AjaxSearchVersion=Min AjaxSearch version:;string;1.12.0 &WayfinderVersion=Min Wayfinder version:;string;2.0.5 &WebLoginVersion=Min WebLogin version:;string;1.2 &WebSignupVersion=Min WebSignup version:;string;1.1.2 &WebChangePwdVersion=Min WebChangePwd version:;string;1.1.2 &BreadcrumbsVersion=Min Breadcrumbs version:;string;1.0.5 &ReflectVersion=Min Reflect version:;string;2.2 &JotVersion=Min Jot version:;string;1.1.5 &MtvVersion=Min multiTV version:;string;2.0.13 &badthemes=Outdated Manager Themes:;string;MODxRE2_DropdownMenu,MODxRE2,MODxRE,MODxCarbon,D3X,MODxFLAT,wMOD,ScienceStyle * @internal @modx_category Manager and Admin * @internal @installset base * @internal @disabled 0 From 3f846155d6768d6da6bcf586d7c45692770d8a4b Mon Sep 17 00:00:00 2001 From: Dmi3yy Date: Sat, 27 Oct 2018 12:36:04 +0300 Subject: [PATCH 142/241] phpMailer update to 6.0.5 --- .../includes/controls/phpmailer/PHPMailer.php | 203 ++++++++++++------ manager/includes/controls/phpmailer/POP3.php | 2 +- manager/includes/controls/phpmailer/SMTP.php | 19 +- 3 files changed, 144 insertions(+), 80 deletions(-) diff --git a/manager/includes/controls/phpmailer/PHPMailer.php b/manager/includes/controls/phpmailer/PHPMailer.php index 9bcf4eaa89..fd8f1ecea9 100755 --- a/manager/includes/controls/phpmailer/PHPMailer.php +++ b/manager/includes/controls/phpmailer/PHPMailer.php @@ -30,6 +30,22 @@ */ class PHPMailer { + const CHARSET_ISO88591 = 'iso-8859-1'; + const CHARSET_UTF8 = 'utf-8'; + + const CONTENT_TYPE_PLAINTEXT = 'text/plain'; + const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; + const CONTENT_TYPE_TEXT_HTML = 'text/html'; + const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; + const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; + const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; + + const ENCODING_7BIT = '7bit'; + const ENCODING_8BIT = '8bit'; + const ENCODING_BASE64 = 'base64'; + const ENCODING_BINARY = 'binary'; + const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + /** * Email priority. * Options: null (default), 1 = High, 3 = Normal, 5 = low. @@ -44,14 +60,14 @@ class PHPMailer * * @var string */ - public $CharSet = 'iso-8859-1'; + public $CharSet = self::CHARSET_ISO88591; /** * The MIME Content-type of the message. * * @var string */ - public $ContentType = 'text/plain'; + public $ContentType = self::CONTENT_TYPE_PLAINTEXT; /** * The message encoding. @@ -59,7 +75,7 @@ class PHPMailer * * @var string */ - public $Encoding = '8bit'; + public $Encoding = self::ENCODING_8BIT; /** * Holds the most recent mailer error message. @@ -441,6 +457,22 @@ class PHPMailer */ public $DKIM_domain = ''; + /** + * DKIM Copy header field values for diagnostic use. + * + * @var bool + */ + public $DKIM_copyHeaderFields = true; + + /** + * DKIM Extra signing headers. + * + * @example ['List-Unsubscribe', 'List-Help'] + * + * @var array + */ + public $DKIM_extraHeaders = []; + /** * DKIM private key file path. * @@ -669,7 +701,7 @@ class PHPMailer * * @var string */ - const VERSION = '6.0.3'; + const VERSION = '6.0.5'; /** * Error severity: message only, continue processing. @@ -837,9 +869,9 @@ protected function edebug($str) public function isHTML($isHtml = true) { if ($isHtml) { - $this->ContentType = 'text/html'; + $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; } else { - $this->ContentType = 'text/plain'; + $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; } } @@ -1402,7 +1434,7 @@ public function preSend() // Set whether the message is multipart/alternative if ($this->alternativeExists()) { - $this->ContentType = 'multipart/alternative'; + $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; } $this->setMessageType(); @@ -1595,7 +1627,7 @@ protected static function isShellSafe($string) { // Future-proof if (escapeshellcmd($string) !== $string - or !in_array(@escapeshellarg($string), ["'$string'", "\"$string\""]) + or !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) ) { return false; } @@ -1964,6 +1996,7 @@ public function setLanguage($langcode = 'en', $lang_path = '') 'no' => 'nb', 'se' => 'sv', 'sr' => 'rs', + 'tg' => 'tl', ]; if (isset($renamed_langcodes[$langcode])) { @@ -1994,7 +2027,7 @@ public function setLanguage($langcode = 'en', $lang_path = '') ]; if (empty($lang_path)) { // Calculate an absolute path so it can work if CWD is not here - $lang_path = __DIR__ . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; + $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; } //Validate $langcode if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) { @@ -2089,7 +2122,7 @@ public function wrapText($message, $length, $qp_mode = false) } // If utf-8 encoding is used, we will need to make sure we don't // split multibyte characters when we wrap - $is_utf8 = 'utf-8' == strtolower($this->CharSet); + $is_utf8 = static::CHARSET_UTF8 === strtolower($this->CharSet); $lelen = strlen(static::$LE); $crlflen = strlen(static::$LE); @@ -2349,19 +2382,19 @@ public function getMailMIME() $ismultipart = true; switch ($this->message_type) { case 'inline': - $result .= $this->headerLine('Content-Type', 'multipart/related;'); + $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); break; case 'attach': case 'inline_attach': case 'alt_attach': case 'alt_inline_attach': - $result .= $this->headerLine('Content-Type', 'multipart/mixed;'); + $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_MIXED . ';'); $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); break; case 'alt': case 'alt_inline': - $result .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $result .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); break; default: @@ -2371,11 +2404,11 @@ public function getMailMIME() break; } // RFC1341 part 5 says 7bit is assumed if not specified - if ('7bit' != $this->Encoding) { + if (static::ENCODING_7BIT != $this->Encoding) { // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE if ($ismultipart) { - if ('8bit' == $this->Encoding) { - $result .= $this->headerLine('Content-Transfer-Encoding', '8bit'); + if (static::ENCODING_8BIT == $this->Encoding) { + $result .= $this->headerLine('Content-Transfer-Encoding', static::ENCODING_8BIT); } // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible } else { @@ -2451,29 +2484,29 @@ public function createBody() $bodyEncoding = $this->Encoding; $bodyCharSet = $this->CharSet; //Can we do a 7-bit downgrade? - if ('8bit' == $bodyEncoding and !$this->has8bitChars($this->Body)) { - $bodyEncoding = '7bit'; + if (static::ENCODING_8BIT == $bodyEncoding and !$this->has8bitChars($this->Body)) { + $bodyEncoding = static::ENCODING_7BIT; //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit $bodyCharSet = 'us-ascii'; } //If lines are too long, and we're not already using an encoding that will shorten them, //change to quoted-printable transfer encoding for the body part only - if ('base64' != $this->Encoding and static::hasLineLongerThanMax($this->Body)) { - $bodyEncoding = 'quoted-printable'; + if (static::ENCODING_BASE64 != $this->Encoding and static::hasLineLongerThanMax($this->Body)) { + $bodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } $altBodyEncoding = $this->Encoding; $altBodyCharSet = $this->CharSet; //Can we do a 7-bit downgrade? - if ('8bit' == $altBodyEncoding and !$this->has8bitChars($this->AltBody)) { - $altBodyEncoding = '7bit'; + if (static::ENCODING_8BIT == $altBodyEncoding and !$this->has8bitChars($this->AltBody)) { + $altBodyEncoding = static::ENCODING_7BIT; //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit $altBodyCharSet = 'us-ascii'; } //If lines are too long, and we're not already using an encoding that will shorten them, //change to quoted-printable transfer encoding for the alt body part only - if ('base64' != $altBodyEncoding and static::hasLineLongerThanMax($this->AltBody)) { - $altBodyEncoding = 'quoted-printable'; + if (static::ENCODING_BASE64 != $altBodyEncoding and static::hasLineLongerThanMax($this->AltBody)) { + $altBodyEncoding = static::ENCODING_QUOTED_PRINTABLE; } //Use this as a preamble in all multipart message types $mimepre = 'This is a multi-part message in MIME format.' . static::$LE; @@ -2495,7 +2528,7 @@ public function createBody() case 'inline_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); $body .= static::$LE; $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); @@ -2507,14 +2540,14 @@ public function createBody() break; case 'alt': $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; if (!empty($this->Ical)) { - $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', ''); + $body .= $this->getBoundary($this->boundary[1], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=REQUEST', ''); $body .= $this->encodeString($this->Ical, $this->Encoding); $body .= static::$LE; } @@ -2522,14 +2555,14 @@ public function createBody() break; case 'alt_inline': $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[2]); @@ -2539,17 +2572,17 @@ public function createBody() case 'alt_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; if (!empty($this->Ical)) { - $body .= $this->getBoundary($this->boundary[2], '', 'text/calendar; method=REQUEST', ''); + $body .= $this->getBoundary($this->boundary[2], '', static::CONTENT_TYPE_TEXT_CALENDAR . '; method=REQUEST', ''); $body .= $this->encodeString($this->Ical, $this->Encoding); } $body .= $this->endBoundary($this->boundary[2]); @@ -2559,17 +2592,17 @@ public function createBody() case 'alt_inline_attach': $body .= $mimepre; $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); + $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_ALTERNATIVE . ';'); $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); + $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, static::CONTENT_TYPE_PLAINTEXT, $altBodyEncoding); $body .= $this->encodeString($this->AltBody, $altBodyEncoding); $body .= static::$LE; $body .= $this->textLine('--' . $this->boundary[2]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); + $body .= $this->headerLine('Content-Type', static::CONTENT_TYPE_MULTIPART_RELATED . ';'); $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"'); $body .= static::$LE; - $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding); + $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, static::CONTENT_TYPE_TEXT_HTML, $bodyEncoding); $body .= $this->encodeString($this->Body, $bodyEncoding); $body .= static::$LE; $body .= $this->attachAll('inline', $this->boundary[3]); @@ -2671,7 +2704,7 @@ protected function getBoundary($boundary, $charSet, $contentType, $encoding) $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); $result .= static::$LE; // RFC1341 part 5 says 7bit is assumed if not specified - if ('7bit' != $encoding) { + if (static::ENCODING_7BIT != $encoding) { $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); } $result .= static::$LE; @@ -2754,7 +2787,7 @@ public function textLine($value) * * @return bool */ - public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') + public function addAttachment($path, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment') { try { if (!@is_file($path)) { @@ -2866,7 +2899,7 @@ protected function attachAll($disposition_type, $boundary) ); } // RFC1341 part 5 says 7bit is assumed if not specified - if ('7bit' != $encoding) { + if (static::ENCODING_7BIT != $encoding) { $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, static::$LE); } @@ -2936,7 +2969,7 @@ protected function attachAll($disposition_type, $boundary) * * @return string */ - protected function encodeFile($path, $encoding = 'base64') + protected function encodeFile($path, $encoding = self::ENCODING_BASE64) { try { if (!file_exists($path)) { @@ -2961,33 +2994,33 @@ protected function encodeFile($path, $encoding = 'base64') * Returns an empty string on failure. * * @param string $str The text to encode - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable + * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' * * @return string */ - public function encodeString($str, $encoding = 'base64') + public function encodeString($str, $encoding = self::ENCODING_BASE64) { $encoded = ''; switch (strtolower($encoding)) { - case 'base64': + case static::ENCODING_BASE64: $encoded = chunk_split( base64_encode($str), static::STD_LINE_LENGTH, static::$LE ); break; - case '7bit': - case '8bit': + case static::ENCODING_7BIT: + case static::ENCODING_8BIT: $encoded = static::normalizeBreaks($str); // Make sure it ends with a line break if (substr($encoded, -(strlen(static::$LE))) != static::$LE) { $encoded .= static::$LE; } break; - case 'binary': + case static::ENCODING_BINARY: $encoded = $str; break; - case 'quoted-printable': + case static::ENCODING_QUOTED_PRINTABLE: $encoded = $this->encodeQP($str); break; default: @@ -3238,7 +3271,7 @@ public function encodeQ($str, $position = 'text') public function addStringAttachment( $string, $filename, - $encoding = 'base64', + $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'attachment' ) { @@ -3278,7 +3311,7 @@ public function addStringAttachment( * * @return bool True on successfully adding an attachment */ - public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline') + public function addEmbeddedImage($path, $cid, $name = '', $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'inline') { if (!@is_file($path)) { $this->setError($this->lang('file_access') . $path); @@ -3332,7 +3365,7 @@ public function addStringEmbeddedImage( $string, $cid, $name = '', - $encoding = 'base64', + $encoding = self::ENCODING_BASE64, $type = '', $disposition = 'inline' ) { @@ -3596,7 +3629,7 @@ public static function isValidHost($host) //Is it a valid IPv4 address? return (bool) filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); } - if (filter_var('http://' . $host, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED)) { + if (filter_var('http://' . $host, FILTER_VALIDATE_URL)) { //Is it a syntactically valid hostname? return true; } @@ -3700,7 +3733,7 @@ public function msgHTML($message, $basedir = '', $advanced = false) // Convert data URIs into embedded images //e.g. "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" if (preg_match('#^data:(image/(?:jpe?g|gif|png));?(base64)?,(.+)#', $url, $match)) { - if (count($match) == 4 and 'base64' == $match[2]) { + if (count($match) == 4 and static::ENCODING_BASE64 == $match[2]) { $data = base64_decode($match[3]); } elseif ('' == $match[2]) { $data = rawurldecode($match[3]); @@ -3713,7 +3746,7 @@ public function msgHTML($message, $basedir = '', $advanced = false) $cid = hash('sha256', $data) . '@phpmailer.0'; // RFC2392 S 2 if (!$this->cidExists($cid)) { - $this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1]); + $this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, static::ENCODING_BASE64, $match[1]); } $message = str_replace( $images[0][$imgindex], @@ -3747,7 +3780,7 @@ public function msgHTML($message, $basedir = '', $advanced = false) $basedir . $directory . $filename, $cid, $filename, - 'base64', + static::ENCODING_BASE64, static::_mime_types((string) static::mb_pathinfo($filename, PATHINFO_EXTENSION)) ) ) { @@ -4250,6 +4283,11 @@ public function DKIM_Add($headers_line, $subject, $body) $to_header = ''; $date_header = ''; $current = ''; + $copiedHeaderFields = ''; + $foundExtraHeaders = []; + $extraHeaderKeys = ''; + $extraHeaderValues = ''; + $extraCopyHeaderFields = ''; foreach ($headers as $header) { if (strpos($header, 'From:') === 0) { $from_header = $header; @@ -4260,6 +4298,23 @@ public function DKIM_Add($headers_line, $subject, $body) } elseif (strpos($header, 'Date:') === 0) { $date_header = $header; $current = 'date_header'; + } elseif (!empty($this->DKIM_extraHeaders)) { + foreach ($this->DKIM_extraHeaders as $extraHeader) { + if (strpos($header, $extraHeader . ':') === 0) { + $headerValue = $header; + foreach ($this->CustomHeader as $customHeader) { + if ($customHeader[0] === $extraHeader) { + $headerValue = trim($customHeader[0]) . + ': ' . + $this->encodeHeader(trim($customHeader[1])); + break; + } + } + $foundExtraHeaders[$extraHeader] = $headerValue; + $current = ''; + break; + } + } } else { if (!empty($$current) and strpos($header, ' =?') === 0) { $$current .= $header; @@ -4268,14 +4323,24 @@ public function DKIM_Add($headers_line, $subject, $body) } } } - $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); - $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); - $date = str_replace('|', '=7C', $this->DKIM_QP($date_header)); - $subject = str_replace( - '|', - '=7C', - $this->DKIM_QP($subject_header) - ); // Copied header fields (dkim-quoted-printable) + foreach ($foundExtraHeaders as $key => $value) { + $extraHeaderKeys .= ':' . $key; + $extraHeaderValues .= $value . "\r\n"; + if ($this->DKIM_copyHeaderFields) { + $extraCopyHeaderFields .= "\t|" . str_replace('|', '=7C', $this->DKIM_QP($value)) . ";\r\n"; + } + } + if ($this->DKIM_copyHeaderFields) { + $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); + $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); + $date = str_replace('|', '=7C', $this->DKIM_QP($date_header)); + $subject = str_replace('|', '=7C', $this->DKIM_QP($subject_header)); + $copiedHeaderFields = "\tz=$from\r\n" . + "\t|$to\r\n" . + "\t|$date\r\n" . + "\t|$subject;\r\n" . + $extraCopyHeaderFields; + } $body = $this->DKIM_BodyC($body); $DKIMlen = strlen($body); // Length of body $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body @@ -4291,12 +4356,9 @@ public function DKIM_Add($headers_line, $subject, $body) $this->DKIM_selector . ";\r\n" . "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" . - "\th=From:To:Date:Subject;\r\n" . + "\th=From:To:Date:Subject" . $extraHeaderKeys . ";\r\n" . "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" . - "\tz=$from\r\n" . - "\t|$to\r\n" . - "\t|$date\r\n" . - "\t|$subject;\r\n" . + $copiedHeaderFields . "\tbh=" . $DKIMb64 . ";\r\n" . "\tb="; $toSign = $this->DKIM_HeaderC( @@ -4304,6 +4366,7 @@ public function DKIM_Add($headers_line, $subject, $body) $to_header . "\r\n" . $date_header . "\r\n" . $subject_header . "\r\n" . + $extraHeaderValues . $dkimhdrs ); $signed = $this->DKIM_Sign($toSign); diff --git a/manager/includes/controls/phpmailer/POP3.php b/manager/includes/controls/phpmailer/POP3.php index 47aa394909..9b51c8ac52 100755 --- a/manager/includes/controls/phpmailer/POP3.php +++ b/manager/includes/controls/phpmailer/POP3.php @@ -45,7 +45,7 @@ class POP3 * * @var string */ - const VERSION = '6.0.3'; + const VERSION = '6.0.5'; /** * Default POP3 port number. diff --git a/manager/includes/controls/phpmailer/SMTP.php b/manager/includes/controls/phpmailer/SMTP.php index 27b752ec30..13d2ebe7ec 100755 --- a/manager/includes/controls/phpmailer/SMTP.php +++ b/manager/includes/controls/phpmailer/SMTP.php @@ -34,7 +34,7 @@ class SMTP * * @var string */ - const VERSION = '6.0.3'; + const VERSION = '6.0.5'; /** * SMTP line break constant. @@ -155,12 +155,13 @@ class SMTP * @var string[] */ protected $smtp_transaction_id_patterns = [ - 'exim' => '/[0-9]{3} OK id=(.*)/', - 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/', - 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/', - 'Microsoft_ESMTP' => '/[0-9]{3} 2.[0-9].0 (.*)@(?:.*) Queued mail for delivery/', - 'Amazon_SES' => '/[0-9]{3} Ok (.*)/', - 'SendGrid' => '/[0-9]{3} Ok: queued as (.*)/', + 'exim' => '/[\d]{3} OK id=(.*)/', + 'sendmail' => '/[\d]{3} 2.0.0 (.*) Message/', + 'postfix' => '/[\d]{3} 2.0.0 Ok: queued as (.*)/', + 'Microsoft_ESMTP' => '/[0-9]{3} 2.[\d].0 (.*)@(?:.*) Queued mail for delivery/', + 'Amazon_SES' => '/[\d]{3} Ok (.*)/', + 'SendGrid' => '/[\d]{3} Ok: queued as (.*)/', + 'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/', ]; /** @@ -443,14 +444,14 @@ public function authenticate( return false; } - $this->edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL); + $this->edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNSPECIFIED'), self::DEBUG_LOWLEVEL); $this->edebug( 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), self::DEBUG_LOWLEVEL ); //If we have requested a specific auth type, check the server supports it before trying others - if (!in_array($authtype, $this->server_caps['AUTH'])) { + if (null !== $authtype and !in_array($authtype, $this->server_caps['AUTH'])) { $this->edebug('Requested auth method not available: ' . $authtype, self::DEBUG_LOWLEVEL); $authtype = null; } From c2b01a5a6e5b90a0cd4859f3fdd5122ff57d1552 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 29 Oct 2018 22:46:01 +0300 Subject: [PATCH 143/241] fix popup.wrap --- manager/media/style/default/js/modx.js | 2 +- manager/media/style/default/js/modx.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/js/modx.js b/manager/media/style/default/js/modx.js index 4560027cc6..4afdf6fd75 100755 --- a/manager/media/style/default/js/modx.js +++ b/manager/media/style/default/js/modx.js @@ -1752,7 +1752,7 @@ title: '', url: '', width: '20rem', - wrap: w.main.document.body, // parentNode + wrap: a.wrap || w.main.document.body, // parentNode zIndex: 10500, w: null, show: function() { diff --git a/manager/media/style/default/js/modx.min.js b/manager/media/style/default/js/modx.min.js index 700d94cb3e..347b2dadff 100755 --- a/manager/media/style/default/js/modx.min.js +++ b/manager/media/style/default/js/modx.min.js @@ -1 +1 @@ -(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[75,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×
          '}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
          ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file +(function($,w,d,u){'use strict';modx.extended({frameset:'frameset',minWidth:840,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),typesactions:{'16':1,'301':2,'78':3,'22':4,'102':5,'108':6,'3':7,'4':7,'6':7,'27':7,'61':7,'62':7,'63':7,'72':7},thememodes:['','lightness','light','dark','darkness'],tabsTimer:0,popupTimer:0,init:function(){if(!localStorage.getItem('MODX_widthSideBar')){localStorage.setItem('MODX_widthSideBar',this.config.tree_width)}this.mainmenu.init();if(w.location.hash){if(modx.getActionFromUrl(w.location.hash,2)){w.history.replaceState(null,d.title,modx.MODX_MANAGER_URL)}else if(modx.getActionFromUrl(w.location.hash)||modx.main.getQueryVariable('filemanager',w.location.hash)){var url=modx.main.getQueryVariable('filemanager',w.location.hash)?modx.MODX_MANAGER_URL+modx.main.getQueryVariable('filemanager',w.location.hash)+w.location.hash.replace('#?','?'):w.location.href.replace('#?','?');if(modx.config.global_tabs){modx.tabs({url:url,title:'blank'})}else if(w.main){w.main.frameElement.src=url}else{modx.openWindow(url)}}}this.resizer.init();this.search.init();if(this.config.session_timeout>0){w.setInterval(this.keepMeAlive,1000*60*this.config.session_timeout)}if(modx.config.mail_check_timeperiod>0&&modx.permission.messages){setTimeout('modx.updateMail(true)',1000)}d.addEventListener('click',this.hideDropDown,false);if(modx.config.global_tabs){d.addEventListener('click',this.tabs,false);this.tabs({url:'?a=2',reload:0})}},mainmenu:{id:'mainMenu',init:function(){var $mm=$('#mainMenu'),mm=d.getElementById('mainMenu'),timer;$mm.on('click','a',function(e){if($(this).hasClass('dropdown-toggle')){if($mm.hasClass('show')&&($(this).hasClass('selected')||!modx.isMobile&&$(this).parent().hasClass('hover'))){$(this).removeClass('selected');$mm.removeClass('show')}else{$('.nav > li > a:not(:hover)').removeClass('selected');$(this).addClass('selected');$mm.addClass('show')}e.stopPropagation();e.target.dataset.toggle='#mainMenu';modx.hideDropDown(e)}if($(this).closest('ul').hasClass('dropdown-menu')&&!$(this).parent('li').hasClass('dropdown-back')){$('.nav > .active').removeClass('active');$('.nav li.selected').removeClass('selected');$(this).closest('.nav > li').addClass('active');if(this.offsetParent.id){d.getElementById(this.offsetParent.id.substr(7)).classList.add('selected')}if((modx.isMobile||w.innerWidth li',function(){var els=mm.querySelectorAll('.nav > li.hover:not(:hover)');for(var i=0;i li li',function(e){var self=this,ul;var els=mm.querySelectorAll('.nav > li li.hover:not(:hover)');for(var i=0;i'+modx.lang.paging_prev+''+data}ul.id='parent_'+self.id;ul.innerHTML=data;var id=w.location.hash.substr(2).replace(/=/g,'_').replace(/&/g,'__');var el=d.getElementById(id);if(el){el.parentNode.classList.add('selected');d.getElementById(el.parentNode.parentNode.id.substr(7)).classList.add('selected')}for(var i=0;iitems.length-1){index=items.length-1}if(index>=0&&index2){s.timer=setTimeout(function(){s.loader.style.display='block';modx.get(modx.MODX_MANAGER_URL+'?a=71&ajax=1&submitok=Search&searchid='+s.input.value,function(data){s.loader.style.display='none';s.results=data.querySelector('.ajaxSearchResults');if(s.results&&s.results.innerHTML!==''){s.result.innerHTML=s.results.outerHTML;s.open();s.result.onclick=function(e){var t=e.target,p=t.parentNode;if(t.tagName==='I'){modx.openWindow({title:p.innerText,id:p.id,url:p.href});e.preventDefault();e.stopPropagation()}else{var a=t.tagName==='A'&&t||p.tagName==='A'&&p;if(a){var el=s.result.querySelector('.selected');if(el)el.className='';a.className='selected';if(modx.isMobile)s.close()}}}}else{s.empty()}},'document')},300)}else{s.empty()}};if(modx.isMobile){this.input.onblur=this.close}this.input.onfocus=this.open;this.input.onclick=this.open;this.input.onmouseenter=this.open;this.result.onmouseenter=this.open;this.result.onmouseleave=this.close;this.mask.onmouseenter=this.open;this.mask.onmouseleave=this.close},open:function(){if(modx.search.results){modx.search.result.classList.add('open')}},close:function(){modx.search.result.classList.remove('open')},empty:function(){modx.search.result.classList.remove('open');modx.search.result.innerHTML=''}},main:{id:'main',idFrame:'mainframe',as:null,onload:function(e){w.main=e.target.contentWindow||e.target.defaultView;modx.main.tabRow.init();modx.main.stopWork();modx.main.scrollWork();w.main.document.addEventListener('click',modx.hideDropDown,false);w.main.document.addEventListener('contextmenu',modx.main.oncontextmenu,false);if(modx.config.global_tabs){w.main.document.addEventListener('click',modx.tabs,false)}w.history.replaceState(null,d.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);setTimeout('modx.tree.restoreTree()',100)},oncontextmenu:function(e){if(e.ctrlKey)return;var el=e.target;if(modx.user.role===1&&/modxtv|modxplaceholder|modxattributevalue|modxchunk|modxsnippet|modxsnippetnocache/i.test(el.className)){var id=Date.now(),name=el.innerText.replace(/[\[|\]|{|}|\*||\#|\+|?|\!|&|=|`|:]/g,''),type=el.className.replace(/cm-modx/,''),n=!!name.replace(/^\d+$/,'');if(name&&n){e.preventDefault();modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'modxTagHelper',name:name,type:type},function(r){if(r){r=JSON.parse(r);for(var k in r){if(r.hasOwnProperty(k)&&r[k].url){r[k]['onclick']='if(event.shiftKey){modx.openWindow({url:\''+r[k].url+'\'})}else{modx.popup({url:\''+r[k].url+'\',title:\''+r.header.innerHTML+'\',width:\'95%\',height:\'95%\',margin:0,hide:0,hover:0,overlay:1,overlayclose:0,position:\'center elements\',animation:0,icon:\'none\'})}'}}r=JSON.stringify(r);el.id='node'+id;el.dataset.contextmenu=r;modx.tree.showPopup(e,id,name)}})}e.preventDefault()}},tabRow:{init:function(){var row=w.main.document.querySelector('.tab-pane > .tab-row');if(row)this.build(row)},build:function(row){var rowContainer=d.createElement('div'),sel=row.querySelector('.selected');rowContainer.className='tab-row-container';row.parentNode.insertBefore(rowContainer,row);rowContainer.appendChild(row);var p=d.createElement('i');p.className='fa fa-angle-left prev disable';p.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.previousSibling){sel.previousSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(p);var n=d.createElement('i');n.className='fa fa-angle-right next disable';n.onclick=function(e){e.stopPropagation();e.preventDefault();var sel=row.querySelector('.selected');if(sel.nextSibling){sel.nextSibling.click();modx.main.tabRow.scroll(row)}};rowContainer.appendChild(n);setTimeout(function(){sel=row.querySelector('.selected');modx.main.tabRow.scroll(row,sel);w.main.addEventListener('resize',function(){modx.main.tabRow.scroll(row)},false);if(sel){if(sel.previousSibling)p.classList.remove('disable');if(sel.nextSibling)n.classList.remove('disable')}},100);row.onclick=function(e){var sel=e.target.tagName==='H2'?e.target:e.target.tagName==='SPAN'?e.target.parentNode:null;if(sel){if(sel.previousSibling){this.parentNode.querySelector('i.prev').classList.remove('disable')}else{this.parentNode.querySelector('i.prev').classList.add('disable')}if(sel.nextSibling){this.parentNode.querySelector('i.next').classList.remove('disable')}else{this.parentNode.querySelector('i.next').classList.add('disable')}modx.main.tabRow.scroll(this,sel)}}},scroll:function(row,sel,a){sel=sel||row.querySelector('.selected')||row.firstChild;a=a||100;var c=0,elms=row.childNodes;for(var i=0;isel.offsetLeft){$(row).animate({scrollLeft:sel.offsetLeft-(sel.previousSibling?30:1)},a)}if(sel.offsetLeft+sel.offsetWidth>row.offsetWidth+row.scrollLeft){$(row).animate({scrollLeft:sel.offsetLeft-row.offsetWidth+sel.offsetWidth+(sel.nextSibling?30:0)},a)}if(c>row.offsetWidth){this.drag(row)}},drag:function(row){row.onmousedown=function(e){if(e.button===0){e.preventDefault();var x=e.clientX,f=row.scrollLeft;row.ownerDocument.body.focus();row.onmousemove=row.ownerDocument.onmousemove=function(e){if(Math.abs(e.clientX-x)>5){e.stopPropagation();row.scrollLeft=f-(e.clientX-x);row.ownerDocument.body.classList.add('drag')}};row.onmouseup=row.ownerDocument.onmouseup=function(e){e.stopPropagation();row.onmousemove=null;row.ownerDocument.onmousemove=null;row.ownerDocument.body.classList.remove('drag')}}}}},work:function(){d.getElementById('mainloader').classList.add('show')},stopWork:function(){d.getElementById('mainloader').classList.remove('show')},scrollWork:function(){var a=w.main.frameElement.contentWindow,b=a.location.search.substring(1)||a.location.hash.substring(2),c=localStorage.getItem('page_y')||0,f=localStorage.getItem('page_url')||b;if(((modx.getActionFromUrl(f)===modx.getActionFromUrl(b))&&(modx.main.getQueryVariable('id',f)&&modx.main.getQueryVariable('id',f)===modx.main.getQueryVariable('id',b)))||(f===b)){a.scrollTo(0,c)}a.addEventListener('scroll',function(){if(this.pageYOffset>=0){localStorage.setItem('page_y',this.pageYOffset.toString());localStorage.setItem('page_url',b)}},false)},getQueryVariable:function(a,b){var f='';if(b||typeof b==='string'){b=b.split('?');b=b[1]||b[0];b=b.split('&');for(var i=0;iMath.abs(ay)&&this.swipe){if(ax<0&&this.sidebar){if(Math.abs(ax)>h)ax=-h;tree.style.transform='translate3d('+ax+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ax+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5-0.5/-h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='left'}else{this.swipe='right'}}else if(ax>0&&!this.sidebar){if(Math.abs(ax)>h)ax=h;tree.style.transform='translate3d('+ -(h-ax)+'px, 0, 0)';tree.style.WebkitTransform='translate3d('+ -(h-ax)+'px, 0, 0)';modx.resizer.mask.style.opacity=(0.5/h*ax).toFixed(2);if(Math.abs(ax)>h/3){this.swipe='right'}else{this.swipe='left'}}}},false);w.addEventListener('touchend',function(){if(this.swipe==='left'){d.body.classList.add('sidebar-closed');modx.resizer.setWidth(0)}if(this.swipe==='right'){d.body.classList.remove('sidebar-closed');modx.resizer.setWidth(h)}tree.style.cssText='';modx.resizer.mask.style.cssText=''},false)}},onMouseDown:function(e){e=e||w.event;modx.resizer.dragElement=e.target!==null?e.target:e.srcElement;if((e.buttons===1||e.button===0)&&modx.resizer.dragElement.id===modx.resizer.id){modx.resizer.oldZIndex=modx.resizer.dragElement.style.zIndex;modx.resizer.dragElement.style.zIndex=modx.resizer.newZIndex;modx.resizer.dragElement.style.background=modx.resizer.background;localStorage.setItem('MODX_widthSideBar',modx.resizer.dragElement.offsetLeft>0?modx.resizer.dragElement.offsetLeft:0);d.body.appendChild(modx.resizer.mask);d.onmousemove=modx.resizer.onMouseMove;d.body.focus();d.body.classList.add('resizer_move');d.onselectstart=function(){return false};modx.resizer.dragElement.ondragstart=function(){return false};return false}},onMouseMove:function(e){e=e||w.event;if(e.clientX>0){modx.resizer.left=e.clientX}else{modx.resizer.left=0}modx.resizer.dragElement.style.left=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('tree').style.width=modx.pxToRem(modx.resizer.left)+'rem';d.getElementById('main').style.left=modx.pxToRem(modx.resizer.left)+'rem';if(e.clientX<-2||e.clientY<-2){modx.resizer.onMouseUp(e)}},onMouseUp:function(e){if(modx.resizer.dragElement!==null&&e.button===0&&modx.resizer.dragElement.id===modx.resizer.id){if(e.clientX>0){d.body.classList.remove('sidebar-closed');modx.resizer.left=e.clientX}else{d.body.classList.add('sidebar-closed');modx.resizer.left=0}d.cookie='MODX_widthSideBar='+modx.pxToRem(modx.resizer.left);modx.resizer.dragElement.style.zIndex=modx.resizer.oldZIndex;modx.resizer.dragElement.style.background='';modx.resizer.dragElement.ondragstart=null;modx.resizer.dragElement=null;d.body.classList.remove('resizer_move');d.body.removeChild(modx.resizer.mask);d.onmousemove=null;d.onselectstart=null}},toggle:function(){if(modx.isMobile||w.innerWidth<=modx.minWidth){if(d.body.classList.contains('sidebar-closed')){d.body.classList.remove('sidebar-closed');localStorage.setItem('MODX_widthSideBar',0);d.cookie='MODX_widthSideBar='+modx.pxToRem(parseInt(d.getElementById('tree').offsetWidth))}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed');d.cookie='MODX_widthSideBar=0'}}else{var p=d.getElementById('tree').offsetWidth!==0?0:parseInt(localStorage.getItem('MODX_widthSideBar'))?parseInt(localStorage.getItem('MODX_widthSideBar')):modx.config.tree_width;modx.resizer.setWidth(p)}},setWidth:function(a){if(a>0){localStorage.setItem('MODX_widthSideBar',0);d.body.classList.remove('sidebar-closed')}else{localStorage.setItem('MODX_widthSideBar',parseInt(d.getElementById('tree').offsetWidth));d.body.classList.add('sidebar-closed')}d.cookie='MODX_widthSideBar='+modx.pxToRem(a);d.getElementById('tree').style.width=modx.pxToRem(a)+'rem';d.getElementById('resizer').style.left=modx.pxToRem(a)+'rem';d.getElementById('main').style.left=modx.pxToRem(a)+'rem'},setDefaultWidth:function(){modx.resizer.setWidth(modx.remToPx(modx.config.tree_width))}},tree:{ctx:null,rpcNode:null,itemToChange:'',selectedObjectName:null,selectedObject:0,selectedObjectDeleted:0,selectedObjectUrl:'',drag:false,deleted:[],init:function(){this.restoreTree()},draggable:function(){if(modx.permission.dragndropdocintree){var els=d.querySelectorAll('#treeRoot a:not(.empty)');for(var i=0;i-1:true;modx.tree.itemToChange=this.dataset.id||this.parentNode.id.replace('node','');modx.tree.selectedObjectName=this.dataset.titleEsc;if(draggable){this.parentNode.draggable=true;this.parentNode.ondragstart=modx.tree.ondragstart}else{this.parentNode.draggable=false;this.parentNode.ondragstart=function(){return false}}}},ondragstart:function(e){e.dataTransfer.effectAllowed='all';e.dataTransfer.dropEffect='all';e.dataTransfer.setData('text',this.id.substr(4))},ondragenter:function(e){if(d.getElementById('node'+modx.tree.itemToChange)===(this.parentNode.closest('#node'+modx.tree.itemToChange)||this.parentNode)){this.parentNode.className='';e.dataTransfer.effectAllowed='none';e.dataTransfer.dropEffect='none';modx.tree.drag=false}else{this.parentNode.className='dragenter';e.dataTransfer.effectAllowed='copy';e.dataTransfer.dropEffect='copy';modx.tree.drag=true}e.preventDefault()},ondragover:function(e){if(modx.tree.drag){var a=e.clientY;var b=parseInt(this.getBoundingClientRect().top);var c=a-b;if(c>this.offsetHeight/1.51){this.parentNode.classList.add('dragafter');this.parentNode.classList.remove('dragbefore');this.parentNode.classList.remove('dragenter');e.dataTransfer.effectAllowed='link';e.dataTransfer.dropEffect='link'}else if(c'}if(this.nextSibling){if(this.nextSibling.innerHTML){this.nextSibling.appendChild(el)}else{el.parentNode.removeChild(el)}els=this.parentNode.lastChild.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode.nextSibling);els=this.parentNode.parentNode.children;for(i=0;i'}this.parentNode.parentNode.insertBefore(el,this.parentNode);els=this.parentNode.parentNode.children;for(i=0;i-1:true)){alert(modx.lang.error_no_privileges);modx.tree.restoreTree();return}modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',{a:'movedocument',id:id,parent:parent,menuindex:menuindex},function(r){if(r.errors)alert(r.errors);modx.tree.restoreTree()},'json');var b=w.main.frameElement.contentWindow.location.search.substr(1);if(modx.getActionFromUrl(b,27)&&parseInt(modx.main.getQueryVariable('id',b))===parseInt(id)){var index=menuindex.indexOf(id),elMenuIndex=w.main.document.querySelector('#documentPane input[name=menuindex]'),elParent=w.main.document.querySelector('#documentPane input[name=parent]'),elParentName=w.main.document.querySelector('#documentPane #parentName');if(elMenuIndex&&index>=0)elMenuIndex.value=index;if(elParent&&elParentName){elParent.value=parent;elParentName.innerHTML=parent+' ('+d.querySelector('#node'+parent+' > a').dataset.titleEsc+')'}}},toggleTheme:function(){var a,b=1,myCodeMirrors=w.main.myCodeMirrors,key;if(typeof localStorage['MODX_themeMode']==='undefined'){localStorage['MODX_themeMode']=modx.config.theme_mode}if(modx.thememodes[parseInt(localStorage['MODX_themeMode'])+1]){b=parseInt(localStorage['MODX_themeMode'])+1}a=modx.thememodes[b];for(key in modx.thememodes){if(modx.thememodes[key]){d.body.classList.remove(modx.thememodes[key]);w.main.document.body.classList.remove(modx.thememodes[key])}}d.body.classList.add(a);w.main.document.body.classList.add(a);d.cookie='MODX_themeMode='+b;localStorage['MODX_themeMode']=b;if(typeof myCodeMirrors!=='undefined'){for(key in myCodeMirrors){if(myCodeMirrors.hasOwnProperty(key)){if(~a.indexOf('dark')){w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.defaulttheme)}else{w.main.document.getElementsByName(key)[0].nextElementSibling.classList.remove('cm-s-'+myCodeMirrors[key].options.darktheme);w.main.document.getElementsByName(key)[0].nextElementSibling.classList.add('cm-s-'+myCodeMirrors[key].options.defaulttheme)}}}}},toggleNode:function(e,id){e=e||w.event;if(e.ctrlKey)return;e.stopPropagation();var el=d.getElementById('node'+id).firstChild;this.rpcNode=el.nextSibling;var toggle=el.querySelector('.toggle'),icon=el.querySelector('.icon');if(this.rpcNode.innerHTML===''){if(toggle)toggle.innerHTML=el.dataset.iconCollapsed;icon.innerHTML=el.dataset.iconFolderOpen;var rpcNodeText=this.rpcNode.innerHTML,loadText=modx.lang.loading_doc_tree;modx.openedArray[id]=1;if(rpcNodeText===''||rpcNodeText.indexOf(loadText)>0){var folderState=this.getFolderState();d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent='+el.dataset.indent+'&parent='+id+'&expandAll='+el.dataset.expandall+folderState,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}this.saveFolderState()}else{if(toggle)toggle.innerHTML=el.dataset.iconExpanded;icon.innerHTML=el.dataset.iconFolderClose;delete modx.openedArray[id];this.rpcNode.style.overflow='hidden';$(this.rpcNode.firstChild).animate({marginTop:-this.rpcNode.offsetHeight+'px'},100,function(){this.parentNode.innerHTML=''});this.saveFolderState()}e.preventDefault()},rpcLoadData:function(a){if(this.rpcNode!==null){var el;this.rpcNode.innerHTML=typeof a==='object'?a.responseText:a;this.rpcNode.loaded=true;if(this.rpcNode.firstChild.tagName==='DIV'){if(this.rpcNode.id==='treeRoot'){el=d.getElementById('binFull');if(el){this.showBin(true)}else{this.showBin(false)}}else{this.rpcNode.style.overflow='hidden';this.rpcNode.firstElementChild.style.marginTop=-this.rpcNode.offsetHeight+'px';$(this.rpcNode.firstChild).animate({marginTop:0},100)}d.getElementById('treeloader').classList.remove('visible')}else{el=d.getElementById('loginfrm');if(el){this.rpcNode.parentNode.removeChild(this.rpcNode);w.location.href=modx.MODX_MANAGER_URL}}}},treeAction:function(e,id,title){if(e.ctrlKey)return;var el=d.getElementById('node'+id).firstChild,treepageclick=el.dataset.treepageclick,showchildren=parseInt(el.dataset.showchildren),openfolder=parseInt(el.dataset.openfolder);title=title||el.dataset&&el.dataset.titleEsc;if(tree.ca==='move'){try{this.setSelectedByContext(id);w.main.setMoveValue(id,title)}catch(oException){alert(modx.lang.unable_set_parent)}}if(tree.ca==='open'||tree.ca===''){if(id===0){href='?a=2'}else{var href='';if(!isNaN(treepageclick)&&isFinite(treepageclick)){href='?a='+treepageclick+'&r=1&id='+id+(openfolder===0?this.getFolderState():'')}else{href=treepageclick}if(openfolder===2){if(showchildren!==1){href=''}this.toggleNode(e,id)}}if(href){if(e.shiftKey){w.getSelection().removeAllRanges();modx.openWindow(href);this.restoreTree()}else{modx.tabs({url:modx.MODX_MANAGER_URL+href,title:title+'('+id+')'});if(modx.isMobile&&w.innerWidth0?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;e.view.position=e.view.frameElement?e.view.frameElement.getBoundingClientRect():e.target.offsetParent.getBoundingClientRect();if(e.view.frameElement){x+=e.view.position.left;y+=e.view.frameElement.offsetParent.offsetTop}else{if(e.target.parentNode.parentNode.classList.contains('node')){x+=50}}if(x>e.view.position.width){x=e.view.position.width-this.ctx.offsetWidth}if(y+this.ctx.offsetHeight/2>e.view.position.height){y=e.view.position.height-this.ctx.offsetHeight-5}else if(y-this.ctx.offsetHeight/20?e.clientX:e.pageX;y=e.clientY>0?e.clientY:e.pageY;if(y+ctx.offsetHeight/2>bodyHeight){y=bodyHeight-ctx.offsetHeight-5}else if(y-ctx.offsetHeight/230){this.selectedObjectName=this.selectedObjectName.substr(0,30)+'...'}var f=d.getElementById('nameHolder');f.innerHTML=this.selectedObjectName;el.style.left=a+(modx.config.textdir?'-190':'')+'px';el.style.top=b+'px';el.classList.add('show')},menuHandler:function(a){switch(a){case 1:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=3&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 2:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=27&r=1&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 3:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=4&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 4:if(this.selectedObjectDeleted){alert('"'+this.selectedObjectName+'" '+modx.lang.already_deleted)}else if(confirm('"'+this.selectedObjectName+'"\n\n'+modx.lang.confirm_delete_resource)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=6&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 5:this.setActiveFromContextMenu(this.itemToChange);modx.tabs({url:modx.MODX_MANAGER_URL+'?a=51&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 6:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=72&pid='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 7:if(confirm(modx.lang.confirm_resource_duplicate)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=94&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 8:if(d.getElementById('node'+this.itemToChange).firstChild.dataset.deleted){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_undelete)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=63&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('"'+this.selectedObjectName+'"'+modx.lang.not_deleted)}break;case 9:if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_publish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=61&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}break;case 10:if(this.itemToChange!==modx.config.site_start){if(confirm('"'+this.selectedObjectName+'" '+modx.lang.confirm_unpublish)===true){modx.tabs({url:modx.MODX_MANAGER_URL+'?a=62&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'})}}else{alert('Document is linked to site_start variable and cannot be unpublished!')}break;case 11:modx.tabs({url:modx.MODX_MANAGER_URL+'?a=56&id='+this.itemToChange,title:this.selectedObjectName+'('+this.itemToChange+')'});break;case 12:w.open(d.getElementById('node'+this.itemToChange).firstChild.dataset.href,'previeWin');break;default:alert('Unknown operation command.')}},setSelected:function(a){var el=d.querySelector('#tree .current');if(el)el.classList.remove('current');if(a){if(typeof a==='object'){a.classList.add('current')}else{el=d.querySelector('#node'+a+'>.node')||d.getElementById('node'+a);if(el)el.classList.add('current')}}},setActiveFromContextMenu:function(a){var el=d.querySelector('#node'+a+'>.node');if(el)this.setSelected(el)},setSelectedByContext:function(a){var el=d.querySelector('#treeRoot .selected');if(el)el.classList.remove('selected');el=d.querySelector('#node'+a+'>.node');if(el)el.classList.add('selected')},setItemToChange:function(){var a=w.main.document&&(w.main.document.URL||w.main.document.location.search),b=modx.getActionFromUrl(a);if(a&&modx.typesactions[b]){this.itemToChange=(modx.typesactions[b]===7?'':modx.typesactions[b]+'_')+parseInt(modx.main.getQueryVariable('id',a))}else{this.itemToChange=''}this.setSelected(this.itemToChange)},restoreTree:function(){if(d.getElementById('treeRoot')){d.getElementById('treeloader').classList.add('visible');this.setItemToChange();this.rpcNode=d.getElementById('treeRoot');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=2&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})}},expandTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=1&id='+this.itemToChange,function(r){modx.tree.rpcLoadData(r);modx.tree.saveFolderState();modx.tree.draggable()})},collapseTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&indent=1&parent=0&expandAll=0&id='+this.itemToChange,function(r){modx.openedArray=[];modx.tree.saveFolderState();modx.tree.rpcLoadData(r);modx.tree.draggable()})},updateTree:function(){this.rpcNode=d.getElementById('treeRoot');d.getElementById('treeloader').classList.add('visible');var a=d.sortFrm;var b='a=1&f=nodes&indent=1&parent=0&expandAll=2&dt='+a.dt.value+'&tree_sortby='+a.sortby.value+'&tree_sortdir='+a.sortdir.value+'&tree_nodename='+a.nodename.value+'&id='+this.itemToChange+'&showonlyfolders='+a.showonlyfolders.value;modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php',b,function(r){modx.tree.rpcLoadData(r);modx.tree.draggable()})},getFolderState:function(){var a;if(modx.openedArray!==[0]){a='&opened=';for(var key in modx.openedArray){if(modx.openedArray[key]){a+=key+'|'}}}else{a='&opened='}return a},saveFolderState:function(){modx.post(modx.MODX_MANAGER_URL+'media/style/'+modx.config.theme+'/ajax.php','a=1&f=nodes&savestateonly=1'+this.getFolderState())},showSorter:function(e){e=e||w.event;var el=d.getElementById('floater');e.target.dataset.toggle='#floater';el.classList.toggle('show');el.onclick=function(e){e.stopPropagation()}},emptyTrash:function(){if(confirm(modx.lang.confirm_empty_trash)===true){modx.get(modx.MODX_MANAGER_URL+'?a=64',function(){modx.tabsClose(modx.tree.deleted);modx.tree.deleted=[];modx.tree.restoreTree()})}},showBin:function(a){var el=d.getElementById('treeMenu_emptytrash');if(el){if(a){el.title=modx.lang.empty_recycle_bin;el.classList.remove('disabled');el.innerHTML=modx.style.empty_recycle_bin;el.onclick=function(){modx.tree.emptyTrash()};var els=d.getElementById('tree').querySelectorAll('.deleted');for(var i=0;i0){if(el){el.innerHTML=c[0];el.style.display='block'}}else{if(el)el.style.display='none'}if(c[1]>0){el=d.getElementById('newMail');if(el){el.innerHTML=''+modx.style.email+modx.lang.inbox+' ('+c[0]+' / '+c[1]+')';el.style.display='block'}}if(modx.config.mail_check_timeperiod>0)setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)})}}catch(oException){setTimeout('modx.updateMail(true)',1000*modx.config.mail_check_timeperiod)}},openWindow:function(a){if(typeof a!=='object'){a={'url':a}}if(!a.width)a.width=parseInt(w.innerWidth*0.9)+'px';if(!a.height)a.height=parseInt(w.innerHeight*0.8)+'px';if(!a.left)a.left=parseInt(w.innerWidth*0.05)+'px';if(!a.top)a.top=parseInt(w.innerHeight*0.1)+'px';if(!a.title)a.title=Math.floor((Math.random()*999999)+1);if(a.url){if(this.plugins.EVOmodal===1){top.EVO.modal.show(a)}else{w.open(a.url,a.title,'width='+a.width+',height='+a.height+',top='+a.top+',left='+a.left+',toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no')}}},tabsClose:function(a){if(modx.config.global_tabs&&a){for(var k in a){if(a.hasOwnProperty(k)){var el=d.getElementById(a[k]);if(el){el.firstElementChild.contentWindow.documentDirty=false;el.close()}}}}},tabs:function(a){function Tabs(a){var s=this;this.url=a.url;this.title=a.title||'';this.name=a.name||'';this.timer=null;this.olduid='';this.closeactions=[6,61,62,63,94];this.saveAndCloseActions=[75,86,99,106];this.reload=typeof a.reload!=='undefined'?a.reload:1;this.action=modx.getActionFromUrl(a.url);this.uid=modx.getActionFromUrl(a.url,2)?'home':modx.urlToUid(a.url);this.page=d.getElementById('evo-tab-page-'+this.uid);this.row=d.getElementsByClassName('evo-tab-row')[0].firstElementChild;this.tab=d.getElementById('evo-tab-'+this.uid);if(this.page){if(this.uid==='home'){if(this.reload){this.page.firstElementChild.src=this.url;this.show()}else{this.reload=1;if(this.tab.onclick===null){this.tab.onclick=function(e){s.select.call(s,e,this)}}this.tab.show=function(e){s.show.call(s,e)};modx.tabs.selected=this.tab}}else{this.show();if(~this.closeactions.indexOf(this.action)){this.setDocPublished();modx.get(this.url,function(){modx.tree.restoreTree()})}}}else if(~this.closeactions.indexOf(this.action)){modx.get(this.url,function(){modx.tree.restoreTree()})}else{this.create()}}Tabs.prototype={create:function(){var s=this;modx.main.work();modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page=d.createElement('div');this.page.id='evo-tab-page-'+this.uid;this.page.className='evo-tab-page iframe-scroller show';if(/iPhone|iPad|iPod/i.test(navigator.userAgent)){this.page.innerHTML=''}else{this.page.innerHTML=''};d.getElementById('main').appendChild(this.page);console.time('load-tab');this.page.firstElementChild.onload=function(e){s.onload.call(s,e);console.timeEnd('load-tab')};this.tab=d.createElement('h2');this.tab.id='evo-tab-'+this.uid;this.tab.className='tab selected';this.icon='';if(!/'}this.tab.innerHTML=''+this.icon+this.title+'×';this.row.appendChild(this.tab);this.tab.onclick=function(e){s.select.call(s,e,this)};this.tab.close=function(e){s.close.call(s,e)};this.tab.show=function(e){s.show.call(s,e)};this.page.close=function(e){s.close.call(s,e)}},onload:function(e){var s=this;w.main=e.target.contentWindow||e.target.defaultView;this.url=w.main.location.search||w.location.hash.substring(1);this.olduid=this.uid;this.uid=modx.urlToUid(this.url);if(!!w.main.__alertQuit){w.main.alert=function(a){};var message=w.main.document.body.innerHTML;w.main.document.body.innerHTML='';history.pushState(null,d.title,modx.getActionFromUrl(w.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.location.search);w.onpopstate=function(){history.go(1)};modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:message,wrap:'body'});modx.getLockedElements(modx.getActionFromUrl(this.url),modx.main.getQueryVariable('id',this.url),function(data){if(!!data){s.page.close();modx.tree.restoreTree()}else{w.main.location.href=modx.MODX_MANAGER_URL+s.url;w.history.replaceState(null,d.title,modx.getActionFromUrl(s.url,2)?modx.MODX_MANAGER_URL:'#'+s.url)}})}else{if(modx.getActionFromUrl(this.url,2)||(~this.saveAndCloseActions.indexOf(modx.getActionFromUrl(this.url))&&parseInt(modx.main.getQueryVariable('r',this.url)))){this.close(e)}else if(this.olduid!==this.uid&&d.getElementById('evo-tab-'+this.uid)){this.close(e);d.getElementById('evo-tab-'+this.uid).show()}else{this.title=w.main.document.body.querySelectorAll('h1')[0]&&w.main.document.body.querySelectorAll('h1')[0].innerHTML||this.title;if(this.title&&this.uid!=='home'){this.tab.innerHTML=''+this.title+'×'}this.page.id='evo-tab-page-'+this.uid;this.tab.id='evo-tab-'+this.uid;this.tab.classList.remove('changed');this.show();modx.main.onload(e);w.main.document.addEventListener('click',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false);w.main.document.addEventListener('keyup',function a(e){if(typeof e.view.documentDirty!=='undefined'&&e.view.documentDirty&&!s.tab.classList.contains('changed')){s.tab.classList.add('changed');this.removeEventListener(e.type,a,false)}},false)}}},show:function(){var s=this;modx.tabs.selected=this.row.querySelector('.selected');if(modx.tabs.selected&&modx.tabs.selected!==this.tab){d.getElementById(modx.tabs.selected.id.replace('tab','tab-page')).classList.remove('show');modx.tabs.selected.classList.remove('selected')}this.page.classList.add('show');this.tab.classList.add('selected');modx.tabs.selected=this.tab;w.main=this.page.firstElementChild.contentWindow;w.history.replaceState(null,w.main.document.title,modx.getActionFromUrl(w.main.location.search,2)?modx.MODX_MANAGER_URL:'#'+w.main.location.search);modx.tree.setItemToChange();modx.main.tabRow.scroll(this.row,this.tab,350)},close:function(e){var documentDirty=this.page.firstElementChild.contentWindow.documentDirty;var checkDirt=!!this.page.firstElementChild.contentWindow.checkDirt;if(documentDirty&&checkDirt&&confirm(this.page.firstElementChild.contentWindow.checkDirt(e))||!documentDirty){if(modx.tabs.selected===this.tab){tree.ca='open'}modx.tabs.selected=this.tab.classList.contains('selected')?this.tab.previousElementSibling:this.row.querySelector('.selected');this.page.parentNode.removeChild(this.page);this.row.removeChild(this.tab);modx.tabs.selected.show()}},select:function(e){if(e.target.className==='tab-close'){this.close(e)}else if(modx.tabs.selected===this.tab){var s=this;if(this.timer){clearTimeout(this.timer);this.timer=null;w.main.location.reload()}else{this.timer=setTimeout(function(){s.timer=null},250)}}else{this.show()}},setDocPublished:function(){var el=w.main.document.getElementsByName('publishedcheck')[0];if(el){el.checked=this.action===61;w.main.document.getElementsByName('published')[0].value=+el.checked}if(modx.getActionFromUrl(w.main.location.search,3)){w.main.location.reload()}}};if(modx.config.global_tabs){if(typeof a.currentTarget!=='undefined'){var e=a;if(e.button===0&&e.target&&(e.target.tagName==='A'&&e.target.target==='main'||(e.target.parentNode&&e.target.parentNode.tagName==='A'&&e.target.parentNode.target==='main'))){a=e.target.tagName==='A'&&e.target||e.target.parentNode.tagName==='A'&&e.target.parentNode;if(e.shiftKey){modx.openWindow({url:a.href})}else{modx.tabs({url:a.href,title:a.innerHTML})}e.preventDefault()}}else{return new Tabs(a)}}else if(a.url){if(w.main){w.main.frameElement.src=a.url}else{modx.openWindow(a.url)}}},popup:function(a){if(typeof a==='object'&&(a.url||a.content||a.text)){var o={addclass:'',animation:'fade',content:a.content||a.text||'',clickclose:0,closeall:0,data:'',dataType:'document',delay:5000,draggable:!1,event:null,height:'auto',hide:1,hover:1,icon:'',iframe:'iframe',margin:'.5rem',maxheight:'',method:'GET',overlay:0,overlayclose:0,position:'center',resize:!1,selector:'',showclose:1,target:'main',uid:'',type:'default',title:'',url:'',width:'20rem',wrap:a.wrap||w.main.document.body,zIndex:10500,w:null,show:function(){if(~o.position.indexOf('center')){if(o.event){o.el.style.left=o.event.clientX+o.mt+'px';o.el.style.bottom=o.w.innerHeight-o.el.offsetHeight-o.event.clientY+o.mt+'px'}else{o.el.style.left=/(%)/.test(o.width)?(100-parseInt(o.width))/2-o.mt/(o.w.innerWidth/100)+'%':(o.w.innerWidth-o.el.offsetWidth)/2-o.mt+'px';o.el.style.bottom=/(%)/.test(o.height)?(100-parseInt(o.height))/2-o.mt/(o.w.innerHeight/100)+'%':(o.w.innerHeight-o.el.offsetHeight-o.wrap.offsetTop)/2-o.mt+'px'}}if(~o.position.indexOf('left')){o.el.style.left=0}if(~o.position.indexOf('right')){o.el.style.right=0}else{o.el.style.right='auto'}if(~o.position.indexOf('top')){o.el.style.top=0;o.el.style.bottom=''}else{o.el.style.top='auto'}if(~o.position.indexOf('bottom')){o.el.style.bottom=0}o.calc();o.el.className+=' in';if(o.showclose){o.el.querySelector('.close').onclick=o.close}if(o.hide){o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);o.close()},o.delay)}if(o.hover){o.el.onmouseenter=function(){clearTimeout(o.el.timer)};o.el.onmouseleave=o.close}if(o.overlayclose&&o.o){o.o.onclick=o.close}if(o.clickclose){o.el.onclick=o.close}if(o.draggable){modx.dragging(o.el,{wrap:o.wrap,resize:o.resize})}},close:function(e){o.event=e||o.event||w.event;if(o.url&&o.iframe==='iframe'){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in');if(els){var documentDirty=o.el.lastElementChild.firstElementChild.contentWindow.documentDirty;if(documentDirty&&confirm(o.el.lastElementChild.firstElementChild.contentWindow.checkDirt(o.event))||!documentDirty){o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}}}else{o.el.classList.remove('in');if(!o.animation){o.el.classList.remove('show')}o.calc(1);if(o.o&&o.o.parentNode){o.o.parentNode.removeChild(o.o);o.wrap.style.overflow=''}o.el.timer=setTimeout(function(){clearTimeout(o.el.timer);if(o.el.parentNode){o.el.parentNode.removeChild(o.el)}},200)}if(typeof o.onclose==='function'){o.onclose(e,o.el)}},calc:function(f){var els=o.wrap.ownerDocument.querySelectorAll('.'+o.className+'.in[data-position="'+o.el.dataset.position+'"]');if(els&&els.length){o.els=[];for(var i=0;i×
        '}if(o.title){o.header=document.createElement('div');if(o.icon!=='none'){o.header.innerHTML+=''}o.header.innerHTML+=o.title;o.header.className='evo-popup-header';o.el.appendChild(o.header)}o.el.innerHTML+='
        ';o.wrap.appendChild(o.el);o.mt=parseFloat(getComputedStyle(o.el).marginTop);if(o.maxheight){o.maxheight=/(%)/.test(o.maxheight)?(o.w.innerHeight-o.el.offsetHeight-o.mt)/100*parseInt(o.maxheight):o.maxheight;o.el.lastChild.style.overflowY='auto';o.el.lastChild.style.maxHeight=o.maxheight+'px'}if(o.url){o.draggable=1;if(o.iframe==='iframe'){o.resize=1;o.uid=modx.urlToUid(a.url);o.el.className+=' '+o.addclass+' '+o.className+'-iframe';o.el.id='evo-popup-'+o.uid;d.getElementById('mainloader').className='show';o.frame=d.createElement('iframe');o.frame.width='100%';o.frame.height='100%';o.frame.frameBorder='0';o.frame.src=o.url;o.frame.onload=function(e){e.target.contentWindow.opener=o.w;a.url=e.target.contentWindow.location.href;o.uid=modx.urlToUid(a.url);o.event=e;if(!!e.target.contentWindow.__alertQuit){modx.popup({type:'warning',title:'MODX :: Alert',position:'top center alertQuit',content:e.target.contentWindow.document.body.querySelector('p').innerHTML});e.target.contentWindow.document.body.innerHTML='';e.target.contentWindow.alert=function(){}}else{if(modx.getActionFromUrl(a.url,2)||o.wrap.querySelectorAll('#evo-popup-'+o.uid).length>1){o.el.close()}else{if(e.target.contentDocument.querySelectorAll('h1')[0]){a.title=e.target.contentDocument.querySelectorAll('h1')[0].innerHTML}else if(e.target.contentDocument.title){a.title=e.target.contentDocument.title}if(o.header){e.target.offsetParent.offsetParent.getElementsByClassName(o.header.className)[0].innerHTML=a.title}e.target.offsetParent.offsetParent.id='evo-popup-'+o.uid;e.target.offsetParent.offsetParent.classList.remove('changed')}}e.target.contentWindow.close=o.close;modx.main.stopWork()};o.el.lastChild.appendChild(o.frame);o.show()}else{var xhr=new XMLHttpRequest();xhr.open(o.method,o.url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded;');xhr.setRequestHeader('X-REQUESTED-WITH','XMLHttpRequest');if(o.dataType){xhr.responseType=o.dataType}xhr.onload=function(){if(this.readyState===4){o.el.className+=' '+o.className+'-ajax';if(o.dataType==='document'){if(o.selector){var r=this.response.documentElement.querySelector(o.selector);if(r){o.el.lastChild.innerHTML+=r.innerHTML}}else{o.el.lastChild.innerHTML+=this.response.body.innerHTML}}else{o.el.lastChild.innerHTML+=this.response}o.show()}};xhr.send(o.data)}}else{o.el.lastChild.innerHTML+=o.content;o.show()}}return o}},getWindowDimension:function(){var a=0,b=0,c=d.documentElement,e=d.body;if(typeof(w.innerWidth)==='number'){a=w.innerWidth;b=w.innerHeight}else if(c&&(c.clientWidth||c.clientHeight)){a=c.clientWidth;b=c.clientHeight}else if(e&&(e.clientWidth||e.clientHeight)){a=e.clientWidth;b=e.clientHeight}return{'width':a,'height':b}},hideDropDown:function(e){e=e||w.event||w.main.event;if(tree.ca==='open'||tree.ca===''){modx.tree.setSelectedByContext()}if(modx.tree.ctx!==null){d.getElementById(modx.frameset).removeChild(modx.tree.ctx);modx.tree.ctx=null}if(!/dropdown\-item/.test(e.target.className)){var els=d.querySelectorAll('.dropdown.show'),n=null,t=e.target||e.target.parentNode,i;if(typeof t.dataset.toggle!=='undefined'){n=d.querySelector(t.dataset.toggle)}else if(t.classList.contains('dropdown-toggle')){n=t.offsetParent}for(i=0;i';if(this.classDrag)this.el.classList.add(this.classDrag);if(this.classResize)this.el.classList.add(this.classResize);this.el.insertBefore(this.borders,this.el.firstChild);if(this.handler&&this.el.getElementsByClassName(this.handler)[0]){this.handler=this.el.getElementsByClassName(this.handler)[0];this.handlerHeight=this.handler.offsetHeight}this.el.onmousedown=function(e){s.mousedown(e)};this.el.ontouchstart=function(e){s.mousedown(e.changedTouches[0])};this.wrap.addEventListener('mousemove',function(e){s.calc(e)},false);this.wrap.addEventListener('touchmove',function(e){s.calc(e.changedTouches[0])},false)};this.dragging.init.prototype={mousedown:function(e){if(e.target.classList.contains('close')){return}e=document.all?window.event:e;var s=this,x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY,style=w.getComputedStyle(this.el);this.elmX=(x-this.el.offsetLeft+parseInt(style.marginLeft));this.elmY=(y-this.el.offsetTop+parseInt(style.marginTop));this.el.position=this.el.getBoundingClientRect();this.el.style.position='fixed';this.el.style.transitionDuration='0s';this.el.style.webkitTransitionDuration='0s';this.el.style.left=this.el.offsetLeft-parseInt(style.marginLeft)+'px';this.el.style.top=this.el.offsetTop-parseInt(style.marginTop)+'px';this.el.style.right='auto';this.el.style.bottom='auto';this.el.style.width=this.el.position.width+'px';this.el.style.height=this.el.position.height+'px';if(e.target.parentNode===this.borders){this.isresize=this.resize;this.el.classList.add('is-resize')}else{if(!this.handler||(this.handler&&e.target===this.handler)){this.isdrag=true;this.el.classList.add('is-drag')}}if(typeof this.start==='function'){this.onstart(e,this.el)}if(e.preventDefault){e.preventDefault()}else{document.onselectstart=function(){return false}}this.wrap.onmousemove=function(e){s.mousemove(e)};this.wrap.ontouchmove=function(e){s.mousemove(e.changedTouches[0]);e.stopPropagation()};this.wrap.onmouseup=function(e){s.mouseup(e)};this.wrap.ontouchend=function(e){s.mouseup(e.changedTouches[0]);e.stopPropagation()}},mousemove:function(e){var x=document.all?window.event.clientX:e.clientX,y=document.all?window.event.clientY:e.clientY;if(this.isresize){if(this.onRight)this.el.style.width=Math.max(x-this.el.position.left+(this.el.position.width-this.x),this.minWidth)+'px';if(this.onBottom)this.el.style.height=Math.max(y-this.el.position.top+(this.el.position.height-this.y),this.minHeight)+'px';if(this.onLeft){this.width=Math.max(this.el.position.left-x+this.el.position.width+this.x,this.minWidth);if(this.width>this.minWidth){this.el.style.width=this.width+'px';this.el.style.left=x-this.elmX+'px'}}if(this.onTop){var currentHeight=Math.max(this.el.position.top-y+this.el.position.height+this.y,this.minHeight);if(currentHeight>this.minHeight){this.el.style.height=currentHeight+'px';this.el.style.top=y-this.elmY+'px'}}if(typeof this.onresize==='function'){this.onresize(e,this.el)}}else if(this.isdrag){this.el.style.opacity=this.opacity;this.el.style.left=x-this.elmX+'px';this.el.style.top=y-this.elmY+'px';if(typeof this.drag==='function'){this.ondrag(e,this.el)}}},mouseup:function(e){if(this.isdrag||this.isresize){this.el.classList.remove('is-resize');this.el.classList.remove('is-drag');this.el.style.opacity='';this.el.style.transitionDuration='';this.el.style.webkitTransitionDuration='';this.el.position=this.el.getBoundingClientRect();this.isdrag=false;this.isresize=false;this.wrap.onmousemove=null;this.wrap.onselectstart=null;if(typeof this.stop==='function'){this.onstop(e,this.el)}}},calc:function(e){if(this.isresize||this.isdrag){return}this.x=e.clientX-this.el.offsetLeft;this.y=e.clientY-this.el.offsetTop;if(this.resize){this.onTop=this.y=this.el.offsetWidth-this.border;this.onBottom=this.y>=this.el.offsetHeight-this.border;if(this.onRight&&this.onBottom||this.onLeft&&this.onTop){this.el.style.cursor='nwse-resize'}else if(this.onRight&&this.onTop||this.onBottom&&this.onLeft){this.el.style.cursor='nesw-resize'}else if(this.onRight||this.onLeft){this.el.style.cursor='ew-resize'}else if(this.onBottom||this.onTop){this.el.style.cursor='ns-resize'}else if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}else{this.el.style.cursor='default'}}else{if(this.x>0&&this.y>0&&(this.x=this.border)){this.el.style.cursor='move'}}}};return new this.dragging.init(a,b)},setTypeIcon:function(a){var b='';switch(this.typesactions[a]){case 1:b='fa fa-newspaper-o';break;case 2:b='fa fa-list-alt';break;case 3:b='fa fa-th-large';break;case 4:b='fa fa-code';break;case 5:b='fa fa-plug';break;case 6:b='fa fa-cube';break;case 7:b='fa fa-pencil-square-o';break;default:b='fa fa-circle'}return b}});w.mainMenu={};w.mainMenu.stopWork=function(){modx.main.stopWork()};w.mainMenu.work=function(){modx.main.work()};w.mainMenu.reloadtree=function(){if(modx.plugins.ElementsInTree){setTimeout('reloadElementsInTree()',50)}if(modx.config.global_tabs){setTimeout('modx.tree.restoreTree()',100)}};w.mainMenu.startrefresh=function(a){if(a===1){}if(a===2){}if(a===9){modx.tree.restoreTree()}if(a===10){w.location.href=modx.MODX_MANAGER_URL}};w.mainMenu.startmsgcount=function(a,b,c){modx.updateMail(c)};w.mainMenu.hideTreeFrame=function(){modx.resizer.setWidth(0)};w.mainMenu.defaultTreeFrame=function(){modx.resizer.setDefaultWidth()};w.tree={};w.tree.ca='open';w.tree.document=document;w.tree.saveFolderState=function(){};w.tree.updateTree=function(){modx.tree.updateTree()};w.tree.restoreTree=function(){modx.tree.restoreTree()};w.tree.resizeTree=function(){};w.onbeforeunload=function(){var a=w.main.frameElement.contentWindow;if(modx.getActionFromUrl(a.location.search,27)){modx.get(modx.MODX_MANAGER_URL+'?a=67&type=7&id='+modx.main.getQueryVariable('id',a.location.search.substring(1)))}};d.addEventListener('DOMContentLoaded',function(){modx.init()})})(typeof jQuery!=='undefined'?jQuery:'',window,document,undefined);(function(){if(!Element.prototype.closest){Element.prototype.closest=function(a){var b=this,c,d;['matches','webkitMatchesSelector','mozMatchesSelector','msMatchesSelector','oMatchesSelector'].some(function(fn){if(typeof document.body[fn]==='function'){c=fn;return true}return false});if(b&&c&&b[c](a))return b;while(b){d=b.parentElement;if(d&&c&&d[c](a))return d;b=d}return null}}})(); \ No newline at end of file From 7043a5321108334ac063c70088436b42a3eb04c6 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 29 Oct 2018 22:48:23 +0300 Subject: [PATCH 144/241] fix sysalert.display.inc.php --- manager/includes/footer.inc.php | 44 ++++++------- manager/includes/sysalert.display.inc.php | 80 +++++++++++------------ 2 files changed, 62 insertions(+), 62 deletions(-) diff --git a/manager/includes/footer.inc.php b/manager/includes/footer.inc.php index 401c07609f..74c52ff417 100755 --- a/manager/includes/footer.inc.php +++ b/manager/includes/footer.inc.php @@ -1,35 +1,35 @@ INCLUDE_ORDERING_ERROR


        Please use the EVO Content Manager instead of accessing this file directly."); +if (!defined('IN_MANAGER_MODE') || IN_MANAGER_MODE !== true) { + die("INCLUDE_ORDERING_ERROR

        Please use the EVO Content Manager instead of accessing this file directly."); } global $SystemAlertMsgQueque; // display system alert window if messages are available -if(count($SystemAlertMsgQueque) > 0) { - include "sysalert.display.inc.php"; +if (!empty($SystemAlertMsgQueque)) { + include MODX_MANAGER_PATH . 'includes/sysalert.display.inc.php'; } ?> manager->action, array( - 85, - 27, - 4, - 72, - 13, - 11, - 12, - 87, - 88 +if (in_array($modx->manager->action, array( + 85, + 27, + 4, + 72, + 13, + 11, + 12, + 87, + 88 ))) { - echo $modx->manager->loadDatePicker($modx->config['mgr_date_picker_path']); + echo $modx->manager->loadDatePicker($modx->config['mgr_date_picker_path']); } ?> diff --git a/manager/includes/sysalert.display.inc.php b/manager/includes/sysalert.display.inc.php index 0b97e73b96..c1c293afe5 100755 --- a/manager/includes/sysalert.display.inc.php +++ b/manager/includes/sysalert.display.inc.php @@ -1,46 +1,46 @@ "; - } - // reset message queque - unset($_SESSION['SystemAlertMsgQueque']); - $_SESSION['SystemAlertMsgQueque'] = array(); - $SystemAlertMsgQueque = &$_SESSION['SystemAlertMsgQueque']; +$sysMsgs = ''; +$limit = count($SystemAlertMsgQueque); +for ($i = 0; $i < $limit; $i++) { + $sysMsgs .= $SystemAlertMsgQueque[$i] . '
        '; +} +// reset message queque +unset($_SESSION['SystemAlertMsgQueque']); +$_SESSION['SystemAlertMsgQueque'] = array(); +$SystemAlertMsgQueque = &$_SESSION['SystemAlertMsgQueque']; - if($sysMsgs!="") { +if ($sysMsgs != '') { + // fetch the styles + ?> + + + - -'; -?> - - \ No newline at end of file From 07ca6dea67e4e51ede558d0e2bed7509d22193ed Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Mon, 29 Oct 2018 23:34:07 +0300 Subject: [PATCH 145/241] remove mootools.js --- manager/includes/header.inc.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/manager/includes/header.inc.php b/manager/includes/header.inc.php index 048f0a17e0..c5714df077 100755 --- a/manager/includes/header.inc.php +++ b/manager/includes/header.inc.php @@ -87,12 +87,6 @@ - - - - From 99ba335ac291934c5958d1874527532e42a8d5c6 Mon Sep 17 00:00:00 2001 From: Serg <64j@mail.ru> Date: Tue, 30 Oct 2018 00:31:10 +0300 Subject: [PATCH 146/241] fix style loginform in dark mode --- manager/media/style/default/login.tpl | 986 ++++++++++++-------------- 1 file changed, 462 insertions(+), 524 deletions(-) diff --git a/manager/media/style/default/login.tpl b/manager/media/style/default/login.tpl index f8654ae1a4..6939076871 100755 --- a/manager/media/style/default/login.tpl +++ b/manager/media/style/default/login.tpl @@ -1,6 +1,6 @@ - + [(site_name)] (Evolution CMS Manager Login) @@ -8,590 +8,528 @@ - - -
        -
        + + +
        +
        - - [+OnManagerLoginFormPrerender+] - - - - - -
        - - -
        - - -
        - - -
        - - -
        -
        [+login_captcha_message+]
        -

        [+captcha_image+]

        - [+captcha_input+] -
        - - -
        - - -
        - - - [+OnManagerLoginFormRender+] + + [+OnManagerLoginFormPrerender+] + + + + + +
        + + +
        + + +
        + + +
        + + +
        +
        [+login_captcha_message+]
        +

        [+captcha_image+]

        + [+captcha_input+] +
        + + +
        + + +
        + + + [+OnManagerLoginFormRender+]
        -
        +
        - -
        + +

        © 2005-2018 by the EVO. EVO™ is licensed under the GPL.
        -
        - - -
        - - - - + }; + xhr.send('ajax=1&username=' + encodeURIComponent(form.username.value) + '&password=' + encodeURIComponent(form.password.value) + (form.captcha_code ? '&captcha_code=' + encodeURIComponent(form.captcha_code.value) : '') + '&rememberme=' + form.rememberme.value); + e.preventDefault(); + }; + /* ]]> */ + + From ada15c79594044c9dbfc035c8e1c77f2a5875319 Mon Sep 17 00:00:00 2001 From: mnoskov Date: Tue, 30 Oct 2018 16:43:50 +0500 Subject: [PATCH 147/241] event reference fix (#844) --- manager/includes/document.parser.class.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index dff560b915..9691323c12 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -5491,10 +5491,10 @@ public function invokeEvent($evtName, $extParams = array()) $this->pluginsCode .= '
        '; $this->pluginsTime["{$evtName} / {$pluginName}"] += $eventtime; } - if ($e->getOutput() != '') { - $results[] = $e->getOutput(); + if ($this->event->getOutput() != '') { + $results[] = $this->event->getOutput(); } - if ($e->_propagate != true) { + if ($this->event->_propagate != true) { break; } } From c57a5d84481d0f992429e032da5b0e9a667d739b Mon Sep 17 00:00:00 2001 From: Nicola Date: Tue, 30 Oct 2018 12:48:02 +0100 Subject: [PATCH 148/241] FIX Lighness Navbar Logo (#827) --- manager/media/style/default/css/mainmenu.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manager/media/style/default/css/mainmenu.css b/manager/media/style/default/css/mainmenu.css index a6b32af1aa..2dbb61fdec 100755 --- a/manager/media/style/default/css/mainmenu.css +++ b/manager/media/style/default/css/mainmenu.css @@ -87,7 +87,7 @@ border: none !important; border-left: 1px solid rgba(0, 0, 0, 0.05) !important; @media (min-width: 1200px) { #searchresult { top: 2.5rem; } #mainMenu #nav #site a { margin-left: 9.25rem; } -#mainMenu #nav #site::before { content: ""; display: block; overflow: hidden; position: absolute; left: 0; top: 0; width: 9rem; height: 100%; background: url("../images/misc/logo-navbar.png") 0 50% no-repeat; background-size: 8rem; } +body:not(.lightness) #mainMenu #nav #site::before { content: ""; display: block; overflow: hidden; position: absolute; left: 0; top: 0; width: 9rem; height: 100%; background: url("../images/misc/logo-navbar.png") 0 50% no-repeat; background-size: 8rem; } #mainMenu, #mainMenu .nav > li > a, #mainMenu .nav .label_searchid, #mainMenu .nav > li > a .icon, #mainMenu #searchform .mask, #mainMenu #nav #site::before { height: 2.5rem; } #mainMenu .nav > li > a, #mainMenu .nav .label_searchid, #mainMenu .nav > li .fa, #mainMenu .nav > li > a .icon { line-height: 2.5rem; } #mainMenu .nav > li > a .icon.photo { width: 2.1rem; height: 2.1rem; margin-top: .2rem; } @@ -131,7 +131,7 @@ border: none !important; border-left: 1px solid rgba(0, 0, 0, 0.05) !important; .lightness #mainMenu { background-color: #f1f1f1; color: #464646; } .lightness #mainMenu .nav > li > a, .lightness #mainMenu .nav .label_searchid { color: #464646 } .lightness #mainMenu.show .nav > li.dropdown.hover > a { color: #222; } -.lightness #mainMenu #nav #site a::before { background-image: url("../images/misc/login-logo.png") } +body:not(.navbar-left).lightness #mainMenu #nav #site::before { content: ""; display: block; overflow: hidden; position: absolute; left: 0; top: 0; width: 9rem; height: 100%; background: url("../images/misc/login-logo.png") 0 50% no-repeat; background-size: 8rem; } /* light */ .light #mainMenu { -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, .3); box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, .3); } .light #mainMenu { background-color: #343944; color: #cacaca; } From fcc2024e431c9d38e687cde35bb6568cd11400c9 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 30 Oct 2018 11:49:06 +0000 Subject: [PATCH 149/241] addOutput method --- manager/includes/document.parser.class.inc.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/manager/includes/document.parser.class.inc.php b/manager/includes/document.parser.class.inc.php index 9691323c12..a334fea157 100755 --- a/manager/includes/document.parser.class.inc.php +++ b/manager/includes/document.parser.class.inc.php @@ -6819,7 +6819,17 @@ public function alert($msg) */ public function output($msg) { - $this->_output .= $msg; + $this->addOutput($msg); + } + + /** + * @param mixed $data + */ + public function addOutput($data) + { + if(\is_scalar($data)) { + $this->_output .= $data; + } } /** From ca4cb5498ced3affbb2d54f2811f9819dc42ced3 Mon Sep 17 00:00:00 2001 From: Agel_Nash Date: Tue, 30 Oct 2018 12:08:28 +0000 Subject: [PATCH 150/241] Fix #834 --- .../plugins/managermanager/utilities.inc.php | 160 +++++++++--------- install/cli-install.php | 2 +- install/setup.info.php | 2 +- 3 files changed, 83 insertions(+), 81 deletions(-) diff --git a/assets/plugins/managermanager/utilities.inc.php b/assets/plugins/managermanager/utilities.inc.php index e64a6926e4..28cb3918dd 100755 --- a/assets/plugins/managermanager/utilities.inc.php +++ b/assets/plugins/managermanager/utilities.inc.php @@ -1,45 +1,45 @@ Event; - + $exclude_roles = false; $exclude_templates = false; - + // Are they negative roles? if (substr($roles, 0, 1) == '!'){ $roles = substr($roles, 1); $exclude_roles = true; } - + // Are they negative templates? if (substr($templates, 0, 1) == '!'){ $templates = substr($templates, 1); $exclude_templates = true; } - + // Make the lists into arrays $roles = makeArray($roles); $templates = makeArray($templates); - + // Does the current role match the conditions supplied? $match_role_list = ($exclude_roles) ? !in_array($mm_current_page['role'], $roles) : in_array($mm_current_page['role'], $roles); - + // Does the current template match the conditions supplied? $match_template_list = ($exclude_templates) ? !in_array($mm_current_page['template'], $templates) : in_array($mm_current_page['template'], $templates); - - // If we've matched either list in any way, return true + + // If we've matched either list in any way, return true if (($match_role_list || count($roles) == 0) && ($match_template_list || count($templates) == 0)){ return true; - } - + } + return false; } @@ -49,26 +49,28 @@ function makeArray($csv){ if (is_array($csv)){ return $csv; } - + // Else if we have an empty string if (trim($csv) == ''){ return array(); } - + // Otherwise, turn it into an array $return = explode(',', $csv); // Remove any whitespace - array_walk($return, create_function('$v, $k', 'return trim($v);')); - + array_walk($return, function (&$value) { + $value = is_scalar($value) ? trim($value) : $value; + }); + return $return; } // Make an output JS safe function jsSafe($str){ global $modx; - + // Only PHP versions > 5.2.3 allow us to prevent double_encoding - // If you are using an older version of PHP, and use characters which require + // If you are using an older version of PHP, and use characters which require // HTML entity encoding in new label names, etc you will have to specify the // actual character, not a pre-encoded version if (version_compare(PHP_VERSION, '5.2.3') >= 0){ @@ -81,56 +83,56 @@ function jsSafe($str){ /** * tplUseTvs * @version 1.2.1 (2014-03-29) - * + * * @desc Does the specified template use the specified TVs? - * + * * @param $tpl_id {integer} - Template ID. * @param $tvs {comma separated string; array} - TV names. Default: ''. * @param $types {comma separated string; array} - TV types, e.g. image. Default: ''. * @param $dbFields {somma separated string} - DB fields which get from 'site_tmplvars' table. Default: 'id'. * @param $resultKey {string; false} - DB field, which values are keys of result array. Keys of result array will be numbered if the parameter equals false. Default: false. - * + * * @return {array; false} */ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey = false){ // If it's a blank template, it can't have TVs if($tpl_id == 0){return false;} - + global $modx; - + //Make the TVs, field types and DB fields into an array $fields = makeArray($tvs); $types = makeArray($types); $dbFields = makeArray($dbFields); - + //Add the result key in DB fields if return of an associative array is required & result key is absent there if ($resultKey !== false && !in_array($resultKey, $dbFields)){ $dbFields[] = $resultKey; } - + //Get the DB table names - $tv_table = $modx->getFullTableName('site_tmplvars'); + $tv_table = $modx->getFullTableName('site_tmplvars'); $rel_table = $modx->getFullTableName('site_tmplvar_templates'); - + $where = array(); //Are we looking at specific TVs, or all? if (!empty($fields)){$where[] = 'tvs.name IN '.makeSqlList($fields);} - + //Are we looking at specific TV types, or all? if (!empty($types)){$where[] = 'type IN '.makeSqlList($types);} - + //Make the SQL for this template if (!empty($tpl_id)){$where[] = 'rel.templateid = '.$tpl_id;} - + //Execute the SQL query $result = $modx->db->select( implode(',', $dbFields), $tv_table.' AS tvs LEFT JOIN '.$rel_table.' AS rel ON rel.tmplvarid = tvs.id', implode(' AND ', $where) ); - + $recordCount = $modx->db->getRecordCount($result); - + // If we have results, return them, otherwise return false if ($recordCount == 0){ return false; @@ -138,7 +140,7 @@ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey //If return of an associative array is required if ($resultKey !== false){ $rsArray = array(); - + while ($row = $modx->db->getRow($result)){ //If result contains the result key if (array_key_exists($resultKey, $row)){ @@ -147,7 +149,7 @@ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey $rsArray[] = $row; } } - + return $rsArray; }else{ return $modx->db->makeArray($result); @@ -158,46 +160,46 @@ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey /** * getTplMatchedFields * @version 1.0.2 (2014-03-27) - * + * * @desc Returns the array that contains only those of passed fields/TVs which are used in the template. - * + * * @param $fields {comma separated string; array} - Document fields or TVs names. @required * @param $tvTypes {comma separated string; array} - TVs types, e.g. image, text. Default: ''. * @param $tempaleId {integer} - Template ID. Default: $mm_current_page['template']. - * + * * @return {array; false} */ function getTplMatchedFields($fields, $tvTypes = '', $tempaleId = ''){ $fields = makeArray($fields); - + //$fields is required if (empty($fields)){return false;} - + global $mm_fields; - + //Template of current document by default if (empty($tempaleId)){ global $mm_current_page; - + $tempaleId = $mm_current_page['template']; } - + $docFields = array(); - + //Only document fields foreach ($fields as $field){ if (isset($mm_fields[$field]) && !$mm_fields[$field]['tv']){ $docFields[] = $field; } } - + //If $fields contains no TVs if (count($docFields) == count($fields)){ $fields = $docFields; }else{ //Get specified TVs for this template $fields = tplUseTvs($tempaleId, $fields, $tvTypes, 'name', 'name'); - + //If there are no appropriate TVs if ($fields == false){ if (!empty($docFields)){ @@ -207,60 +209,60 @@ function getTplMatchedFields($fields, $tvTypes = '', $tempaleId = ''){ $fields = array_merge(array_keys($fields), $docFields); } } - + return $fields; } /** * makeSqlList * @version 1.0.2 (2014-03-29) - * + * * @desc Create a MySQL-safe list from an array. - * + * * @param $arr {array; comma separated string} - Values. */ function makeSqlList($arr){ global $modx; - + $arr = makeArray($arr); - + foreach($arr as $k => $tv){ //if (substr($tv, 0, 2) == 'tv'){$tv=substr($tv,2);} // Escape them for MySQL $arr[$k] = "'".$modx->db->escape($tv)."'"; } - + $sql = " (".implode(',', $arr).") "; - + return $sql; } /** * includeJsCss * @version 1.3.1 (2013-12-10) - * + * * @desc Generates the code needed to include an external script file. - * + * * @param $source {string} - The URL of the external script or code (if $plaintext == true). @required * @param $output_type {'js'; 'html'} - Either js or html - depending on where the output is appearing. Default: 'js'. * @param $name {string} - Script name. Default: ''. * @param $version {string} - Script version. Default: ''. * @param $plaintext {boolean} - Is this plaintext? Default: false. * @param $type {''; 'js'; 'css'} - Type of source (required if $plaintext == true). Default: ''. - * + * * @return {string} - Code. */ function includeJsCss($source, $output_type = 'js', $name = '', $version = '', $plaintext = false, $type = ''){ global $modx, $mm_includedJsCss; - + $useThisVer = true; $result = ''; - + if ($plaintext){ if (empty($name) || empty($version) || empty($type)){ return $result; } - + $nameVersion = array( 'name' => $name, 'version' => $version, @@ -271,7 +273,7 @@ function includeJsCss($source, $output_type = 'js', $name = '', $version = '', $ $nameVersion = ddTools::parseFileNameVersion($source); }else{ $temp = pathinfo($source); - + $nameVersion = array( 'name' => $name, 'version' => $version, @@ -279,7 +281,7 @@ function includeJsCss($source, $output_type = 'js', $name = '', $version = '', $ ); } } - + //If this script is already included if (isset($mm_includedJsCss[$nameVersion['name']])){ //If old < new, use new, else — old @@ -288,14 +290,14 @@ function includeJsCss($source, $output_type = 'js', $name = '', $version = '', $ //Add $mm_includedJsCss[$nameVersion['name']] = array(); } - + //If the new version is used if ($useThisVer){ //Save the new version $mm_includedJsCss[$nameVersion['name']]['version'] = $nameVersion['version']; - + $result = $source; - + if ($nameVersion['extension'] == 'css'){ if ($plaintext){ $result = '