فهرست منبع

Super Secret Homepage Goodness!

causefx 8 سال پیش
والد
کامیت
a245eebd23
4فایلهای تغییر یافته به همراه375 افزوده شده و 237 حذف شده
  1. 13 0
      config/configDefaults.php
  2. 315 3
      functions.php
  3. 1 233
      homepage.php
  4. 46 1
      settings.php

+ 13 - 0
config/configDefaults.php

@@ -119,4 +119,17 @@ return array(
 	"embyRecentTVAuth" => "false",
 	"embyRecentMusicAuth" => "false",
 	"embyPlayingNowAuth" => "false",
+	"homepageOrdercustomhtml" => '1',
+	"homepageOrdernotice" => '2',
+	"homepageOrderplexsearch" => '3',
+	"homepageOrderspeedtest" => '4',
+	"homepageOrdernzbget" => '5',
+	"homepageOrdersabnzbd" => '6',
+	"homepageOrderplexnowplaying" => '7',
+	"homepageOrderplexrecent" => '8',
+	"homepageOrderplexplaylist" => '9',
+	"homepageOrderembynowplaying" => '10',
+	"homepageOrderembyrecent" => '11',
+	"homepageOrderombi" => '12',
+	"homepageOrdercalendar" => '13',
 );

+ 315 - 3
functions.php

@@ -6,7 +6,26 @@
 // ===================================
 use Kryptonit3\Sonarr\Sonarr;
 use Kryptonit3\SickRage\SickRage;
