feat: Add comprehensive documentation suite and reorganize project structure

- Created complete documentation in docs/ directory
- Added PROJECT_OVERVIEW.md with feature highlights and getting started guide
- Added ARCHITECTURE.md with system design and technical details
- Added SECURITY.md with comprehensive security implementation guide
- Added DEVELOPMENT.md with development workflows and best practices
- Added DEPLOYMENT.md with production deployment instructions
- Added API.md with complete REST API documentation
- Added CONTRIBUTING.md with contribution guidelines
- Added CHANGELOG.md with version history and migration notes
- Reorganized all documentation files into docs/ directory for better organization
- Updated README.md with proper documentation links and quick navigation
- Enhanced project structure with professional documentation standards
This commit is contained in:
SamiAhmed7777
2025-10-21 00:39:45 -07:00
commit 0b7e2d0a5b
6080 changed files with 1332936 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
<div id="vs-logo">
<div class="left-float">
<a href="{$main_url}" class="top-logo"><img src="{$global_images_url}/logo.png" alt="{$head_title}" title="{$head_title}" /></a>
</div>
</div>

View File

@@ -0,0 +1,5 @@
<div id="vs-logo">
<div class="left-float">
<a href="{$main_url}" class="top-logo"><img src="{$global_images_url}/logo-mail.png" alt="{$head_title}" title="{$head_title}" height="36" /></a>
</div>
</div>

View File

