Просмотр исходного кода

Initial Commit

Ready for beta!
causefx 10 лет назад
Родитель
Сommit
a3dc7147f1

+ 9 - 0
css/bootstrap-iconpicker.min.css

@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap-iconpicker v1.7.0
+ *
+ * Copyright 2013-2015 Victor Valencia Rico.
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @recktoner.
+ */.iconpicker .caret{margin-left:10px!important}.iconpicker{min-width:60px}.iconpicker input.search-control{margin-bottom:6px;margin-top:6px}div.iconpicker.left .table-icons{margin-right:auto}div.iconpicker.center .table-icons{margin-left:auto;margin-right:auto}div.iconpicker.right .table-icons{margin-left:auto}.table-icons .btn{min-height:30px;min-width:35px;text-align:center;padding:0;margin:2px}.table-icons td{min-width:39px}.popover{max-width:inherit!important}.iconpicker-popover{z-index:1050!important}.iconpicker-popover .search-control{margin-bottom:6px;margin-top:6px}

Разница между файлами не показана из-за своего большого размера
+ 4 - 0
css/bootstrap.min.css


Разница между файлами не показана из-за своего большого размера
+ 3 - 0
css/font-awesome.min.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
css/min.css


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
css/tabs.flat.min.css


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
css/tabs.min.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
css/zozo.examples.min.css


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
css/zozo.tabs.flat.min.css


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
css/zozo.tabs.min.css


+ 34 - 0
example.ini.php

@@ -0,0 +1,34 @@
+[general]
+title = "iCauseFX"
+password = "$5$rounds=10000$eouObTi7kzkrVSUi$SWDzat61s1exrkWhI6DzRnlPI2b6oGHjiLmBM.T/BL0"
+useicons = "true"
+[Sonarr]
+url = "https://sonarr.tv/"
+icon = "fa-desktop"
+enabled = "true"
+[QNAP]
+url = "https://www.qnap.com/i/useng/"
+icon = "fa-cubes"
+enabled = "true"
+[Movies]
+url = "https://couchpota.to/"
+icon = "fa-film"
+enabled = "true"
+[Proxy]
+url = "https://www.glype.com/"
+icon = "fa-bug"
+enabled = "true"
+guest = "true"
+[Request]
+url = "http://plexrequests.8bits.ca/"
+icon = "fa-search"
+enabled = "true"
+guest = "true"
+[Server]
+url = "http://phpsysinfo.github.io/phpsysinfo/"
+icon = "fa-database"
+enabled = "true"
+[NZB]
+url = "http://nzbget.net/"
+icon = "fa-cloud-download"
+enabled = "true"



BIN
img/loading-image.gif


BIN
img/z-tabs-icons.png


+ 126 - 0
index.php