-
+//homepage order
+function homepageOrder(){
+	$homepageOrder = array(
+		"homepageOrdercustomhtml" => homepageOrdercustomhtml,
+		"homepageOrdernotice" => homepageOrdernotice,
+		"homepageOrderplexsearch" => homepageOrderplexsearch,
+		"homepageOrderspeedtest" => homepageOrderspeedtest,
+		"homepageOrdernzbget" => homepageOrdernzbget,
+		"homepageOrdersabnzbd" => homepageOrdersabnzbd,
+		"homepageOrderplexnowplaying" => homepageOrderplexnowplaying,
+		"homepageOrderplexrecent" => homepageOrderplexrecent,
+		"homepageOrderplexplaylist" => homepageOrderplexplaylist,
+		"homepageOrderembynowplaying" => homepageOrderembynowplaying,
+		"homepageOrderembyrecent" => homepageOrderembyrecent,
+		"homepageOrderombi" => homepageOrderombi,
+		"homepageOrdercalendar" => homepageOrdercalendar,
+	);
+	asort($homepageOrder);
+	return $homepageOrder;
+}
 // Debugging output functions
 function debug_out($variable, $die = false) {
 	$trace = debug_backtrace()[0];
@@ -4939,9 +4958,9 @@ function buildOmbiList($group, $user){
 	return outputOmbiRequests("Requested Content", $requests, "
 	setInterval(function() {
 		$('<div></div>').load('ajax.php?a=ombi-requests',function() {
-			var element = $(this).find('[id]');
+			var element = $(this).find('#recentRequests');
 			var loadedID = 	element.attr('id');
-			$('#'+loadedID).replaceWith(element);
+			$('#recentRequests').replaceWith(element);
 			console.log('Loaded updated: '+loadedID);
 			loadSlick();
 		});
@@ -4975,12 +4994,305 @@ function outputOmbiRequests($header = "Requested Content", $items, $script = fal
     }
 }
 
+function buildHomepageSettings(){
+	$homepageOrder = homepageOrder();
+	$homepageList = '<h4>Drag Homepage Items to Order Them</h4><div id="homepage-items" class="external-events">';
+	$inputList = '<div id="homepage-values">';
+	foreach ($homepageOrder as $key => $val) {
+		$homepageList .= '
+		<div class="fc-event blue-bg">
+			<span class="ordinal-position text-uppercase" data-link="'.$key.'" style="float:left">'.strtoupper($val).'</span>
+			&nbsp; '.substr($key, 13).'
+			<span class="fa fa-bars remove-event"></span>
+		</div>';
+		$inputList .= '<input type="hidden" name="'.$key.'">';
+	}
+	$homepageList .= '</div>';
+	$inputList .= '</div>';
+	return $homepageList.$inputList;
+}
+
+function buildHomepage($group, $user){
+	$homepageOrder = homepageOrder();
+	$homepageBuilt = '';
+	foreach ($homepageOrder as $key => $value) {
+		$homepageBuilt .= buildHomepageItem($key, $group, $user);
+	}
+	return $homepageBuilt;
+}
+
 function realSize($bytes, $decimals = 2) {
     $size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
     $factor = floor((strlen($bytes) - 1) / 3);
     return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . ' '.@$size[$factor];
 }
 
+function buildHomepageItem($homepageItem, $group, $user){
+	$homepageItemBuilt = '';
+	switch ($homepageItem) {
+		case 'homepageOrderplexsearch':
+			if((qualifyUser(PLEXSEARCHAUTH) && PLEXSEARCH == "true" && qualifyUser(PLEXHOMEAUTH))) {
+				$homepageItemBuilt .= '
+				<div id="searchPlexRow" class="row">
+					<div class="col-lg-12">
+						<div class="content-box box-shadow big-box todo-list">
+							<form id="plexSearchForm" onsubmit="return false;" autocomplete="off">
+								<div class="">
+									<div class="input-group">
+										<div style="border-radius: 25px 0 0 25px; border:0" class="input-group-addon gray-bg"><i class="fa fa-search white"></i></div>
+										<input id="searchInput" type="text" style="border-radius: 0;" autocomplete="off" name="search-title" class="form-control input-group-addon gray-bg" placeholder="Media Search">
+										<div id="clearSearch" style="border-radius: 0 25px 25px 0;border:0; cursor: pointer;" class="input-group-addon gray-bg"><i class="fa fa-close white"></i></div>
+										<button style="display:none" id="plexSearchForm_submit" class="btn btn-primary waves"></button>
+									</div>
+								</div>
+							</form>
+							<div id="resultshere" class="table-responsive"></div>
+						</div>
+					</div>
+				</div>
+				';
+			}
+			break;
+		case 'homepageOrdercustomhtml':
+			if (qualifyUser(HOMEPAGECUSTOMHTML1AUTH) && HOMEPAGECUSTOMHTML1) {
+				$homepageItemBuilt .= "<div>" . HOMEPAGECUSTOMHTML1 . "</div>";
+			}
+			break;
+		case 'homepageOrdernotice':
+			if (qualifyUser(HOMEPAGENOTICEAUTH) && HOMEPAGENOTICETITLE && HOMEPAGENOTICETYPE && HOMEPAGENOTICEMESSAGE && HOMEPAGENOTICELAYOUT) {
+				$homepageItemBuilt .= buildHomepageNotice(HOMEPAGENOTICELAYOUT, HOMEPAGENOTICETYPE, HOMEPAGENOTICETITLE, HOMEPAGENOTICEMESSAGE);
+			}
+			break;
+		case 'homepageOrderspeedtest':
+			if(SPEEDTEST == "true" && qualifyUser(SPEEDTESTAUTH)){
+				$homepageItemBuilt .= '
+				<style type="text/css">
+					.flash {
+						animation: flash 0.6s linear infinite;
+					}
+					@keyframes flash {
+						0% { opacity: 0.6; }
+						50% { opacity: 1; }
+					}
+				</style>
+				<script type="text/javascript">
+				var w = null
+					function runTest() {
+						document.getElementById("startBtn").style.display = "none"
+						document.getElementById("testArea").style.display = ""
+						document.getElementById("abortBtn").style.display = ""
+						w = new Worker("bower_components/speed/speedtest_worker.js")
+						var interval = setInterval(function () { w.postMessage("status") }, 100)
+						w.onmessage = function (event) {
+							var data = event.data.split(";")
+							var status = Number(data[0])
+							var dl = document.getElementById("download")
+							var ul = document.getElementById("upload")
+							var ping = document.getElementById("ping")
+							var jitter = document.getElementById("jitter")
+							dl.className = status === 1 ? "w-name flash" : "w-name"
+							ping.className = status === 2 ? "w-name flash" : "w-name"
+							jitter.className = ul.className = status === 3 ? "w-name flash" : "w-name"
+							if (status >= 4) {
+								clearInterval(interval)
+								document.getElementById("abortBtn").style.display = "none"
+								document.getElementById("startBtn").style.display = ""
+								w = null
+							}
+							if (status === 5) {
+								document.getElementById("testArea").style.display = "none"
+							}
+							dl.textContent = data[1] + " Mbit/s";
+							$("#downloadpercent").attr("style", "width: " + data[1] + "%;");
+							$("#uploadpercent").attr("style", "width: " + data[2] + "%;");
+							$("#pingpercent").attr("style", "width: " + data[3] + "%;");
+							$("#jitterpercent").attr("style", "width: " + data[5] + "%;");
+							ul.textContent = data[2] + " Mbit/s";
+							ping.textContent = data[3] + " ms";
+							jitter.textContent = data[5] + " ms";
+						}
+						w.postMessage(\'start {"telemetry_level":"basic"}\')
+						//w.postMessage("start")
+					}
+					function abortTest() {
+						if (w) w.postMessage("abort")
+					}
+				</script>
+				<div class="row" id="testArea" style="display:none">
+					<div class="test col-sm-3 col-lg-3">
+						<div class="content-box ultra-widget green-bg" data-counter="">
+							<div id="downloadpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
+							<div class="w-content">
+								<div class="w-icon right pull-right"><i class="mdi mdi-cloud-download"></i></div>
+								<div class="w-descr left pull-left text-center">
+									<span class="testName text-uppercase w-name">Download</span>
+									<br>
+									<span class="w-name counter" id="download" ></span>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="test col-sm-3 col-lg-3">
+						<div class="content-box ultra-widget red-bg" data-counter="">
+							<div id="uploadpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
+							<div class="w-content">
+								<div class="w-icon right pull-right"><i class="mdi mdi-cloud-upload"></i></div>
+								<div class="w-descr left pull-left text-center">
+									<span class="testName text-uppercase w-name">Upload</span>
+									<br>
+									<span class="w-name counter" id="upload" ></span>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="test col-sm-3 col-lg-3">
+						<div class="content-box ultra-widget yellow-bg" data-counter="">
+							<div id="pingpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
+							<div class="w-content">
+								<div class="w-icon right pull-right"><i class="mdi mdi-timer"></i></div>
+								<div class="w-descr left pull-left text-center">
+									<span class="testName text-uppercase w-name">Latency</span>
+									<br>
+									<span class="w-name counter" id="ping" ></span>
+								</div>
+							</div>
+						</div>
+					</div>
+					<div class="test col-sm-3 col-lg-3">
+						<div class="content-box ultra-widget blue-bg" data-counter="">
+							<div id="jitterpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
+							<div class="w-content">
+								<div class="w-icon right pull-right"><i class="mdi mdi-pulse"></i></div>
+								<div class="w-descr left pull-left text-center">
+									<span class="testName text-uppercase w-name">Jitter</span>
+									<br>
+									<span class="w-name counter" id="jitter" ></span>
+								</div>
+							</div>
+						</div>
+					</div>
+					<br/>
+				</div>
+				<div id="abortBtn" class="row" style="display: none" onclick="javascript:abortTest()">
+					<div class="col-lg-12">
+						<div class="content-box red-bg" style="cursor: pointer;">
+							<h1 style="margin: 10px" class="text-uppercase text-center">Abort Speed Test</h1>
+							<div class="clearfix"></div>
+						</div>
+					</div>
+				</div>
+				<div id="startBtn" class="row" onclick="javascript:runTest()">
+					<div class="col-lg-12">
+						<div class="content-box green-bg" style="cursor: pointer;">
+							<h1 style="margin: 10px" class="text-uppercase text-center">Run Speed Test</h1>
+							<div class="clearfix"></div>
+						</div>
+					</div>
+				</div>
+				';
+			}
+			break;
+		case 'homepageOrdernzbget':
+			if(NZBGETURL != "" && qualifyUser(NZBGETHOMEAUTH)){
+				$homepageItemBuilt .= buildDownloader('nzbget');
+			}
+			break;
+		case 'homepageOrdersabnzbd':
+			if(SABNZBDURL != "" && qualifyUser(SABNZBDHOMEAUTH)) {
+				$homepageItemBuilt .= buildDownloader('sabnzbd');
+			}
+			break;
+		case 'homepageOrderplexnowplaying':
+			if (qualifyUser(PLEXHOMEAUTH) && PLEXTOKEN) {
+				if(qualifyUser(PLEXPLAYINGNOWAUTH) && PLEXPLAYINGNOW == "true"){
+					$homepageItemBuilt .= '<div id="plexRowNowPlaying" class="row">';
+					$homepageItemBuilt .= getPlexStreams(12, PLEXSHOWNAMES, $group);
+					$homepageItemBuilt .= '</div>';
+				}
+			}
+			break;
+		case 'homepageOrderplexrecent':
+			if (qualifyUser(PLEXHOMEAUTH) && PLEXTOKEN) {
+				if(qualifyUser(PLEXRECENTMOVIEAUTH) && PLEXRECENTMOVIE == "true" || qualifyUser(PLEXRECENTTVAUTH) && PLEXRECENTTV == "true" || qualifyUser(PLEXRECENTMUSICAUTH) &&  PLEXRECENTMUSIC == "true"){
+					$plexArray = array("movie" => PLEXRECENTMOVIE, "season" => PLEXRECENTTV, "album" => PLEXRECENTMUSIC);
+					$homepageItemBuilt .= '<div id="plexRow" class="row"><div class="col-lg-12">';
+					$homepageItemBuilt .= getPlexRecent($plexArray);
+					$homepageItemBuilt .= '</div></div>';
+				}
+			}
+			break;
+		case 'homepageOrderplexplaylist':
+			if (qualifyUser(PLEXHOMEAUTH) && PLEXTOKEN) {
+				if(qualifyUser(PLEXPLAYLISTSAUTH) && PLEXPLAYLISTS == "true"){
+					$homepageItemBuilt .= '<div id="plexPlaylists" class="row"><div class="col-lg-12">';
+					$plexArray = array("movie" => PLEXRECENTMOVIE, "season" => PLEXRECENTTV, "album" => PLEXRECENTMUSIC);
+					$homepageItemBuilt .= getPlexPlaylists($plexArray);
+					$homepageItemBuilt .= '</div> </div>';
+				}
+			}
+			break;
+		case 'homepageOrderembynowplaying':
+			if (qualifyUser(EMBYHOMEAUTH) && EMBYTOKEN) {
+				if(qualifyUser(EMBYPLAYINGNOWAUTH) && EMBYPLAYINGNOW == "true"){
+					$homepageItemBuilt .= '<div id="embyRowNowPlaying" class="row">';
+					$homepageItemBuilt .= getEmbyStreams(12, EMBYSHOWNAMES, $USER->role);
+					$homepageItemBuilt .= '</div>';
+				}
+			}
+			break;
+		case 'homepageOrderembyrecent':
+			if (qualifyUser(EMBYHOMEAUTH) && EMBYTOKEN) {
+				if(qualifyUser(EMBYRECENTMOVIEAUTH) && EMBYRECENTMOVIE == "true" || qualifyUser(EMBYRECENTTVAUTH) && EMBYRECENTTV == "true" || qualifyUser(EMBYRECENTMUSICAUTH) && EMBYRECENTMUSIC == "true"){
+					$embyArray = array("Movie" => EMBYRECENTMOVIE, "Episode" => EMBYRECENTTV, "MusicAlbum" => EMBYRECENTMUSIC, "Series" => EMBYRECENTTV);
+					$homepageItemBuilt .= '<div id="embyRow" class="row"><div class="col-lg-12">';
+					$homepageItemBuilt .= getEmbyRecent($embyArray);
+					$homepageItemBuilt .= '</div></div>';
+				}
+			}
+			break;
+		case 'homepageOrderombi':
+			if (qualifyUser(OMBIAUTH) && OMBIURL) {
+				$homepageItemBuilt .= '<div id="ombiRequests" class="row"><div class="col-lg-12">';
+				$homepageItemBuilt .= buildOmbiList($group, $user);
+				$homepageItemBuilt .= '</div></div>';
+			}
+			break;
+		case 'homepageOrdercalendar':
+			if ((SONARRURL != "" && qualifyUser(SONARRHOMEAUTH)) || (RADARRURL != "" && qualifyUser(RADARRHOMEAUTH)) || (HEADPHONESURL != "" && qualifyUser(HEADPHONESHOMEAUTH)) || (SICKRAGEURL != "" && qualifyUser(SICKRAGEHOMEAUTH)) || (COUCHURL != "" && qualifyUser(COUCHHOMEAUTH))) {
+				$calendarItems = '';
+				if(RADARRURL != ""){ $calendarItems .= '<li><a class="calendarOption" calendarOption="film" href="javascript:void(0)">Movies</a></li>'; }
+				if(SONARRURL != ""){ $calendarItems .= '<li><a class="calendarOption" calendarOption="tv" href="javascript:void(0)">TV Shows</a></li>'; }
+				if(HEADPHONESURL != ""){ $calendarItems .= '<li><a class="calendarOption" calendarOption="music" href="javascript:void(0)">Music</a></li>'; }
+				$homepageItemBuilt .= '
+				<div id="calendarLegendRow" class="row" style="padding: 0 0 10px 0;">
+					<div class="col-lg-12 content-form form-inline">
+						<div class="form-group pull-right">
+							<span class="swal-legend label label-primary well-sm">Legend</span>&nbsp;
+							<div class="btn-group" role="group">
+								<button id="calendarSelected" style="margin-right: 0px;" type="button" class="btn waves btn-default btn-sm dropdown-toggle waves-effect waves-float" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">View All&nbsp;<span class="caret"></span></button>
+								<ul style="right:0; left: auto" class="dropdown-menu">
+									<li><a class="calendarOption" calendarOption="all" href="javascript:void(0)">View All</a></li>
+									'.$calendarItems.'
+								</ul>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div id="calendarRow" class="row">
+					<div class="col-lg-12">
+						<div id="calendar" class="fc-calendar box-shadow fc fc-ltr fc-unthemed"></div>
+					</div>
+				</div>
+				';
+			}
+			break;
+		default:
+			# code...
+			break;
+	}
+	return $homepageItemBuilt;
+}
+
 function buildDownloader($name){
 	return '
 <div id="downloadClientRow" class="row">

+ 1 - 233
homepage.php

@@ -287,240 +287,8 @@ foreach(loadAppearance() as $key => $value) {
         <div class="main-wrapper" style="position: initial;">
             <div id="content" class="container-fluid">
                 <br/>
+				<?php echo buildHomepage($USER->role, $USER->username);?>
 
-                <?php if (qualifyUser(HOMEPAGENOTICEAUTH) && HOMEPAGENOTICETITLE && HOMEPAGENOTICETYPE && HOMEPAGENOTICEMESSAGE && HOMEPAGENOTICELAYOUT) { echo buildHomepageNotice(HOMEPAGENOTICELAYOUT, HOMEPAGENOTICETYPE, HOMEPAGENOTICETITLE, HOMEPAGENOTICEMESSAGE); } ?>
-                <?php if((qualifyUser(PLEXSEARCHAUTH) && PLEXSEARCH == "true" && qualifyUser(PLEXHOMEAUTH))) { ?>
-                <div id="searchPlexRow" class="row">
-                    <div class="col-lg-12">
-                        <div class="content-box box-shadow big-box todo-list">
-                            <form id="plexSearchForm" onsubmit="return false;" autocomplete="off">
-                                <div class="">
-                                    <div class="input-group">
-                                        <div style="border-radius: 25px 0 0 25px; border:0" class="input-group-addon gray-bg"><i class="fa fa-search white"></i></div>
-                                        <input id="searchInput" type="text" style="border-radius: 0;" autocomplete="off" name="search-title" class="form-control input-group-addon gray-bg" placeholder="Media Search">
-										<div id="clearSearch" style="border-radius: 0 25px 25px 0;border:0; cursor: pointer;" class="input-group-addon gray-bg"><i class="fa fa-close white"></i></div>
-                                        <button style="display:none" id="plexSearchForm_submit" class="btn btn-primary waves"></button>
-                                    </div>
-                                </div>
-                            </form>
-                            <div id="resultshere" class="table-responsive"></div>
-                        </div>
-                    </div>
-                </div>
-                <?php } ?>
-                <?php if (qualifyUser(HOMEPAGECUSTOMHTML1AUTH) && HOMEPAGECUSTOMHTML1) { echo "<div>" . HOMEPAGECUSTOMHTML1 . "</div>"; } ?>
-
-                <?php if(SPEEDTEST == "true" && qualifyUser(SPEEDTESTAUTH)){ ?>
-                <style type="text/css">
-
-                    .flash {
-                        animation: flash 0.6s linear infinite;
-                    }
-
-                    @keyframes flash {
-                        0% { opacity: 0.6; }
-                        50% { opacity: 1; }
-                    }
-
-                </style>
-                <script type="text/javascript">
-                    var w = null
-                    function runTest() {
-                        document.getElementById('startBtn').style.display = 'none'
-                        document.getElementById('testArea').style.display = ''
-                        document.getElementById('abortBtn').style.display = ''
-                        w = new Worker('bower_components/speed/speedtest_worker.js')
-                        var interval = setInterval(function () { w.postMessage('status') }, 100)
-                        w.onmessage = function (event) {
-                            var data = event.data.split(';')
-                            var status = Number(data[0])
-                            var dl = document.getElementById('download')
-                            var ul = document.getElementById('upload')
-                            var ping = document.getElementById('ping')
-                            var jitter = document.getElementById('jitter')
-                            dl.className = status === 1 ? 'w-name flash' : 'w-name'
-                            ping.className = status === 2 ? 'w-name flash' : 'w-name'
-                            jitter.className = ul.className = status === 3 ? 'w-name flash' : 'w-name'
-                            if (status >= 4) {
-                                clearInterval(interval)
-                                document.getElementById('abortBtn').style.display = 'none'
-                                document.getElementById('startBtn').style.display = ''
-                                w = null
-                            }
-                            if (status === 5) {
-                                document.getElementById('testArea').style.display = 'none'
-                            }
-                            dl.textContent = data[1] + " Mbit/s";
-                            $("#downloadpercent").attr("style", "width: " + data[1] + "%;");
-                            $("#uploadpercent").attr("style", "width: " + data[2] + "%;");
-                            $("#pingpercent").attr("style", "width: " + data[3] + "%;");
-                            $("#jitterpercent").attr("style", "width: " + data[5] + "%;");
-                            ul.textContent = data[2] + " Mbit/s";
-                            ping.textContent = data[3] + " ms";
-                            jitter.textContent = data[5] + " ms";
-                        }
-                        w.postMessage('start {"telemetry_level":"basic"}')
-                        //w.postMessage('start')
-                    }
-                    function abortTest() {
-                        if (w) w.postMessage('abort')
-                    }
-                </script>
-
-                <div class="row" id="testArea" style="display:none">
-
-                    <div class="test col-sm-3 col-lg-3">
-                        <div class="content-box ultra-widget green-bg" data-counter="">
-                            <div id="downloadpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
-                            <div class="w-content">
-                                <div class="w-icon right pull-right"><i class="mdi mdi-cloud-download"></i></div>
-                                <div class="w-descr left pull-left text-center">
-                                    <span class="testName text-uppercase w-name">Download</span>
-                                    <br>
-                                    <span class="w-name counter" id="download" ></span>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="test col-sm-3 col-lg-3">
-                        <div class="content-box ultra-widget red-bg" data-counter="">
-                            <div id="uploadpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
-                            <div class="w-content">
-                                <div class="w-icon right pull-right"><i class="mdi mdi-cloud-upload"></i></div>
-                                <div class="w-descr left pull-left text-center">
-                                    <span class="testName text-uppercase w-name">Upload</span>
-                                    <br>
-                                    <span class="w-name counter" id="upload" ></span>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="test col-sm-3 col-lg-3">
-                        <div class="content-box ultra-widget yellow-bg" data-counter="">
-                            <div id="pingpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
-                            <div class="w-content">
-                                <div class="w-icon right pull-right"><i class="mdi mdi-timer"></i></div>
-                                <div class="w-descr left pull-left text-center">
-                                    <span class="testName text-uppercase w-name">Latency</span>
-                                    <br>
-                                    <span class="w-name counter" id="ping" ></span>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="test col-sm-3 col-lg-3">
-                        <div class="content-box ultra-widget blue-bg" data-counter="">
-                            <div id="jitterpercent" class="progress-bar progress-bar-striped active w-used" style=""></div>
-                            <div class="w-content">
-                                <div class="w-icon right pull-right"><i class="mdi mdi-pulse"></i></div>
-                                <div class="w-descr left pull-left text-center">
-                                    <span class="testName text-uppercase w-name">Jitter</span>
-                                    <br>
-                                    <span class="w-name counter" id="jitter" ></span>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <br/>
-
-                </div>
-
-                <div id="abortBtn" class="row" style="display: none" onclick="javascript:abortTest()">
-                    <div class="col-lg-12">
-                        <div class="content-box red-bg" style="cursor: pointer;">
-                            <h1 style="margin: 10px" class="text-uppercase text-center">Abort Speed Test</h1>
-                            <div class="clearfix"></div>
-                        </div>
-                    </div>
-                </div>
-
-                <div id="startBtn" class="row" onclick="javascript:runTest()">
-                    <div class="col-lg-12">
-                        <div class="content-box green-bg" style="cursor: pointer;">
-                            <h1 style="margin: 10px" class="text-uppercase text-center">Run Speed Test</h1>
-                            <div class="clearfix"></div>
-                        </div>
-                    </div>
-                </div>
-                <?php } ?>
-
-                <?php if(NZBGETURL != "" && qualifyUser(NZBGETHOMEAUTH)){
-					echo  buildDownloader('nzbget');
-				}
-				if(SABNZBDURL != "" && qualifyUser(SABNZBDHOMEAUTH)) {
-					echo  buildDownloader('sabnzbd');
-				} ?>
-				<?php if (qualifyUser(PLEXHOMEAUTH) && PLEXTOKEN) { ?>
-                <div id="plexRowNowPlaying" class="row">
-                    <?php if(qualifyUser(PLEXPLAYINGNOWAUTH) && PLEXPLAYINGNOW == "true"){ echo getPlexStreams(12, PLEXSHOWNAMES, $USER->role); } ?>
-                </div>
-                <div id="plexRow" class="row">
-					<div class="col-lg-12">
-	                <?php
-	                if(qualifyUser(PLEXRECENTMOVIEAUTH) && PLEXRECENTMOVIE == "true" || qualifyUser(PLEXRECENTTVAUTH) && PLEXRECENTTV == "true" || qualifyUser(PLEXRECENTMUSICAUTH) &&  PLEXRECENTMUSIC == "true"){
-	                    $plexArray = array("movie" => PLEXRECENTMOVIE, "season" => PLEXRECENTTV, "album" => PLEXRECENTMUSIC);
-	                    echo getPlexRecent($plexArray);
-	                }
-	                ?>
-					</div>
-                </div>
-                <div id="plexPlaylists" class="row">
-                    <div class="col-lg-12">
-                    <?php if(qualifyUser(PLEXPLAYLISTSAUTH) && PLEXPLAYLISTS == "true"){ echo getPlexPlaylists($plexArray); } ?>
-                    </div>
-                </div>
-                <?php } ?>
-
-				<?php if (qualifyUser(EMBYHOMEAUTH) && EMBYTOKEN) { ?>
-                <div id="embyRowNowPlaying" class="row">
-                    <?php if(EMBYPLAYINGNOW == "true"){ echo getEmbyStreams(12, EMBYSHOWNAMES, $USER->role); } ?>
-                </div>
-                <div id="embyRow" class="row">
-                    <div class="col-lg-12">
-                    <?php
-                    if(EMBYRECENTMOVIE == "true" || EMBYRECENTTV == "true" || EMBYRECENTMUSIC == "true"){
-                        $embyArray = array("Movie" => EMBYRECENTMOVIE, "Episode" => EMBYRECENTTV, "MusicAlbum" => EMBYRECENTMUSIC, "Series" => EMBYRECENTTV);
-                        echo getEmbyRecent($embyArray);
-                    }
-                    ?>
-                    </div>
-
-                </div>
-				<?php } ?>
-				<?php if (qualifyUser(OMBIAUTH) && OMBIURL) { ?>
-				<div id="ombiRequests" class="row">
-                    <div class="col-lg-12">
-						<?php echo buildOmbiList($USER->role, $USER->username); ?>
-					</div>
-				</div>
-				<?php } ?>
-                <?php if ((SONARRURL != "" && qualifyUser(SONARRHOMEAUTH)) || (RADARRURL != "" && qualifyUser(RADARRHOMEAUTH)) || (HEADPHONESURL != "" && qualifyUser(HEADPHONESHOMEAUTH)) || (SICKRAGEURL != "" && qualifyUser(SICKRAGEHOMEAUTH)) || (COUCHURL != "" && qualifyUser(COUCHHOMEAUTH))) { ?>
-                <div id="calendarLegendRow" class="row" style="padding: 0 0 10px 0;">
-                    <div class="col-lg-12 content-form form-inline">
-                        <div class="form-group pull-right">
-                            <span class="swal-legend label label-primary well-sm">Legend</span>&nbsp;
-                            <div class="btn-group" role="group">
-                                <button id="calendarSelected" style="margin-right: 0px;" type="button" class="btn waves btn-default btn-sm dropdown-toggle waves-effect waves-float" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">View All&nbsp;<span class="caret"></span></button>
-                                <ul style="right:0; left: auto" class="dropdown-menu">
-                                    <li><a class="calendarOption" calendarOption="all" href="javascript:void(0)">View All</a></li>
-                                    <?php if(RADARRURL != ""){ echo '<li><a class="calendarOption" calendarOption="film" href="javascript:void(0)">Movies</a></li>'; }?>
-                                    <?php if(SONARRURL != ""){ echo '<li><a class="calendarOption" calendarOption="tv" href="javascript:void(0)">TV Shows</a></li>'; }?>
-                                    <?php if(HEADPHONESURL != ""){ echo '<li><a class="calendarOption" calendarOption="music" href="javascript:void(0)">Music</a></li>'; }?>
-                                </ul>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div id="calendarRow" class="row">
-                    <div class="col-lg-12">
-                        <div id="calendar" class="fc-calendar box-shadow fc fc-ltr fc-unthemed"></div>
-                    </div>
-                </div>
-                <?php } ?>
             </div>
         </div>
         <script>

+ 46 - 1
settings.php

@@ -1487,7 +1487,7 @@ echo buildSettings(
 					),
 				),
 			),
-   array(
+   			array(
 				'title' => 'Notice',
 				'id' => 'notice',
 				'image' => 'images/pin.png',
@@ -1630,6 +1630,17 @@ echo buildSettings(
 					),
 				),
 			),
+			array(
+				'title' => 'Homepage Arrangement',
+				'id' => 'homepageArrangement',
+				'image' => 'images/settings/full-color/png/64px/news.png',
+				'fields' => array(
+					array(
+						'type' => 'custom',
+						'html' => buildHomepageSettings(),
+					),
+				),
+			),
 		),
 	)
 );
@@ -3996,6 +4007,40 @@ echo buildSettings(
         </script>
         <script>
         $( document ).ready(function() {
+
+			$("#homepage-items").sortable({
+				placeholder:    "sort-placeholder",
+				forcePlaceholderSize: true,
+				start: function( e, ui ){
+					ui.item.data( "start-pos", ui.item.index()+1 );
+				},
+				change: function( e, ui ){
+					var seq,
+					startPos = ui.item.data( "start-pos" ),
+					$index,
+					correction;
+					correction = startPos <= ui.placeholder.index() ? 0 : 1;
+					ui.item.parent().find( "div.fc-event").each( function( idx, el ){
+						var $this = $( el ),
+						$index = $this.index();
+						if ( ( $index+1 >= startPos && correction === 0) || ($index+1 <= startPos && correction === 1 ) ){
+							$index = $index + correction;
+							$this.find( ".ordinal-position").text( $index);
+							link = $this.find( ".ordinal-position" ).attr('data-link');
+							$('#homepage-values [name='+link+']').val($index);
+							$('#homepage-values [name='+link+']').attr('data-changed', 'true');
+							console.log(link+' - '+$index);
+						}
+					});
+					seq = ui.item.parent().find( "div.sort-placeholder").index() + correction;
+					ui.item.find( ".ordinal-position" ).text( seq );
+					newlink = ui.item.find( ".ordinal-position" ).attr('data-link');
+					$('#homepage-values [name='+newlink+']').val(seq);
+					$('#homepage-values [name='+newlink+']').attr('data-changed', 'true');
+					console.log(newlink+' - '+seq);
+				}
+			});
+
 			$(".iconpickeradd").on("click", function() {
                 console.log('icon picker start add');
                 $(this).iconpicker({placement: 'right', hideOnSelect: false, collision: true});