settings.php 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466
  1. <?php
  2. date_default_timezone_set('America/Los_Angeles');
  3. $data = false;
  4. ini_set("display_errors", 1);
  5. ini_set("error_reporting", E_ALL | E_STRICT);
  6. function registration_callback($username, $email, $userdir)
  7. {
  8. global $data;
  9. $data = array($username, $email, $userdir);
  10. }
  11. require_once("user.php");
  12. $USER = new User("registration_callback");
  13. if(!$USER->authenticated) :
  14. die("Why you trying to access this without logging in?!?!");
  15. elseif($USER->authenticated && $USER->role !== "admin") :
  16. die("C'mon man! I give you access to my stuff and now you're trying to get in the back door?");
  17. endif;
  18. function printArray($arrayName){
  19. foreach ( $arrayName as $item ) :
  20. echo $item . "<br/>";
  21. endforeach;
  22. }
  23. $dbfile = DATABASE_LOCATION . constant('User::DATABASE_NAME') . ".db";
  24. $userdirpath = USER_HOME;
  25. $userdirpath = substr_replace($userdirpath, "", -1);
  26. $file_db = new PDO("sqlite:" . $dbfile);
  27. $file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  28. $getUsers = $file_db->query('SELECT * FROM users');
  29. $gotUsers = $file_db->query('SELECT * FROM users');
  30. $dbTab = $file_db->query('SELECT name FROM sqlite_master WHERE type="table" AND name="tabs"');
  31. $dbOptions = $file_db->query('SELECT name FROM sqlite_master WHERE type="table" AND name="options"');
  32. $tabSetup = "Yes";
  33. $hasOptions = "No";
  34. foreach($dbTab as $row) :
  35. if (in_array("tabs", $row)) :
  36. $tabSetup = "No";
  37. endif;
  38. endforeach;
  39. foreach($dbOptions as $row) :
  40. if (in_array("options", $row)) :
  41. $hasOptions = "Yes";
  42. endif;
  43. endforeach;
  44. if($hasOptions == "No") :
  45. $title = "Organizr";
  46. $topbar = "#eb6363";
  47. $topbartext = "#FFFFFF";
  48. $bottombar = "#eb6363";
  49. $sidebar = "#000000";
  50. $hoverbg = "#eb6363";
  51. $activetabBG = "#eb6363";
  52. $activetabicon = "#FFFFFF";
  53. $activetabtext = "#FFFFFF";
  54. $inactiveicon = "#FFFFFF";
  55. $inactivetext = "#FFFFFF";
  56. endif;
  57. if($tabSetup == "No") :
  58. $result = $file_db->query('SELECT * FROM tabs');
  59. endif;
  60. if($hasOptions == "Yes") :
  61. $resulto = $file_db->query('SELECT * FROM options');
  62. endif;
  63. if($hasOptions == "Yes") :
  64. foreach($resulto as $row) :
  65. $title = $row['title'];
  66. $topbartext = $row['topbartext'];
  67. $topbar = $row['topbar'];
  68. $bottombar = $row['bottombar'];
  69. $sidebar = $row['sidebar'];
  70. $hoverbg = $row['hoverbg'];
  71. $activetabBG = $row['activetabBG'];
  72. $activetabicon = $row['activetabicon'];
  73. $activetabtext = $row['activetabtext'];
  74. $inactiveicon = $row['inactiveicon'];
  75. $inactivetext = $row['inactivetext'];
  76. endforeach;
  77. endif;
  78. $action = "";
  79. if(isset($_POST['action'])) :
  80. $action = $_POST['action'];
  81. endif;
  82. if($action == "deleteDB") :
  83. unset($_COOKIE['Organizr']);
  84. setcookie('Organizr', '', time() - 3600, '/');
  85. unset($_COOKIE['OrganizrU']);
  86. setcookie('OrganizrU', '', time() - 3600, '/');
  87. $file_db = null;
  88. unlink($dbfile);
  89. foreach(glob($userdirpath . '/*') as $file) :
  90. if(is_dir($file)) :
  91. rmdir($file);
  92. elseif(!is_dir($file)) :
  93. unlink($file);
  94. endif;
  95. endforeach;
  96. rmdir($userdirpath);
  97. echo "<script>window.parent.location.reload();</script>";
  98. endif;
  99. if(!isset($_POST['op'])) :
  100. $_POST['op'] = "";
  101. endif;
  102. if($action == "addTabz") :
  103. if($tabSetup == "No") :
  104. $file_db->exec("DELETE FROM tabs");
  105. endif;
  106. if($tabSetup == "Yes") :
  107. $file_db->exec("CREATE TABLE tabs (name TEXT UNIQUE, url TEXT, defaultz TEXT, active TEXT, user TEXT, guest TEXT, icon TEXT, iconurl TEXT, window TEXT)");
  108. endif;
  109. $addTabName = array();
  110. $addTabUrl = array();
  111. $addTabIcon = array();
  112. $addTabIconUrl = array();
  113. $addTabDefault = array();
  114. $addTabActive = array();
  115. $addTabUser = array();
  116. $addTabGuest = array();
  117. $addTabWindow = array();
  118. $buildArray = array();
  119. foreach ($_POST as $key => $value) :
  120. $trueKey = explode('-', $key);
  121. if ($value == "on") :
  122. $value = "true";
  123. endif;
  124. if($trueKey[0] == "name"):
  125. array_push($addTabName, $value);
  126. endif;
  127. if($trueKey[0] == "url"):
  128. array_push($addTabUrl, $value);
  129. endif;
  130. if($trueKey[0] == "icon"):
  131. array_push($addTabIcon, $value);
  132. endif;
  133. if($trueKey[0] == "iconurl"):
  134. array_push($addTabIconUrl, $value);
  135. endif;
  136. if($trueKey[0] == "default"):
  137. array_push($addTabDefault, $value);
  138. endif;
  139. if($trueKey[0] == "active"):
  140. array_push($addTabActive, $value);
  141. endif;
  142. if($trueKey[0] == "user"):
  143. array_push($addTabUser, $value);
  144. endif;
  145. if($trueKey[0] == "guest"):
  146. array_push($addTabGuest, $value);
  147. endif;
  148. if($trueKey[0] == "window"):
  149. array_push($addTabWindow, $value);
  150. endif;
  151. endforeach;
  152. $tabArray = 0;
  153. if(count($addTabName) > 0) :
  154. foreach(range(1,count($addTabName)) as $index) :
  155. if(!isset($addTabDefault[$tabArray])) :
  156. $tabDefault = "false";
  157. else :
  158. $tabDefault = $addTabDefault[$tabArray];
  159. endif;
  160. $buildArray[] = array('name' => $addTabName[$tabArray],
  161. 'url' => $addTabUrl[$tabArray],
  162. 'defaultz' => $tabDefault,
  163. 'active' => $addTabActive[$tabArray],
  164. 'user' => $addTabUser[$tabArray],
  165. 'guest' => $addTabGuest[$tabArray],
  166. 'icon' => $addTabIcon[$tabArray],
  167. 'window' => $addTabWindow[$tabArray],
  168. 'iconurl' => $addTabIconUrl[$tabArray]);
  169. $tabArray++;
  170. endforeach;
  171. endif;
  172. $insert = "INSERT INTO tabs (name, url, defaultz, active, user, guest, icon, iconurl, window)
  173. VALUES (:name, :url, :defaultz, :active, :user, :guest, :icon, :iconurl, :window)";
  174. $stmt = $file_db->prepare($insert);
  175. $stmt->bindParam(':name', $name);
  176. $stmt->bindParam(':url', $url);
  177. $stmt->bindParam(':defaultz', $defaultz);
  178. $stmt->bindParam(':active', $active);
  179. $stmt->bindParam(':user', $user);
  180. $stmt->bindParam(':guest', $guest);
  181. $stmt->bindParam(':icon', $icon);
  182. $stmt->bindParam(':iconurl', $iconurl);
  183. $stmt->bindParam(':window', $window);
  184. foreach ($buildArray as $t) :
  185. $name = $t['name'];
  186. $url = $t['url'];
  187. $defaultz = $t['defaultz'];
  188. $active = $t['active'];
  189. $user = $t['user'];
  190. $guest = $t['guest'];
  191. $icon = $t['icon'];
  192. $iconurl = $t['iconurl'];
  193. $window = $t['window'];
  194. $stmt->execute();
  195. endforeach;
  196. //echo "<script>window.onload = function() {if(!window.location.hash) {window.location = window.location + '#loaded';window.location.reload();}}</script>";
  197. endif;
  198. if($action == "addOptionz") :
  199. if($hasOptions == "Yes") :
  200. $file_db->exec("DELETE FROM options");
  201. endif;
  202. if($hasOptions == "No") :
  203. $file_db->exec("CREATE TABLE options (title TEXT UNIQUE, topbar TEXT, bottombar TEXT, sidebar TEXT, hoverbg TEXT, topbartext TEXT, activetabBG TEXT, activetabicon TEXT, activetabtext TEXT, inactiveicon TEXT, inactivetext TEXT)");
  204. endif;
  205. $title = $_POST['title'];
  206. $topbartext = $_POST['topbartext'];
  207. $topbar = $_POST['topbar'];
  208. $bottombar = $_POST['bottombar'];
  209. $sidebar = $_POST['sidebar'];
  210. $hoverbg = $_POST['hoverbg'];
  211. $activetabBG = $_POST['activetabBG'];
  212. $activetabicon = $_POST['activetabicon'];
  213. $activetabtext = $_POST['activetabtext'];
  214. $inactiveicon = $_POST['inactiveicon'];
  215. $inactivetext = $_POST['inactivetext'];
  216. $insert = "INSERT INTO options (title, topbartext, topbar, bottombar, sidebar, hoverbg, activetabBG, activetabicon, activetabtext, inactiveicon, inactivetext)
  217. VALUES (:title, :topbartext, :topbar, :bottombar, :sidebar, :hoverbg, :activetabBG, :activetabicon , :activetabtext , :inactiveicon, :inactivetext)";
  218. $stmt = $file_db->prepare($insert);
  219. $stmt->bindParam(':title', $title);
  220. $stmt->bindParam(':topbartext', $topbartext);
  221. $stmt->bindParam(':topbar', $topbar);
  222. $stmt->bindParam(':bottombar', $bottombar);
  223. $stmt->bindParam(':sidebar', $sidebar);
  224. $stmt->bindParam(':hoverbg', $hoverbg);
  225. $stmt->bindParam(':activetabBG', $activetabBG);
  226. $stmt->bindParam(':activetabicon', $activetabicon);
  227. $stmt->bindParam(':activetabtext', $activetabtext);
  228. $stmt->bindParam(':inactiveicon', $inactiveicon);
  229. $stmt->bindParam(':inactivetext', $inactivetext);
  230. $stmt->execute();
  231. endif;
  232. ?>
  233. <!DOCTYPE html>
  234. <html lang="en" class="no-js">
  235. <head>
  236. <meta charset="UTF-8">
  237. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  238. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  239. <meta name="msapplication-tap-highlight" content="no" />
  240. <title>Settings</title>
  241. <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
  242. <link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css">
  243. <link rel="stylesheet" href="bower_components/mdi/css/materialdesignicons.min.css">
  244. <link rel="stylesheet" href="bower_components/metisMenu/dist/metisMenu.min.css">
  245. <link rel="stylesheet" href="bower_components/Waves/dist/waves.min.css">
  246. <link rel="stylesheet" href="bower_components/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css">
  247. <link rel="stylesheet" href="js/selects/cs-select.css">
  248. <link rel="stylesheet" href="js/selects/cs-skin-elastic.css">
  249. <link href="bower_components/iconpick/dist/css/fontawesome-iconpicker.min.css" rel="stylesheet">
  250. <link rel="stylesheet" href="bower_components/google-material-color/dist/palette.css">
  251. <link rel="stylesheet" href="bower_components/sweetalert/dist/sweetalert.css">
  252. <link rel="stylesheet" href="bower_components/smoke/dist/css/smoke.min.css">
  253. <script src="js/menu/modernizr.custom.js"></script>
  254. <script type="text/javascript" src="js/sha1.js"></script>
  255. <script type="text/javascript" src="js/user.js"></script>
  256. <link rel="stylesheet" href="css/style.css">
  257. <link href="css/jquery.filer.css" rel="stylesheet">
  258. <link href="css/jquery.filer-dragdropbox-theme.css" rel="stylesheet">
  259. <!--[if lt IE 9]>
  260. <script src="bower_components/html5shiv/dist/html5shiv.min.js"></script>
  261. <script src="bower_components/respondJs/dest/respond.min.js"></script>
  262. <![endif]-->
  263. </head>
  264. <body style="padding: 0; background: #273238;">
  265. <style>
  266. input.form-control.material.icp-auto.iconpicker-element.iconpicker-input {
  267. display: none;
  268. }
  269. </style>
  270. <div id="main-wrapper" class="main-wrapper">
  271. <!--Content-->
  272. <div id="content" style="margin:0 20px; overflow:hidden">
  273. <br/>
  274. <div id="versionCheck"></div>
  275. <div class="row">
  276. <div class="col-lg-12">
  277. <div class="tabbable tabs-with-bg" id="eighth-tabs">
  278. <ul class="nav nav-tabs" style="background: #76828e">
  279. <li class="active">
  280. <a href="#tab-tabs" data-toggle="tab"><i class="fa fa-list gray"></i></a>
  281. </li>
  282. <li>
  283. <a href="#customedit" data-toggle="tab"><i class="fa fa-paint-brush green"></i></a>
  284. </li>
  285. <li>
  286. <a href="#useredit" data-toggle="tab"><i class="fa fa-user red"></i></a>
  287. </li>
  288. <li>
  289. <a href="#about" data-toggle="tab"><i class="fa fa-info indigo"></i></a>
  290. </li>
  291. </ul>
  292. <div class="tab-content">
  293. <div class="content-box box-shadow big-box todo-list tab-pane big-box fade in active" id="tab-tabs">
  294. <div class="sort-todo">
  295. <a class="total-tabs">Total Tabs <span class="badge gray-bg"></span></a>
  296. <button id="iconHide" type="button" class="btn waves btn-labeled btn-success btn-sm text-uppercase waves-effect waves-float">
  297. <span class="btn-label"><i class="fa fa-upload"></i></span>Upload Icons
  298. </button>
  299. <?php if($action) : ?>
  300. <button id="apply" class="btn waves btn-labeled btn-success btn-sm pull-right text-uppercase waves-effect waves-float" type="submit">
  301. <span class="btn-label"><i class="fa fa-check"></i></span>Apply Changes
  302. </button>
  303. <?php endif; ?>
  304. </div>
  305. <input type="file" name="files[]" id="uploadIcons" multiple="multiple">
  306. <form id="add_tab" method="post">
  307. <div class="form-group add-tab">
  308. <div class="input-group">
  309. <div class="input-group-addon">
  310. <i class="fa fa-pencil gray"></i>
  311. </div>
  312. <input type="text" class="form-control name-of-todo" placeholder="Type In New Tab Name And Hit Enter" style="border-top-left-radius: 0;
  313. border-bottom-left-radius: 0;">
  314. </div>
  315. </div>
  316. </form>
  317. <div class="panel">
  318. <form id="submitTabs" method="post">
  319. <div class="panel-body todo">
  320. <input type="hidden" name="action" value="addTabz" />
  321. <ul class="list-group ui-sortable">
  322. <?php if($tabSetup == "No") : $tabNum = 1;
  323. foreach($result as $row) :
  324. if($row['defaultz'] == "true") : $default = "checked"; else : $default = ""; endif;
  325. if($row['active'] == "true") : $activez = "checked"; else : $activez = ""; endif;
  326. if($row['guest'] == "true") : $guestz = "checked"; else : $guestz = ""; endif;
  327. if($row['user'] == "true") : $userz = "checked"; else : $userz = ""; endif;
  328. if($row['window'] == "true") : $windowz = "checked"; else : $windowz = ""; endif;
  329. ?>
  330. <li id="item-<?=$tabNum;?>" class="list-group-item gray-bg" style="position: relative; left: 0px; top: 0px;">
  331. <tab class="content-form form-inline">
  332. <div class="form-group">
  333. <div class="action-btns" style="width:calc(100%)">
  334. <a class="" style="margin-left: 0px"><span class="fa fa-hand-paper-o"></span></a>
  335. </div>
  336. </div>
  337. <div class="form-group">
  338. <input style="width: 100%;" type="text" class="form-control material input-sm" id="name-<?=$tabNum;?>" name="name-<?=$tabNum;?>" placeholder="New Tab Name" value="<?=$row['name'];?>">
  339. </div>
  340. <div class="form-group">
  341. <input style="width: 100%;" type="text" class="form-control material input-sm" id="url-<?=$tabNum;?>" name="url-<?=$tabNum;?>" placeholder="Tab URL" value="<?=$row['url']?>">
  342. </div>
  343. <div style="margin-right: 5px;" class="form-group">
  344. <div class="input-group">
  345. <input data-placement="bottomRight" class="form-control material icp-auto" name="icon-<?=$tabNum;?>" value="<?=$row['icon'];?>" type="text" />
  346. <span class="input-group-addon"></span>
  347. </div>
  348. - OR -
  349. </div>
  350. <div class="form-group">
  351. <input style="width: 100%;" type="text" class="form-control material input-sm" id="iconurl-<?=$tabNum;?>" name="iconurl-<?=$tabNum;?>" placeholder="Icon URL" value="<?=$row['iconurl']?>">
  352. </div>
  353. <div class="form-group">
  354. <div class="radio radio-danger">
  355. <input type="radio" id="default[<?=$tabNum;?>]" value="true" name="default" <?=$default;?>>
  356. <label for="default[<?=$tabNum;?>]">Default</label>
  357. </div>
  358. </div>
  359. <div class="form-group">
  360. <div class="">
  361. <input id="" class="switcher switcher-success" value="false" name="active-<?=$tabNum;?>" type="hidden">
  362. <input id="active[<?=$tabNum;?>]" class="switcher switcher-success" name="active-<?=$tabNum;?>" type="checkbox" <?=$activez;?>>
  363. <label for="active[<?=$tabNum;?>]"></label>
  364. </div>
  365. Active
  366. </div>
  367. <div class="form-group">
  368. <div class="">
  369. <input id="" class="switcher switcher-primary" value="false" name="user-<?=$tabNum;?>" type="hidden">
  370. <input id="user[<?=$tabNum;?>]" class="switcher switcher-primary" name="user-<?=$tabNum;?>" type="checkbox" <?=$userz;?>>
  371. <label for="user[<?=$tabNum;?>]"></label>
  372. </div>
  373. User
  374. </div>
  375. <div class="form-group">
  376. <div class="">
  377. <input id="" class="switcher switcher-primary" value="false" name="guest-<?=$tabNum;?>" type="hidden">
  378. <input id="guest[<?=$tabNum;?>]" class="switcher switcher-warning" name="guest-<?=$tabNum;?>" type="checkbox" <?=$guestz;?>>
  379. <label for="guest[<?=$tabNum;?>]"></label>
  380. </div>
  381. Guest
  382. </div>
  383. <div class="form-group">
  384. <div class="">
  385. <input id="" class="switcher switcher-primary" value="false" name="window-<?=$tabNum;?>" type="hidden">
  386. <input id="window[<?=$tabNum;?>]" class="switcher switcher-warning" name="window-<?=$tabNum;?>" type="checkbox" <?=$windowz;?>>
  387. <label for="window[<?=$tabNum;?>]"></label>
  388. </div>
  389. No iFrame
  390. </div>
  391. <div class="pull-right action-btns" style="padding-top: 8px;">
  392. <a class="trash"><span class="fa fa-close"></span></a>
  393. </div>
  394. </tab>
  395. </li>
  396. <?php $tabNum ++; endforeach; endif;?>
  397. </ul>
  398. </div>
  399. <div class="checkbox clear-todo pull-left"></div>
  400. <button class="btn waves btn-labeled btn-success btn-sm pull-right text-uppercase waves-effect waves-float" type="submit">
  401. <span class="btn-label"><i class="fa fa-floppy-o"></i></span>Save Tabs
  402. </button>
  403. </form>
  404. </div>
  405. </div>
  406. <div class="tab-pane big-box fade in" id="useredit">
  407. <div class="row">
  408. <div class="col-lg-12">
  409. <div class="gray-bg content-box big-box box-shadow">
  410. <form class="content-form form-inline" name="new user registration" id="registration" action="" method="POST">
  411. <input type="hidden" name="op" value="register"/>
  412. <input type="hidden" name="sha1" value=""/>
  413. <div class="form-group">
  414. <input type="text" class="form-control gray" name="username" placeholder="Username" autocorrect="off" autocapitalize="off" value="">
  415. </div>
  416. <div class="form-group">
  417. <input type="email" class="form-control gray" name="email" placeholder="E-mail">
  418. </div>
  419. <div class="form-group">
  420. <input type="password" class="form-control gray" name="password1" placeholder="Password">
  421. </div>
  422. <div class="form-group">
  423. <input type="password" class="form-control gray" name="password2" placeholder="Retype Password">
  424. </div>
  425. <button type="submit" onclick="User.processRegistration()" class="btn btn-primary btn-icon waves waves-circle waves-effect waves-float"><i class="fa fa-user-plus"></i></button>
  426. </form>
  427. </div>
  428. </div>
  429. </div>
  430. <div class="content-box big-box">
  431. <form class="content-form form-inline" name="unregister" id="unregister" action="" method="POST">
  432. <input type="hidden" name="op" value="unregister"/>
  433. <p id="inputUsername"></p>
  434. <div class="table-responsive">
  435. <table class="table table-striped">
  436. <thead>
  437. <tr>
  438. <th>#</th>
  439. <th>Username</th>
  440. <th>E-Mail</th>
  441. <th>Login Status</th>
  442. <th>Last Seen</th>
  443. <th>User Group</th>
  444. <th>User Actions</th>
  445. </tr>
  446. </thead>
  447. <tbody>
  448. <?php $countUsers = 1;
  449. foreach($gotUsers as $row) :
  450. if($row['role'] == "admin") :
  451. $userColor = "red";
  452. $disableAction = "disabled=\"disabled\"";
  453. else :
  454. $userColor = "blue";
  455. $disableAction = "";
  456. endif;
  457. if($row['active'] == "true") :
  458. $userActive = "Logged In";
  459. $userActiveColor = "primary";
  460. else :
  461. $userActive = "Logged Out";
  462. $userActiveColor = "danger";
  463. endif;
  464. $userpic = md5( strtolower( trim( $row['email'] ) ) );
  465. if(!empty($row["last"])) :
  466. $lastActive = date("Y-m-d H:i", intval($row["last"]));
  467. else :
  468. $lastActive = "";
  469. endif;
  470. ?>
  471. <tr id="<?=$row['username'];?>">
  472. <th scope="row"><?=$countUsers;?></th>
  473. <td><i class="userpic"><img src="https://www.gravatar.com/avatar/<?=$userpic;?>?s=25&d=mm" class="img-circle"></i> &nbsp; <?=$row['username'];?></td>
  474. <td><?=$row['email'];?></td>
  475. <td><span class="label label-<?=$userActiveColor;?>"><?=$userActive;?></span></td>
  476. <td><?=$lastActive;?></td>
  477. <td><span class="text-uppercase <?=$userColor;?>"><?=$row['role'];?></span></td>
  478. <td id="<?=$row['username'];?>">
  479. <button <?=$disableAction;?> class="btn waves btn-labeled btn-danger btn btn-sm text-uppercase waves-effect waves-float deleteUser">
  480. <span class="btn-label"><i class="fa fa-user-times"></i></span>Delete
  481. </button>
  482. </td>
  483. </tr>
  484. <?php $countUsers++; endforeach; ?>
  485. </tbody>
  486. </table>
  487. </div>
  488. </form>
  489. </div>
  490. </div>
  491. <div class="tab-pane big-box fade in" id="about">
  492. <h4><strong>About Organizr</strong></h4>
  493. <p id="version"></p>
  494. <p id="submitFeedback">
  495. <a href='https://github.com/causefx/Organizr/issues/new' target='_blank' type='button' class='btn waves btn-labeled btn-success btn text-uppercase waves-effect waves-float'><span class='btn-label'><i class='fa fa-github-alt'></i></span>Submit Issue or Request</a>
  496. <a href='https://github.com/causefx/Organizr' target='_blank' type='button' class='btn waves btn-labeled btn-primary btn text-uppercase waves-effect waves-float'><span class='btn-label'><i class='fa fa-github'></i></span>View On Github</a>
  497. <a href='https://riot.im/app/#/room/#iCauseFX:matrix.org' target='_blank' type='button' class='btn waves btn-labeled btn-dark btn text-uppercase waves-effect waves-float'><span class='btn-label'><i class='fa fa-comments-o'></i></span>Chat With Us</a>
  498. </p>
  499. <p id="whatsnew"></p>
  500. <p id="downloadnow"></p>
  501. <div class="panel panel-danger">
  502. <div class="panel-heading">
  503. <h3 class="panel-title">Delete Database</h3>
  504. </div>
  505. <div class="panel-body">
  506. <div class="col-lg-4">
  507. <p>Only do this if an upgrade requires it. This will delete your database so there is no going back and you will need to set everything back up, including user accouts.</p>
  508. <form id="deletedb" method="post">
  509. <input type="hidden" name="action" value="deleteDB" />
  510. <button class="btn waves btn-labeled btn-danger pull-right text-uppercase waves-effect waves-float" type="submit">
  511. <span class="btn-label"><i class="fa fa-trash"></i></span>Delete Databse
  512. </button>
  513. </form>
  514. </div>
  515. </div>
  516. </div>
  517. </div>
  518. <div class="tab-pane small-box fade in" id="customedit">
  519. <form id="add_optionz" method="post">
  520. <input type="hidden" name="action" value="addOptionz" />
  521. <button id="plexTheme" style="background: #E49F0C" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Plex</button>
  522. <button id="embyTheme" style="background: #52B54B" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Emby</button>
  523. <button id="bookTheme" style="background: #3B5998" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Book</button>
  524. <button id="spaTheme" style="background: #66BBAE" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Spa</button>
  525. <button id="darklyTheme" style="background: #375A7F" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Darkly</button>
  526. <button id="slateTheme" style="background: #272B30" type="button" class="btn waves btn-dark btn-sm text-uppercase waves-effect waves-float">Slate</button>
  527. <button class="btn waves btn-labeled btn-success btn-sm pull-right text-uppercase waves-effect waves-float" type="submit">
  528. <span class="btn-label"><i class="fa fa-floppy-o"></i></span>Save Options
  529. </button>
  530. <div class="content-box box-shadow big-box grids">
  531. <div class="row show-grids">
  532. <h4><strong>Title</strong></h4>
  533. <div class="col-md-2 gray-bg">
  534. <center>Title</center>
  535. <input name="title" class="form-control gray" value="<?=$title;?>" placeholder="Organizr">
  536. </div>
  537. <div class="col-md-2 gray-bg">
  538. <center>Title Text</center>
  539. <input name="topbartext" id="topbartext" class="form-control jscolor {hash:true}" value="<?=$topbartext;?>">
  540. </div>
  541. </div>
  542. <div class="row show-grids">
  543. <h4><strong>Navigation Bars</strong></h4>
  544. <div class="col-md-2 gray-bg">
  545. <center>Top Bar</center>
  546. <input name="topbar" id="topbar" class="form-control jscolor {hash:true}" value="<?=$topbar;?>">
  547. </div>
  548. <div class="col-md-2 gray-bg">
  549. <center>Bottom Bar</center>
  550. <input name="bottombar" id="bottombar" class="form-control jscolor {hash:true}" value="<?=$bottombar;?>">
  551. </div>
  552. <div class="clearfix visible-xs-block"></div>
  553. <div class="col-md-2 gray-bg">
  554. <center>Side Bar</center>
  555. <input name="sidebar" id="sidebar" class="form-control jscolor {hash:true}" value="<?=$sidebar;?>">
  556. </div>
  557. <div class="col-md-2 gray-bg">
  558. <center>Hover BG</center>
  559. <input name="hoverbg" id="hoverbg" class="form-control jscolor {hash:true}" value="<?=$hoverbg;?>">
  560. </div>
  561. </div>
  562. <div class="row show-grids">
  563. <h4><strong>Active Tab</strong></h4>
  564. <div class="col-md-2 gray-bg">
  565. <center>Active Tab BG</center>
  566. <input name="activetabBG" id="activetabBG" class="form-control jscolor {hash:true}" value=<?=$activetabBG;?>"">
  567. </div>
  568. <div class="col-md-2 gray-bg">
  569. <center>Active Tab Icon</center>
  570. <input name="activetabicon" id="activetabicon" class="form-control jscolor {hash:true}" value="<?=$activetabicon;?>">
  571. </div>
  572. <div class="col-md-2 gray-bg">
  573. <center>Active Tab Text</center>
  574. <input name="activetabtext" id="activetabtext" class="form-control jscolor {hash:true}" value="<?=$activetabtext;?>">
  575. </div>
  576. </div>
  577. <div class="row show-grids">
  578. <h4><strong>Inactive Tab</strong></h4>
  579. <div class="col-md-2 gray-bg">
  580. <center>Inactive Icon</center>
  581. <input name="inactiveicon" id="inactiveicon" class="form-control jscolor {hash:true}" value="<?=$inactiveicon;?>">
  582. </div>
  583. <div class="col-md-2 gray-bg">
  584. <center>Inactive Text</center>
  585. <input name="inactivetext" id="inactivetext" class="form-control jscolor {hash:true}" value="<?=$inactivetext;?>">
  586. </div>
  587. </div>
  588. </div>
  589. </form>
  590. </div>
  591. </div>
  592. </div>
  593. </div>
  594. </div>
  595. </div>
  596. <!--End Content-->
  597. <!--Welcome notification-->
  598. <div id="welcome"></div>
  599. </div>
  600. <?php if(!$USER->authenticated) : ?>
  601. <?php endif;?>
  602. <?php if($USER->authenticated) : ?>
  603. <?php endif;?>
  604. <!--Scripts-->
  605. <script src="bower_components/jquery/dist/jquery.min.js"></script>
  606. <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
  607. <script src="bower_components/metisMenu/dist/metisMenu.min.js"></script>
  608. <script src="bower_components/Waves/dist/waves.min.js"></script>
  609. <script src="bower_components/moment/min/moment.min.js"></script>
  610. <script src="bower_components/jquery.nicescroll/jquery.nicescroll.min.js"></script>
  611. <script src="bower_components/slimScroll/jquery.slimscroll.min.js"></script>
  612. <script src="bower_components/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.js"></script>
  613. <script src="bower_components/cta/dist/cta.min.js"></script>
  614. <!--Menu-->
  615. <script src="js/menu/classie.js"></script>
  616. <script src="bower_components/iconpick/dist/js/fontawesome-iconpicker.js"></script>
  617. <!--Selects-->
  618. <script src="js/selects/selectFx.js"></script>
  619. <script src="js/jscolor.js"></script>
  620. <script src="bower_components/sweetalert/dist/sweetalert.min.js"></script>
  621. <script src="bower_components/smoke/dist/js/smoke.min.js"></script>
  622. <!--Notification-->
  623. <script src="js/notifications/notificationFx.js"></script>
  624. <script src="js/jqueri_ui_custom/jquery-ui.min.js"></script>
  625. <script src="js/jquery.filer.min.js" type="text/javascript"></script>
  626. <script src="js/custom.js" type="text/javascript"></script>
  627. <?php if($_POST['op']) : ?>
  628. <script>
  629. $.smkAlert({
  630. text: '<?php echo printArray($USER->info_log); ?>',
  631. type: 'info'
  632. });
  633. <?php if(!empty($USER->error_log)) : ?>
  634. $.smkAlert({
  635. position: 'top-left',
  636. text: '<?php echo printArray($USER->error_log); ?>',
  637. type: 'warning'
  638. });
  639. <?php endif; ?>
  640. </script>
  641. <?php endif; ?>
  642. <?php if($action == "addTabz") : ?>
  643. <script>
  644. if(!window.location.hash) {
  645. window.location = window.location + '#loaded';
  646. window.location.reload();
  647. }else{
  648. swal("Tabs Saved!", "Apply Changes To Reload The Page!", "success");
  649. }
  650. </script>
  651. <?php endif; ?>
  652. <?php if($action == "addOptionz") : ?>
  653. <script>
  654. swal("Colors Saved!", "Apply Changes To Reload The Page!", "success");
  655. </script>
  656. <?php endif; ?>
  657. <script>
  658. (function($) {
  659. function startTrigger(e,data) {
  660. var $elem = $(this);
  661. $elem.data('mouseheld_timeout', setTimeout(function() {
  662. $elem.trigger('mouseheld');
  663. }, e.data));
  664. }
  665. function stopTrigger() {
  666. var $elem = $(this);
  667. clearTimeout($elem.data('mouseheld_timeout'));
  668. }
  669. var mouseheld = $.event.special.mouseheld = {
  670. setup: function(data) {
  671. var $this = $(this);
  672. $this.bind('mousedown', +data || mouseheld.time, startTrigger);
  673. $this.bind('mouseleave mouseup', stopTrigger);
  674. },
  675. teardown: function() {
  676. var $this = $(this);
  677. $this.unbind('mousedown', startTrigger);
  678. $this.unbind('mouseleave mouseup', stopTrigger);
  679. },
  680. time: 200 // default to 750ms
  681. };
  682. })(jQuery);
  683. $(function () {
  684. //$(".todo ul").sortable();
  685. $(".todo ul").sortable({
  686. 'containment': 'parent',
  687. 'opacity': 0.9
  688. });
  689. $("#add_tab").on('submit', function (e) {
  690. e.preventDefault();
  691. var $toDo = $(this).find('.name-of-todo');
  692. toDo_name = $toDo.val();
  693. if (toDo_name.length >= 3) {
  694. var newid = $('.list-group-item').length + 1;
  695. $(".todo ul").append(
  696. '<li id="item-' + newid + '" class="list-group-item gray-bg" style="position: relative; left: 0px; top: 0px;"><tab class="content-form form-inline"> <div class="form-group"><div class="action-btns" style="width:calc(100%)"><a class="" style="margin-left: 0px"><span class="fa fa-hand-paper-o"></span></a></div></div> <div class="form-group"><input style="width: 100%;" type="text" class="form-control material input-sm" name="name-' + newid + '" id="name[' + newid + ']" placeholder="New Tab Name" value="' + toDo_name + '"></div> <div class="form-group"><input style="width: 100%;" type="text" class="form-control material input-sm" name="url-' + newid + '" id="url[' + newid + ']" placeholder="Tab URL"></div> <div style="margin-right: 5px;" class="form-group"><div class="input-group"><input style="width: 100%;" name="icon-' + newid + '" data-placement="bottomRight" class="form-control material icp-auto" value="fa-diamond" type="text" /><span class="input-group-addon"></span></div> - OR -</div> <div class="form-group"><input style="width: 100%;" type="text" class="form-control material input-sm" id="iconurl-' + newid + '" name="iconurl-' + newid + '" placeholder="Icon URL" value=""></div> <div class="form-group"> <div class="radio radio-danger"> <input type="radio" name="default" id="default[' + newid + ']" name="default"> <label for="default[' + newid + ']">Default</label></div></div> <div class="form-group"><div class=""><input id="" class="switcher switcher-success" value="false" name="active-' + newid + '" type="hidden"><input name="active-' + newid + '" id="active[' + newid + ']" class="switcher switcher-success" type="checkbox" checked=""><label for="active[' + newid + ']"></label></div> Active</div> <div class="form-group"><div class=""><input id="" class="switcher switcher-primary" value="false" name="user-' + newid + '" type="hidden"><input id="user[' + newid + ']" name="user-' + newid + '" class="switcher switcher-primary" type="checkbox" checked=""><label for="user[' + newid + ']"></label></div> User</div> <div class="form-group"><div class=""><input id="" class="switcher switcher-primary" value="false" name="guest-' + newid + '" type="hidden"><input name="guest-' + newid + '" id="guest[' + newid + ']" class="switcher switcher-warning" type="checkbox" checked=""><label for="guest[' + newid + ']"></label></div> Guest</div> <div class="form-group"><div class=""><input id="" class="switcher switcher-primary" value="false" name="window-' + newid + '" type="hidden"><input name="window-' + newid + '" id="window[' + newid + ']" class="switcher switcher-warning" type="checkbox"><label for="window[' + newid + ']"></label></div> No iFrame</div><div class="pull-right action-btns" style="padding-top: 8px;"><a class="trash"><span class="fa fa-close"></span></a></div></tab></li>'
  697. );
  698. $('.icp-auto').iconpicker({placement: 'left', hideOnSelect: false, collision: true});
  699. var eventObject = {
  700. title: $.trim($("#" + newid).text()),
  701. className: $("#" + newid).attr("data-bg"),
  702. stick: true
  703. };
  704. $("#" + newid).data('eventObject', eventObject);
  705. $toDo.val('').focus();
  706. } else {
  707. $toDo.focus();
  708. }
  709. });
  710. count();
  711. $(".list-group-item").addClass("list-item");
  712. //Remove one completed item
  713. $(document).on('click', '.trash', function (e) {
  714. var clearedCompItem = $(this).closest(".list-group-item").remove();
  715. e.preventDefault();
  716. count();
  717. });
  718. //Count items
  719. function count() {
  720. var active = $('.list-group-item').length;
  721. $('.total-tabs span').text(active);
  722. };
  723. $("#submitTabs").on('submit', function (e) {
  724. console.log("submitted");
  725. $("div.radio").each(function(i) {
  726. $(this).find('input').attr('name', 'default-' + i);
  727. console.log(i);
  728. });
  729. $('form input[type="radio"]').not(':checked').each(function() {
  730. $(this).prop('checked', true);
  731. $(this).prop('value', "false");
  732. console.log("found unchecked");
  733. });
  734. });
  735. $('#apply').on('click touchstart', function(){
  736. window.parent.location.reload();
  737. });
  738. });
  739. </script>
  740. <script>
  741. $("#iconHide").click(function(){
  742. $( "div[class^='jFiler jFiler-theme-dragdropbox']" ).toggle();
  743. });
  744. $(".deleteUser").click(function(){
  745. var parent_id = $(this).parent().attr('id');
  746. editUsername = $('#unregister').find('#inputUsername');
  747. $(editUsername).html('<input type="hidden" name="username"value="' + parent_id + '" />');
  748. });
  749. $('.icp-auto').iconpicker({placement: 'left', hideOnSelect: false, collision: true});
  750. $("li[class^='list-group-item']").bind('mouseheld', function(e) {
  751. $(this).find("span[class^='fa fa-hand-paper-o']").attr("class", "fa fa-hand-grab-o");
  752. $(this).mouseup(function() {
  753. $(this).find("span[class^='fa fa-hand-grab-o']").attr("class", "fa fa-hand-paper-o");
  754. });
  755. })
  756. </script>
  757. <script>
  758. //Custom Themes
  759. function changeColor(elementName, elementColor) {
  760. var definedElement = document.getElementById(elementName);
  761. definedElement.value = elementColor;
  762. definedElement.style.backgroundColor = elementColor;
  763. }
  764. $('#plexTheme').on('click touchstart', function(){
  765. changeColor("topbartext", "#E49F0C");
  766. changeColor("topbar", "#000000");
  767. changeColor("bottombar", "#000000");
  768. changeColor("sidebar", "#121212");
  769. changeColor("hoverbg", "#FFFFFF");
  770. changeColor("activetabBG", "#E49F0C");
  771. changeColor("activetabicon", "#FFFFFF");
  772. changeColor("activetabtext", "#FFFFFF");
  773. changeColor("inactiveicon", "#949494");
  774. changeColor("inactivetext", "#B8B8B8");
  775. });
  776. $('#embyTheme').on('click touchstart', function(){
  777. changeColor("topbartext", "#52B54B");
  778. changeColor("topbar", "#212121");
  779. changeColor("bottombar", "#212121");
  780. changeColor("sidebar", "#121212");
  781. changeColor("hoverbg", "#FFFFFF");
  782. changeColor("activetabBG", "#52B54B");
  783. changeColor("activetabicon", "#FFFFFF");
  784. changeColor("activetabtext", "#FFFFFF");
  785. changeColor("inactiveicon", "#949494");
  786. changeColor("inactivetext", "#B8B8B8");
  787. });
  788. $('#bookTheme').on('click touchstart', function(){
  789. changeColor("topbartext", "#FFFFFF");
  790. changeColor("topbar", "#3B5998");
  791. changeColor("bottombar", "#3B5998");
  792. changeColor("sidebar", "#8B9DC3");
  793. changeColor("hoverbg", "#FFFFFF");
  794. changeColor("activetabBG", "#3B5998");
  795. changeColor("activetabicon", "#FFFFFF");
  796. changeColor("activetabtext", "#FFFFFF");
  797. changeColor("inactiveicon", "#DFE3EE");
  798. changeColor("inactivetext", "#DFE3EE");
  799. });
  800. $('#spaTheme').on('click touchstart', function(){
  801. changeColor("topbartext", "#5B391E");
  802. changeColor("topbar", "#66BBAE");
  803. changeColor("bottombar", "#66BBAE");
  804. changeColor("sidebar", "#C3EEE7");
  805. changeColor("hoverbg", "#66BBAE");
  806. changeColor("activetabBG", "#C6C386");
  807. changeColor("activetabicon", "#FFFFFF");
  808. changeColor("activetabtext", "#FFFFFF");
  809. changeColor("inactiveicon", "#5B391E");
  810. changeColor("inactivetext", "#5B391E");
  811. });
  812. $('#darklyTheme').on('click touchstart', function(){
  813. changeColor("topbartext", "#FFFFFF");
  814. changeColor("topbar", "#375A7F");
  815. changeColor("bottombar", "#375A7F");
  816. changeColor("sidebar", "#222222");
  817. changeColor("hoverbg", "#464545");
  818. changeColor("activetabBG", "#FFFFFF");
  819. changeColor("activetabicon", "#464545");
  820. changeColor("activetabtext", "#464545");
  821. changeColor("inactiveicon", "#0CE3AC");
  822. changeColor("inactivetext", "#0CE3AC");
  823. });
  824. $('#slateTheme').on('click touchstart', function(){
  825. changeColor("topbartext", "#C8C8C8");
  826. changeColor("topbar", "#272B30");
  827. changeColor("bottombar", "#272B30");
  828. changeColor("sidebar", "#32383E");
  829. changeColor("hoverbg", "#58C0DE");
  830. changeColor("activetabBG", "#3E444C");
  831. changeColor("activetabicon", "#C8C8C8");
  832. changeColor("activetabtext", "#FFFFFF");
  833. changeColor("inactiveicon", "#C8C8C8");
  834. changeColor("inactivetext", "#C8C8C8");
  835. });
  836. </script>
  837. <script>
  838. $( document ).ready(function() {
  839. $( "div[class^='jFiler jFiler-theme-dragdropbox']" ).hide();
  840. $.ajax({
  841. type: "GET",
  842. url: "https://api.github.com/repos/causefx/Organizr/releases/latest",
  843. dataType: "json",
  844. success: function(github) {
  845. var currentVersion = "0.97";
  846. var githubVersion = github.tag_name;
  847. var githubDescription = github.body;
  848. var githubName = github.name;
  849. infoTabVersion = $('#about').find('#version');
  850. infoTabNew = $('#about').find('#whatsnew');
  851. infoTabDownload = $('#about').find('#downloadnow');
  852. if(currentVersion < githubVersion){
  853. console.log("You Need To Upgrade");
  854. $.smkAlert({
  855. text: '<strong>New Version Available</strong> Click Info Tab',
  856. type: 'warning',
  857. permanent: true
  858. });
  859. $(infoTabNew).html("<br/><h4><strong>What's New in " + githubVersion + "</strong></h4><strong>Title: </strong>" + githubName + " <br/><strong>Changes: </strong>" + githubDescription);
  860. $(infoTabDownload).html("<br/><a href='https://github.com/causefx/Organizr/archive/master.zip' target='_blank' type='button' class='btn waves btn-labeled btn-success btn-lg text-uppercase waves-effect waves-float'><span class='btn-label'><i class='fa fa-download'></i></span>Download Organizr v." + githubVersion + "</a>");
  861. }else if(currentVersion === githubVersion){
  862. console.log("You Are on Current Version");
  863. $.smkAlert({
  864. text: 'Software is <strong>Up-To-Date!</strong>',
  865. type: 'success'
  866. });
  867. }else{
  868. console.log("something went wrong");
  869. $.smkAlert({
  870. text: '<strong>WTF!? </strong>Can\'t check version.',
  871. type: 'danger',
  872. time: 10
  873. });
  874. }
  875. $(infoTabVersion).html("<strong>Installed Version: </strong>" + currentVersion + " <strong>Current Version: </strong>" + githubVersion);
  876. }
  877. });
  878. });
  879. </script>
  880. </body>
  881. </html>