diff --git a/config/config.php.sample b/config/config.php.sample
index cfcd76e3..72ac34cf 100644
--- a/config/config.php.sample
+++ b/config/config.php.sample
@@ -38,6 +38,17 @@ return array(
'debug'=>'Debug information',
'raw'=>'Raw report dump',
),
+
+ //this enebales one to change the default bootstrap theme
+ 'bootstrap_theme' => 'default',
+
+ //this list all the available themes for a user to switch and use the one he or she likes
+ //once removed the theme will not appear in the dropdown
+ //if all to be removed - no dropdown will be visible for the user and the default (above) will be used
+ 'bootstrap_themelist' => array(
+ 'default',
+ 'amelia', 'cerulean', 'cosmo', 'cyborg', 'flatly', 'journal', 'readable', 'simplex', 'slate', 'spacelab', 'united'
+ ),
//email settings
'mail_settings' => array(
diff --git a/lib/PhpReports/PhpReports.php b/lib/PhpReports/PhpReports.php
index 4007b670..27574910 100644
--- a/lib/PhpReports/PhpReports.php
+++ b/lib/PhpReports/PhpReports.php
@@ -225,6 +225,7 @@ public static function listReports() {
$template_vars['reports'] = $reports;
$template_vars['report_errors'] = $errors;
+ $template_vars['theme'] = $_COOKIE['reports-theme'] != '' ? $_COOKIE['reports-theme'] : self::$config['bootstrap_theme'];
$start = microtime(true);
echo self::render('html/report_list',$template_vars);
diff --git a/public/css/bootstrap.defualt.min.css b/public/css/bootstrap.default.min.css
similarity index 100%
rename from public/css/bootstrap.defualt.min.css
rename to public/css/bootstrap.default.min.css
diff --git a/public/js/jquery.cookie.js b/public/js/jquery.cookie.js
new file mode 100644
index 00000000..9a25dc28
--- /dev/null
+++ b/public/js/jquery.cookie.js
@@ -0,0 +1,107 @@
+/*!
+ * jQuery Cookie Plugin v1.3.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as anonymous module.
+ define(['jquery'], factory);
+ } else {
+ // Browser globals.
+ factory(jQuery);
+ }
+}(function ($) {
+
+ var pluses = /\+/g;
+
+ function decode(s) {
+ if (config.raw) {
+ return s;
+ }
+ try {
+ // If we can't decode the cookie, ignore it, it's unusable.
+ return decodeURIComponent(s.replace(pluses, ' '));
+ } catch(e) {}
+ }
+
+ function decodeAndParse(s) {
+ if (s.indexOf('"') === 0) {
+ // This is a quoted cookie as according to RFC2068, unescape...
+ s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+ }
+
+ s = decode(s);
+
+ try {
+ // If we can't parse the cookie, ignore it, it's unusable.
+ return config.json ? JSON.parse(s) : s;
+ } catch(e) {}
+ }
+
+ var config = $.cookie = function (key, value, options) {
+
+ // Write
+ if (value !== undefined) {
+ options = $.extend({}, config.defaults, options);
+
+ if (typeof options.expires === 'number') {
+ var days = options.expires, t = options.expires = new Date();
+ t.setDate(t.getDate() + days);
+ }
+
+ value = config.json ? JSON.stringify(value) : String(value);
+
+ return (document.cookie = [
+ config.raw ? key : encodeURIComponent(key),
+ '=',
+ config.raw ? value : encodeURIComponent(value),
+ options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+ options.path ? '; path=' + options.path : '',
+ options.domain ? '; domain=' + options.domain : '',
+ options.secure ? '; secure' : ''
+ ].join(''));
+ }
+
+ // Read
+
+ var result = key ? undefined : {};
+
+ // To prevent the for loop in the first place assign an empty array
+ // in case there are no cookies at all. Also prevents odd result when
+ // calling $.cookie().
+ var cookies = document.cookie ? document.cookie.split('; ') : [];
+
+ for (var i = 0, l = cookies.length; i < l; i++) {
+ var parts = cookies[i].split('=');
+ var name = decode(parts.shift());
+ var cookie = parts.join('=');
+
+ if (key && key === name) {
+ result = decodeAndParse(cookie);
+ break;
+ }
+
+ // Prevent storing a cookie that we couldn't decode.
+ if (!key && (cookie = decodeAndParse(cookie)) !== undefined) {
+ result[name] = cookie;
+ }
+ }
+
+ return result;
+ };
+
+ config.defaults = {};
+
+ $.removeCookie = function (key, options) {
+ if ($.cookie(key) !== undefined) {
+ // Must not alter options, thus extending a fresh object...
+ $.cookie(key, '', $.extend({}, options, { expires: -1 }));
+ return true;
+ }
+ return false;
+ };
+
+}));
diff --git a/templates/default/html/page.twig b/templates/default/html/page.twig
index 8993489c..c135a4fa 100644
--- a/templates/default/html/page.twig
+++ b/templates/default/html/page.twig
@@ -7,7 +7,7 @@
{% block stylesheets %}
-
+