@@ -0,0 +1,130 @@
{if $website_offline_mode eq "1"}{assign var=disabled_input value='disabled="disabled"'}{else}{assign var=disabled_input value=""}{/if}
{assign var="access_url" value="{$main_url}"}
{assign var="href_s" value="{href_entry key="account"}"}
{assign var="href_m" value="{href_entry key="messages"}"}
{assign var="href_c" value="{href_entry key="contacts"}"}
{assign var="href_cm" value="{href_entry key="comments"}"}
{assign var="href_sub" value="{href_entry key="subscriptions"}"}
{assign var="lang_s" value="{lang_entry key="subnav.entry.settings"}"}
{assign var="lang_f" value="{lang_entry key="subnav.entry.files.my"}"}
<header id="main_header">
<div class="dynamic_container">
<div id="header_top">
<div class="container">
<div class="welcome-text">{lang_entry key="frontend.global.welcome.to"} {$website_shortname}</div>
<div class="search_holder">
<div id="sb-search" class="sb-search">
<form method="get" action="{$main_url}/{href_entry key="search"}">
<input class="sb-search-input" placeholder="{lang_entry key="frontend.global.search.term"}" type="text" value="" name="q" id="search">
<input class="sb-search-submit" type="submit" value="">
<span class="sb-icon-search icon-search"></span>
</form>
</div>
</div>
<div class="but_register">
<div id="user-nav-menu" class="dl-menuwrapper">
<span class="dl-trigger"><span>{if $smarty.session.USER_ID eq ""}{lang_entry key="frontend.global.account"}{else}{$smarty.session.USER_NAME}{/if}</span></span>
<ul class="dl-menu">
{if $smarty.session.USER_ID eq ""}
<li><a href="{$main_url}/{href_entry key="signin"}" rel="nofollow"><i class="icon-enter"></i> {lang_entry key="frontend.global.signin"}</a></li>
<li><a href="{$main_url}/{href_entry key="signup"}" rel="nofollow"><i class="icon-signup"></i> {lang_entry key="frontend.global.signup"}</a></li>
<li><a href="{$main_url}/{href_entry key="service"}/{href_entry key="x_recovery"}" rel="nofollow"><i class="icon-support"></i> {lang_entry key="frontend.global.recovery"}</a></li>
{else}
<li><a href="{$main_url}/{href_entry key="files"}"><i class="icon-upload"></i> {$lang_f}</a></li>
<li><a href="{$main_url}/{$href_sub}"><i class="icon-users5"></i> {lang_entry key="subnav.entry.sub"}</a></li>
<li><a href="{$main_url}/{if $internal_messaging eq 1 and ($user_friends eq 1 or $user_blocking eq 1)}{$href_m}{elseif $internal_messaging eq 0 and ($user_friends eq 1 or $user_blocking eq 1)}{$href_c}{else}{$href_cm}{/if}"><i class="icon-envelope"></i> {if $internal_messaging eq 1 and ($user_friends eq 1 or $user_blocking eq 1)}{lang_entry key="subnav.entry.contacts.messages"}{elseif $internal_messaging eq 0 and ($user_friends eq 1 or $user_blocking eq 1)}{lang_entry key="subnav.entry.contacts"}{else}{lang_entry key="subnav.entry.comments"}{/if} {insert name="newMessages"}</a></li>
<li><a href="{$main_url}/{href_entry key="manage_channel"}"><i class="icon-settings"></i> {lang_entry key="subnav.entry.channel.my"}</a></li>
<li><a href="{$main_url}/{$href_s}"><i class="icon-profile"></i> {$lang_s}</a></li>
<li><a href="{$main_url}/{href_entry key="signout"}"><i class="icon-exit"></i> {lang_entry key="frontend.global.signout"}</a></li>
{/if}
</ul>
</div>
</div>
<div class="but_upload" onclick="window.location='{$main_url}/{href_entry key="upload"}'"><span>{lang_entry key="frontend.global.upload"}</span></div>
<a style="display:none;" id="up" href="{$main_url}/{href_entry key="upload"}" rel="nofollow">{lang_entry key="frontend.global.upload"}</a>
<div class="social_links">
<a href="{$facebook_link}" target="_blank" rel="me">
<i class="icon-facebook2"></i>
</a>
<a href="{$twitter_link}" target="_blank" rel="me">
<i class="icon-twitter22"></i>
</a>
<a href="{$gplus_link}" target="_blank" rel="me">
<i class="icon-googleplus3"></i>
</a>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="header_bottom">
<div class="container">
<div id="main_navbar" class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="{$main_url}" title="Home" id="logo" rel="nofollow"></a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li class="{if $page_display eq "tpl_index"}active{/if}">
<a href="{$main_url}"><i class="icon-home"></i>{lang_entry key="frontend.global.home"}</a>
</li>
{if $live_module eq 1}
<li class="{if $page_display eq "tpl_browse" and $type_display eq "live"}active{/if}">
<a href="{$main_url}/{href_entry key="broadcasts"}"><i class="icon-live"></i>{lang_entry key="frontend.global.l.p.c"}</a>
</li>
{/if}
{if $video_module eq 1}
<li class="{if $page_display eq "tpl_browse" and $type_display eq "video"}active{/if}">
<a href="{$main_url}/{href_entry key="videos"}"><i class="icon-video"></i>{lang_entry key="frontend.global.v.p.c"}</a>
</li>
{/if}
{if $image_module eq 1}
<li class="{if $page_display eq "tpl_browse" and $type_display eq "image"}active{/if}">
<a href="{$main_url}/{href_entry key="images"}"><i class="icon-image"></i>{lang_entry key="frontend.global.i.p.c"}</a>
</li>
{/if}
{if $audio_module eq 1}
<li class="{if $page_display eq "tpl_browse" and $type_display eq "audio"}active{/if}">
<a href="{$main_url}/{href_entry key="audios"}"><i class="icon-headphones"></i>{lang_entry key="frontend.global.a.p.c"}</a>
</li>
{/if}
{if $document_module eq 1}
<li class="{if $page_display eq "tpl_browse" and $type_display eq "document"}active{/if}">
<a href="{$main_url}/{href_entry key="documents"}"><i class="icon-file"></i>{lang_entry key="frontend.global.d.p.c"}</a>
</li>
{/if}
{if $blog_module eq 1}
<li id="section-blogs" class="{if $page_display eq "tpl_browse" and $type_display eq "blog"}active{/if}">
<a href="{$main_url}/{href_entry key="blogs"}"><i class="icon-pencil2"></i>{lang_entry key="frontend.global.blogs"}</a>
</li>
{/if}
{if $public_channels eq 1}
<li class="{if $page_display eq "tpl_channels"}active{/if}">
<a href="{$main_url}/{href_entry key="channels"}"><i class="icon-users"></i>{lang_entry key="frontend.global.channels"}</a>
</li>
{/if}
{if $file_playlists eq 1}
<li id="section-playlists" class="{if $page_display eq "tpl_playlists"}active{/if}">
<a href="{$main_url}/{href_entry key="playlists"}"><i class="icon-list"></i>{lang_entry key="frontend.global.playlists"}</a>
</li>
{/if}
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container-fluid -->
</div>
</div>
</div> <!-- /.header_bottom -->
</div>
</header><!-- /header -->

