Files
MyTrack/Manage.php

2735 lines
102 KiB
PHP
Raw Permalink Normal View History

2026-02-23 19:45:59 +08:00
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
include 'header.php';
include 'menu.php';
include 'common-js.php';
include 'table-js.php';
// 获取插件选项
$options = Typecho_Widget::widget('Widget_Options');
$pluginOptions = $options->plugin('MyTrack');
$webApiKey = isset($pluginOptions->webApiKey) ? $pluginOptions->webApiKey : '';
// 检查是否有搜索参数
$searchKeyword = isset($_GET['search']) ? trim($_GET['search']) : '';
$searchResults = array();
$searchPerformed = false;
$currentPage = isset($_GET['page']) ? intval($_GET['page']) : 1;
// 如果有关键词,执行搜索
if ($searchKeyword) {
$searchPerformed = true;
try {
$db = MyTrack_Plugin::getDbConnection();
// 构建SQL查询条件 - 只搜索地名
$whereConditions = array();
$params = array();
// 仅搜索名称(地名)
if (!empty($searchKeyword)) {
$whereConditions[] = "name LIKE ?";
$searchParam = '%' . $searchKeyword . '%';
$params = array($searchParam);
}
// 构建完整的WHERE子句
$whereSql = '';
if (!empty($whereConditions)) {
$whereSql = 'WHERE ' . implode(' AND ', $whereConditions);
}
// 获取分页信息
$pageSize = 10;
$offset = ($currentPage - 1) * $pageSize;
// 获取总记录数
$countSql = "SELECT COUNT(*) FROM plugin_track_footprint " . $whereSql;
$countStmt = $db->prepare($countSql);
$countStmt->execute($params);
$total = $countStmt->fetchColumn();
$totalPages = ceil($total / $pageSize);
// 获取搜索结果
$sql = "SELECT * FROM plugin_track_footprint
$whereSql
ORDER BY date DESC, created_at DESC
LIMIT ? OFFSET ?";
$stmt = $db->prepare($sql);
$limitParams = array_merge($params, array($pageSize, $offset));
$stmt->execute($limitParams);
$searchResults = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
// 搜索出错,不显示结果
$searchPerformed = false;
}
}
?>
<!-- 引入MyTrack插件的CSS和JS -->
<link rel="stylesheet" href="<?php $options->pluginUrl('MyTrack/assets/admin.css'); ?>">
<!-- 添加搜索功能的CSS -->
<style>
.btn-s{border-radius:8px!important;}
/* 只保留CSS头部确保不改变原有CSS结构 */
.dark input[type=text], input[type=url], input[type=password], input[type=email], input[type=number], textarea, .typecho-option select, input[type=text]:disabled, input[type=text]:read-only, input[type=password]:disabled, input[type=password]:read-only, input[type=email]:disabled, input[type=email]:read-only, textarea:disabled, textarea:read-only, select {
background: #fff!important;
border: 1px solid #000000;
outline: none;
}
.typecho-list-operate{margin:1em 10px!important;}
/* 搜索容器样式 */
.mytrack-search-container {
margin-bottom: 25px;
padding: 15px 15px 5px;
background-color: #f8f9fa;
border-radius: 8px;
border: 1px solid #e5e7eb;
}
.mytrack-search-header {
margin-bottom: 12px;
}
.mytrack-search-header .description {
color: #6b7280;
font-size: 13px;
margin-top: 4px;
line-height: 1.4;
}
.mytrack-search-box {
position: relative;
margin-bottom: 10px;
}
#location-search {
width: 100%;
padding: 10px 12px;
font-size: 14px;
line-height: 1.5;
color: #374151;
background-color: #fff;
border: 1px solid #d1d5db;
border-radius: 6px;
transition: border-color 0.15s ease-in-out;
}
#location-search:focus {
outline: 0;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.mytrack-search-results {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 1000;
max-height: 320px;
overflow-y: auto;
background-color: #fff;
border: 1px solid #d1d5db;
border-top: none;
border-radius: 0 0 6px 6px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
margin-top: -1px;
}
.mytrack-result-item {
padding: 10px 12px;
cursor: pointer;
border-bottom: 1px solid #f3f4f6;
transition: background-color 0.15s;
}
.mytrack-result-item:last-child {
border-bottom: none;
}
.mytrack-result-item:hover,
.mytrack-result-item.hover {
background-color: #f3f4f6;
}
.mytrack-result-name {
font-weight: 600;
color: #111827;
margin-bottom: 3px;
font-size: 14px;
line-height: 1.3;
}
.mytrack-result-address {
color: #6b7280;
font-size: 12px;
line-height: 1.3;
margin-bottom: 2px;
word-break: break-word;
}
.mytrack-result-type {
color: #3b82f6;
font-size: 11px;
font-weight: 500;
background-color: #eff6ff;
padding: 2px 6px;
border-radius: 10px;
display: inline-block;
margin-top: 3px;
}
.mytrack-loading,
.mytrack-no-results {
padding: 20px 12px;
text-align: center;
color: #6b7280;
font-size: 14px;
}
.mytrack-search-actions {
text-align: right;
padding-top: 8px;
border-top: 1px solid #e5e7eb;
}
.mytrack-search-link {
color: #3b82f6;
text-decoration: none;
font-size: 13px;
transition: color 0.15s;
}
.mytrack-search-link:hover {
color: #2563eb;
text-decoration: underline;
}
/* 适配模态框内样式 */
.typecho-modal-body .mytrack-search-container {
margin-left: -24px;
margin-right: -24px;
margin-top: -24px;
border-radius: 0;
border-left: none;
border-right: none;
border-top: none;
}
/* 确保搜索结果框在最上层 */
.typecho-modal-content {
z-index: 1001;
}
.mytrack-search-results {
z-index: 1002;
}
/* 新增字段样式 */
.mytrack-field-row {
display: flex;
gap: 15px;
margin-bottom: 15px;
}
.mytrack-field-group {
flex: 1;
}
.mytrack-field-label {
display: block;
margin-bottom: 5px;
font-weight: 500;
color: #374151;
font-size: 13px;
}
.mytrack-field-select,
.mytrack-field-input {
width: 100%;
padding: 8px 12px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 14px;
color: #374151;
background-color: #fff;
transition: border-color 0.15s;
box-sizing: border-box;
}
.mytrack-field-select:focus,
.mytrack-field-input:focus {
outline: 0;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.mytrack-review-textarea {
width: 100%;
min-height: 80px;
padding: 8px 12px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 14px;
color: #374151;
background-color: #fff;
transition: border-color 0.15s;
resize: vertical;
font-family: inherit;
box-sizing: border-box;
}
.mytrack-review-textarea:focus {
outline: 0;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* 亮点字段样式 */
.mytrack-highlights-input {
width: 100%;
padding: 8px 12px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 14px;
color: #374151;
background-color: #fff;
transition: border-color 0.15s;
box-sizing: border-box;
}
.mytrack-highlights-input:focus {
outline: 0;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.mytrack-highlights-note {
color: #6b7280;
font-size: 12px;
margin-top: 4px;
line-height: 1.4;
}
/* 星级评分样式 */
.mytrack-rating-stars {
display: flex;
gap: 5px;
margin-top: 5px;
}
.mytrack-star {
font-size: 20px;
color: #d1d5db;
cursor: pointer;
transition: color 0.2s;
}
.mytrack-star:hover,
.mytrack-star.selected {
color: #f59e0b;
}
/* 分类选择器样式 */
.mytrack-categories-options {
display: flex;
gap: 10px;
margin-top: 5px;
}
.mytrack-categories-option {
flex: 1;
text-align: center;
padding: 8px;
border: 2px solid #d1d5db;
border-radius: 6px;
cursor: pointer;
background: white;
font-size: 13px;
transition: all 0.2s;
color: #6b7280;
}
.mytrack-categories-option:hover {
border-color: #9ca3af;
color: #374151;
}
.mytrack-categories-option.selected {
border-color: #3b82f6;
background: #eff6ff;
color: #1e40af;
font-weight: 500;
}
.mytrack-categories-option.visited {
border-color: #10b981;
}
.mytrack-categories-option.visited.selected {
background: #d1fae5;
color: #065f46;
}
.mytrack-categories-option.want {
border-color: #8b5cf6;
}
.mytrack-categories-option.want.selected {
background: #ede9fe;
color: #5b21b6;
}
.mytrack-categories-option.plan {
border-color: #f59e0b;
}
.mytrack-categories-option.plan.selected {
background: #fef3c7;
color: #92400e;
}
/* 表格中星级显示样式 */
.mytrack-rating-display {
display: flex;
gap: 2px;
}
.mytrack-rating-star {
color: #f59e0b;
font-size: 14px;
}
.mytrack-rating-empty-star {
color: #d1d5db;
font-size: 14px;
}
/* 表格中亮点显示样式 */
.mytrack-highlights-display {
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mytrack-highlight-tag {
display: inline-block;
background-color: #e8f5e9;
color: #2e7d32;
padding: 2px 8px;
border-radius: 12px;
font-size: 12px;
margin-right: 5px;
margin-bottom: 3px;
}
/* 表格中分类显示样式 */
.mytrack-categories-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
line-height: 1.5;
}
.mytrack-categories-visited-badge {
background-color: #d1fae5;
color: #065f46;
border: 1px solid #10b981;
}
.mytrack-categories-want-badge {
background-color: #ede9fe;
color: #5b21b6;
border: 1px solid #8b5cf6;
}
.mytrack-categories-plan-badge {
background-color: #fef3c7;
color: #92400e;
border: 1px solid #f59e0b;
}
/* 操作列样式 */
.mytrack-actions {
white-space: nowrap;
}
.mytrack-edit-btn,
.mytrack-delete-btn {
color: #3b82f6;
text-decoration: none;
margin: 0 5px;
font-size: 13px;
cursor: pointer;
}
.mytrack-edit-btn:hover,
.mytrack-delete-btn:hover {
text-decoration: underline;
}
.mytrack-delete-btn {
color: #ef4444;
}
.mytrack-delete-btn:hover {
color: #dc2626;
}
/* 标记颜色选择器样式 */
.mytrack-marker-color-options {
display: flex;
gap: 10px;
margin-top: 5px;
flex-wrap: wrap;
}
.mytrack-marker-color-option {
width: 30px;
height: 30px;
border-radius: 50%;
cursor: pointer;
border: 2px solid transparent;
transition: border-color 0.3s ease, transform 0.3s ease;
}
.mytrack-marker-color-option:hover {
transform: scale(1.1);
}
.mytrack-marker-color-option.selected {
border-color: #333;
transform: scale(1.1);
}
.mytrack-marker-color-sunset { background: linear-gradient(135deg, rgb(255, 179, 71), rgb(255, 111, 97)); }
.mytrack-marker-color-ocean { background: linear-gradient(135deg, rgb(6, 190, 182), rgb(72, 177, 191)); }
.mytrack-marker-color-forest { background: linear-gradient(135deg, rgb(94, 231, 223), rgb(57, 163, 124)); }
.mytrack-marker-color-amber { background: linear-gradient(135deg, rgb(246, 211, 101), rgb(253, 160, 133)); }
.mytrack-marker-color-violet { background: linear-gradient(135deg, rgb(161, 140, 209), rgb(251, 194, 235)); }
.mytrack-marker-color-citrus { background: linear-gradient(135deg, rgb(253, 251, 143), rgb(161, 255, 206)); }
/* 表格中标记颜色显示样式 - 只显示颜色圆点,不显示文字 */
.mytrack-marker-color-display {
width: 20px;
height: 20px;
border-radius: 50%;
display: inline-block;
vertical-align: middle;
border: 2px solid #fff;
box-shadow: 0 2px 5px rgba(0,0,0,0.3);
}
.mytrack-marker-color-display-sunset { background: linear-gradient(135deg, rgb(255, 179, 71), rgb(255, 111, 97)); }
.mytrack-marker-color-display-ocean { background: linear-gradient(135deg, rgb(6, 190, 182), rgb(72, 177, 191)); }
.mytrack-marker-color-display-forest { background: linear-gradient(135deg, rgb(94, 231, 223), rgb(57, 163, 124)); }
.mytrack-marker-color-display-amber { background: linear-gradient(135deg, rgb(246, 211, 101), rgb(253, 160, 133)); }
.mytrack-marker-color-display-violet { background: linear-gradient(135deg, rgb(161, 140, 209), rgb(251, 194, 235)); }
.mytrack-marker-color-display-citrus { background: linear-gradient(135deg, rgb(253, 251, 143), rgb(161, 255, 206)); }
/* 标记颜色单元格样式 - 居中显示 */
td .mytrack-marker-color-display {
margin: 0 auto;
display: block;
}
/* 关联文章样式 */
.mytrack-related-articles-container {
margin-top: 15px;
padding: 15px;
background-color: #f8f9fa;
border-radius: 6px;
border: 1px solid #e5e7eb;
}
.mytrack-related-articles-list {
max-height: 200px;
overflow-y: auto;
margin-top: 10px;
padding: 10px;
background-color: white;
border-radius: 4px;
border: 1px solid #e5e7eb;
}
.mytrack-related-article-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 10px;
border-bottom: 1px solid #f3f4f6;
}
.mytrack-related-article-item:last-child {
border-bottom: none;
}
.mytrack-related-article-info {
flex: 1;
}
.mytrack-related-article-title {
font-weight: 500;
color: #374151;
margin-bottom: 2px;
font-size: 14px;
}
.mytrack-related-article-cid {
color: #6b7280;
font-size: 12px;
}
.mytrack-related-article-actions {
display: flex;
gap: 5px;
}
.mytrack-remove-related-article {
color: #ef4444;
background: none;
border: none;
cursor: pointer;
font-size: 12px;
padding: 2px 6px;
border-radius: 4px;
transition: background-color 0.2s;
text-decoration: none;
}
.mytrack-remove-related-article:hover {
background-color: #fee2e2;
text-decoration: none;
}
.mytrack-add-related-article {
display: flex;
gap: 10px;
margin-top: 10px;
}
/* 表格中关联文章显示样式 */
.mytrack-related-articles-display {
max-width: 150px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mytrack-related-article-link {
color: #3b82f6;
text-decoration: none;
margin-right: 5px;
font-size: 12px;
cursor: pointer;
position: relative;
}
.mytrack-related-article-link:hover {
text-decoration: underline;
}
.mytrack-related-article-tooltip {
position: absolute;
bottom: 100%;
left: 50%;
transform: translateX(-50%);
background-color: #333;
color: white;
padding: 8px 12px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
z-index: 1000;
display: none;
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
.mytrack-related-article-link:hover .mytrack-related-article-tooltip {
display: block;
}
.mytrack-related-article-tooltip::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 5px;
border-style: solid;
border-color: #333 transparent transparent transparent;
}
/* 管理页面搜索框样式 - 已完善 */
.mytrack-management-search {
display: inline-flex;
align-items: center;
margin-left: 150px;
vertical-align: middle;
position: relative;
border-radius: 6px;
height: 32px;
}
.mytrack-management-search form {
display: flex;
align-items: center;
margin: 0;
width: 100%;
}
.mytrack-management-search input {
padding: 6px 12px;
border: none;
border-radius: 6px 0 0 6px;
font-size: 13px;
width: 180px;
transition: all 0.2s;
background: #cecece;
height: 30px;
line-height: 30px;
outline: none;
color: #666;
}
.dark .mytrack-management-search input {
background: #cecece!important; color: #666;
}
.mytrack-management-search input:focus {
outline: none;
box-shadow: none;
}
.mytrack-management-search-btn {
padding: 0 12px;
background-color: #2d578a;
color: #cecece;
border: none;
border-radius: 0 6px 6px 0;
font-size: 13px;
cursor: pointer;
transition: background-color 0.2s;
height: 30px;
line-height: 30px;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
border-left: 1px solid rgba(255, 255, 255, 0.1);
}
.mytrack-management-search-btn:hover {
background-color: #02308c;
}
.mytrack-management-search-clear {
padding: 0 12px;
background-color: #6b7280;
color: white;
border: none;
border-radius: 0 6px 6px 0;
font-size: 13px;
cursor: pointer;
transition: background-color 0.2s;
height: 30px;
line-height: 30px;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
text-decoration: none;
margin-left: 1px;
}
.mytrack-management-search-clear:hover {
background-color: #4b5563;
text-decoration: none;
color: white;
}
.mytrack-management-search.with-clear .mytrack-management-search-btn {
border-radius: 0;
}
.mytrack-management-search.with-clear .mytrack-management-search-clear {
border-radius: 0 6px 6px 0;
}
/* 搜索结果提示样式 */
.mytrack-search-result-info {
background-color: #f0f9ff;
border: 1px solid #bae6fd;
border-radius: 6px;
padding: 12px 16px;
margin-bottom: 15px;
display: flex;
justify-content: space-between;
align-items: center;
}
.mytrack-search-result-info p {
margin: 0;
color: #0369a1;
font-size: 14px;
}
.mytrack-search-result-info a {
color: #3b82f6;
text-decoration: none;
font-size: 13px;
}
.mytrack-search-result-info a:hover {
text-decoration: underline;
}
/* 搜索结果建议框 */
#mytrack-suggestions {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 1000;
max-height: 300px;
overflow-y: auto;
background-color: #fff;
border: 1px solid #d1d5db;
border-top: none;
border-radius: 0 0 6px 6px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
margin-top: -1px;
}
.mytrack-suggestion-item {
padding: 10px 12px;
cursor: pointer;
border-bottom: 1px solid #f3f4f6;
transition: background-color 0.15s;
}
.mytrack-suggestion-item:last-child {
border-bottom: none;
}
.mytrack-suggestion-item:hover,
.mytrack-suggestion-item.hover {
background-color: #f3f4f6;
}
.mytrack-suggestion-name {
font-weight: 500;
color: #374151;
margin-bottom: 2px;
font-size: 13px;
}
/* 高亮文本 */
mark {
background-color: #fef3c7;
color: #92400e;
padding: 0 2px;
border-radius: 2px;
}
.typecho-table-wrap{padding:30px 0px!important;}
.typecho-pager{float:none!important;}
</style>
<script>
// 设置插件配置
var MyTrackConfig = {
actionUrl: '<?php $options->index("/action/track"); ?>',
webApiKey: '<?php echo $webApiKey; ?>'
};
</script>
<div class="main">
<div class="body container">
<!--<?php include 'page-title.php'; ?>-->
<div class="row typecho-page-main" role="main">
<div class="col-mb-12 typecho-list">
<div class="typecho-list-operate clearfix">
<form method="get">
<div class="operate">
<label><i class="sr-only"><?php _e('全选'); ?></i><input type="checkbox" class="typecho-table-select-all"/></label>
<div class="btn-group btn-drop">
<button class="btn dropdown-toggle btn-s" type="button"><i
class="sr-only"><?php _e('操作'); ?></i><?php _e('选中项'); ?> <i
class="i-caret-down"></i></button>
<ul class="dropdown-menu">
<li>
<a href="#" id="batch-delete-btn"><?php _e('删除'); ?></a>
</li>
</ul>
</div>
</div>
</form>
<!-- 管理页面搜索框 - 居中在批量删除和精简导出之间 -->
<div class="mytrack-management-search <?php echo $searchKeyword ? 'with-clear' : ''; ?>">
<form method="get" action="" style="display: flex; align-items: center; width: 100%;">
<input type="text" name="search" id="management-search"
placeholder="<?php _e('搜索地名...'); ?>"
value="<?php echo htmlspecialchars($searchKeyword); ?>"
autocomplete="off">
<input type="hidden" name="panel" value="MyTrack/Manage.php">
<button type="submit" class="mytrack-management-search-btn"><?php _e('搜索'); ?></button>
<?php if ($searchKeyword): ?>
<a href="<?php echo \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php', $options->adminUrl); ?>"
class="mytrack-management-search-clear"><?php _e('清除'); ?></a>
<?php endif; ?>
</form>
</div>
<a class="btn primary btn-s btn-operate" style="float: right;line-height: 28px;" href="#" id="add-footprint-btn"><?php _e('新增地点'); ?></a>
<a class="btn primary btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="import-footprint-btn"><?php _e('导入数据'); ?></a>
<a class="btn btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="export-json-btn"><?php _e('导出数据'); ?></a>
<a class="btn btn-s btn-operate" style="float: right;line-height: 28px;margin-right: 10px;" href="#" id="export-simple-btn"><?php _e('精简导出'); ?></a>
</div><!-- end .typecho-list-operate -->
<?php if ($searchPerformed && $searchKeyword): ?>
<div class="mytrack-search-result-info">
<p><?php _e('搜索关键词:'); ?><strong>"<?php echo htmlspecialchars($searchKeyword); ?>"</strong> |
<?php _e('找到'); ?> <strong><?php echo isset($total) ? $total : 0; ?></strong> <?php _e('条记录'); ?></p>
<a href="<?php echo \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php', $options->adminUrl); ?>">
<?php _e('返回全部列表'); ?>
</a>
</div>
<?php endif; ?>
<form method="post" name="manage_footprints" class="operate-form">
<div class="typecho-table-wrap">
<table class="typecho-list-table">
<colgroup>
<col width="3%" class="kit-hidden-mb"/>
<col width="5%"/>
<col width="15%"/>
<col width="20%"/>
<col width="8%"/>
<col width="8%"/>
<col width="8%"/>
<col width="8%"/>
<col width="12%"/>
<col width="15%"/>
<col width="10%"/>
</colgroup>
<thead>
<tr>
<th class="kit-hidden-mb"></th>
<th><?php _e('ID'); ?></th>
<th><?php _e('地名'); ?></th>
<th><?php _e('详细地址'); ?></th>
<th><?php _e('类型'); ?></th>
<th><?php _e('分类'); ?></th>
<th><?php _e('推荐星级'); ?></th>
<th><?php _e('标记'); ?></th>
<th><?php _e('亮点'); ?></th>
<th><?php _e('关联文章'); ?></th>
<th><?php _e('操作'); ?></th>
</tr>
</thead>
<tbody id="footprint-list">
<?php
try {
$db = MyTrack_Plugin::getDbConnection();
// 使用搜索结果或全部数据
if ($searchPerformed && !empty($searchResults)) {
$footprints = $searchResults;
} else {
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
$pageSize = 10;
$offset = ($page - 1) * $pageSize;
$countStmt = $db->query("SELECT COUNT(*) FROM plugin_track_footprint");
$total = $countStmt->fetchColumn();
$totalPages = ceil($total / $pageSize);
$stmt = $db->prepare("SELECT * FROM plugin_track_footprint
ORDER BY date DESC, created_at DESC
LIMIT ? OFFSET ?");
$stmt->execute(array($pageSize, $offset));
$footprints = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
if (empty($footprints)) {
if ($searchPerformed && $searchKeyword) {
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . sprintf(_t('没有找到与"%s"相关的足迹'), htmlspecialchars($searchKeyword)) . '</h6></td></tr>';
} else {
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . _t('没有任何足迹') . '</h6></td></tr>';
}
} else {
foreach ($footprints as $footprint) {
echo '<tr id="footprint-' . $footprint['id'] . '">';
echo '<td class="kit-hidden-mb"><input type="checkbox" value="' . $footprint['id'] . '" name="footprint[]"/></td>';
echo '<td>' . $footprint['id'] . '</td>';
echo '<td>' . ($footprint['name'] ?: '-') . '</td>';
echo '<td>' . ($footprint['address'] ?: '-') . '</td>';
echo '<td>' . ($footprint['location_type'] ?: '-') . '</td>';
echo '<td>';
if ($footprint['categories']) {
$categories = explode(',', $footprint['categories']);
foreach ($categories as $category) {
$category = trim($category);
$badgeClass = '';
$categoryText = '';
switch($category) {
case 'visited':
$badgeClass = 'mytrack-categories-visited-badge';
$categoryText = '去过';
break;
case 'want':
$badgeClass = 'mytrack-categories-want-badge';
$categoryText = '想去';
break;
case 'plan':
$badgeClass = 'mytrack-categories-plan-badge';
$categoryText = '计划';
break;
default:
$badgeClass = 'mytrack-categories-badge';
$categoryText = $category;
}
echo '<span class="mytrack-categories-badge ' . $badgeClass . '" style="margin: 2px;">' . $categoryText . '</span>';
}
} else {
echo '-';
}
echo '</td>';
echo '<td>';
if ($footprint['rating_level'] && $footprint['rating_level'] > 0) {
echo '<div class="mytrack-rating-display">';
for ($i = 1; $i <= 5; $i++) {
if ($i <= $footprint['rating_level']) {
echo '<span class="mytrack-rating-star">★</span>';
} else {
echo '<span class="mytrack-rating-empty-star">☆</span>';
}
}
echo '</div>';
} else {
echo '-';
}
echo '</td>';
echo '<td style="text-align: center;">';
if ($footprint['markerColor']) {
$colorDisplayClass = 'mytrack-marker-color-display-' . $footprint['markerColor'];
echo '<span class="mytrack-marker-color-display ' . $colorDisplayClass . '" title="' . $footprint['markerColor'] . '"></span>';
} else {
echo '-';
}
echo '</td>';
echo '<td class="mytrack-highlights-display">';
if (!empty($footprint['highlights'])) {
$highlights = explode(',', $footprint['highlights']);
$displayCount = 0;
foreach ($highlights as $highlight) {
$highlight = trim($highlight);
if ($highlight) {
echo '<span class="mytrack-highlight-tag">' . htmlspecialchars($highlight) . '</span>';
$displayCount++;
if ($displayCount >= 3) {
echo '...';
break;
}
}
}
} else {
echo '-';
}
echo '</td>';
// 关联文章列表显示
echo '<td class="mytrack-related-articles-display">';
if (!empty($footprint['related_articles'])) {
$relatedArticles = explode(',', $footprint['related_articles']);
$relatedArticlesInfo = MyTrack_Plugin::getRelatedArticlesInfo($footprint['related_articles']);
foreach ($relatedArticles as $index => $articleCid) {
$articleCid = trim($articleCid);
if (!empty($articleCid)) {
$articleTitle = '';
$articleLink = '';
if (isset($relatedArticlesInfo[$articleCid])) {
$articleTitle = $relatedArticlesInfo[$articleCid]['title'];
$articleLink = $relatedArticlesInfo[$articleCid]['link'];
}
if ($articleLink) {
echo '<a href="' . $articleLink . '" target="_blank" class="mytrack-related-article-link" title="' . $articleTitle . '">' . $articleCid . '</a>';
if ($index < count($relatedArticles) - 1) {
echo ', ';
}
} else {
echo '<span title="文章不存在">' . $articleCid . '</span>';
if ($index < count($relatedArticles) - 1) {
echo ', ';
}
}
}
}
} else {
echo '-';
}
echo '</td>';
echo '<td class="mytrack-actions">';
echo '<a href="#" class="mytrack-edit-btn edit-footprint" data-id="' . $footprint['id'] . '">' . _t('编辑') . '</a>';
echo '<span></span>';
echo '<a href="#" class="mytrack-delete-btn delete-footprint" data-id="' . $footprint['id'] . '">' . _t('删除') . '</a>';
echo '</td>';
echo '</tr>';
}
}
} catch (PDOException $e) {
echo '<tr><td colspan="11" style="text-align: center;"><h6 class="typecho-list-table-title">' . _t('加载数据失败: ') . $e->getMessage() . '</h6></td></tr>';
}
?>
</tbody>
</table>
</div>
</form><!-- end .operate-form -->
<div class="typecho-list-operate clearfix">
<ul class="typecho-pager">
<?php
if (isset($totalPages) && $totalPages > 1) {
$currentPage = $currentPage;
$adminUrl = $options->adminUrl;
echo '<li>';
if ($currentPage > 1) {
$prevUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . ($currentPage - 1), $adminUrl);
if ($searchKeyword) {
$prevUrl .= '&search=' . urlencode($searchKeyword);
}
echo '<a href="' . $prevUrl . '">' . _t('上一页') . '</a>';
} else {
echo '<span class="current">' . _t('上一页') . '</span>';
}
echo '</li>';
for ($i = 1; $i <= $totalPages; $i++) {
echo '<li>';
if ($i === $currentPage) {
echo '<span class="current">' . $i . '</span>';
} else {
$pageUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . $i, $adminUrl);
if ($searchKeyword) {
$pageUrl .= '&search=' . urlencode($searchKeyword);
}
echo '<a href="' . $pageUrl . '">' . $i . '</a>';
}
echo '</li>';
}
echo '<li>';
if ($currentPage < $totalPages) {
$nextUrl = \Typecho\Common::url('extending.php?panel=MyTrack/Manage.php&page=' . ($currentPage + 1), $adminUrl);
if ($searchKeyword) {
$nextUrl .= '&search=' . urlencode($searchKeyword);
}
echo '<a href="' . $nextUrl . '">' . _t('下一页') . '</a>';
} else {
echo '<span class="current">' . _t('下一页') . '</span>';
}
echo '</li>';
}
?>
</ul>
</div>
</div><!-- end .typecho-list -->
</div><!-- end .typecho-page-main -->
</div>
</div>
<!-- 添加/编辑足迹模态框 -->
<div id="footprint-modal" class="typecho-modal" style="display: none;">
<div class="typecho-modal-content">
<div class="typecho-modal-title">
<span id="modal-title"><?php _e('新增地点'); ?></span>
<button type="button" class="typecho-modal-close">&times;</button>
</div>
<div class="typecho-modal-body">
<div class="mytrack-search-container">
<div class="mytrack-search-header">
<p class="description"><?php _e('已接入高德地图API输入关键词实时联想搜索下拉菜单选择地点后自动填充信息当然你也可以通过右侧链接跳转高德地图复制粘贴经纬度填写'); ?><a href="https://lbs.amap.com/tools/picker" target="_blank" class="mytrack-search-link">
<?php _e('高德地图经纬度选择工具'); ?>
</a></p>
</div>
<div class="mytrack-search-box">
<input type="text" id="location-search"
placeholder="<?php _e('输入地点关键词,如:北京市天安门广场'); ?>"
class="text" autocomplete="off">
<div id="search-results" class="mytrack-search-results" style="display: none;"></div>
</div>
</div>
<form id="footprint-form" method="post" style="margin-top: 20px;">
<ul>
<li>
<label class="typecho-label" for="longitude"><?php _e('地点经度'); ?> <em style="color: red;">*</em></label>
<input placeholder="例如116.4074" type="text" id="longitude" name="longitude" class="text" required />
</li>
<li>
<label class="typecho-label" for="latitude"><?php _e('地点纬度'); ?> <em style="color: red;">*</em></label>
<input placeholder="例如39.9042" type="text" id="latitude" name="latitude" class="text" required />
</li>
<li>
<label class="typecho-label" for="name"><?php _e('地点名称'); ?> <em style="color: red;">*</em></label>
<input placeholder="例如:天安门广场" type="text" id="name" name="name" class="text" required />
</li>
<li>
<label class="typecho-label" for="address"><?php _e('详细地址'); ?></label>
<input placeholder="例如:北京市东城区天安门广场" type="text" id="address" name="address" class="text" />
</li>
<!--<li>
<label class="typecho-label" for="date"><?php _e('日期'); ?></label>
<input placeholder="例如2025-10-27" type="date" id="date" name="date" class="text" />
</li>-->
<div class="mytrack-field-row">
<div class="mytrack-field-group">
<label class="mytrack-field-label" for="location_type"><?php _e('地点类型'); ?></label>
<input type="text" id="location_type" name="location_type" class="mytrack-field-input" placeholder="<?php _e('例如:景点、餐厅、酒店'); ?>" />
</div>
<div class="mytrack-field-group">
<label class="mytrack-field-label"><?php _e('推荐星级'); ?></label>
<div class="mytrack-rating-stars" id="rating-stars">
<span class="mytrack-star" data-value="1"></span>
<span class="mytrack-star" data-value="2"></span>
<span class="mytrack-star" data-value="3"></span>
<span class="mytrack-star" data-value="4"></span>
<span class="mytrack-star" data-value="5"></span>
</div>
<input type="hidden" id="rating_level" name="rating_level" value="0" />
</div>
</div>
<div class="mytrack-field-row">
<div class="mytrack-field-group">
<label class="mytrack-field-label"><?php _e('状态分类'); ?></label>
<div class="mytrack-categories-options">
<button type="button" class="mytrack-categories-option visited" data-value="visited">
<?php _e('去过'); ?>
</button>
<button type="button" class="mytrack-categories-option want" data-value="want">
<?php _e('想去'); ?>
</button>
<button type="button" class="mytrack-categories-option plan" data-value="plan">
📅 <?php _e('计划'); ?>
</button>
</div>
<input type="hidden" id="categories" name="categories" value="" />
</div>
</div>
<div class="mytrack-field-row">
<div class="mytrack-field-group">
<label class="mytrack-field-label"><?php _e('标记颜色'); ?></label>
<div class="mytrack-marker-color-options" id="marker-color-options">
<div class="mytrack-marker-color-option mytrack-marker-color-sunset" data-value="sunset" title="Sunset"></div>
<div class="mytrack-marker-color-option mytrack-marker-color-ocean" data-value="ocean" title="Ocean"></div>
<div class="mytrack-marker-color-option mytrack-marker-color-forest" data-value="forest" title="Forest"></div>
<div class="mytrack-marker-color-option mytrack-marker-color-amber" data-value="amber" title="Amber"></div>
<div class="mytrack-marker-color-option mytrack-marker-color-violet" data-value="violet" title="Violet"></div>
<div class="mytrack-marker-color-option mytrack-marker-color-citrus" data-value="citrus" title="Citrus"></div>
</div>
<input type="hidden" id="markerColor" name="markerColor" value="" />
</div>
</div>
<li>
<label class="typecho-label" for="highlights"><?php _e('亮点'); ?></label>
<input placeholder="<?php _e('例如:夜景好看,适合拍照,交通便利'); ?>"
type="text"
id="highlights"
name="highlights"
class="mytrack-highlights-input" />
<p class="mytrack-highlights-note"><?php _e('多个亮点用逗号分隔,例如:夜景好看,适合拍照,交通便利'); ?></p>
</li>
<li>
<label class="typecho-label" for="review"><?php _e('我的评价'); ?></label>
<textarea id="review" name="review" rows="3" class="mytrack-review-textarea" placeholder="<?php _e('写下您的评价...'); ?>"></textarea>
</li>
<!-- <li>
<label class="typecho-label" for="description"><?php _e('地点描述'); ?></label>
<textarea id="description" name="description" rows="3" class="mytrack-review-textarea" placeholder="<?php _e('地点描述信息...'); ?>"></textarea>
</li>-->
<!--<li>
<label class="typecho-label" for="tags"><?php _e('标签'); ?></label>
<input placeholder="<?php _e('例如:景点,文化,历史'); ?>"
type="text"
id="tags"
name="tags"
class="text" />
</li>-->
<!--<li>
<label class="typecho-label" for="article_cid"><?php _e('关联文章ID'); ?></label>
<input placeholder="<?php _e('关联文章的CID'); ?>"
type="text"
id="article_cid"
name="article_cid"
class="text" />
</li>-->
<!--<li>
<label class="typecho-label" for="photos"><?php _e('图片链接'); ?></label>
<input placeholder="<?php _e('多个图片链接用逗号分隔'); ?>"
type="text"
id="photos"
name="photos"
class="text" />
</li>-->
<!--<li>
<label class="typecho-label" for="urlLabel"><?php _e('链接标签'); ?></label>
<input placeholder="<?php _e('例如:查看详情'); ?>"
type="text"
id="urlLabel"
name="urlLabel"
class="text" />
</li>-->
<!--<li>
<label class="typecho-label" for="url"><?php _e('链接地址'); ?></label>
<input placeholder="<?php _e('例如https://example.com'); ?>"
type="text"
id="url"
name="url"
class="text" />
</li>-->
<!-- 关联文章管理 -->
<div class="mytrack-related-articles-container">
<label class="typecho-label"><?php _e('关联文章'); ?></label>
<p class="description"><?php _e('多个文章ID用逗号分隔1,2,3'); ?></p>
<div class="mytrack-add-related-article">
<input type="text" id="related-articles-input"
placeholder="<?php _e('输入文章CID多个用逗号分隔'); ?>"
class="text" style="flex: 1;" />
<button type="button" id="save-related-articles-btn" class="btn btn-s primary"><?php _e('保存'); ?></button>
</div>
<div class="mytrack-related-articles-list" id="related-articles-list">
<!-- 关联文章列表将动态生成在这里 -->
</div>
<input type="hidden" id="related_articles" name="related_articles" value="" />
</div>
</ul>
<input type="hidden" id="footprint-id" name="id" value="" />
</form>
</div>
<div class="typecho-modal-foot">
<!--<button type="button" id="fetch-images-btn" class="btn"><?php _e('获取文章内容'); ?></button>-->
<button type="button" id="save-footprint-btn" class="btn primary"><?php _e('保存'); ?></button>
<button type="button" class="btn typecho-modal-btn"><?php _e('取消'); ?></button>
</div>
</div>
</div>
<!-- 导入足迹模态框 -->
<div id="import-modal" class="typecho-modal" style="display: none;">
<div class="typecho-modal-content">
<div class="typecho-modal-title">
<span><?php _e('导入足迹'); ?></span>
<button type="button" class="typecho-modal-close">&times;</button>
</div>
<div class="typecho-modal-body">
<form id="import-form" method="post" enctype="multipart/form-data">
<ul>
<li>
<label class="typecho-label" for="import-file"><?php _e('选择文件'); ?> <em style="color: red;">*</em></label>
<input type="file" id="import-file" name="file" class="text" accept=".json" required />
<p class="description"><?php _e('支持JSON格式文件'); ?></p>
</li>
<li>
<h4><?php _e('JSON格式示例'); ?></h4>
<pre>[
{
"latitude": 39.9042,
"longitude": 116.4074,
"name": "天安门广场",
"address": "北京市东城区天安门广场",
"location_type": "景点",
"rating_level": 5,
"categories": "visited",
"review": "非常值得一去的景点",
"description": "北京天安门",
"article_cid": 1,
"urlLabel": "天安门游记",
"url": "https://example.com",
"photos": "https://example.com/image1.jpg,https://example.com/image2.jpg",
"date": "2025-10-27",
"markerColor": "ocean",
"related_articles": "1,2,3",
"highlights": "夜景好看,适合拍照,交通便利",
"created_at": "2025-11-17 14:37:39",
"updated_at": "2025-11-21 05:14:53",
"tags": "景点,文化,历史"
}
]</pre>
</li>
</ul>
</form>
</div>
<div class="typecho-modal-foot">
<button type="button" id="start-import-btn" class="btn primary"><?php _e('导入'); ?></button>
<button type="button" class="btn typecho-modal-btn"><?php _e('取消'); ?></button>
</div>
</div>
</div>
<!-- 加载提示 -->
<div id="loading" class="loading" style="display: none;">
<div class="spinner"></div>
<p><?php _e('加载中...'); ?></p>
</div>
<!-- 消息提示 -->
<div id="message" class="message" style="display: none;"></div>
<script>
// 使用立即执行函数确保代码安全执行
(function($) {
'use strict';
// 搜索相关变量
var searchTimer = null;
var lastSearchKeyword = '';
var currentResults = [];
// 关联文章相关变量
var relatedArticles = [];
var isProcessingArticles = false; // 防止重复处理
// 初始化函数 - 确保在DOM完全加载后执行
function initMyTrack() {
console.log('MyTrack插件管理页面初始化');
// 为管理页面搜索框添加自动完成功能
initManagementSearch();
$('#add-footprint-btn').on('click', function(e) {
e.preventDefault();
console.log('点击新增地点按钮');
showFootprintModal();
});
$('#import-footprint-btn').on('click', function(e) {
e.preventDefault();
console.log('点击导入数据按钮');
showImportModal();
});
$('#export-json-btn').on('click', function(e) {
e.preventDefault();
console.log('点击导出数据按钮');
exportFootprints('json');
});
$('#export-simple-btn').on('click', function(e) {
e.preventDefault();
console.log('点击精简导出按钮');
exportSimpleFootprints();
});
$('#fetch-images-btn').on('click', function(e) {
e.preventDefault();
console.log('点击获取文章内容按钮');
fetchArticleImages();
});
$('#save-footprint-btn').on('click', function(e) {
e.preventDefault();
console.log('点击保存按钮');
saveFootprint();
});
$('#start-import-btn').on('click', function(e) {
e.preventDefault();
console.log('点击导入按钮');
importFootprints();
});
$('.typecho-modal-close, .typecho-modal-btn').on('click', function() {
$(this).closest('.typecho-modal').hide();
});
$('#batch-delete-btn').on('click', function(e) {
e.preventDefault();
console.log('点击批量删除按钮');
var selectedIds = [];
$('input[name="footprint[]"]:checked').each(function() {
selectedIds.push($(this).val());
});
if (selectedIds.length === 0) {
alert('<?php _e('请选择要删除的足迹'); ?>');
return;
}
if (confirm('<?php _e('你确认要删除这些足迹吗?'); ?>')) {
$('#loading').show();
var formData = new FormData();
formData.append('do', 'batchDelete');
for (var i = 0; i < selectedIds.length; i++) {
formData.append('footprint[]', selectedIds[i]);
}
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'POST',
data: formData,
processData: false,
contentType: false,
dataType: 'json',
success: function(response) {
$('#loading').hide();
if (response.success) {
alert(response.message);
window.location.reload();
} else {
alert(response.message);
}
},
error: function(xhr, status, error) {
$('#loading').hide();
console.error('批量删除请求失败:', status, error);
alert('<?php _e('批量删除失败:'); ?>' + (error || '<?php _e('网络错误'); ?>'));
}
});
}
});
// 保存关联文章按钮点击事件
$('#save-related-articles-btn').on('click', function(e) {
e.preventDefault();
saveRelatedArticles();
});
// 关联文章输入框回车事件
$('#related-articles-input').on('keypress', function(e) {
if (e.which === 13) {
e.preventDefault();
saveRelatedArticles();
}
});
// 使用直接绑定方式绑定编辑和删除按钮
bindEditDeleteEvents();
// 监听表格变化,为新增的按钮绑定事件
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
bindEditDeleteEvents();
}
});
});
var tbody = document.getElementById('footprint-list');
if (tbody) {
observer.observe(tbody, { childList: true, subtree: true });
}
initSearch();
initRatingStars();
initCategoriesOptions();
initMarkerColorOptions();
}
// 初始化管理页面搜索框的自动完成功能
function initManagementSearch() {
var searchInput = $('#management-search');
if (!searchInput.length) return;
var suggestionTimer = null;
var currentSuggestions = [];
// 创建建议框容器
var suggestionsDiv = $('<div id="mytrack-suggestions" class="mytrack-search-results" style="display: none;"></div>');
searchInput.parent().append(suggestionsDiv);
searchInput.on('input', function() {
var keyword = $(this).val().trim();
if (!keyword) {
hideSuggestions();
return;
}
clearTimeout(suggestionTimer);
if (keyword.length >= 1) {
suggestionTimer = setTimeout(function() {
searchFootprintsForSuggestions(keyword);
}, 300);
} else {
hideSuggestions();
}
});
searchInput.on('focus', function() {
var keyword = $(this).val().trim();
if (keyword && currentSuggestions.length > 0) {
showSuggestions();
}
});
searchInput.on('keydown', function(e) {
var suggestionsDiv = $('#mytrack-suggestions');
var suggestionItems = suggestionsDiv.find('.mytrack-suggestion-item');
if (e.key === 'Escape') {
hideSuggestions();
} else if (e.key === 'ArrowDown') {
e.preventDefault();
if (suggestionItems.length > 0) {
var firstItem = suggestionItems.first();
if (!suggestionsDiv.find('.mytrack-suggestion-item.hover').length) {
firstItem.addClass('hover');
} else {
var currentHover = suggestionsDiv.find('.mytrack-suggestion-item.hover');
var nextItem = currentHover.next('.mytrack-suggestion-item');
if (nextItem.length) {
currentHover.removeClass('hover');
nextItem.addClass('hover');
}
}
}
} else if (e.key === 'ArrowUp') {
e.preventDefault();
if (suggestionItems.length > 0) {
var lastItem = suggestionItems.last();
if (!suggestionsDiv.find('.mytrack-suggestion-item.hover').length) {
lastItem.addClass('hover');
} else {
var currentHover = suggestionsDiv.find('.mytrack-suggestion-item.hover');
var prevItem = currentHover.prev('.mytrack-suggestion-item');
if (prevItem.length) {
currentHover.removeClass('hover');
prevItem.addClass('hover');
}
}
}
} else if (e.key === 'Enter') {
var hoverItem = suggestionsDiv.find('.mytrack-suggestion-item.hover');
if (hoverItem.length) {
e.preventDefault();
searchInput.val(hoverItem.find('.mytrack-suggestion-name').text());
hideSuggestions();
// 自动提交表单
setTimeout(function() {
searchInput.closest('form').submit();
}, 100);
}
}
});
$(document).on('click', function(e) {
if (!$(e.target).closest('.mytrack-management-search').length) {
hideSuggestions();
}
});
}
function searchFootprintsForSuggestions(keyword) {
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'GET',
data: {do: 'getAll'},
dataType: 'json',
success: function(response) {
if (response.success && response.data && response.data.length > 0) {
var footprints = response.data;
var suggestions = [];
// 过滤匹配的足迹 - 只匹配地名
footprints.forEach(function(footprint) {
if (footprint.name && footprint.name.toString().toLowerCase().indexOf(keyword.toLowerCase()) !== -1) {
suggestions.push(footprint);
}
});
currentSuggestions = suggestions.slice(0, 8); // 最多8条建议
displaySuggestions(currentSuggestions, keyword);
} else {
hideSuggestions();
}
},
error: function() {
hideSuggestions();
}
});
}
function displaySuggestions(suggestions, keyword) {
var suggestionsDiv = $('#mytrack-suggestions');
if (suggestions.length === 0) {
suggestionsDiv.html('<div class="mytrack-no-results"><?php _e('没有找到匹配的地名'); ?></div>');
suggestionsDiv.show();
return;
}
var html = '';
suggestions.forEach(function(footprint) {
// 高亮显示匹配的关键词
var name = footprint.name || '';
// 创建高亮文本
var highlightedName = highlightText(name, keyword);
html += '<div class="mytrack-result-item mytrack-suggestion-item" data-name="' + name + '">';
html += '<div class="mytrack-result-name mytrack-suggestion-name">' + highlightedName + '</div>';
// 显示地址(如果有)
if (footprint.address) {
html += '<div class="mytrack-result-address">' + (footprint.address || '') + '</div>';
}
html += '</div>';
});
suggestionsDiv.html(html);
suggestionsDiv.show();
// 绑定点击事件
suggestionsDiv.find('.mytrack-suggestion-item').on('click', function() {
var name = $(this).data('name');
$('#management-search').val(name);
hideSuggestions();
// 自动提交表单
setTimeout(function() {
$('#management-search').closest('form').submit();
}, 100);
});
suggestionsDiv.find('.mytrack-suggestion-item').hover(
function() {
$(this).addClass('hover').siblings().removeClass('hover');
},
function() {
$(this).removeClass('hover');
}
);
}
function highlightText(text, keyword) {
if (!text || !keyword) return text;
var regex = new RegExp('(' + keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi');
return text.replace(regex, '<mark>$1</mark>');
}
function showSuggestions() {
$('#mytrack-suggestions').show();
}
function hideSuggestions() {
$('#mytrack-suggestions').hide();
$('#mytrack-suggestions .mytrack-suggestion-item').removeClass('hover');
}
function bindEditDeleteEvents() {
console.log('绑定编辑和删除按钮事件');
$('.mytrack-edit-btn').off('click.edit').on('click.edit', function(e) {
e.preventDefault();
e.stopPropagation();
var footprintId = $(this).data('id');
console.log('点击编辑按钮ID:', footprintId);
editFootprint(footprintId);
});
$('.mytrack-delete-btn').off('click.delete').on('click.delete', function(e) {
e.preventDefault();
e.stopPropagation();
var footprintId = $(this).data('id');
console.log('点击删除按钮ID:', footprintId);
deleteFootprint(footprintId);
});
}
// 保存关联文章
function saveRelatedArticles() {
if (isProcessingArticles) {
alert('<?php _e('正在处理中,请稍候...'); ?>');
return;
}
var articlesInput = $('#related-articles-input');
var inputValue = articlesInput.val().trim();
if (!inputValue) {
relatedArticles = [];
$('#related_articles').val('');
renderRelatedArticlesList();
return;
}
// 解析逗号分隔的CID列表
var cidArray = inputValue.split(',').map(function(cid) {
return cid.trim();
}).filter(function(cid) {
return cid !== '' && !isNaN(cid);
});
// 去重
var uniqueCids = [];
cidArray.forEach(function(cid) {
if (uniqueCids.indexOf(cid) === -1) {
uniqueCids.push(cid);
}
});
relatedArticles = uniqueCids;
$('#related_articles').val(relatedArticles.join(','));
// 更新输入框,确保格式统一
articlesInput.val(relatedArticles.join(', '));
renderRelatedArticlesList();
}
// 移除单个关联文章
function removeRelatedArticle(cid) {
console.log('正在移除关联文章CID:', cid);
var index = relatedArticles.indexOf(cid);
if (index !== -1) {
relatedArticles.splice(index, 1);
$('#related_articles').val(relatedArticles.join(','));
// 更新输入框
$('#related-articles-input').val(relatedArticles.join(', '));
renderRelatedArticlesList();
} else {
console.warn('未找到要移除的文章CID:', cid);
}
}
// 渲染关联文章列表 - 简化版本
function renderRelatedArticlesList() {
var listContainer = $('#related-articles-list');
if (relatedArticles.length === 0) {
listContainer.html('<div class="mytrack-no-results"><?php _e('暂无关联文章'); ?></div>');
return;
}
var simpleHtml = '';
relatedArticles.forEach(function(cid) {
simpleHtml += '<div class="mytrack-related-article-item">';
simpleHtml += '<div class="mytrack-related-article-info">';
simpleHtml += '<div class="mytrack-related-article-title" data-cid="' + cid + '">CID: ' + cid + '</div>';
simpleHtml += '<div class="mytrack-related-article-cid"><?php _e('正在获取文章信息...'); ?></div>';
simpleHtml += '</div>';
simpleHtml += '<div class="mytrack-related-article-actions">';
simpleHtml += '<a href="#" class="mytrack-remove-related-article" data-cid="' + cid + '"><?php _e('移除'); ?></a>';
simpleHtml += '</div>';
simpleHtml += '</div>';
});
listContainer.html(simpleHtml);
// 绑定移除按钮事件 - 使用更简单直接的方式
bindRemoveRelatedArticleEvents();
// 异步获取文章信息
relatedArticles.forEach(function(cid) {
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'GET',
data: {do: 'getArticleImages', article_cid: cid},
dataType: 'json',
success: function(response) {
if (response && response.success) {
// 更新对应的文章标题
var titleElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
.closest('.mytrack-related-article-item')
.find('.mytrack-related-article-title');
var cidElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
.closest('.mytrack-related-article-item')
.find('.mytrack-related-article-cid');
if (response.title) {
titleElement.text(response.title);
}
cidElement.text('CID: ' + cid);
}
},
error: function() {
// 获取失败时显示默认文本
var cidElement = listContainer.find('.mytrack-remove-related-article[data-cid="' + cid + '"]')
.closest('.mytrack-related-article-item')
.find('.mytrack-related-article-cid');
cidElement.text('CID: ' + cid + ' (<?php _e('获取信息失败'); ?>)');
}
});
});
}
// 绑定移除关联文章按钮事件 - 使用更简单直接的方式
function bindRemoveRelatedArticleEvents() {
console.log('绑定移除关联文章按钮事件');
// 移除旧的绑定
$('#related-articles-list .mytrack-remove-related-article').off('click');
// 添加新的绑定
$('#related-articles-list').on('click', '.mytrack-remove-related-article', function(e) {
e.preventDefault();
e.stopPropagation();
var cid = $(this).data('cid');
console.log('点击移除关联文章按钮CID:', cid);
removeRelatedArticle(cid);
});
}
function fetchArticleImages() {
var articleCid = $('#article_cid').val().trim();
console.log('获取文章信息CID:', articleCid);
if (!articleCid) {
alert('<?php _e('请先输入文章CID'); ?>');
return;
}
if (isNaN(articleCid)) {
alert('<?php _e('文章CID必须是数字'); ?>');
return;
}
$('#loading').show();
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'GET',
data: {do: 'getArticleImages', article_cid: articleCid},
dataType: 'json',
success: function(response) {
console.log('获取文章信息响应:', response);
$('#loading').hide();
if (response.success) {
if (response.text && $('#description').val().trim() === '') {
var markdownMatch = response.text.match(/<!--markdown-->([\s\S]*?)<!--more-->/);
if (markdownMatch && markdownMatch[1]) {
var textContent = markdownMatch[1];
textContent = textContent.replace(/<[^>]+>/g, '');
textContent = textContent.replace(/\s+/g, ' ').trim();
if (textContent.length > 100) {
textContent = textContent.substring(0, 100) + '...';
}
$('#description').val(textContent);
} else {
var textContent = response.text.replace(/<[^>]+>/g, '');
textContent = textContent.replace(/\s+/g, ' ').trim();
if (textContent.length > 100) {
textContent = textContent.substring(0, 100) + '...';
}
$('#description').val(textContent);
}
}
if (response.images && response.images.length > 0 && $('#photos').val().trim() === '') {
var limitedImages = response.images.slice(0, 4);
$('#photos').val(limitedImages.join(','));
}
if (response.title && $('#urlLabel').val().trim() === '') {
$('#urlLabel').val(response.title);
}
if (response.link && $('#url').val().trim() === '') {
$('#url').val(response.link);
}
if (response.tags && response.tags.length > 0 && $('#tags').val().trim() === '') {
$('#tags').val(response.tags.join(','));
}
if (response.created && !$('#date').val()) {
var date = new Date(response.created * 1000);
var year = date.getFullYear();
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
var formattedDate = year + '-' + month + '-' + day;
$('#date').val(formattedDate);
}
alert('<?php _e('获取文章信息成功'); ?>');
} else {
alert(response.message || '<?php _e('获取文章信息失败'); ?>');
}
},
error: function(xhr, status, error) {
console.error('获取文章信息错误:', error);
$('#loading').hide();
alert('<?php _e('获取文章信息失败'); ?>');
}
});
}
// 显示足迹模态框
function showFootprintModal(footprint) {
var modal = $('#footprint-modal');
var form = $('#footprint-form');
var title = $('#modal-title');
form[0].reset();
$('#location-search').val('');
hideSearchResults();
currentResults = [];
lastSearchKeyword = '';
$('#location_type').val('');
$('#rating_level').val('0');
$('#categories').val('');
$('#review').val('');
$('#address').val('');
$('#markerColor').val('');
$('#highlights').val('');
$('#description').val('');
$('#tags').val('');
$('#article_cid').val('');
$('#photos').val('');
$('#urlLabel').val('');
$('#url').val('');
$('#date').val('');
$('#related_articles').val('');
$('#related-articles-input').val('');
relatedArticles = [];
$('#related-articles-list').html('<div class="mytrack-no-results"><?php _e('暂无关联文章'); ?></div>');
$('#rating-stars .mytrack-star').removeClass('selected');
$('.mytrack-categories-option').removeClass('selected');
$('.mytrack-marker-color-option').removeClass('selected');
if (footprint) {
title.text('<?php _e('编辑足迹'); ?>');
$('#footprint-id').val(footprint.id);
$('#latitude').val(footprint.latitude);
$('#longitude').val(footprint.longitude);
$('#name').val(footprint.name || '');
$('#address').val(footprint.address || '');
$('#location_type').val(footprint.location_type || '');
$('#review').val(footprint.review || '');
$('#date').val(footprint.date ? footprint.date.split(' ')[0] : '');
$('#description').val(footprint.description || '');
$('#tags').val(footprint.tags || '');
$('#article_cid').val(footprint.article_cid || '');
$('#photos').val(footprint.photos || '');
$('#urlLabel').val(footprint.urlLabel || '');
$('#url').val(footprint.url || '');
$('#highlights').val(footprint.highlights || '');
if (footprint.rating_level && footprint.rating_level > 0) {
$('#rating_level').val(footprint.rating_level);
updateStarRating(footprint.rating_level);
}
if (footprint.categories) {
$('#categories').val(footprint.categories);
var categories = footprint.categories.split(',');
categories.forEach(function(category) {
category = category.trim();
$('.mytrack-categories-option[data-value="' + category + '"]').addClass('selected');
});
}
if (footprint.markerColor) {
$('#markerColor').val(footprint.markerColor);
$('.mytrack-marker-color-option[data-value="' + footprint.markerColor + '"]').addClass('selected');
}
if (footprint.related_articles) {
$('#related_articles').val(footprint.related_articles);
relatedArticles = footprint.related_articles.split(',').map(function(cid) {
return cid.trim();
}).filter(function(cid) {
return cid !== '' && !isNaN(cid);
});
$('#related-articles-input').val(relatedArticles.join(', '));
renderRelatedArticlesList();
}
} else {
title.text('<?php _e('新增地点'); ?>');
$('#footprint-id').val('');
}
modal.show();
setTimeout(function() {
$('#location-search').focus();
}, 300);
}
function updateStarRating(rating) {
$('#rating-stars .mytrack-star').removeClass('selected');
for (var i = 1; i <= rating; i++) {
$('#rating-stars .mytrack-star[data-value="' + i + '"]').addClass('selected');
}
}
function editFootprint(id) {
console.log('编辑足迹请求ID:', id);
$('#loading').show();
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'GET',
data: {do: 'get', id: id},
dataType: 'json',
success: function(response) {
$('#loading').hide();
console.log('编辑足迹响应:', response);
if (response.success) {
showFootprintModal(response.data);
} else {
alert(response.message || '<?php _e('获取足迹信息失败'); ?>');
}
},
error: function(xhr, status, error) {
$('#loading').hide();
console.error('编辑足迹错误:', error);
alert('<?php _e('获取足迹信息失败'); ?>');
}
});
}
function saveFootprint() {
var form = $('#footprint-form');
var id = $('#footprint-id').val();
var isEdit = id !== '';
if (!$('#latitude').val() || !$('#longitude').val() || !$('#name').val()) {
alert('<?php _e('请填写经纬度和地点名称'); ?>');
return;
}
var formData = {
do: isEdit ? 'update' : 'add',
id: id,
latitude: $('#latitude').val(),
longitude: $('#longitude').val(),
name: $('#name').val(),
address: $('#address').val(),
location_type: $('#location_type').val(),
rating_level: $('#rating_level').val() || 0,
categories: $('#categories').val(),
review: $('#review').val(),
date: $('#date').val(),
description: $('#description').val(),
tags: $('#tags').val(),
article_cid: $('#article_cid').val(),
urlLabel: $('#urlLabel').val(),
url: $('#url').val(),
photos: $('#photos').val(),
markerColor: $('#markerColor').val(),
highlights: $('#highlights').val(),
related_articles: $('#related_articles').val()
};
Object.keys(formData).forEach(function(key) {
if (formData[key] === '' || formData[key] === null) {
formData[key] = undefined;
}
});
console.log('保存足迹数据:', formData);
$('#loading').show();
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'POST',
data: formData,
dataType: 'json',
success: function(response) {
$('#loading').hide();
console.log('保存足迹响应:', response);
if (response.success) {
alert(response.message);
$('#footprint-modal').hide();
window.location.reload();
} else {
// 新增时检查是否是重复数据错误
if (!isEdit && response.message && response.message.indexOf('已存在') !== -1) {
alert('该地点已有,请勿重复添加!');
} else {
alert(response.message || '<?php _e('保存失败'); ?>');
}
}
},
error: function(xhr, status, error) {
$('#loading').hide();
console.error('保存足迹错误:', error);
alert(isEdit ? '<?php _e('更新足迹失败'); ?>' : '<?php _e('新增地点失败'); ?>');
}
});
}
function deleteFootprint(id) {
console.log('删除足迹ID:', id);
if (confirm('<?php _e('你确认要删除这个足迹吗?'); ?>')) {
$('#loading').show();
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'POST',
data: {do: 'delete', id: id},
dataType: 'json',
success: function(response) {
$('#loading').hide();
console.log('删除足迹响应:', response);
if (response.success) {
alert(response.message);
window.location.reload();
} else {
alert(response.message || '<?php _e('删除失败'); ?>');
}
},
error: function(xhr, status, error) {
$('#loading').hide();
console.error('删除足迹错误:', error);
alert('<?php _e('删除失败'); ?>');
}
});
}
}
function showImportModal() {
$('#import-modal').show();
}
function importFootprints() {
var fileInput = $('#import-file')[0];
if (!fileInput.files.length) {
alert('<?php _e('请选择要导入的文件'); ?>');
return;
}
var formData = new FormData();
formData.append('do', 'import');
formData.append('file', fileInput.files[0]);
$('#loading').show();
$.ajax({
url: MyTrackConfig.actionUrl,
type: 'POST',
data: formData,
processData: false,
contentType: false,
dataType: 'json',
success: function(response) {
$('#loading').hide();
if (response.success) {
alert(response.message);
$('#import-modal').hide();
window.location.reload();
} else {
alert(response.message);
}
},
error: function(xhr, status, error) {
$('#loading').hide();
console.error('导入错误:', error);
alert('<?php _e('导入失败'); ?>');
}
});
}
function exportFootprints(format) {
if (format !== 'json') {
alert('<?php _e('只支持JSON格式导出'); ?>');
return;
}
var exportForm = $('<form>', {
'method': 'POST',
'action': MyTrackConfig.actionUrl,
'target': '_blank'
});
exportForm.append($('<input>', {
'type': 'hidden',
'name': 'do',
'value': 'export'
}));
exportForm.append($('<input>', {
'type': 'hidden',
'name': 'format',
'value': 'json'
}));
$('body').append(exportForm);
exportForm.submit();
exportForm.remove();
}
function exportSimpleFootprints() {
var exportForm = $('<form>', {
'method': 'POST',
'action': MyTrackConfig.actionUrl,
'target': '_blank'
});
exportForm.append($('<input>', {
'type': 'hidden',
'name': 'do',
'value': 'exportSimple'
}));
exportForm.append($('<input>', {
'type': 'hidden',
'name': 'format',
'value': 'json'
}));
$('body').append(exportForm);
exportForm.submit();
exportForm.remove();
}
function initSearch() {
var searchInput = $('#location-search');
if (!searchInput.length) return;
searchInput.on('input', function() {
var keyword = $(this).val().trim();
if (!keyword) {
hideSearchResults();
return;
}
clearTimeout(searchTimer);
if (keyword !== lastSearchKeyword) {
searchTimer = setTimeout(function() {
searchLocations(keyword);
lastSearchKeyword = keyword;
}, 500);
}
});
searchInput.on('focus', function() {
var keyword = $(this).val().trim();
if (keyword && currentResults.length > 0) {
showSearchResults();
}
});
searchInput.on('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
var keyword = $(this).val().trim();
if (keyword) {
var resultsDiv = $('#search-results');
var firstItem = resultsDiv.find('.mytrack-result-item').first();
if (firstItem.length) {
selectLocation(firstItem.data('location'));
} else {
searchLocations(keyword);
}
}
}
});
$(document).on('click', function(e) {
if (!$(e.target).closest('.mytrack-search-box').length) {
hideSearchResults();
}
});
searchInput.on('keydown', function(e) {
var resultsDiv = $('#search-results');
var resultsItems = resultsDiv.find('.mytrack-result-item');
if (e.key === 'Escape') {
hideSearchResults();
searchInput.blur();
} else if (e.key === 'ArrowDown') {
e.preventDefault();
if (resultsItems.length > 0) {
var firstItem = resultsItems.first();
if (!resultsDiv.find('.mytrack-result-item.hover').length) {
firstItem.addClass('hover');
} else {
var currentHover = resultsDiv.find('.mytrack-result-item.hover');
var nextItem = currentHover.next('.mytrack-result-item');
if (nextItem.length) {
currentHover.removeClass('hover');
nextItem.addClass('hover');
}
}
}
} else if (e.key === 'ArrowUp') {
e.preventDefault();
if (resultsItems.length > 0) {
var lastItem = resultsItems.last();
if (!resultsDiv.find('.mytrack-result-item.hover').length) {
lastItem.addClass('hover');
} else {
var currentHover = resultsDiv.find('.mytrack-result-item.hover');
var prevItem = currentHover.prev('.mytrack-result-item');
if (prevItem.length) {
currentHover.removeClass('hover');
prevItem.addClass('hover');
}
}
}
} else if (e.key === 'Enter' && e.ctrlKey) {
e.preventDefault();
$('#save-footprint-btn').click();
}
});
$('#article_cid').on('focus', function(e) {
e.stopPropagation();
hideSearchResults();
});
$('#related-articles-input').on('focus', function(e) {
e.stopPropagation();
hideSearchResults();
});
}
function searchLocations(keyword) {
if (!keyword || keyword.length < 1) {
hideSearchResults();
return;
}
if (!MyTrackConfig.webApiKey) {
alert('<?php _e('高德地图Web服务API密钥未配置请先配置插件设置'); ?>');
return;
}
showSearchLoading();
var url = 'https://restapi.amap.com/v3/place/text?key=' + MyTrackConfig.webApiKey +
'&keywords=' + encodeURIComponent(keyword) +
'&city=&offset=10&page=1&extensions=base&output=JSON';
$.ajax({
url: url,
type: 'GET',
dataType: 'json',
success: function(response) {
if (response.status === '1' && response.pois && response.pois.length > 0) {
currentResults = response.pois;
displaySearchResults(response.pois);
} else {
displayNoResults(response.info || '<?php _e('未找到相关地点'); ?>');
}
},
error: function(xhr, status, error) {
console.error('搜索失败:', error);
displayNoResults('<?php _e('搜索失败,请检查网络连接'); ?>');
}
});
}
function showSearchLoading() {
var resultsDiv = $('#search-results');
resultsDiv.html('<div class="mytrack-loading"><?php _e('搜索中...'); ?></div>');
resultsDiv.show();
}
function displaySearchResults(pois) {
var resultsDiv = $('#search-results');
var html = '';
var maxItems = Math.min(pois.length, 8);
for (var i = 0; i < maxItems; i++) {
var poi = pois[i];
var location = poi.location || '';
var longitude = '0';
var latitude = '0';
if (location) {
var coords = location.split(',');
if (coords.length >= 2) {
longitude = coords[0].trim();
latitude = coords[1].trim();
}
}
html += '<div class="mytrack-result-item" data-location=\'' + JSON.stringify({
id: poi.id || '',
name: poi.name || '<?php _e('未知地点'); ?>',
address: poi.address || '',
pname: poi.pname || '',
cityname: poi.cityname || '',
adname: poi.adname || '',
type: poi.type || '',
tel: poi.tel || '',
longitude: longitude,
latitude: latitude
}) + '\'>';
html += '<div class="mytrack-result-name">' + (poi.name || '<?php _e('未知地点'); ?>') + '</div>';
var addressParts = [];
if (poi.pname) addressParts.push(poi.pname);
if (poi.cityname && poi.cityname !== poi.pname) addressParts.push(poi.cityname);
if (poi.adname && poi.adname !== poi.cityname) addressParts.push(poi.adname);
if (poi.address) addressParts.push(poi.address);
if (addressParts.length > 0) {
html += '<div class="mytrack-result-address">' + addressParts.join(' · ') + '</div>';
}
var typeName = getTypeName(poi.type);
html += '<div class="mytrack-result-type">' + typeName + '</div>';
html += '</div>';
}
resultsDiv.html(html);
resultsDiv.show();
resultsDiv.find('.mytrack-result-item').on('click', function() {
var locationData = $(this).data('location');
if (locationData) {
selectLocation(locationData);
}
});
resultsDiv.find('.mytrack-result-item').hover(
function() {
$(this).addClass('hover').siblings().removeClass('hover');
},
function() {
$(this).removeClass('hover');
}
);
}
function getTypeName(typeCode) {
var typeMap = {
"050000": "<?php _e('餐饮'); ?>",
"060000": "<?php _e('购物'); ?>",
"070000": "<?php _e('生活'); ?>",
"080000": "<?php _e('体育'); ?>",
"090000": "<?php _e('医疗'); ?>",
"100000": "<?php _e('住宿'); ?>",
"110000": "<?php _e('风景'); ?>",
"120000": "<?php _e('商务'); ?>",
"130000": "<?php _e('政府'); ?>",
"140000": "<?php _e('交通'); ?>",
"150000": "<?php _e('教育'); ?>",
"160000": "<?php _e('金融'); ?>",
"170000": "<?php _e('公司'); ?>"
};
if (!typeCode) return "<?php _e('其他'); ?>";
var mainType = typeCode.substring(0, 2) + "0000";
return typeMap[mainType] || "<?php _e('其他'); ?>";
}
function displayNoResults(message) {
var resultsDiv = $('#search-results');
resultsDiv.html('<div class="mytrack-no-results">' + message + '</div>');
resultsDiv.show();
currentResults = [];
}
function showSearchResults() {
$('#search-results').show();
}
function hideSearchResults() {
$('#search-results').hide();
$('.mytrack-result-item').removeClass('hover');
}
function selectLocation(locationData) {
if (!locationData) return;
console.log('选择地点:', locationData);
var currentDescription = $('#description').val();
var currentTags = $('#tags').val();
var currentDate = $('#date').val();
var currentArticleCid = $('#article_cid').val();
var currentUrlLabel = $('#urlLabel').val();
var currentUrl = $('#url').val();
var currentPhotos = $('#photos').val();
var currentLocationType = $('#location_type').val();
var currentRatingLevel = $('#rating_level').val();
var currentCategories = $('#categories').val();
var currentReview = $('#review').val();
var currentMarkerColor = $('#markerColor').val();
var currentHighlights = $('#highlights').val();
var currentRelatedArticles = $('#related_articles').val();
var currentRelatedArticlesInput = $('#related-articles-input').val();
$('#longitude').val(locationData.longitude);
$('#latitude').val(locationData.latitude);
$('#name').val(locationData.name || '');
var addressParts = [];
if (locationData.pname) addressParts.push(locationData.pname);
if (locationData.cityname && locationData.cityname !== locationData.pname) {
addressParts.push(locationData.cityname);
}
if (locationData.adname && locationData.adname !== locationData.cityname) {
addressParts.push(locationData.adname);
}
if (locationData.address) {
addressParts.push(locationData.address);
}
$('#address').val(addressParts.join(''));
if (!currentLocationType && locationData.type) {
var typeName = getTypeName(locationData.type);
if (typeName !== "<?php _e('其他'); ?>") {
$('#location_type').val(typeName);
}
}
$('#description').val(currentDescription);
$('#tags').val(currentTags);
$('#date').val(currentDate);
$('#article_cid').val(currentArticleCid);
$('#urlLabel').val(currentUrlLabel);
$('#url').val(currentUrl);
$('#photos').val(currentPhotos);
$('#rating_level').val(currentRatingLevel);
updateStarRating(currentRatingLevel);
$('#categories').val(currentCategories);
$('#review').val(currentReview);
$('#markerColor').val(currentMarkerColor);
$('#highlights').val(currentHighlights);
$('#related_articles').val(currentRelatedArticles);
$('#related-articles-input').val(currentRelatedArticlesInput);
$('.mytrack-categories-option').removeClass('selected');
if (currentCategories) {
var categories = currentCategories.split(',');
categories.forEach(function(category) {
category = category.trim();
if (category) {
$('.mytrack-categories-option[data-value="' + category + '"]').addClass('selected');
}
});
}
$('.mytrack-marker-color-option').removeClass('selected');
if (currentMarkerColor) {
$('.mytrack-marker-color-option[data-value="' + currentMarkerColor + '"]').addClass('selected');
}
if (currentRelatedArticles) {
relatedArticles = currentRelatedArticles.split(',').map(function(cid) {
return cid.trim();
}).filter(function(cid) {
return cid !== '' && !isNaN(cid);
});
renderRelatedArticlesList();
}
hideSearchResults();
setTimeout(function() {
$('#address').focus();
}, 100);
}
function initRatingStars() {
$('#rating-stars .mytrack-star').on('click', function() {
var rating = $(this).data('value');
$('#rating_level').val(rating);
updateStarRating(rating);
});
$('#rating-stars .mytrack-star').on('mouseenter', function() {
var rating = $(this).data('value');
updateStarRating(rating);
}).on('mouseleave', function() {
var currentRating = $('#rating_level').val() || 0;
updateStarRating(currentRating);
});
}
function initCategoriesOptions() {
$('.mytrack-categories-option').on('click', function() {
var category = $(this).data('value');
var currentCategories = $('#categories').val();
var categories = currentCategories ? currentCategories.split(',') : [];
if ($(this).hasClass('selected')) {
$(this).removeClass('selected');
var index = categories.indexOf(category);
if (index > -1) {
categories.splice(index, 1);
}
} else {
$(this).addClass('selected');
if (categories.indexOf(category) === -1) {
categories.push(category);
}
}
$('#categories').val(categories.join(','));
});
}
function initMarkerColorOptions() {
$('#marker-color-options .mytrack-marker-color-option').on('click', function() {
var color = $(this).data('value');
$('#marker-color-options .mytrack-marker-color-option').removeClass('selected');
$(this).addClass('selected');
$('#markerColor').val(color);
});
}
$(document).ready(function() {
initMyTrack();
});
})(jQuery);
</script>
<?php
include 'footer.php';
?>