<?php const MDCMS_VERSION = '1.1.12'; const MDCMS_PASSWORD = ''; const MDCMS_DOMAIN = ''; const MDCMS_LANGUAGE = [1 => 'ru', 2 => 'en']; session_start(); header('Content-Type: text/html; charset=windows-1251'); if (isset($_POST['password']) && is_string($_POST['password']) && $_POST['password'] === MDCMS_PASSWORD) { $_SESSION['mdcms_accepted'] = true; } if (strlen(MDCMS_PASSWORD) > 0 && ((isset($_SESSION['mdcms_accepted']) && $_SESSION['mdcms_accepted'] !== true) || !isset($_SESSION['mdcms_accepted'])) ) { die('<!DOCTYPE html><html lang="en-EN"><head><meta charset="windows-1251"><meta name="viewport" content="width=device-width, initial-scale=1"><title>MyDrop CMS</title><link rel="stylesheet" href="https://bootswatch.com/3/yeti/bootstrap.min.css" crossorigin="anonymous" /><style>*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}html,body{height:100%;}.wrap{min-height:100%;height:auto;}</style></head><body><div class="wrap"><div class="container"><div class="row"><div class="col-xs-12 col-sm-8 col-md-6 col-sm-offset-2 col-md-offset-3" style="margin-top:10%"><form method="post"><div class="input-group"><input type="password" name="password" class="form-control" placeholder="Password" autofocus required><span class="input-group-btn"><button class="btn btn-success" type="submit">Submit</button></span></div></form></div></div></div></div></body></html>'); } $config = [ 'dirname' => dirname(__FILE__), 'languageId' => 2, 'language' => loadLanguage(2), 'source' => loadSourceDir(), 'update' => false, 'domain' => [ 'safeName' => preg_replace('/[^a-z0-9]/', '_', MDCMS_DOMAIN), 'urls' => [], 'tree' => [], 'root' => (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] ], 'data' => [ 'rowid' => null, 'content' => null, ] ]; $config['db'] = new PDO('sqlite:'.$config['source'].'.mdcms_data'.DIRECTORY_SEPARATOR.'structure.db'); $query = $config['db']->prepare('CREATE TABLE IF NOT EXISTS structure (url TEXT, filename TEXT);'); $query->execute(); $query = $config['db']->prepare('CREATE TABLE IF NOT EXISTS setting (version TEXT, version_checked INTEGER, language INTEGER);'); $query->execute(); if (isset($_POST['action'])) { if ($_POST['action'] === 'editor.content') { $data = getUrlData($_POST['rowid']); if (isset($data['filename'])) { $filename = $config['source'] . substr($data['filename'], 0, 2) . DIRECTORY_SEPARATOR . substr($data['filename'], 2, 2) . DIRECTORY_SEPARATOR . $data['filename'] . '.html'; if (file_exists($filename)) { file_put_contents($filename, iconv('UTF-8', 'Windows-1251', $_POST['content'])); } } } else if ($_POST['action'] === 'replacer.do') { $_POST['replacer_search'] = str_replace(["\r\n", "\n", "\r"], "\n", iconv('UTF-8', 'Windows-1251', $_POST['replacer_search'])); $_POST['replacer_text'] = str_replace(["\r\n", "\n", "\r"], "\n", iconv('UTF-8', 'Windows-1251', $_POST['replacer_text'])); $query = $config['db']->prepare('SELECT rowid, * FROM structure ORDER BY url'); $query->execute(); while ($row = $query->fetch(PDO::FETCH_ASSOC)) { $filename = $config['source'] . substr($row['filename'], 0, 2) . DIRECTORY_SEPARATOR . substr($row['filename'], 2, 2) . DIRECTORY_SEPARATOR . $row['filename'] . '.html'; if (file_exists($filename)) { file_put_contents($filename, str_replace($_POST['replacer_search'], $_POST['replacer_text'], str_replace(["\r\n", "\n", "\r"], "\n", file_get_contents($filename)))); } } } else if ($_POST['action'] === 'page.delete') { $data = getUrlData($_POST['rowid']); if (isset($data['filename'])) { $filename = $config['source'] . substr($data['filename'], 0, 2) . DIRECTORY_SEPARATOR . substr($data['filename'], 2, 2) . DIRECTORY_SEPARATOR . $data['filename'] . '.html'; if (file_exists($filename)) { unlink($filename); } $query = $config['db']->prepare('DELETE FROM structure WHERE rowid = :rowid'); $query->execute(['rowid' => $data['rowid']]); } } else if ($_POST['action'] === 'page.copy') { if ( !isset($_POST['page_copy_url']) || (($_POST['page_copy_url'] = trim($_POST['page_copy_url'])) && !preg_match('/^\/.*$/', trim($_POST['page_copy_url']))) ) { echo '{"error":1}'; exit; } $data = getUrlData($_POST['rowid']); if (!isset($data['filename'])) { echo '{"error":2}'; exit; } $filename_source = $config['source'] . substr($data['filename'], 0, 2) . DIRECTORY_SEPARATOR . substr($data['filename'], 2, 2) . DIRECTORY_SEPARATOR . $data['filename'] . '.html'; if (!file_exists($filename_source)) { echo '{"error":3}'; exit; } $md5 = md5($_POST['page_copy_url']); $filename = ''; foreach ([0, 2] as $value) { $filename .= substr($md5, $value, 2) . DIRECTORY_SEPARATOR; if (!file_exists($config['source'] . $filename)) { @mkdir($config['source'] . $filename); } if (!is_dir($config['source'] . $filename)) { echo '{"error":4}'; exit; } } $filename .= $md5 . '.html'; if (file_exists($config['source'] . $filename)) { echo '{"error":5}'; exit; } if (copy($filename_source, $filename) !== true) { echo '{"error":6}'; exit; } $query = $config['db']->prepare('INSERT INTO structure (url, filename) VALUES (:url, :filename)'); $query->execute([ 'url' => $_POST['page_copy_url'], 'filename' => $md5 ]); echo '{"error":0,"id":'.$config['db']->lastInsertId().'}'; exit; } else if ($_POST['action'] === 'page.create') { if ( !isset($_POST['page_create_url']) || (($_POST['page_create_url'] = trim($_POST['page_create_url'])) && !preg_match('/^\/.*$/', trim($_POST['page_create_url']))) ) { echo '{"error":1}'; exit; } $md5 = md5($_POST['page_create_url']); $filename = ''; foreach ([0, 2] as $value) { $filename .= substr($md5, $value, 2) . DIRECTORY_SEPARATOR; if (!file_exists($config['source'] . $filename)) { @mkdir($config['source'] . $filename); } if (!is_dir($config['source'] . $filename)) { echo '{"error":2}'; exit; } } $filename .= $md5 . '.html'; if (file_exists($config['source'] . $filename)) { echo '{"error":3}'; exit; } file_put_contents($filename, ''); if (!file_exists($config['source'] . $filename)) { echo '{"error":2}'; exit; } $query = $config['db']->prepare('INSERT INTO structure (url, filename) VALUES (:url, :filename)'); $query->execute([ 'url' => $_POST['page_create_url'], 'filename' => $md5 ]); echo '{"error":0,"id":'.$config['db']->lastInsertId().'}'; exit; } else if ($_POST['action'] === 'language' && isset($_POST['id']) && MDCMS_LANGUAGE[$_POST['id']] !== null) { $query = $config['db']->prepare('SELECT rowid, * FROM setting LIMIT 1'); $query->execute(); $row = $query->fetch(PDO::FETCH_ASSOC); if ($row !== false && isset($row['language']) && $row['language'] != $_POST['id']) { $query = $config['db']->prepare('UPDATE setting SET language = :language WHERE rowid = :rowid'); $query->execute([ 'language' => (int)$_POST['id'], 'rowid' => $row['rowid'] ]); } } else if ($_POST['action'] === 'logout') { unset($_SESSION['mdcms_accepted']); } echo '[]'; exit; } $query = $config['db']->prepare('SELECT COUNT(*) FROM structure'); $query->execute(); if ($query->fetchColumn() == 0) { if (!file_exists($config['dirname'] . DIRECTORY_SEPARATOR . MDCMS_DOMAIN . '.csv')) { die(t('error_not_found_csv')); } $handler = fopen($config['dirname'] . DIRECTORY_SEPARATOR . MDCMS_DOMAIN . '.csv', 'r'); while (($buffer = fgets($handler)) !== false) { if (!preg_match('/^'.MDCMS_DOMAIN.'([^;]+);'.MDCMS_DOMAIN.'\/[a-f0-9]{2}\/[a-f0-9]{2}\/([a-f0-9]{32})\.html$/', trim($buffer), $match)) { continue; } $query = $config['db']->prepare('INSERT INTO structure (url, filename) VALUES (:url, :filename)'); $query->execute([ 'url' => $match[1], 'filename' => $match[2] ]); } fclose($handler); } $urls = []; $query = $config['db']->prepare('SELECT rowid, * FROM structure ORDER BY url'); $query->execute(); while ($row = $query->fetch(PDO::FETCH_ASSOC)) { $config['domain']['urls'][$row['rowid']] = $row['url']; $explode = explode('/', $row['url']); $count = count($explode); $keys = []; for ($i = 1; $i < $count; ++$i) { if ($i + 1 < $count) { if ($explode[$i] !== '' && $i + 1 < $count) { $keys[] = $explode[$i]; } } else { if (count($keys) > 0) { $tmp = [$row['rowid']]; foreach (array_reverse($keys) as $key) { $tmp = ['s' . $key => $tmp]; } $urls[] = $tmp; } else { $urls[] = [$row['rowid']]; } } } } $config['domain']['tree'] = count($urls) > 0 ? call_user_func_array('array_merge_recursive', $urls) : []; unset($urls); $query = $config['db']->prepare('SELECT COUNT(*) FROM setting'); $query->execute(); if ($query->fetchColumn() == 0) { $data = getVersion(); $query = $config['db']->prepare('INSERT INTO setting (version, version_checked, language) VALUES (:version, :version_checked, :language)'); $query->execute([ 'version' => $data === false ? MDCMS_VERSION : $data, 'version_checked' => time(), 'language' => 2, ]); } else { $query = $config['db']->prepare('SELECT rowid, * FROM setting LIMIT 1'); $query->execute(); $row = $query->fetch(PDO::FETCH_ASSOC); if ($row !== false) { if (time() - $row['version_checked'] > 86400) { $data = getVersion(); if ($data === false) { $query = $config['db']->prepare('UPDATE setting SET version_checked = :version_checked WHERE rowid = :rowid'); $query->execute([ 'version_checked' => time(), 'rowid' => $row['rowid'] ]); } else { $query = $config['db']->prepare('UPDATE setting SET version = :version, version_checked = :version_checked WHERE rowid = :rowid'); $query->execute([ 'version' => $data, 'version_checked' => time(), 'rowid' => $row['rowid'] ]); $row['version'] = $data; } } if ($row['version'] !== MDCMS_VERSION) { $config['update'] = true; } // Update database if (!isset($row['language'])) { $query = $config['db']->prepare('ALTER TABLE `setting` ADD `language` INTEGER AFTER `version_checked`;'); $query->execute(); $query = $config['db']->prepare('UPDATE setting SET language = :language WHERE rowid = :rowid'); $query->execute([ 'language' => 2, 'rowid' => $row['rowid'] ]); $row['language'] = 2; } if ($row['language'] != 2) { $config['language'] = loadLanguage($row['language']); $config['languageId'] = $row['language']; } } } if (isset($_GET['rowid']) && $_GET['do'] == 'edit') { $config['data'] = getUrlData($_GET['rowid']); $config['data']['filepath'] = substr($config['data']['filename'], 0, 2) . DIRECTORY_SEPARATOR . substr($config['data']['filename'], 2, 2) . DIRECTORY_SEPARATOR . $config['data']['filename'] . '.html'; $config['data']['content'] = htmlspecialchars(file_get_contents($config['source'] . $config['data']['filepath']), ENT_COMPAT | ENT_HTML401, 'cp1251'); } function t($key) { return isset($GLOBALS['config']['language'][$key]) ? $GLOBALS['config']['language'][$key] : $key; } function loadLanguage($key) { $languages = [ // RU 1 => [ 'footer' => '������ ��� ������ � ���������������� ��������', 'footer_support' => '����������� ��������� � info@mydrop.io', 'login' => '�����', 'logout' => '�����', 'file' => '����', 'password' => '������', 'error_folder' => '���������� ������� ����� .mdcms_data ��� �������� ������', 'error_not_folder' => '���� .mdcms_data ������ ���� ������', 'error_not_found_csv' => '���� CSV �� ������', 'error_massive_input' => '�� ��������� ����', 'search_replace' => '�������� ��������������', 'single' => '������������ ��������������', 'massage_success' => '������ ������� ���������', 'search' => '������� �����', 'replace' => '�� ��� ������', 'do' => '���������', 'save' => '���������', 'WYSIWYG' => '�������� WYSIWYG', 'CODE' => '�������� HTML', 'editor' => '��������', 'replacer' => '������ ������', 'editor_header' => '�������� URL ������� ������ ���������������', 'replacer_header' => '�������� ������ ������ �� ���� HTML-������', 'message_saved' => '��������� ������� ���������', 'need_update' => '�������� ����� ����� ������ MyDrop CMS � �������.', 'page_create' => '������� ����� ��������', 'page_copy' => '����������� ��������', 'cancel' => '������', 'list_domains' => '������ ������� � MyDrop.io', 'go_to_site' => '������� �� ����', 'question_delete_link' => '�� �������, ��� ������ ������� ������ URL?', 'error_page_create' => '������ �������� ��������. ��������� ����� �� ������ � ���������� ����.', 'error_page_0' => '������ ������ ���������� �� ����� � �� �������� � ���� �����.', 'error_page_1' => 'URL �� ������ ���� ������ � ���������� �� ����� � ������.', 'error_page_2' => '������ �������� HTML �����. ��������� ����� �� ������ � ���������� ����.', 'error_page_3' => 'HTML ���� ��� ���������� URL ��� ����������.', 'error_page_4' => '�� ������ �������� URL ��� �����������', 'error_page_5' => '�������� HTML ���� �� ������. ���������, ��������� �� �� ��������� ����� �� ������ �� �������.', 'error_page_6' => '�� ������� ����������� �������� HTML ����. ��������� ����� �� ������ � ���������� ����.', ], // EN 2 => [ 'footer' => 'Expired Domains and Full Websites Restore', 'footer_support' => 'Support � info@mydrop.io', 'login' => 'Sign In', 'logout' => 'Logout', 'file' => 'File', 'password' => 'Password', 'error_folder' => 'Unable to create .mdcms_data folder for storing files', 'error_not_folder' => 'The .mdcms_data file must be a folder', 'error_not_found_csv' => 'CSV file not found', 'error_massive_input' => 'Missing fields', 'search_replace' => 'Mass editing', 'single' => 'Page editing', 'massage_success' => 'Task completed successfully', 'search' => 'Searched text', 'replace' => 'What are we changing for', 'do' => 'Run', 'save' => 'Save', 'WYSIWYG' => 'WYSIWYG Editor', 'CODE' => 'HTML Editor', 'editor' => 'Editor', 'replacer' => 'Replacing text', 'editor_header' => 'Select the URL you want to edit', 'replacer_header' => 'Bulk text replacement in all HTML files', 'message_saved' => 'Change saved successfully', 'need_update' => 'A newer version of MyDrop CMS is available - download.', 'page_create' => 'Create new page', 'page_copy' => 'Copy page', 'cancel' => 'Cancel', 'list_domains' => 'List of domains in MyDrop.io', 'go_to_site' => 'Go to website', 'question_delete_link' => 'Are you sure you want to delete this URL?', 'error_page_create' => 'Creating page error. Check write permissions in the site directory.', 'error_page_0' => 'URL must start with a slash and not include a domain.', 'error_page_1' => 'The URL must not be empty and begin with a slash at the beginning.', 'error_page_2' => 'Creating HTML file error. Check write permissions in the website folder.', 'error_page_3' => 'HTML file for specified URL already exists.', 'error_page_4' => 'No source URL to copy found', 'error_page_5' => 'HTML file not found. Check if you completely transferred the files from the archive to the hosting.', 'error_page_6' => 'Failed to copy the HTML file. Check write permissions in the website directory.', ], ]; return isset($languages[$key]) ? $languages[$key] : []; } function loadSourceDir() { $dir = dirname(__FILE__); if (!file_exists($dir . DIRECTORY_SEPARATOR . '.mdcms_data') && !mkdir($dir . DIRECTORY_SEPARATOR . '.mdcms_data', 0770, true)) { die(t('error_folder')); } if (!is_dir($dir . DIRECTORY_SEPARATOR . '.mdcms_data')) { die(t('error_not_folder')); } return $dir . DIRECTORY_SEPARATOR; } function createUrlsList() { $id = isset($GLOBALS['config']['data']['rowid']) ? $GLOBALS['config']['data']['rowid'] : 0; $options = []; foreach ($GLOBALS['config']['domain']['urls'] as $key => $value) { $options[] = '<option value="'.$key.'"'.($id == $key ? ' selected' : '').'>'.$value.'</option>'; } return implode('', $options); } function getUrlData($id) { $query = $GLOBALS['config']['db']->prepare('SELECT rowid, * FROM structure WHERE rowid = :id'); $query->execute(['id' => $id]); return $query->fetch(PDO::FETCH_ASSOC); } function createTree($data) { echo '<ul class="d-none">'; foreach ($data as $key => $value) { if (is_array($value)) { echo '<li data-jstree=\'{"icon":"glyphicon glyphicon-folder-open","disabled":false,"type":1}\'>/' . htmlspecialchars(rawurldecode(substr($key, 1)), ENT_IGNORE); createTree($value); echo '</li>'; } else { echo '<li data-jstree=\'{"id":'.$value.',"icon":"glyphicon glyphicon-file","type":2}\'>' . htmlspecialchars(rawurldecode($GLOBALS['config']['domain']['urls'][$value]), ENT_IGNORE) . '</li>'; } } echo '</ul>'; } function getVersion() { $json = file_get_contents('https://mydrop.io/cms.json', false, stream_context_create(['http' => ['timeout' => 5]])); if ($json === false) { return false; } $data = json_decode($json, true); if ($data === false || !isset($data['version']) || !preg_match('/\d+\.\d+/', $data['version'])) { return false; } return $data['version']; } ?> <!DOCTYPE html> <html lang="ru-RU"> <head> <meta charset="windows-1251"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="robots" content="noindex, nofollow" /> <title>MyDrop CMS</title> <link rel="stylesheet" href="https://bootswatch.com/3/yeti/bootstrap.min.css" crossorigin="anonymous" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/themes/default/style.min.css" crossorigin="anonymous" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/codemirror.min.css" crossorigin="anonymous"/> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous"/> <link rel="shortcut icon" href="https://mydrop.io/favicon.ico" type="image/x-icon"> <style> *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} html,body{height:100%;font-size: 16px;line-height: 1.4;color: #222222;} label, .control-label{font-size: 15px;} .navbar{border:none;font-size:14px;font-weight:300;border-radius:0;min-height:45px;margin-bottom:21px;} .navbar-default{background-color:#333333;border-color:#222222;} .container > .navbar-header{margin-right:0;margin-left:0;} .wrap{min-height:100%;height:auto;margin:0 auto -85px;padding:0 0 85px;} .wrap > .container, .wrap > .container-fluid {padding:60px 15px 20px;} .footer{display:block;height:85px;background-color:#eee;border-top:1px solid #ddd;padding:15px 0;} .form-horizontal .control-label {text-align: left;font-weight:normal;} .jstree-default a {white-space: normal !important;height: auto;} .jstree-anchor {height: auto !important;font-size: 0.8em;} .jstree-leaf a {height: auto !important;} .jstree-default a.jstree-search {color: inherit;} .jstree-default-small .jstree-icon:empty{line-height:14px;margin-left:-5px;} .jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl {background-position:-39px -6px;} .CodeMirror {box-sizing: border-box;margin: 0;font: inherit;font-family: inherit;display: block;width: 100%;padding: 0;font-size: 12px;line-height: 1.42857143;color: #555;background-color: #fff;background-image: none;border: 1px solid #ccc;border-radius: 4px;box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;font-family: monospace;} .CodeMirror-focused {border-color: #66afe9;outline: 0;box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;} #textarea_editor_html {min-height: 400px;display: none;white-space: pre-wrap;word-wrap: break-word;} .btn.btn-primary[disabled] {background-color:#337ab7;} .glyphicon-folder-open{color:#edc237;} .glyphicon-file{color:#797d7f;} </style> </head> <body><div class="wrap"><nav id="w3" class="navbar-default navbar-fixed-top navbar"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#w3-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><span class="navbar-brand" href="/">MyDrop CMS</span></div><div id="w3-collapse" class="collapse navbar-collapse"><ul id="w4" class="navbar-nav navbar-right nav"><li><a href="https://mydrop.io/domains" target="_blank" rel="noopener noreferrer"><i class="fa fa-table"></i> <?=t('list_domains')?></a></li><li><a href="<?=$config['domain']['root']?>" target="_blank" rel="noopener noreferrer"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> <?=t('go_to_site')?> <?=$_SERVER['HTTP_HOST']?></a></li><li class="dropdown"><a class="dropdown-toggle" href="#" data-toggle="dropdown"><img src="https://mydrop.io/images/flags/<?= MDCMS_LANGUAGE[$config['languageId']] ?>.png"> <?= strtoupper(MDCMS_LANGUAGE[$config['languageId']]) ?> <span class="caret"></span></a><ul id="w5" class="dropdown-menu" style="min-width: 100px;"><li><a href="#" onclick="changeLanguage(2); return false;" tabindex="-1"><img src="https://mydrop.io/images/flags/us.png"> English</a></li><li><a href="#" onclick="changeLanguage(1); return false;" tabindex="-1"><img src="https://mydrop.io/images/flags/ru.png"> �������</a></li></ul></li><li><a href="#" onclick="logout(); return false;"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> <?=t('logout')?></a></li></ul></div></div></nav><div class="container-fluid"><div class="row"><div class="col-md-12"><?php if($config['update']){?><div class="alert alert-warning" role="alert"><?=t('need_update')?></div><?php }?><div><ul class="nav nav-tabs" role="tablist"><li role="presentation" class="active"><a href="#editor" aria-controls="editor" role="tab" data-toggle="tab"><?=t('editor')?></a></li><li role="presentation"><a href="#replacer" aria-controls="replacer" role="tab" data-toggle="tab"><?=t('replacer')?></a></li></ul><div class="tab-content" style="margin-top:1%"><div role="tabpanel" class="tab-pane active" id="editor"><div class="row"><div class="col-sm-4 col-md-3"><div class="panel panel-default"><div class="panel-body"><div id="jstree_loading_alert"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Loading URL list ...</div><div id="jstree_<?=$config['domain']['safeName']?>" data-domain-converted="<?=$config['domain']['safeName']?>" style="display:none;"><?php createTree($config['domain']['tree']); ?></div></div></div></div><div class="col-sm-8 col-md-9"><div class="panel panel-default"><div class="panel-heading"><?=t('editor_header')?></div><div class="panel-body"><form class="form-horizontal"><div class="form-group"><label class="col-sm-2 col-md-1 control-label">URL: </label><div class="col-sm-10 col-md-11"><div class="input-group"><input id="editor_url" type="text" class="form-control" value="<?=isset($config['data']['url']) ? $config['data']['url'] : ''?>" readonly="readonly" / ><div class="input-group-btn"><a class="btn btn-default" onclick="copyLink(); return false;"><i class="glyphicon glyphicon-link" aria-hidden="true"></i></a><a class="btn btn-default" href="<?= $config['domain']['root'] . (isset($config['data']['url']) ? $config['data']['url'] : ''); ?>" target="_blank" rel="noopener noreferrer"><i class="glyphicon glyphicon-new-window" aria-hidden="true"></i></a><a class="btn btn-default" onclick="deleteLink(); return false;"><i class="glyphicon glyphicon-trash" aria-hidden="true"></i></a></div></div></div></div><div class="form-group"><label class="col-sm-2 col-md-1 control-label"><?=t('file')?>: </label><div class="col-sm-10 col-md-11"><div class="input-group"><input type="text" class="form-control" value="<?=isset($config['data']['filepath']) ? $config['data']['filepath'] : ''?>" readonly="readonly" / ><div class="input-group-btn"><button type="button" class="btn btn-default" title="<?=t('page_copy')?>" data-toggle="modal" data-target="#modalPageCopy"><i class="fa fa-copy" aria-hidden="true"></i></button></div></div></div></div></form><div class="row"><div class="col-sm-10 col-md-11 col-sm-offset-2 col-md-offset-1"><button type="button" class="btn btn-default" title="<?=t('page_create')?>" data-toggle="modal" data-target="#modalPageCreate"><i class="fa fa-file-o" aria-hidden="true"></i></button></div></div></div></div><ul class="nav nav-tabs" role="tablist"><li role="presentation" class="active"><a href="#editor_html" aria-controls="editor_html" role="tab" data-toggle="tab"><?=t('WYSIWYG')?></a></li><li role="presentation"><a id="editor_code-tab" href="#editor_code" aria-controls="editor_code" role="tab" data-toggle="tab"><?=t('CODE')?></a></li></ul><div class="alert alert-success text-center" id="savedAlert" role="alert" style="display:none;margin-top:1%;"><?=t('message_saved')?></div><div class="tab-content" style="margin-top:1%"><div role="tabpanel" class="tab-pane active" id="editor_html"><form id="formHtml" action="" method="post" class="form-horizontal" onsubmit="ajaxSaveFile('formHtml'); return false;" autocomplete="off"><input type="hidden" name="action" value="editor.content"/><input type="hidden" name="rowid" value="<?=isset($config['data']['rowid']) ? $config['data']['rowid'] : ''?>" /><div class="form-group"><div class="col-md-12"><textarea id="textarea_editor_html" name="content"><?=$config['data']['content'];?></textarea></div></div><div class="form-group"><div class="col-md-12"><button type="submit" class="btn btn-primary"><?=t('save')?></button></div></div></form></div><div role="tabpanel" class="tab-pane" id="editor_code"><form id="formCode" action="" method="post" class="form-horizontal" onsubmit="ajaxSaveFile('formCode'); return false;" autocomplete="off"><input type="hidden" name="action" value="editor.content"/><input type="hidden" name="rowid" value="<?=isset($config['data']['rowid']) ? $config['data']['rowid'] : ''?>" /><div class="form-group"><div class="col-md-12"><textarea id="textarea_editor_code" name="content"><?=$config['data']['content'];?></textarea></div></div><div class="form-group"><div class="col-md-12"><button type="submit" class="btn btn-primary"><?=t('save')?></button></div></div></form></div></div></div></div></div><div role="tabpanel" class="tab-pane" id="replacer"><div class="alert alert-success text-center" id="formReplacerAlert" role="alert" style="display:none;margin-top:1%;"><?=t('message_saved')?></div><div class="panel panel-default"><div class="panel-heading"><?=t('replacer_header')?></div><div class="panel-body"><form id="formReplacer" action="" method="post" class="form-horizontal" onsubmit="ajaxReplacer(); return false;"><input type="hidden" name="action" value="replacer.do"/><div class="form-group"><label for="inputEmail3" class="col-sm-2 col-md-1 control-label"><?=t('search')?>: </label><div class="col-sm-10 col-md-11"><textarea class="form-control" name="replacer_search" rows="4" style="resize:none;"></textarea></div></div><div class="form-group"><label for="inputPassword3" class="col-sm-2 col-md-1 control-label"><?=t('replace')?>: </label><div class="col-sm-10 col-md-11"><textarea class="form-control" name="replacer_text" rows="4" style="resize:none;"></textarea></div></div><div class="form-group"><div class="col-md-12"><span class="pull-right"><button type="submit" class="btn btn-primary form-control"><?=t('do')?></button></span></div></div></form></div></div></div></div></div></div></div></div></div><footer class="footer"><div class="container"><p class="text-center">© 2016�2020 <a href="https://mydrop.io" target="_blank" rel="noopener noreferrer">MyDrop.io</a> � <?=t('footer')?></p><p class="text-center"><?=t('footer_support')?></p></div></footer><div class="modal fade" id="modalPageCreate" tabindex="-1" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><form id="formPageCreate" class="form-horizontal" onsubmit="ajaxPageCreate(); return false;" autocomplete="off"><input type="hidden" name="action" value="page.create"/><div class="modal-body"><div class="alert alert-danger text-center" id="pageCreateAlert" role="alert" style="display:none;"><?=t('error_page_create');?></div><div class="form-group"><label class="col-sm-2 col-md-1 control-label">URL: </label><div class="col-sm-10 col-md-11"><div class="input-group" style="width:100%"><input name="page_create_url" type="text" class="form-control" value="/" pattern="\/{1}.*" title="<?=t('error_page_0');?>" / ></div></div></div></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal"><?=t('cancel')?></button><button type="submit" class="btn btn-primary"><?=t('page_create')?></button></div></form></div></div></div><div class="modal fade" id="modalPageCopy" tabindex="-1" role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><form id="formPageCopy" class="form-horizontal" onsubmit="ajaxPageCopy(); return false;" autocomplete="off"><input type="hidden" name="action" value="page.copy"/><input type="hidden" name="rowid" value="<?=isset($config['data']['rowid']) ? $config['data']['rowid'] : ''?>" /><div class="modal-body"><div class="alert alert-danger text-center" id="pageCopyAlert" role="alert" style="display:none;"><?=t('error_page_create');?></div><div class="form-group"><label class="col-sm-2 col-md-1 control-label">URL: </label><div class="col-sm-10 col-md-11"><div class="input-group" style="width:100%"><input name="page_copy_url" type="text" class="form-control" value="/" pattern="\/{1}.*" title="<?=t('error_page_0');?>" / ></div></div></div></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal"><?=t('cancel')?></button><button type="submit" class="btn btn-primary"><?=t('page_copy')?></button></div></form></div></div></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.7/jstree.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/codemirror.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/addon/edit/matchbrackets.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/addon/edit/matchtags.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/mode/css/css.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/mode/htmlmixed/htmlmixed.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/mode/javascript/javascript.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.44.0/mode/xml/xml.min.js" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/tinymce/4.9.4/tinymce.min.js" crossorigin="anonymous"></script> <script> $(document).ready(function () { $('#editor_code-tab').on('shown.bs.tab', function () { editor.refresh(); }); }); function copyLink() { var copyText = document.createElement('textarea'); copyText.value = '<?= $config['domain']['root']; ?>' + document.getElementById('editor_url').value; copyText.setAttribute('readonly', ''); copyText.style = {position: 'absolute', left: '-9999px'}; document.body.appendChild(copyText); copyText.select(); document.execCommand('copy'); document.body.removeChild(copyText); } function ajaxSaveFile(form) { $(':input[type="submit"]').attr('disabled', 'disabled'); if (form == 'formCode') { editor.save(); } if (form == 'formHtml') { tinymce.triggerSave(); } var url = "<?=$_SERVER['REQUEST_URI']?>"; $.post({ cache: false, url: url, data: $('#' + form).serialize(), success: function (data) { if (form == 'formHtml') { editor.setValue($('#textarea_editor_html').val()); } if (form == 'formCode') { tinymce.editors[0].setContent($('#textarea_editor_code').val()); tinymce.editors[0].theme.resizeTo('100%', 500); tinymce.editors[0].focus(); } $('html, body').animate({ scrollTop: 0 }, 'fast'); $('#savedAlert').show('fast').delay(2000).hide('fast'); $(':input[type="submit"]').removeAttr('disabled'); } }); return false; } function ajaxReplacer() { $(':input[type="submit"]').attr('disabled', 'disabled'); var url = "<?=$_SERVER['REQUEST_URI']?>"; $.post({ cache: false, url: url, data: $('#formReplacer').serialize(), success: function (data) { $('html, body').animate({ scrollTop: 0 }, 'fast'); $('#formReplacerAlert').show('fast').delay(2000).hide('fast'); $(':input[type="submit"]').removeAttr('disabled'); } }); return false; } function ajaxPageCreate() { $(':input[type="submit"]').attr('disabled', 'disabled'); var url = "<?=$_SERVER['REQUEST_URI']?>"; $.post({ cache: false, url: url, data: $('#formPageCreate').serialize(), dataType: 'json', success: function (data) { $('html, body').animate({ scrollTop: 0 }, 'fast'); $(':input[type="submit"]').removeAttr('disabled'); if (data['error'] === undefined) { return false; } else if (data['error'] != 0) { console.log(data['error']); if (data['error'] == 1) { $('#pageCreateAlert').html('<?=t('error_page_1')?>'); } else if (data['error'] == 2) { $('#pageCreateAlert').html('<?=t('error_page_2')?>'); } else if (data['error'] == 3) { $('#pageCreateAlert').html('<?=t('error_page_3')?>'); } $('#pageCreateAlert').show('fast').delay(4000).hide('fast'); return false; } else if (data['id'] === undefined) { return false; } window.location.href = '<?=htmlspecialchars($_SERVER['SCRIPT_NAME'])?>?do=edit&rowid=' + data['id']; }, error: function () { $('html, body').animate({ scrollTop: 0 }, 'fast'); $('#pageCreateAlert').show('fast').delay(4000).hide('fast'); $(':input[type="submit"]').removeAttr('disabled'); } }); return false; } function ajaxPageCopy() { $(':input[type="submit"]').attr('disabled', 'disabled'); var url = "<?=$_SERVER['REQUEST_URI']?>"; $.post({ cache: false, url: url, data: $('#formPageCopy').serialize(), dataType: 'json', success: function (data) { $('html, body').animate({ scrollTop: 0 }, 'fast'); $(':input[type="submit"]').removeAttr('disabled'); if (data['error'] === undefined) { return false; } else if (data['error'] != 0) { if (data['error'] == 1) { $('#pageCopyAlert').html('<?=t('error_page_1')?>'); } else if (data['error'] == 2) { $('#pageCopyAlert').html('<?=t('error_page_4')?>'); } else if (data['error'] == 3) { $('#pageCopyAlert').html('<?=t('error_page_5')?>'); } else if (data['error'] == 4) { $('#pageCopyAlert').html('<?=t('error_page_2')?>'); } else if (data['error'] == 5) { $('#pageCopyAlert').html('<?=t('error_page_3')?>'); } else if (data['error'] == 6) { $('#pageCopyAlert').html('<?=t('error_page_')?>'); } $('#pageCopyAlert').show('fast').delay(4000).hide('fast'); return false; } else if (data['id'] === undefined) { return false; } window.location.href = '<?=htmlspecialchars($_SERVER['SCRIPT_NAME'])?>?do=edit&rowid=' + data['id']; }, error: function () { $('html, body').animate({ scrollTop: 0 }, 'fast'); $('#pageCopyAlert').show('fast').delay(4000).hide('fast'); $(':input[type="submit"]').removeAttr('disabled'); } }); return false; } function deleteLink() { <?= !isset($config['data']['rowid']) ? 'return false;' : ''; ?> var r = confirm('<?=t('question_delete_link')?>'); if (r == true) { var url = "<?=$_SERVER['REQUEST_URI']?>"; $.post({ cache: false, url: url, data: 'action=page.delete&rowid=<?=isset($config['data']['rowid']) ? $config['data']['rowid'] : ''?>', success: function (data) { window.location.href = '<?=htmlspecialchars($_SERVER['SCRIPT_NAME'])?>'; }, }); } } $('#jstree_<?=$config['domain']['safeName']?>').bind('loaded.jstree', function(e, data) { $('#jstree_loading_alert').css('display', 'none'); $('#jstree_<?=$config['domain']['safeName']?>').css('display', 'block'); }).jstree({ "plugins": [ "wholerow", "search", "sort", "state", ], "search": { "case_sensitive": false, "show_only_matches": true }, "core": { "themes": { "variant": "small", }, "multiple": false, }, "state": { "key": "domainname", }, "sort": function (a, b) { a1 = this.get_node(a); b1 = this.get_node(b); if (a1.data.jstree.type == b1.data.jstree.type) { return (a1.text > b1.text) ? 1 : -1; } else { return (a1.data.jstree.type > b1.data.jstree.type) ? 1 : -1; } }, }); $('#jstree_<?=$config['domain']['safeName']?>').on('activate_node.jstree', function (e, data) { if (data.instance.get_node(data.node.id).data.jstree.type == 1) { return; } window.location.href = '<?=htmlspecialchars($_SERVER['SCRIPT_NAME'])?>?do=edit&rowid=' + data.instance.get_node(data.node.id).data.jstree.id; }); if (document.getElementById('textarea_editor_code')) { var editor = CodeMirror.fromTextArea(document.getElementById('textarea_editor_code'), { mode: "text/html", viewportMargin: Infinity, lineNumbers: true, lineWrapping: true, smartIndent: true, matchBrackets: true, extraKeys: { "Ctrl-S": function (instance) { ajaxSaveFile($('#textarea_editor_code').closest('form').attr('id')); }, } }); editor.setSize("100%", '900'); } tinymce.init({ selector: 'textarea#textarea_editor_html', plugins: "advlist lists charmap print anchor textcolor visualblocks colorpicker fullpage fullscreen code image link imagetools media searchreplace save", toolbar: "insert | undo redo | formatselect | bold italic forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | fullpage fullscreen code image link imagetools media searchreplace save", removed_menuitems: 'newdocument', save_onsavecallback: function () { ajaxSaveFile('formHtml'); }, valid_elements: "*[*]", valid_children: "*[*]", theme: "modern", cleanup_on_startup: false, trim_span_elements: false, verify_html: false, cleanup: false, extended_valid_elements: "*[*]", custom_elements: "*[*]", allow_conditional_comments: true, allow_html_in_named_anchor: true, allow_unsafe_link_target: true, convert_fonts_to_spans: false, branding: false, height: 900, autoresize_on_init: true, relative_urls: true, allow_script_urls: true, convert_urls: false, remove_script_host: true, anchor_bottom: false, anchor_top: false, forced_root_block: false, keep_styles: true, remove_trailing_brs: false, document_base_url: "<?= $config['domain']['root'] . '/' ?>", entity_encoding: "named", }); function logout() { $.post({ cache: false, url: '<?=$_SERVER['REQUEST_URI']?>', data: 'action=logout', success: function (data) { window.location.href = '<?=$_SERVER['REQUEST_URI']?>'; } }); } function changeLanguage($id) { $.post({ cache: false, url: '<?=$_SERVER['REQUEST_URI']?>', data: 'action=language&id=' + $id, success: function (data) { window.location.href = '<?=$_SERVER['REQUEST_URI']?>'; } }); } </script> </body> </html>