View File

@@ -0,0 +1,66 @@
{if $smarty.session.USER_ID gt 0}
<div class="tacc-img">
<img height="40" class="own-profile-image mt-off" title="{$smarty.session.USER_NAME}" alt="{$smarty.session.USER_NAME}" src="{insert name="getProfileImage" assign="profileImage" for="{$smarty.session.USER_ID}"}{$profileImage}">
</div>
<div class="tacc-nfo">
<span>
<span class="tacc-uu">{if $smarty.session.USER_ID gt 0}<a href="{$main_url}/@{$smarty.session.USER_NAME}">{if $smarty.session.USER_DNAME ne ''}{$smarty.session.USER_DNAME}{else}{$smarty.session.USER_NAME}{/if}</a>{else}{lang_entry key="frontend.global.guest.rand"}{/if}</span>
<span class="tacc-us">
{if $user_follows}
<span class="r2">{if $smarty.session.USER_ID gt 0}{insert name="getFollowCount"}{else}0{/if} <label>{lang_entry key="frontend.global.followers"}</label></span>
{/if}
{if $user_subscriptions}
<span class="r1">{if $smarty.session.USER_ID gt 0}{insert name="getSubCount"}{else}0{/if} <label>{lang_entry key="frontend.global.subscribers"}</label></span>
{/if}
</span>
</span>
</div>
<div class="clearfix"></div>
{/if}
<ul class="accordion tacc" id="top-session-accordion">
{if $smarty.session.USER_ID gt 0}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="files"}"><i class="icon-upload"></i> {lang_entry key="subnav.entry.files.my"}</a></li>
{if $user_subscriptions eq 1}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="subscribers"}"><i class="icon-coin"></i> {lang_entry key="subnav.entry.subpanel"}</a></li>
{/if}
{if $user_tokens eq 1}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="tokens"}"><i class="icon-coin"></i> {lang_entry key="subnav.entry.tokenpanel"}</a></li>
{/if}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="account"}"><i class="icon-user"></i> {lang_entry key="subnav.entry.account.my"}</a></li>
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="manage_channel"}"><i class="icon-settings"></i> {lang_entry key="subnav.entry.channel.my"}</a></li>
<li class=""><a class="dcjq-parent" href="{$main_url}/{if $internal_messaging eq 1 and ($user_friends eq 1 or $user_blocking eq 1)}{href_entry key="messages"}{elseif $internal_messaging eq 0 and ($user_friends eq 1 or $user_blocking eq 1)}{href_entry key="contacts"}{/if}"><i class="icon-envelope"></i> {if $internal_messaging eq 1 and ($user_friends eq 1 or $user_blocking eq 1)}{lang_entry key="subnav.entry.contacts.messages"}{elseif $internal_messaging eq 0 and ($user_friends eq 1 or $user_blocking eq 1)}{lang_entry key="subnav.entry.contacts"}{/if} {insert name="newMessages"}</a></li>
<li><div class="line"></div></li>
{/if}
<li class="">
<a class="dcjq-parent a-dt" href="javascript:;" rel="nofollow"><i class="icon-contrast"></i> {lang_entry key="frontend.global.darktheme"}: <span id="dark-mode-state-text">{if $theme_name|strpos:'dark'}{lang_entry key="frontend.global.on.text"}{else}{lang_entry key="frontend.global.off.text"}{/if}</span><i class="iconBe-chevron-right place-right"></i></a>
</li>
<li id="l-dt" style="display:none">
<div class="dm-wrap">
<div class="dm-head dm-head-dt"><i class="icon-arrow-left2"></i> {lang_entry key="frontend.global.darktheme"}</div>
<p>{lang_entry key="frontend.global.darktheme.tip1"}<br><br>{lang_entry key="frontend.global.darktheme.tip2"}
<div>
<span class="label">{lang_entry key="frontend.global.darktheme"}</span>
{insert name="themeSwitch"}
</div>
</div>
</li>
{if $smarty.session.lang_count gt 1}
<li class="">
{insert name="langInit"}
</li>
{/if}
{if $smarty.session.USER_ID gt 0}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="signout"}"><i class="icon-exit"></i> {lang_entry key="frontend.global.signout"}</a></li>
{else}
<li class=""><a class="dcjq-parent" href="{$main_url}/{href_entry key="signin"}"><i class="icon-exit"></i> {lang_entry key="frontend.global.signin"}</a></li>
{/if}
</ul>
{literal}
<script type="text/javascript">
$('a.a-dt').click(function(){$('#user-arrow-box #top-session-accordion li').hide();$('#l-dt').show()});
$('.dm-head-dt').click(function(){$('#user-arrow-box #top-session-accordion li').show();$('#l-dt, #l-ln').hide()});
$('a.a-ln').click(function(){$('#user-arrow-box #top-session-accordion li').hide();$('#l-ln').show()});
$('.dm-head-ln').click(function(){$('#user-arrow-box #top-session-accordion li').show();$('#l-ln, #l-dt').hide()});
</script>
{/literal}