@@ -0,0 +1,126 @@
+<?php
+
+try {
+    $config = parse_ini_file('settings.ini.php', true);
+} catch(Exception $e) {
+    die('<b>Unable to read config.ini.php. Did you rename it from config.ini.php-example?</b><br><br>Error message: ' .$e->getMessage());
+}
+
+foreach ($config as $keyname => $section) {
+        
+        if(!empty($section["useicons"]) && ($section["useicons"]=="true")){ 
+            
+            $icons = "active"; 
+            
+            $guesticons = "<span><i class=\"fa fa-toggle-on\"></i></span>";
+            $adminicons = "<span><i class=\"fa fa-toggle-on\"></i></span>";
+        }
+    
+        //Guest
+        if(!isset($_COOKIE["logged"]) && !empty($section["enabled"]) && ($section["enabled"]=="true") && !empty($section["guest"]) && ($section["guest"]=="true") ) {
+            if($icons == "active"){ $listicons = "<span><i class=\"fa ". $section["icon"] ."\"></i></span>"; }
+            $loadedlist .= "<li><a>" . $keyname . " " . $listicons ."</a></li>\n";
+            $loadedurls .= "<div class=\"z-nopadding\" data-content-url=\"". $section["url"] ."\" data-content-type=\"iframe\"></div>\n";
+                            
+        }
+        //Full Access
+        if(isset($_COOKIE["logged"]) && !empty($section["enabled"]) && ($section["enabled"]=="true")) {
+            if($icons == "active"){ $listicons = "<span><i class=\"fa ". $section["icon"] ."\"></i></span>"; }
+            $loadedlist .= "<li><a>" . $keyname . " " . $listicons ."</a></li>\n";
+            $loadedurls .= "<div class=\"z-nopadding\" data-content-url=\"". $section["url"] ."\" data-content-type=\"iframe\"></div>\n";
+            
+        }
+        //General
+        if (empty($title)) $title = 'Manage My HTPC';
+        if(($keyname == "general")) { $title = $section["title"]; }
+
+}
+if(!isset($_COOKIE["logged"])){
+    $lasttablist .= "<li><a>Login" . $guesticons . "</a></li>\n";
+    $lasttaburl .= "<div class=\"z-nopadding\" data-content-url=\"setup.php\" data-content-type=\"iframe\"></div>\n";
+}
+
+if(isset($_COOKIE["logged"])){
+    $lasttablist .= "<li><a>Settings" . $adminicons . "</a></li>\n";
+    $lasttaburl .= "<div class=\"z-nopadding\" data-content-url=\"setup.php\" data-content-type=\"iframe\"></div>\n";
+}
+
+if(!file_exists('settings.ini.php')){
+    $lasttablist = "<li><a>Setup<span><i class=\"fa fa-spinner\"></i></span></a></li>\n";
+    $lasttaburl = "<div class=\"z-nopadding\" data-content-url=\"setup.php\" data-content-type=\"iframe\"></div>\n";
+}
+
+?>
+<!doctype html>
+<html class="z-white z-width1200">
+
+    <head>
+
+        <title><?=$title;?></title>
+        <meta charset="utf-8">
+        <meta name="viewport" content="width = device-width, initial-scale = 1.0" />
+        <link href="css/min.css" rel="stylesheet" />
+        <link href="css/tabs.min.css" rel="stylesheet" />
+        <script src="js/jquery.min.js"></script>
+        <script src="js/tabs.min.js"></script>
+        <link rel='stylesheet prefetch' href='https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css'>
+
+    </head>
+
+    <body style="position: fixed; top: 0; right: 0; bottom: 0; left: 0;background: url(img/bg.jpg) no-repeat center center fixed; 
+  -webkit-background-size: cover;
+  -moz-background-size: cover;
+  -o-background-size: cover;
+  background-size: cover;">
+
+        <span>&nbsp;</span>
+
+        <div id="page">
+
+            <!--Tabs Start-->
+            <div id="tabbed-nav">
+
+                <ul>
+
+                    <?=$loadedlist;?>
+                    <?=$lasttablist;?>
+
+                </ul>
+
+                <!-- Content container -->
+                <div>              
+
+                    <?=$loadedurls;?>
+                    <?=$lasttaburl;?>
+
+                </div>
+
+            </div>
+            <!--Tabs End-->
+
+        </div>
+
+        <script>
+            jQuery(document).ready(function ($) {
+                /* jQuery activation and setting options for the tabs*/
+                $("#tabbed-nav").zozoTabs({
+                    defaultTab: "tab1",
+                    multiline: true,
+                    theme: "white",
+                    position: "top-compact",
+                    size: "medium",
+                    animation: {
+                        easing: "easeInOutExpo",
+                        duration: 450,
+                        effects: "fade"
+                    }
+                });
+            });
+        </script>
+        <script>
+            jQuery('iframe','#container').attr('src',url);
+        </script>
+
+    </body>
+    
+</html>

Разница между файлами не показана из-за своего большого размера
+ 18 - 0
js/bootstrap-iconpicker.min.js


Разница между файлами не показана из-за своего большого размера
+ 5 - 0
js/bootstrap.min.js


Разница между файлами не показана из-за своего большого размера
+ 21 - 0
js/iconset-fontawesome-4.2.0.min.js


Разница между файлами не показана из-за своего большого размера
+ 3 - 0
js/jquery-1.10.2.min.js


+ 390 - 0
js/jquery.ba-hashchange.js

@@ -0,0 +1,390 @@
+/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery hashchange event
+//
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    $.browser.msie && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);

Разница между файлами не показана из-за своего большого размера
+ 4 - 0
js/jquery.easing.min.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
js/jquery.min.js


Разница между файлами не показана из-за своего большого размера
+ 16 - 0
js/tabs.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
js/tabs.min.js


Разница между файлами не показана из-за своего большого размера
+ 16 - 0
js/zozo.tabs.js


Разница между файлами не показана из-за своего большого размера
+ 11 - 0
js/zozo.tabs.min.js


+ 238 - 0
settings.php