View File

@@ -0,0 +1,92 @@
<header id="main_header">
{if $is_mobile}
<div class="pwa_header" style="display:none">
<center class="my-10">{lang_entry key="frontend.global.pwa.add"}</center>
<center>
<button class="search-button form-button button-grey px-15 py-5 m-0 tt-c max-w-auto" value="1" name="app_btn" id="app-btn" type="button"><span>{lang_entry key="frontend.global.pwa.install"}</span></button>
<a class="link cancel-trigger mb-0 px-15 py-5 tt-c" href="#" id="app-cancel"><span class="px-0">{lang_entry key="frontend.global.cancel"}</span></a>
</center>
</div>
{/if}
<div class="dynamic_container">
<div id="ct-header-top">
<div id="logo_container">
<i class="icon icon-menu2 menu-trigger"></i>
<a class="navbar-brand" href="{$main_url}" title="{lang_entry key="frontend.global.home"}" id="logo" rel="nofollow"></a>
<span id="menu-trigger-response"></span>
</div>
<div id="top_actions"{if $smarty.session.USER_ID eq 0} class="no-session"{/if}>
<div class="user-thumb-xlarge top">
<a href="javascript:;" class="sb-icon-search-top place-left pr5" onclick="$('.search_holder').toggleClass('open');$('#user-arrow-box, #notifications-arrow-box').addClass('hidden');$('.dynamic_container').addClass('s-open');$('.navbar-brand').css({ldelim}'visibility':'hidden'{rdelim})"><i class="icon-rs-search icon-search"></i></a>
{if $smarty.session.USER_ID gt 0}
<img height="32" class="own-profile-image mt" title="{$smarty.session.USER_NAME}" alt="{$smarty.session.USER_NAME}" src="{insert name="getProfileImage" assign="profileImage" for="{$smarty.session.USER_ID}"}{$profileImage}">
{else}
<span class="no-session-icon" onclick="$('#user-arrow-box').toggleClass('hidden');"><i class="mt-open"></i></span>
{/if}
<div class="arrow_box hidden blue" id="user-arrow-box">
{include file="tpl_frontend/tpl_header/tpl_headernav_pop.tpl"}
</div>
</div>
{if $smarty.session.USER_ID gt 0}
<a href="javascript:;" class="top-icon top-notif" title="{lang_entry key="frontend.global.notifications"}">
<i class="icon-bell"></i>{if $smarty.session.new_notifications gt 0}<span class="nnr">{$smarty.session.new_notifications}</span>{/if}
</a>
<a href="javascript:;" class="top-icon top-upload" title="{lang_entry key="frontend.global.upload"}">
<i class="icon-upload"></i>
</a>
<div class="arrow_box hidden" id="notifications-arrow-box">
<div class="arrow_box_pad">
<div id="notifications-box">
</div>
</div>
</div>
<div class="arrow_box blue hidden" id="upload-arrow-box">
<ul class="accordion tacc" id="top-session-accordion">
{if $live_module eq 1 and $live_uploads eq 1}<li{if $smarty.get.t eq "live"} class=""{/if}><a id="new-live" rel-s="{href_entry key="files"}" class="dcjq-parent" href="{$main_url}/{href_entry key="upload"}?t=live"><i class="icon icon-live"></i> {lang_entry key="upload.menu.live"}</a></li>{/if}
{if $video_module eq 1 and $video_uploads eq 1}<li{if $smarty.get.t eq "video"} class=""{/if}><a class="dcjq-parent" href="{$main_url}/{href_entry key="upload"}?t=video"><i class="icon icon-video"></i> {lang_entry key="upload.menu.video"}</a></li>{/if}
{if $video_module eq 1 and $video_uploads eq 1}<li{if $smarty.get.t eq "short"} class=""{/if}><a class="dcjq-parent" href="{$main_url}/{href_entry key="upload"}?t=short"><i class="icon icon-mobile"></i> {lang_entry key="upload.menu.short"}</a></li>{/if}
{if $import_yt eq 1 or $import_dm eq 1 or $import_vi eq 1}<li{if $page_display eq "tpl_import" and $smarty.get.t eq "video"} class=""{/if}><a class="dcjq-parent" href="{$main_url}/{href_entry key="import"}?t=video"><i class="icon icon-embed"></i> {lang_entry key="upload.menu.grab"}</a></li>{/if}
{if $audio_module eq 1 and $audio_uploads eq 1}<li{if $smarty.get.t eq "audio"} class=""{/if}><a class="dcjq-parent" href="{$main_url}/{href_entry key="upload"}?t=audio"><i class="icon icon-headphones"></i> {lang_entry key="upload.menu.audio"}</a></li>{/if}
{if $image_module eq 1 and $image_uploads eq 1}<li{if $smarty.get.t eq "image"} class=""{/if}><a class="dcjq-parent" href="{$main_url}/{href_entry key="upload"}?t=image"><i class="icon icon-image"></i> {lang_entry key="upload.menu.image"}</a></li>{/if}
{if $document_module eq 1 and $document_uploads eq 1}<li{if $smarty.get.t eq "document"} class="tab-current"{/if}><a href="{$main_url}/{href_entry key="upload"}?t=document"><i class="icon icon-file"></i> {lang_entry key="upload.menu.document"}</a></li>{/if}
{if $blog_module eq 1}<li{if $smarty.get.t eq "blog"} class="tab-current"{/if}><a id="new-blog" rel-s="{href_entry key="files"}" href="{$main_url}/{href_entry key="upload"}?t=blog"><i class="icon icon-blog"></i> {lang_entry key="upload.menu.blog"}</a></li>{/if}
</ul>
</div>
{/if}
{if $smarty.session.USER_ID eq 0}
<a href="{$main_url}/{href_entry key="signin"}" rel="nofollow"><button class="save-entry-button button-grey search-button top-signin" value="1" name="frontend_global_signin"><i class="icon-user"></i><span>{lang_entry key="frontend.global.signin"}</span></button></a>
{/if}
</div>
<center>
<div class="search_holder{if $smarty.session.USER_ID eq 0} no-session-holder{/if}">
<a href="javascript:;" class="icon-rs-arrow-left"><i class="icon-arrow-left close-search visible-mobile"></i></a>
<div class="top-search-form-wrap"><form id="top-search-form" class="entry-form-class">
<button type="button" id="filter-search-type" value="video" class="dl-menuwrapper viewType_btn viewType_btn-default search-filter-mode">
<span class="dl-trigger actions-trigger nbfr"><i class="icon icon-video"></i></span>
<ul class="dl-menu dl-search">
{if $video_module eq 1}<li><a href="" class="icon icon-video" rel-value="1" rel="nofollow"><span>{lang_entry key="frontend.global.v.p.c"}</span></a></li>{/if}
{if $short_module eq 1}<li><a href="" class="icon icon-mobile" rel-value="9" rel="nofollow"><span>{lang_entry key="frontend.global.s.p.c"}</span></a></li>{/if}
{if $live_module eq 1}<li><a href="" class="icon icon-live" rel-value="8" rel="nofollow"><span>{lang_entry key="frontend.global.l.p.c"}</span></a></li>{/if}
{if $audio_module eq 1}<li><a href="" class="icon icon-headphones" rel-value="3" rel="nofollow"><span>{lang_entry key="frontend.global.a.p.c"}</span></a></li>{/if}
{if $image_module eq 1}<li><a href="" class="icon icon-image" rel-value="2" rel="nofollow"><span>{lang_entry key="frontend.global.i.p.c"}</span></a></li>{/if}
{if $doc_module eq 1}<li><a href="" class="icon icon-file" rel-value="4" rel="nofollow"><span>{lang_entry key="frontend.global.d.p.c"}</span></a></li>{/if}
{if $blog_module eq 1}<li><a href="" class="icon icon-blog" rel-value="7" rel="nofollow"><span>{lang_entry key="frontend.global.b.p.c"}</span></a></li>{/if}
{if $public_channels eq 1}<li><a href="" class="icon icon-users" rel-value="6" rel="nofollow"><span>{lang_entry key="frontend.global.channels"}</span></a></li>{/if}
</ul>
</button>
</form></div>
<div id="sb-search" class="sb-search sb-search-open">
<form method="get" action="{$main_url}/{href_entry key="search"}">
<input class="sb-search-ft" type="hidden" name="tf" value="1">
<input class="sb-search-input" placeholder="{lang_entry key="frontend.global.searchtext"}" type="text" value="" name="q" id="search">
<input class="sb-search-submit" type="submit" value="">
<span class="sb-icon-search icon-search"></span>
</form>
</div>
</div>
</center>
</div>
<div class="clearfix"></div>
</div>
</header>

View File

@@ -0,0 +1,8 @@
{if $error_message ne ""}{assign var=notif_class value="error"}{assign var=the_message value=$error_message}{elseif $notice_message ne ""}{assign var=notif_class value="notice"}{assign var=the_message value=$notice_message}{/if}
<!-- NOTIFICATION CONTAINER -->
{if $error_message ne "" or $notice_message ne ""}
<div class="{$notif_class}-message" id="{$notif_class}-message" onclick="$(this).replaceWith(''); $('#cb-response').replaceWith(''); $('#cb-response-wrap').replaceWith(''); resizeDelimiter();">
<p class="{$notif_class}-message-text">{$the_message}</p>
</div>
<script type="text/javascript">$(document).ready(function(){ldelim}$(document).on("click","#{$notif_class}-message",function(){ldelim}$("#{$notif_class}-message").replaceWith("");$("#cb-response").replaceWith("");$("#cb-response-wrap").replaceWith("");resizeDelimiter();if($("#wrapper").hasClass("tpl_shorts")){ldelim}var sh=!$('#view-player').hasClass('bottom-comments')?$('.video-js').height():360;var ct=sh-($('#comment-load .file-views-nr').height()+$('#comment-load #comm-post-response').height()+$('#comment-load #comm-post-form').height()+20);$('.posted-comments').css('height',ct);{rdelim}{rdelim});{rdelim});</script>
{/if} <!-- END NOTIFICATION CONTAINER -->