@@ -0,0 +1,238 @@
+<?php
+if((!isset($_COOKIE["logged"]))){
+    echo "<!DOCTYPE html>";
+    echo "<head>";
+    echo "<title>Form submitted</title>";
+    echo "<script type='text/javascript'>window.location.replace('setup.php');</script>";
+    echo "</head>";
+    echo "<body></body></html>";
+    die;
+    
+}
+
+if(isset($_GET["action"])){$action = $_GET["action"];}
+
+function write_ini_file($content, $path) { 
+
+
+    if (!$handle = fopen($path, 'w')) { 
+        return false; 
+    }
+
+    $success = fwrite($handle, $content);
+    fclose($handle); 
+
+    return $success; 
+}
+
+//ini_set('display_errors',1);  error_reporting(E_ALL);
+
+$configfile = 'settings.ini.php';
+$examplefile = 'example.ini.php';
+
+try {
+    $config = parse_ini_file('settings.ini.php', true);
+} catch(Exception $e) {
+    die('<b>Unable to read settings.ini.php.</b><br><br>Error message: ' .$e->getMessage());
+}
+                                                
+?>
+
+
+<link rel='stylesheet prefetch' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css'>
+<link rel='stylesheet prefetch' href='https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css'>
+<!-- Bootstrap -->
+<link rel="stylesheet" href="css/bootstrap.min.css"/>
+<!-- Font Awesome -->
+<link rel="stylesheet" href="css/font-awesome.min.css"/>
+<!-- Bootstrap-Iconpicker -->
+<link rel="stylesheet" href="css/bootstrap-iconpicker.min.css"/>
+        
+<style>
+body {
+    margin: 50px;
+}
+
+.fa {
+  min-width: 14px;
+}
+
+.form-inline .form-control,
+.form-inline .btn {
+  margin-bottom: 8px;
+}
+
+.form-group {
+  width: 100%;
+}
+    
+input[type=checkbox].css-checkbox {
+							position:absolute; z-index:-1000; left:-1000px; overflow: hidden; clip: rect(0 0 0 0); height:1px; width:1px; margin:-1px; padding:0; border:0;
+						}
+
+						input[type=checkbox].css-checkbox + label.css-label {
+							padding-left:55px;
+							height:30px; 
+							display:inline-block;
+							line-height:30px;
+							background-repeat:no-repeat;
+							background-position: 0 0;
+							font-size:30px;
+							vertical-align:middle;
+							cursor:pointer;
+
+						}
+
+						input[type=checkbox].css-checkbox:checked + label.css-label {
+							background-position: 0 -30px;
+						}
+						label.css-label {
+				background-image:url(img/check.png);
+				-webkit-touch-callout: none;
+				-webkit-user-select: none;
+				-khtml-user-select: none;
+				-moz-user-select: none;
+				-ms-user-select: none;
+				user-select: none;
+			}
+    hr {
+    display: block;
+    height: 1px;
+    border: 0;
+    border-top: 1px solid #ccc;
+    margin: 1em 0 auto;
+    padding: 0;
+}
+</style>
+
+<body>
+      
+                 
+<?
+
+
+//Password crap
+foreach ($config as $keyname => $section) { if(($keyname == "general")) { $nopass = $section["password"]; } }
+$salt = substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
+$rounds = 10000;
+if(empty($_POST["password-0"])){ $_POST["password-0"] = $nopass;}
+if(strlen($_POST["password-0"]) < 50){ $_POST["password-0"] = crypt($_POST["password-0"], sprintf('$5$rounds=%d$%s$', $rounds, $salt)); }
+//password crap      
+
+foreach ($_POST as $parameter => $value) {
+    $splitParameter = explode('-', $parameter);
+    if ($value == "on")
+        $value = "true";
+
+    
+    if($splitParameter[0] == "category"){ $sampleData .= "[" . $value . "]\r\n"; }else{ $sampleData .= $splitParameter[0] . " = \"" . $value . "\"\r\n"; }
+
+
+}
+      if($action == "write"){
+write_ini_file($sampleData, $configfile);
+
+          sleep(.5);
+              echo "<!DOCTYPE html>";
+    echo "<head>";
+    echo "<title>Form submitted</title>";
+    echo "<script type='text/javascript'>window.location.replace('settings.php');</script>";
+    echo "</head>";
+    echo "<body></body></html>";
+
+}
+      ?>
+      
+     
+
+    <form action="?action=write" method="post" name="adminForm" class="form-inline">
+        <?foreach ($config as $keyname => $section) {
+            if(($keyname == "general")) {
+                echo '<div class="form-group clearfix">';
+                echo '<input type="hidden" name="category-0" class="form-control" value="general">';
+                echo '<span class="btn btn-inactive " type="button"><span class="fa fa-cog"></span></span> ';
+                echo '<input type="text" name="title-0" class="form-control" value="'. $section["title"] .'"> ';
+                echo '<input type="text" name="password-0" class="form-control" placeholder="Leave Blank if no change" value=""> ';
+                if($section['useicons'] == "true"){echo '<input type="checkbox" name="useicons-0" id="useicons-0" class="css-checkbox" checked> ';}else {echo '<input type="checkbox" name="useicons-0" id="useicons-0" class="css-checkbox"> ';}
+                echo '<label for="useicons-0" class="css-label">Icons</label></div><br/><hr/><br/> ';
+            }}?>  
+    
+
+<div id="tagsForm" class="sortable">
+    
+    
+<?
+    $i = 0;
+    foreach ($config as $keyname => $section) {
+    
+        if(($keyname !== "general")) {
+         
+?>  
+  <div class="form-group clearfix">
+    <span class="btn btn-default move" type="button"><span class="fa fa-arrows"></span></span>
+    <input type="text" name="category-<?=$i;?>" class="form-control" value="<?=$keyname;?>">
+    <input type="text" name="url-<?=$i;?>" class="form-control" placeholder="url" value="<?=$section['url']?>">
+    <button data-placement="left" data-cols="5" data-rows="5" class="btn btn-default" name="icon-<?=$i;?>" role="iconpicker" data-iconset="fontawesome" data-icon="<?=$section['icon']?>"></button>
+<? if($section['enabled'] == "true"){echo '<input type="checkbox" name="enabled-' . $i .'" id="enabled-' . $keyname . '" class="css-checkbox" checked>';}else {echo '<input type="checkbox" name="enabled-' . $i .'" id="enabled-' . $keyname . '" class="css-checkbox">';}?>      
+      <label for="enabled-<?=$keyname;?>" class="css-label">Enabled</label> <? if($section['guest'] == "true"){echo '<input type="checkbox" name="guest-' . $i .'" id="guest-' . $keyname . '" class="css-checkbox" checked>';}else {echo '<input type="checkbox" name="guest-' . $i .'" id="guest-' . $keyname . '" class="css-checkbox">';}?>  <label for="guest-<?=$keyname;?>"" class="css-label">Guest</label> <button class="btn btn-danger deleteGroup" id="remScnt" type="button"><span class="fa fa-trash"></span></button>
+
+  </div>
+
+<? 
+    
+        }
+    $i++;
+    }?>
+      
+</div>
+          <div class="form-group clearfix">  
+<button class="btn btn-primary" id="addScnt" type="button"><span class="fa fa-plus"></span></button> 
+           <button class="btn btn-success" type="submit"> Save Settings </button>
+</div>    
+</form>
+
+ <script type="text/javascript" src="https://code.jquery.com/jquery-1.4.3.min.js"></script>
+
+          <script type='text/javascript'> 
+    $(function() {
+        var scntDiv = $('#tagsForm');
+        var i = <?=$i?>;
+        
+        $('#addScnt').on('click', function() {
+                $('<div class="form-group clearfix ui-sortable-handle"> <span class="btn btn-default move" type="button"><span class="fa fa-arrows"></span></span> <input type="text" name="category-' + i +'" class="form-control" placeholder="Tag" value="New Tab"> <input type="text" name="url-' + i +'" class="form-control" placeholder="url" value="Add URL"> <button class="btn btn-default" name="icon-' + i +'" role="iconpicker" data-iconset="fontawesome" data-icon="fa-question"></button> <input type="checkbox" name="enabled-' + i +'" id="enabled-' + i +'" class="css-checkbox"> <label for="enabled-' + i +'" class="css-label">Enabled</label> <input type="checkbox" name="guest-' + i +'" id="guest-' + i +'" class="css-checkbox"> <label for="guest-' + i +'" class="css-label">Guest</label> <button class="btn btn-danger deleteGroup" id="remScnt" type="button"><span class="fa fa-trash"></span></button></div>').appendTo(scntDiv);
+            i++;    
+            return false;
+                
+        });
+        
+        $(document).on('click','#remScnt', function() {
+                
+                        $(this).closest('div').remove();
+                        i--;
+                
+                return false;
+        });
+});
+      
+      </script>
+          
+          <script src='https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>          
+<script src='https://code.jquery.com/ui/1.11.2/jquery-ui.min.js'></script>
+
+<script>$( "#tagsForm" ).sortable({connectWith: ".sortable"});</script>
+
+<!-- jQuery -->
+<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
+<!-- Bootstrap -->
+<script type="text/javascript" src="js/bootstrap.min.js"></script>
+<!-- Bootstrap-Iconpicker Iconset for Font Awesome -->
+<script type="text/javascript" src="js/iconset-fontawesome-4.2.0.min.js"></script>
+<!-- Bootstrap-Iconpicker -->
+<script type="text/javascript" src="js/bootstrap-iconpicker.min.js"></script>
+   
+    
+
+       
+
+
+</body>

+ 84 - 0
setup.php

@@ -0,0 +1,84 @@
+<?php
+
+//ini_set('display_errors',1);  error_reporting(E_ALL);
+
+$configfile = 'settings.ini.php';
+$examplefile = 'example.ini.php';
+
+if(!file_exists($filename) && !file_exists($examplefile)){
+    die('You are missing the ini configuration file, please download and refresh this page');
+}
+
+if(!file_exists($configfile)){
+    echo "The file $configfile does not exist, we will make a copy now...<br/><br/>";
+    if (!is_writable(dirname($examplefile)))
+        die('We don\'t have access to write to the current directory, please change the permissions to this directory.');
+    else {
+        copy($examplefile, $configfile);
+        sleep(2);
+        echo "<!DOCTYPE html>";
+        echo "<head>";
+        echo "<title>Form submitted</title>";
+        echo "<script type='text/javascript'>window.parent.location.reload()</script>";
+        echo "</head>";
+        echo "<body></body></html>";
+    }
+}
+
+try {
+    $config = parse_ini_file('settings.ini.php', true);
+} catch(Exception $e) {
+    die('<b>Unable to read config.ini.php. Did you rename it from settings.ini.php-example?</b><br><br>Error message: ' .$e->getMessage());
+}
+
+foreach ($config as $keyname => $section) {
+    
+        if(($keyname == "general")) { $hash_pass = $section["password"]; }
+
+}
+
+/*$salt = substr(str_replace('+','.',base64_encode(md5(mt_rand(), true))),0,16);
+$rounds = 10000;
+$given_hash = crypt($realpass, sprintf('$5$rounds=%d$%s$', $rounds, $salt));
+*/
+
+$pass = isset( $_POST["pass"] ) ? $_POST["pass"] : "none" ;
+
+if(isset( $_POST["pass"] ) && $pass !== "none"){ $error = "Wrong Password!";}
+
+$parts = explode('$', $hash_pass);
+$test_hash = crypt($pass, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));
+
+if(($hash_pass == $test_hash)){ 
+    setcookie("logged", "Dashboard", time() + (86400 * 7), "/");
+    //echo "<meta http-equiv='refresh' content='0'>";
+        echo "<!DOCTYPE html>";
+        echo "<head>";
+        echo "<title>Form submitted</title>";
+        echo "<script type='text/javascript'>window.parent.location.reload()</script>";
+        echo "</head>";
+        echo "<body></body></html>";
+} 
+    
+if((!isset($_COOKIE["logged"]))){
+
+    echo "<center><B>Please Login to Contiune<br/><br/>";
+    echo $error . "<br/>";
+    echo "<style> .css-input { padding:8px; border-radius:47px; border-width:3px; border-style:double; font-size:17px; border-color:#0a090a; box-shadow: 2px 6px 8px 0px rgba(42,42,42,.75); font-weight:bold;  } 
+		 .css-input:focus { outline:none; } </style>";
+    echo "<form method='POST'>";
+    echo "<b>Password: </b><input class='css-input' type='password' name='pass'></input>            ";
+    echo "<input class='css-input' type='submit' name='submit' value='Go'></input>";
+    echo "</form></center>";
+    
+}else{
+    
+        echo "<!DOCTYPE html>";
+    echo "<head>";
+    echo "<title>Form submitted</title>";
+    echo "<script type='text/javascript'>window.location.replace('settings.php');</script>";
+    echo "</head>";
+    echo "<body></body></html>";
+    
+}
+?>

Некоторые файлы не были показаны из-за большого количества измененных файлов