├── README.md ├── test └── app-test.js ├── .gitignore ├── public ├── img │ ├── bg.jpg │ ├── icons │ │ ├── 16 │ │ │ ├── users.png │ │ │ ├── console.png │ │ │ ├── players.png │ │ │ ├── plugins.png │ │ │ ├── servers.png │ │ │ ├── settings.png │ │ │ ├── updates.png │ │ │ ├── worlds.png │ │ │ ├── dashboard.png │ │ │ ├── users_grey.png │ │ │ ├── console_grey.png │ │ │ ├── players_grey.png │ │ │ ├── plugins_grey.png │ │ │ ├── servers_grey.png │ │ │ ├── settings_grey.png │ │ │ ├── updates_grey.png │ │ │ ├── worlds_grey.png │ │ │ └── dashboard_grey.png │ │ ├── users.png │ │ ├── worlds.png │ │ ├── console.png │ │ ├── players.png │ │ ├── plugins.png │ │ ├── servers.png │ │ ├── settings.png │ │ ├── updates.png │ │ ├── dashboard.png │ │ ├── users_grey.png │ │ ├── worlds_grey.png │ │ ├── console_grey.png │ │ ├── players_grey.png │ │ ├── plugins_grey.png │ │ ├── servers_grey.png │ │ ├── settings_grey.png │ │ ├── updates_grey.png │ │ └── dashboard_grey.png │ ├── progress_bg.png │ ├── progress_bg2.png │ ├── progress_fg.png │ ├── progress_fg2.png │ └── progress_fg.old.png ├── css │ ├── bootstrap │ │ ├── images │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ ├── ui-icons_888888_256x240.png │ │ │ ├── ui-icons_cd0a0a_256x240.png │ │ │ ├── ui-icons_f6cf3b_256x240.png │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ │ ├── ui-bg_glass_75_dadada_1x400.png │ │ │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ │ │ ├── ui-bg_glass_75_ffffff_1x400.png │ │ │ ├── ui-bg_inset-soft_95_fef1ec_1x100.png │ │ │ └── ui-bg_highlight-soft_75_cccccc_1x100.png │ │ ├── jquery.ui.1.8.16.ie.css │ │ └── jquery-ui-1.8.16.custom.css │ ├── icons.css │ └── style.css └── js │ ├── api.js │ ├── docready.js │ ├── console.js │ ├── dashboard.js │ ├── util.js │ └── jquery.progress.js ├── app ├── views │ ├── 404.jade │ ├── 500.jade │ ├── users │ │ ├── login.jade │ │ └── register.jade │ ├── home.jade │ └── layouts │ │ └── default.jade ├── controllers │ ├── users-controller.js │ └── systems-controller.js └── models │ └── user.js ├── .gitmodules ├── config └── psm.yml ├── lib ├── auth.js ├── errors.js ├── utils.js └── configure.js ├── package.json └── app.js /README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/app-test.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *~ 3 | \#*# -------------------------------------------------------------------------------- /public/img/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/bg.jpg -------------------------------------------------------------------------------- /app/views/404.jade: -------------------------------------------------------------------------------- 1 | extends layouts/default 2 | 3 | block content 4 | h1 404 Page Not Found -------------------------------------------------------------------------------- /app/views/500.jade: -------------------------------------------------------------------------------- 1 | extends layouts/default 2 | 3 | block content 4 | h1 500 Shit be broken -------------------------------------------------------------------------------- /app/views/users/login.jade: -------------------------------------------------------------------------------- 1 | extends ../layouts/default 2 | 3 | block content 4 | h1 Login -------------------------------------------------------------------------------- /app/views/users/register.jade: -------------------------------------------------------------------------------- 1 | extends ../layouts/default 2 | 3 | block content 4 | h1 Register -------------------------------------------------------------------------------- /public/img/icons/users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/users.png -------------------------------------------------------------------------------- /public/img/icons/worlds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/worlds.png -------------------------------------------------------------------------------- /public/img/progress_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/progress_bg.png -------------------------------------------------------------------------------- /public/img/progress_bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/progress_bg2.png -------------------------------------------------------------------------------- /public/img/progress_fg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/progress_fg.png -------------------------------------------------------------------------------- /public/img/progress_fg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/progress_fg2.png -------------------------------------------------------------------------------- /public/img/icons/16/users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/users.png -------------------------------------------------------------------------------- /public/img/icons/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/console.png -------------------------------------------------------------------------------- /public/img/icons/players.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/players.png -------------------------------------------------------------------------------- /public/img/icons/plugins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/plugins.png -------------------------------------------------------------------------------- /public/img/icons/servers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/servers.png -------------------------------------------------------------------------------- /public/img/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/settings.png -------------------------------------------------------------------------------- /public/img/icons/updates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/updates.png -------------------------------------------------------------------------------- /public/img/icons/16/console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/console.png -------------------------------------------------------------------------------- /public/img/icons/16/players.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/players.png -------------------------------------------------------------------------------- /public/img/icons/16/plugins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/plugins.png -------------------------------------------------------------------------------- /public/img/icons/16/servers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/servers.png -------------------------------------------------------------------------------- /public/img/icons/16/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/settings.png -------------------------------------------------------------------------------- /public/img/icons/16/updates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/updates.png -------------------------------------------------------------------------------- /public/img/icons/16/worlds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/worlds.png -------------------------------------------------------------------------------- /public/img/icons/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/dashboard.png -------------------------------------------------------------------------------- /public/img/icons/users_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/users_grey.png -------------------------------------------------------------------------------- /public/img/icons/worlds_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/worlds_grey.png -------------------------------------------------------------------------------- /public/img/progress_fg.old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/progress_fg.old.png -------------------------------------------------------------------------------- /public/img/icons/16/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/dashboard.png -------------------------------------------------------------------------------- /public/img/icons/16/users_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/users_grey.png -------------------------------------------------------------------------------- /public/img/icons/console_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/console_grey.png -------------------------------------------------------------------------------- /public/img/icons/players_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/players_grey.png -------------------------------------------------------------------------------- /public/img/icons/plugins_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/plugins_grey.png -------------------------------------------------------------------------------- /public/img/icons/servers_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/servers_grey.png -------------------------------------------------------------------------------- /public/img/icons/settings_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/settings_grey.png -------------------------------------------------------------------------------- /public/img/icons/updates_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/updates_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/console_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/console_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/players_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/players_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/plugins_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/plugins_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/servers_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/servers_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/settings_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/settings_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/updates_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/updates_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/worlds_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/worlds_grey.png -------------------------------------------------------------------------------- /public/img/icons/dashboard_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/dashboard_grey.png -------------------------------------------------------------------------------- /public/img/icons/16/dashboard_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/img/icons/16/dashboard_grey.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "public/css/Aristo"] 2 | path = public/css/Aristo 3 | url = git://github.com/taitems/Aristo-jQuery-UI-Theme.git 4 | -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-icons_f6cf3b_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-icons_f6cf3b_256x240.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_glass_75_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_glass_75_ffffff_1x400.png -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_inset-soft_95_fef1ec_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_inset-soft_95_fef1ec_1x100.png -------------------------------------------------------------------------------- /config/psm.yml: -------------------------------------------------------------------------------- 1 | db: 2 | uri: "mongodb://psm:psm123@localhost/psm" 3 | cookieSecret: "yacBigbiekCaliapIapGenEfoftAsinVekhobackendEthifeckwikBomNiancee" 4 | port: 8080 5 | host: "0.0.0.0" -------------------------------------------------------------------------------- /public/css/bootstrap/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/englercj/psm-web/master/public/css/bootstrap/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /app/controllers/users-controller.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | User = mongoose.model('User'); 3 | 4 | module.exports = UsersController = function(app) { 5 | //handle logout 6 | app.get('/logout', function(req, res) { 7 | res.logout(); 8 | res.redirect('/'); 9 | }); 10 | }; -------------------------------------------------------------------------------- /public/css/bootstrap/jquery.ui.1.8.16.ie.css: -------------------------------------------------------------------------------- 1 | 2 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-left, .ui-corner-bottom{ border-radius:0px;} 3 | .ui-state-active,.ui-tabs-selected { border-radius:0px;} 4 | .ui-tabs-selected { border-radius:0px;} 5 | .ui-tabs .ui-tabs-nav li{ filter:none;} 6 | .ui-tabs .ui-tabs-nav li a { border-radius:0px; } 7 | -------------------------------------------------------------------------------- /public/js/api.js: -------------------------------------------------------------------------------- 1 | (function($, win) { 2 | win.api = { 3 | init: function() { 4 | api.socket = io.connect('/'); 5 | }, 6 | getSystemStatus: function(cb) { 7 | util.doAjax('/system/status', 'GET', cb); 8 | }, 9 | getServerStatus: function(server, cb) { 10 | util.doAjax('/system/status/' + server, 'GET', cb); 11 | }, 12 | doCommand: function(cmd, server, cb) { 13 | util.doAjax('/system/cmd/' + server, 'POST', { cmd: cmd }, cb); 14 | }, 15 | socket: null 16 | }; 17 | })(jQuery, window); -------------------------------------------------------------------------------- /lib/auth.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Generic require login routing middleware 3 | */ 4 | exports.requiresLogin = function (req, res, next) { 5 | if (!req.loggedIn) { 6 | req.flash('notice', 'You are not authorized. Please login'); 7 | res.redirect('/articles'); 8 | } 9 | next(); 10 | }; 11 | 12 | 13 | /* 14 | * User authorizations routing middleware 15 | */ 16 | exports.user = { 17 | hasAuthorization : function (req, res, next) { 18 | if (req.foundUser.id != req.session.auth.userId) { 19 | req.flash('notice', 'You are not authorized'); 20 | res.redirect('/profile/'+req.foundUser.id); 21 | } 22 | next(); 23 | } 24 | } -------------------------------------------------------------------------------- /public/js/docready.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $(function() { 3 | //init api 4 | api.init(); 5 | 6 | //init util 7 | util.init(); 8 | 9 | //Setup page tabs 10 | $('#main').tabs({ 11 | select: function(e, ui) { 12 | util.removeNotification(ui.tab.hash.substr(1)); 13 | } 14 | }); 15 | 16 | //setup ui buttons 17 | $('button,a.button').button(); 18 | 19 | //Menu ui stuff 20 | $('a.dash').addClass('selected'); 21 | $('#nav a').on('click', function(e) { 22 | $('#nav a').removeClass('selected'); 23 | $(this).addClass('selected'); 24 | }); 25 | 26 | //setup psm status box 27 | setupPsmStatusBox(); 28 | }); 29 | })(jQuery); -------------------------------------------------------------------------------- /app/models/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | mongooseAuth = require('mongoose-auth'), 3 | UserSchema = new mongoose.Schema({}), 4 | User; 5 | 6 | UserSchema.plugin(mongooseAuth, { 7 | everymodule: { 8 | everyauth: { 9 | User: function() { 10 | return User; 11 | } 12 | } 13 | }, 14 | password: { 15 | everyauth: { 16 | getLoginPath: '/login', 17 | postLoginPath: '/login', 18 | loginView: 'users/login.jade', 19 | getRegisterPath: '/register', 20 | postRegisterPath: '/register', 21 | registerView: 'users/register.jade', 22 | loginSuccessRedirect: '/', 23 | registerSuccessRedirect: '/' 24 | } 25 | } 26 | }); 27 | 28 | exports = mongoose.model('User', UserSchema); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "author": "Chad Engler ", 3 | "name": "psm-web", 4 | "description": "Web front-end for the Panther Server Manager", 5 | "version": "0.0.1", 6 | "repository": { 7 | "type": "git", 8 | "url": "git://github.com/pantherdev/psm-web.git" 9 | }, 10 | "engines": { 11 | "node": "v0.6.x" 12 | }, 13 | "dependencies": { 14 | "express": "2.x.x", 15 | "jade": "0.26.x", 16 | "mongoose": "2.4.9", 17 | "js-yaml": "0.3.x", 18 | "gzippo": "0.1.x", 19 | "connect-mongodb": "1.1.x", 20 | "mongoose-auth": "0.0.x", 21 | "express-messages": "0.0.x", 22 | "request": "2.9.x", 23 | "dateformat": ">= 1", 24 | "socket.io": "0.9.x", 25 | "socket.io-client": "0.9.x" 26 | }, 27 | "devDependencies": {}, 28 | "private": true 29 | } -------------------------------------------------------------------------------- /public/js/console.js: -------------------------------------------------------------------------------- 1 | (function($, win) { 2 | $(function() { 3 | var $console = $('#console'), 4 | $input = $console.find('input'); 5 | 6 | //setup command sending 7 | $input.on('keypress', function(e) { 8 | if(e.which == 13) { 9 | e.preventDefault(); 10 | 11 | //send command 12 | api.doCommand($input.val(), 'crafttest', function(err, data) { 13 | console.log(err, data); 14 | }); 15 | $input.val(''); 16 | } 17 | }); 18 | 19 | //setup output listener 20 | api.socket.on('output', function(msg) { 21 | var $pre = $('#console pre'); 22 | 23 | //add lines to console 24 | for(var i = 0, line; line = msg.lines[i]; ++i) { 25 | $pre.append(util.tagOutput(line) + '\n'); 26 | } 27 | 28 | //add notification if not selected 29 | if(util.selectedTab() != 'console') { 30 | util.setNotification('console', util.getNotification('console') + msg.lines.length); 31 | } 32 | }); 33 | }); 34 | })(jQuery, window); -------------------------------------------------------------------------------- /lib/errors.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | 3 | exports.boot = function(app) { 4 | //Once router has finished and no route matched 5 | //lets return a NotFound error 6 | app.use(function(req, res, next) { 7 | next(new NotFound(req.url)); 8 | }); 9 | 10 | //Create the NotFound exception 11 | function NotFound(path) { 12 | this.name = 'NotFound'; 13 | if(path) { 14 | Error.call(this, 'Cannot find ' + path); 15 | this.path = path; 16 | } else { 17 | Error.call(this, 'Not Found'); 18 | } 19 | Error.captureStackTrace(this, arguments.callee); 20 | } 21 | 22 | NotFound.prototype.__proto__ = Error.prototype; 23 | 24 | //Setup error handlers 25 | app.error(function(err, req, res, next) { 26 | console.log(err.stack); 27 | 28 | if(err instanceof NotFound) { 29 | res.render('404', { 30 | status: 404, 31 | error: err, 32 | showStack: app.settings.showStackError, 33 | title: 'Oops! The page you requested doesn\'t exist.' 34 | }); 35 | } else { 36 | res.render('500', { 37 | status: 500, 38 | error: err, 39 | showStack: app.settings.showStackError, 40 | title: 'Oops! Something went wrong!' 41 | }); 42 | } 43 | }); 44 | }; -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | exports.cloneObject = function cloneObject(obj) { 2 | var clone = {}; 3 | for(var i in obj) { 4 | if(typeof(obj[i])=="object") 5 | clone[i] = this.cloneObject(obj[i]); 6 | else 7 | clone[i] = obj[i]; 8 | } 9 | return clone; 10 | } 11 | 12 | 13 | exports.mergeRecursive = function (obj1, obj2) { 14 | for (var p in obj2) 15 | try { 16 | // Property in destination object set; update its value. 17 | if ( obj2[p].constructor==Object ) 18 | obj1[p] = MergeRecursive(obj1[p], obj2[p]); 19 | else 20 | obj1[p] = obj2[p]; 21 | } catch(e) { 22 | // Property in destination object not set; create it and set its value. 23 | obj1[p] = obj2[p]; 24 | } 25 | return obj1; 26 | } 27 | 28 | 29 | exports.capitalize = function (string) { 30 | return string.charAt(0).toUpperCase() + string.slice(1); 31 | } 32 | 33 | exports.mongooseErrorHandler = function (err, req) { 34 | var errors = err.errors; 35 | for (var error in errors) { 36 | req.flash('error', errors[error].type); 37 | } 38 | } 39 | 40 | exports.sizeOfObject = function sizeOfObject(obj) { 41 | var size = 0, key; 42 | for (key in obj) { 43 | if (obj.hasOwnProperty(key)) size++; 44 | } 45 | return size; 46 | }; -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | //Load required modules 2 | var express = require('express'), 3 | fs = require('fs'), 4 | path = require('path'), 5 | yaml = require('js-yaml'), 6 | mongoose = require('mongoose'), 7 | mongooseAuth = require('mongoose-auth'), 8 | everyauth = require('everyauth'), 9 | utils = require('./lib/utils'), 10 | auth = require('./lib/auth'); 11 | 12 | //Load configuration 13 | var config = require(path.join(__dirname, 'config', 'psm.yml')).shift(); 14 | 15 | //Connect to MongoDB 16 | mongoose.connect(config.db.uri); 17 | 18 | //Load Models 19 | var mDir = path.join(__dirname, 'app', 'models'), 20 | mFiles = fs.readdirSync(mDir), 21 | User; 22 | 23 | mFiles.forEach(function(file) { 24 | require(path.join(mDir, file)); 25 | }); 26 | 27 | User = mongoose.model('User'); 28 | 29 | //Initialize express app 30 | var app = express.createServer(); 31 | require('./lib/configure').boot(app, config); 32 | 33 | app.get('/', function(req, res) { 34 | res.render('home', { title: 'Panther Server Manager' }); 35 | }); 36 | 37 | //Load Controllers 38 | var cDir = path.join(__dirname, 'app', 'controllers'), 39 | cFiles = fs.readdirSync(cDir); 40 | 41 | cFiles.forEach(function(file) { 42 | require(path.join(cDir, file))(app); 43 | }); 44 | 45 | //Load Error handlers 46 | require('./lib/errors').boot(app); 47 | 48 | //Initialize Mongoose Auth 49 | mongooseAuth.helpExpress(app); 50 | everyauth.helpExpress(app, { userAlias: 'current_user' }); 51 | 52 | //Start express server 53 | app.listen(config.port, config.host); -------------------------------------------------------------------------------- /app/views/home.jade: -------------------------------------------------------------------------------- 1 | extends layouts/default 2 | 3 | block content 4 | ul 5 | li 6 | span.tab-icon.dashboard 7 | a(href="#dashboard") Dashboard 8 | li 9 | span.tab-icon.console 10 | a(href="#console") Console 11 | li 12 | span.tab-icon.players 13 | a(href="#players") Players 14 | li 15 | span.tab-icon.worlds 16 | a(href="#worlds") Worlds 17 | li 18 | span.tab-icon.plugins 19 | a(href="#plugins") Plugins 20 | li 21 | span.tab-icon.updates 22 | a(href="#updates") Updates 23 | 24 | div#dashboard 25 | ul.ui-helper-clearfix 26 | li.info 27 | h2 28 | h6.mcversion 29 | b Minecraft Version: 30 | h6.cbversion 31 | b Craftbukkit Build: 32 | li.players 33 | h4 Players 34 | div.players 35 | h5 Players Connected 36 | div.meter 37 | span 38 | li.system 39 | h4 System 40 | div.cpu 41 | h5 CPU Usage 42 | div.meter 43 | span 44 | div.ram 45 | h5 RAM Usage 46 | div.meter 47 | span 48 | li.control 49 | h4 Controls 50 | a.button.ui-button-success Start Server 51 | a.button.ui-button-error Stop Server 52 | a.button.ui-button-primary Restart Server 53 | 54 | div#console 55 | pre 56 | input 57 | 58 | div#players 59 | 60 | div#worlds 61 | 62 | div#plugins 63 | 64 | div#updates 65 | 66 | -------------------------------------------------------------------------------- /app/views/layouts/default.jade: -------------------------------------------------------------------------------- 1 | !!! 5 2 | html(lang="en") 3 | head 4 | block head 5 | //meta 6 | meta(charset="utf-8") 7 | 8 | //page title 9 | title= title 10 | 11 | //CSS 12 | link(type="text/css", rel="stylesheet", media="screen", href="/css/bootstrap/jquery-ui-1.8.16.custom.css") 13 | link(type="text/css", rel="stylesheet", media="screen", href="/css/style.css") 14 | link(type="text/css", rel="stylesheet", media="screen", href="/css/icons.css") 15 | 16 | //JavaScript 17 | script(type="text/javascript", src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js") 18 | script(type="text/javascript", src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js") 19 | script(type="text/javascript", src="/socket.io/socket.io.js") 20 | script(type="text/javascript", src="/js/jquery.progress.js") 21 | script(type="text/javascript", src="/js/util.js") 22 | script(type="text/javascript", src="/js/api.js") 23 | script(type="text/javascript", src="/js/docready.js") 24 | body 25 | div#wrapper 26 | block header 27 | h1#logo Panther Server Manager 28 | div#userPanel 29 | ul#nav 30 | li 31 | a(class="dash") Dashboard 32 | li 33 | a(class="players") Players 34 | li 35 | a(class="worlds") Worlds 36 | li 37 | a(class="plugins") Plugins 38 | li 39 | a(class="updates") Updates 40 | li 41 | a(class="users") Users 42 | li 43 | a(class="servers") Servers 44 | li 45 | a(class="settings") Settings 46 | div#main 47 | block content 48 | block footer 49 | div#footer 50 | a(href='http://github.com/pantherdev/psm') Panther Server Manager -------------------------------------------------------------------------------- /public/js/dashboard.js: -------------------------------------------------------------------------------- 1 | (function($, win) { 2 | $(function() { 3 | //load status of PSM box 4 | api.getSystemStatus(function(err, data) { 5 | if(err) return; 6 | 7 | api.getServerStatus('crafttest', function(err, server) { 8 | if(err) return; 9 | 10 | var $info = $('#dashboard ul li.info'), 11 | $players = $('#dashboard ul li.players'), 12 | $system = $('#dashboard ul li.system'), 13 | $ctrl = $('#dashboard ul li.control'), 14 | totalCpuTime = 0, 15 | idleCpuTime = 0; 16 | 17 | //hide the loader 18 | //$('#performance .loader').hide(); 19 | //$('#performance ul').show(); 20 | 21 | //server title 22 | $('h2', $info).text(server.data.properties['server-name']); 23 | 24 | //add host type 25 | $('h6.mcversion', $info).append(' v' + server.data.mcversion); 26 | $('h6.cbversion', $info).append(' ' + server.data.cbversion); 27 | 28 | //aggregate the status of the system 29 | for(var i = 0, len = data.status.cpus.length; i < len; ++i) { 30 | totalCpuTime += data.status.cpus[i].times.idle; 31 | totalCpuTime += data.status.cpus[i].times.irq; 32 | totalCpuTime += data.status.cpus[i].times.nice; 33 | totalCpuTime += data.status.cpus[i].times.sys; 34 | totalCpuTime += data.status.cpus[i].times.user; 35 | 36 | idleCpuTime += data.status.cpus[i].times.idle; 37 | } 38 | 39 | var stats = [ 40 | { 41 | val: 16, 42 | max: data.status.maxPlayers || 32, 43 | fmt: '{v} / {m}', 44 | divisor: 1, 45 | $meter: $('.players .meter', $players) 46 | }, 47 | { 48 | val: totalCpuTime - idleCpuTime, 49 | max: totalCpuTime, 50 | fmt: '{p}%', 51 | divisor: 1, 52 | $meter: $('.cpu .meter', $system) 53 | }, 54 | { 55 | val: data.status.totalmem - data.status.freemem, 56 | max: data.status.totalmem, 57 | fmt: '{v} / {m} MB', 58 | divisor: 1048576, 59 | $meter: $('.ram .meter', $system) 60 | } 61 | ]; 62 | 63 | //create each stat graph 64 | stats.forEach(function(stat) { 65 | util.createProgressbar(stat.$meter, stat.val, stat.max, stat.fmt, stat.divisor); 66 | }); 67 | }); 68 | }); 69 | }); 70 | })(jQuery, window); -------------------------------------------------------------------------------- /public/css/icons.css: -------------------------------------------------------------------------------- 1 | .tab-icon { 2 | height:16px; 3 | width:16px; 4 | 5 | position:absolute; 6 | left:6px; 7 | top:9px; 8 | 9 | background:left top no-repeat transparent; 10 | } 11 | 12 | .tab-icon.dashboard { background-image:url(../img/icons/16/dashboard_grey.png); } 13 | .ui-tabs-selected .tab-icon.dashboard, .ui-state-hover .tab-icon.dashboard { background-image:url(../img/icons/16/dashboard.png); } 14 | 15 | .tab-icon.console { background-image:url(../img/icons/16/console_grey.png); } 16 | .ui-tabs-selected .tab-icon.console, .ui-state-hover .tab-icon.console { background-image:url(../img/icons/16/console.png); } 17 | 18 | .tab-icon.players { background-image:url(../img/icons/16/players_grey.png); } 19 | .ui-tabs-selected .tab-icon.players, .ui-state-hover .tab-icon.players { background-image:url(../img/icons/16/players.png); } 20 | 21 | .tab-icon.worlds { background-image:url(../img/icons/16/worlds_grey.png); } 22 | .ui-tabs-selected .tab-icon.worlds, .ui-state-hover .tab-icon.worlds { background-image:url(../img/icons/16/worlds.png); } 23 | 24 | .tab-icon.plugins { background-image:url(../img/icons/16/plugins_grey.png); } 25 | .ui-tabs-selected .tab-icon.plugins, .ui-state-hover .tab-icon.plugins { background-image:url(../img/icons/16/plugins.png); } 26 | 27 | .tab-icon.updates { background-image:url(../img/icons/16/updates_grey.png); } 28 | .ui-tabs-selected .tab-icon.updates, .ui-state-hover .tab-icon.updates { background-image:url(../img/icons/16/updates.png); } 29 | 30 | 31 | #nav a { background:center 10px no-repeat; } 32 | 33 | #nav a.dash { background-image:url(../img/icons/dashboard_grey.png); } 34 | #nav a.dash:hover, 35 | #nav a.dash.selected { background-image:url(../img/icons/dashboard.png); } 36 | 37 | #nav a.players { background-image:url(../img/icons/players_grey.png); } 38 | #nav a.players:hover, 39 | #nav a.players.selected { background-image:url(../img/icons/players.png); } 40 | 41 | #nav a.worlds { background-image:url(../img/icons/worlds_grey.png); } 42 | #nav a.worlds:hover, 43 | #nav a.worlds.selected { background-image:url(../img/icons/worlds.png); } 44 | 45 | #nav a.plugins { background-image:url(../img/icons/plugins_grey.png); } 46 | #nav a.plugins:hover, 47 | #nav a.plugins.selected { background-image:url(../img/icons/plugins.png); } 48 | 49 | #nav a.updates { background-image:url(../img/icons/updates_grey.png); } 50 | #nav a.updates:hover, 51 | #nav a.updates.selected { background-image:url(../img/icons/updates.png); } 52 | 53 | #nav a.users { background-image:url(../img/icons/users_grey.png); } 54 | #nav a.users:hover, 55 | #nav a.users.selected { background-image:url(../img/icons/users.png); } 56 | 57 | #nav a.servers { background-image:url(../img/icons/servers_grey.png); } 58 | #nav a.servers:hover, 59 | #nav a.servers.selected { background-image:url(../img/icons/servers.png); } 60 | 61 | #nav a.settings { background-image:url(../img/icons/settings_grey.png); } 62 | #nav a.settings:hover, 63 | #nav a.settings.selected { background-image:url(../img/icons/settings.png); } -------------------------------------------------------------------------------- /app/controllers/systems-controller.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'), 2 | sio = require('socket.io'), 3 | sioc = require('socket.io-client'), 4 | request = require('request'); 5 | 6 | module.exports = SystemsController = function(app) { 7 | var self = this, 8 | man, io; 9 | 10 | //setup proxied routes 11 | app.get('/system/status', function(req, res) { 12 | doRequest('/system/status', req, res); 13 | }); 14 | 15 | app.get('/system/:cmd(start|stop|restart|status|update|backupServer|backupMaps|backupLogs|reloadConfig|isRunning)/:server/:remote?', function(req, res) { 16 | doRequest('/status', req, res); 17 | }); 18 | 19 | app.post('/system/cmd/:server/:remote?', function(req, res) { 20 | doRequest('/cmd', req, res, 'POST'); 21 | }); 22 | 23 | app.get('/system/config/:key', function(req, res) { 24 | doRequest('/config/' + req.params.key, req, res); 25 | }); 26 | 27 | app.post('/system/config/:key', function(req, res) { 28 | doRequest('/config/' + req.params.key, req, res); 29 | }); 30 | 31 | app.get('/system/list/:remote?', function(req, res) { 32 | doRequest('/list', req, res); 33 | }); 34 | 35 | app.post('/:cmd(add|rm)/:type(server|remote)/:remote?', function(req, res) { 36 | doRequest(req.params.cmd + '/' + req.params.type, req, res, 'POST'); 37 | }); 38 | 39 | //setup the socket.io listener 40 | io = sio.listen(app); 41 | 42 | //subscribe to manager socket.io 43 | man = sioc.connect('localhost', { port: 9876 }); 44 | 45 | //echo manager events 46 | man.on('output', function(msg) { 47 | io.sockets.emit('output', msg); 48 | }); 49 | 50 | man.on('player::connect', function(msg) { 51 | io.sockets.emit('player::connect', msg); 52 | }); 53 | 54 | man.on('player::disconnect', function(msg) { 55 | io.sockets.emit('player::disconnect', msg); 56 | }); 57 | 58 | man.on('player::chat', function(msg) { 59 | io.sockets.emit('player::chat', msg); 60 | }); 61 | }; 62 | 63 | function doRequest(path, req, res, method) { 64 | var opts = { 65 | url: buildUrl(path, req), 66 | method: method || 'GET', 67 | json: (method == 'POST' ? req.body : undefined) 68 | }; 69 | 70 | console.log(opts); 71 | request(opts, function(err, response, body) { 72 | if(!err && response.statusCode == 200) { 73 | if(typeof(body) == 'string') { 74 | try { 75 | res.json(JSON.parse(body)); 76 | } catch(e) { 77 | res.json({ 78 | success: false, 79 | error: e.message, 80 | body: body 81 | }); 82 | } 83 | } 84 | else 85 | res.json(body); 86 | } else { 87 | res.json({ 88 | success: false, 89 | error: (err ? err.message : 'Got non 200 status code (' + response.statusCode + ')'), 90 | url: buildUrl(path, req), 91 | body: body 92 | }); 93 | } 94 | }); 95 | } 96 | 97 | function buildUrl(path, req) { 98 | return 'http://localhost:9876' + path + 99 | (req.params.server ? '/' + req.params.server : '') + 100 | (req.params.remote ? '/' + req.params.remote : '') + 101 | '?token=e0a39d05-a6b4-4514-bf16-504d99c5ee47'; 102 | } -------------------------------------------------------------------------------- /lib/configure.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | mongoStore = require('connect-mongodb'), 3 | mongooseAuth = require('mongoose-auth'), 4 | path = require('path'), 5 | url = require('url'); 6 | //stylus = require('stylus'); 7 | 8 | exports.boot = function(app, config) { 9 | app.configure(function() { 10 | //setup views and template engine 11 | app.set('views', path.join(__dirname, '..', 'app', 'views')); 12 | app.set('view engine', 'jade'); 13 | app.set('view options', { layout: false }); 14 | 15 | //includes blocks of content only on required pages 16 | app.use(function(req, res, next) { 17 | //expose path as view variable 18 | res.local('path', url.parse(req.url).pathname); 19 | 20 | //assign content str for section 21 | res.local('contentFor', function(section, str) { 22 | res.local(section, str); 23 | }); 24 | 25 | //check is section is defined and return accordingly 26 | res.local('content', function(section) { 27 | if(typeof(res.local(section)) != 'undefined') 28 | return res.local(section); 29 | else 30 | return ''; 31 | }); 32 | 33 | next(); 34 | }); 35 | 36 | //add bodyParser and methodOverride 37 | app.use(express.bodyParser()); 38 | app.use(express.methodOverride()); 39 | 40 | //add cookieParser and session 41 | app.use(express.cookieParser()); 42 | app.use(express.session({ 43 | secret: config.cookieSecret, 44 | store: new mongoStore({ 45 | url: config.db.uri, 46 | collection: 'sessions' 47 | }) 48 | })); 49 | 50 | //setup logging and favicon 51 | app.use(express.logger(':method :url :status')); 52 | app.use(express.favicon()); 53 | 54 | //include mongooseAuth middleware 55 | app.use(mongooseAuth.middleware()); 56 | }); 57 | 58 | //view helper functions 59 | app.dynamicHelpers({ 60 | request: function(req) { return req; }, 61 | hasMessages: function(req) { 62 | if(!req.session) return false; 63 | 64 | return Object.keys(req.session.flash || {}).length; 65 | }, 66 | messages: require('express-messages'), 67 | dateformat: function(req, res) { 68 | return require('dateformat'); 69 | }, 70 | base: function() { 71 | return '/' == app.route ? '' : app.route; 72 | }, 73 | appName: function(req, res) { 74 | return 'Panther Server Manager'; 75 | }, 76 | slogan: function(req, res) { 77 | return 'Alpha'; 78 | } 79 | }); 80 | 81 | //Add stylus for CSS templating 82 | /* 83 | function compile(str, path) { 84 | return stylus(str) 85 | .set('filename', path) 86 | .set('warn', true) 87 | .set('compress', true) 88 | .define('url', stylus.url({ paths: [path.join(__dirname, 'public', 'img')] })); 89 | } 90 | 91 | //add stylus middleware 92 | app.use(stylus.middleware({ 93 | debug: true, 94 | src: path.join(__dirname, 'app', 'stylus'), 95 | dest: path.join(__dirname, 'public'), 96 | compile: compile 97 | })); 98 | */ 99 | 100 | //turn off express error handling 101 | app.set('showStackError', false); 102 | 103 | //configure environments 104 | app.configure('development', function() { 105 | app.set('showStackError', true); 106 | app.use(express.static(path.join(__dirname, '..', 'public'))); 107 | }); 108 | 109 | app.configure('staging', function() { 110 | app.use(gzippo.staticGzip(path.join(__dirname, '..', 'public'))); 111 | app.enable('view cache'); 112 | }); 113 | 114 | app.configure('production', function() { 115 | app.use(gzippo.staticGzip(path.join(__dirname, '..', 'public'))); 116 | app.enable('view cache'); 117 | }); 118 | }; -------------------------------------------------------------------------------- /public/js/util.js: -------------------------------------------------------------------------------- 1 | (function($, win) { 2 | //global util functions 3 | win.util = { 4 | init: function() {}, 5 | tagOutput: function(str) { 6 | str = util.tagStr(str, /([0-9\-: ]+)/, 'timestamp'); 7 | str = util.tagStr(str, /(\[INFO\])/, 'info'); 8 | str = util.tagStr(str, /(\[WARN(ING)?\])/, 'warn'); 9 | str = util.tagStr(str, /(\[SEVERE\])/, 'severe'); 10 | str = util.tagStr(str, /(\[FATAL\])/, 'fatal'); 11 | 12 | return str; 13 | }, 14 | tagStr: function(str, regex, clss) { 15 | return str.replace(regex, '$1'); 16 | }, 17 | selectedTab: function() { 18 | var sel = $('#main').tabs('option', 'selected'), 19 | $a = $('#main > .ui-tabs-nav > li').eq(sel).find('a'); 20 | 21 | return $a.attr('href').substr(1); 22 | }, 23 | setNotification: function(tab, val) { 24 | var $a = $('#main > .ui-tabs-nav > li > a[href="#' + tab + '"]'), 25 | $n = $a.find('span.notification'); 26 | 27 | if($n.length) 28 | $n.text(val); 29 | else 30 | $a.append('' + val + ''); 31 | }, 32 | getNotification: function(tab) { 33 | var $a = $('#main > .ui-tabs-nav > li > a[href="#' + tab + '"]'), 34 | $n = $a.find('span.notification'); 35 | 36 | return ($.isNumeric($n.text()) ? parseInt($n.text(), 10) : $n.text()); 37 | }, 38 | removeNotification: function(tab) { 39 | var $a = $('#main > .ui-tabs-nav > li > a[href="#' + tab + '"]'), 40 | $n = $a.find('span.notification'); 41 | 42 | $n.remove(); 43 | }, 44 | doAjax: function(url, method, data, cb) { 45 | if(typeof(data) == 'function') { cb = data; data = undefined; } 46 | if(typeof(method) == 'function') { cb = method; method = 'GET'; } 47 | 48 | $.ajax({ 49 | cache: false, 50 | crossDomain: false, 51 | data: data, 52 | dataType: 'json', 53 | processData: true, 54 | type: method, 55 | url: url, 56 | success: function(data, textStatus, jqXHR) { 57 | if(cb) cb(data.error, data); 58 | }, 59 | error: function(jqXHR, textStatus, errorThrown) { 60 | if(cb) cb(errorThrown || textStatus); 61 | } 62 | }); 63 | }, 64 | createProgressbar: function($elm, val, max, format, divisor) { 65 | var $span = $elm.find('span'); 66 | 67 | divisor = divisor || 1; 68 | 69 | $elm.progressbar({ 70 | change: function(event, ui) { 71 | var step = $(event.target).progressbar('option', 'value'), 72 | fval = (max * (step / 100)) / divisor, 73 | fmax = max / divisor, 74 | txt = format.replace('{v}', fval.toFixed()) 75 | .replace('{m}', fmax.toFixed()) 76 | .replace('{p}', step.toFixed()); 77 | 78 | $span.text(txt); 79 | 80 | if(step >= 50) 81 | $span.addClass('invert'); 82 | else 83 | $span.removeClass('invert'); 84 | } 85 | }); 86 | 87 | //animates from 0 (no data) to val (set data) 88 | //basically provides the calculations for step so we 89 | //can do the animation via setting the value option 90 | //of the progressbar 91 | $elm.animate( 92 | { 93 | 'data-psm-value': val 94 | }, 95 | { 96 | duration: 2000, 97 | easing: 'easeOutCubic', 98 | step: function(step) { 99 | $elm.progressbar('option', 'value', step / max * 100); 100 | } 101 | } 102 | ); 103 | } 104 | }; 105 | 106 | //some quick jquery funcs 107 | $.fn.visible = function() { 108 | return this.css('visibility', 'visible'); 109 | } 110 | 111 | $.fn.invisible = function() { 112 | return this.css('visibility', 'hidden'); 113 | } 114 | })(jQuery, window); 115 | -------------------------------------------------------------------------------- /public/js/jquery.progress.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $.widget('psm.cprogress', { 3 | //Default options 4 | options: { 5 | value: 50, 6 | duration: 1500, 7 | easing: 'easeOutCubic', 8 | fg: '', 9 | bg: '', 10 | textFormat: '{v}%' 11 | }, 12 | //Setup widget 13 | _create: function() { 14 | var $prog = $('
').addClass('cprogress'), 15 | $text = $('
').addClass('cprogress-text'), 16 | $ctx = $(''); 17 | 18 | //store objects into options 19 | this.options.store = { 20 | $prog: $prog, 21 | $text: $text, 22 | $ctx: $ctx, 23 | bgImg: null, 24 | fgImg: null, 25 | ctx: null 26 | }; 27 | 28 | //load images and canvas 29 | this._reloadImages($.proxy(function() { 30 | //prepend to target 31 | $prog.append($text).append($ctx).prependTo(this.element); 32 | 33 | //fade in element 34 | $prog.fadeTo(500, 1); 35 | 36 | //call paint methods 37 | this.paint(); 38 | }, this)); 39 | }, 40 | //Use the _setOption method to response to changes to options 41 | _setOption: function(key, value) { 42 | $.Widget.prototype._setOption.apply(this, arguments); 43 | 44 | if(key == 'value') this.paint(); 45 | }, 46 | //destroy methods to cleanup DOM changes 47 | destroy: function() { 48 | var self = this; 49 | 50 | self.options.store.$prog.fadeTo(500, 0, function() { 51 | self.options.store.$prog.remove(); 52 | $.Widget.prototype.destroy.call(self); 53 | }); 54 | }, 55 | //repaints the progress bar 56 | paint: function() { 57 | var $elm = this.element, 58 | opts = this.options, 59 | store = opts.store, 60 | ctx = store.ctx; 61 | 62 | //if($elm.width() == 0 || $elm.height() == 0) 63 | //this._reloadImages(); 64 | 65 | if(opts.text) this._setText(); 66 | else store.$text.hide(); 67 | 68 | if(opts.value > 100) opts = 100; 69 | if(opts.value < 0) opts = 0; 70 | 71 | //use data-value to animate the paint 72 | $elm.animate( 73 | { 74 | 'data-progress-value': this.options.value 75 | }, 76 | { 77 | duration: this.options.duration, 78 | easing: this.options.easing, 79 | step: $.proxy(function(step) { 80 | this._paint(step / 100); 81 | this._setText(step); 82 | }, this) 83 | } 84 | ); 85 | }, 86 | //private helpers 87 | _paint: function(prct) { 88 | var store = this.options.store, 89 | w = this.element.width(), 90 | h = this.element.height(), 91 | x = w / 2, 92 | y = h / 2, 93 | radius = h / 2, 94 | top = 3 * Math.PI / 2, 95 | circle = 2 * Math.PI, 96 | ctx = store.ctx; 97 | 98 | //clear canvas 99 | ctx.clearRect(0, 0, w, h); 100 | ctx.save(); 101 | 102 | //draw background 103 | ctx.drawImage(store.bgImg, 0, 0); 104 | 105 | ctx.beginPath(); 106 | ctx.lineWidth = 5; 107 | ctx.arc(x, y, radius, top, top + (circle * prct), false); 108 | ctx.lineTo(x, y); 109 | ctx.closePath(); 110 | ctx.clip(); 111 | 112 | //draw foreground 113 | ctx.drawImage(store.fgImg, 0, 0); 114 | ctx.restore(); 115 | }, 116 | _setText: function(val) { 117 | this.options.store.$text.show().text(this.options.textFormat.replace('{v}', Math.round(val))); 118 | }, 119 | _reloadImages: function(cb) { 120 | //reload images 121 | var store = this.options.store, 122 | mt = parseInt(store.$prog.css('marginTop').replace('ems', ''), 10), 123 | ml = parseInt(store.$prog.css('marginLeft').replace('ems', ''), 10), 124 | done = 0; 125 | 126 | //instantiate new Image objects 127 | store.bgImg = new Image(); 128 | store.fgImg = new Image(); 129 | 130 | //setup onload callbacks 131 | store.bgImg.onload = store.fgImg.onload = $.proxy(function() { 132 | done++; 133 | if(done == 2) { 134 | //make element height/width match images 135 | this.element.width(store.bgImg.width); 136 | this.element.height(store.bgImg.height); 137 | 138 | //setup main div container 139 | //store.$prog.css('marginLeft', (this.element.width() / 2) + ml) 140 | //.css('marginTop', (this.element.height() / 2) + mt); 141 | 142 | //setup canvas 143 | //store.$ctx.width(this.element.width()).height(this.element.height()); 144 | 145 | //grab the context 146 | store.ctx = store.$ctx.get(0).getContext('2d'); 147 | 148 | cb(); 149 | } 150 | }, this); 151 | 152 | //setup source for images 153 | store.bgImg.src = this.options.bg; 154 | store.fgImg.src = this.options.fg; 155 | } 156 | }); 157 | })(jQuery); -------------------------------------------------------------------------------- /public/css/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin:0; 3 | padding:0; 4 | font-size:1em; 5 | font-weight:normal; 6 | font-family: 7 | } 8 | 9 | /* Element Styles */ 10 | font-face { 11 | font-family: 'BebasNeueRegular'; 12 | src: url('BebasNeue-webfont.eot'); 13 | src: url('BebasNeue-webfont.eot?#iefix') format('embedded-opentype'), 14 | url('BebasNeue-webfont.woff') format('woff'), 15 | url('BebasNeue-webfont.ttf') format('truetype'), 16 | url('BebasNeue-webfont.svg#BebasNeueRegular') format('svg'); 17 | font-weight: normal; 18 | font-style: normal; 19 | 20 | } 21 | 22 | body { 23 | color:#404040; 24 | background:center top url(http://images3.alphacoders.com/489/48957.jpg) no-repeat #000; 25 | } 26 | 27 | h1, h2, h3, h4, h5, h6 { 28 | font-family:'Century Gothic',futura,'URW Gothic L',Verdana,sans-serif; 29 | font-weight:bold; 30 | text-align:center; 31 | 32 | margin-bottom:10px; 33 | 34 | color:#404040; 35 | } 36 | 37 | h1 { font-size:1.5em; } 38 | h2 { font-size:1.4em; } 39 | h3 { font-size:1.3em; } 40 | h4 { font-size:1.2em; font-weight:normal; margin:5px 0; } 41 | h5 { font-size:1.1em; font-weight:normal; margin:15px 0 5px 0; } 42 | h6 { font-size:1em; font-weight:normal; margin:5px 0; } 43 | 44 | b { font-weight:bold; } 45 | 46 | /* General Classes */ 47 | .clear { clear:both; } 48 | .floatL { float:left; } 49 | .floatR { float:right; } 50 | 51 | .hidden { display:none; } 52 | 53 | .timestamp { color:grey; } 54 | .info { color:cyan; } 55 | .warn { color:goldenrod; } 56 | .severe { color:orangered; } 57 | .fatal { color:red; } 58 | 59 | .well { 60 | background-color: #F5F5F5; 61 | border: 1px solid rgba(0, 0, 0, 0.05); 62 | border-radius: 4px 4px 4px 4px; 63 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) inset; 64 | margin-bottom: 20px; 65 | min-height: 20px; 66 | padding: 5px; 67 | } 68 | 69 | .notification { 70 | font-size:10px; 71 | font-weight:bold; 72 | color:#FFF; 73 | 74 | border-radius:10px; 75 | padding:1px 5px; 76 | height:12px; 77 | line-height:12px; 78 | 79 | position:absolute; 80 | margin:0 0 0 -5px; 81 | z-index:9999; 82 | 83 | background: #ff3019; /* Old browsers */ 84 | background: -moz-linear-gradient(top, #ff3019 0%, #bf0000 100%); /* FF3.6+ */ 85 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff3019), color-stop(100%,#bf0000)); /* Chrome,Safari4+ */ 86 | background: -webkit-linear-gradient(top, #ff3019 0%,#bf0000 100%); /* Chrome10+,Safari5.1+ */ 87 | background: -o-linear-gradient(top, #ff3019 0%,#bf0000 100%); /* Opera 11.10+ */ 88 | background: -ms-linear-gradient(top, #ff3019 0%,#bf0000 100%); /* IE10+ */ 89 | background: linear-gradient(to bottom, #ff3019 0%,#bf0000 100%); /* W3C */ 90 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff3019', endColorstr='#bf0000',GradientType=0 ); /* IE6-9 */ 91 | } 92 | 93 | /* Wrapper */ 94 | #wrapper { width:1024px; margin:0 auto; } 95 | 96 | /* Logo */ 97 | #logo { 98 | font-size:3em; 99 | float:left; 100 | margin-bottom:25px; 101 | font-family:'Century Gothic',futura,'URW Gothic L',Verdana,sans-serif; 102 | 103 | color:#0064CD; 104 | } 105 | 106 | /* Main Content */ 107 | #main { 108 | background:#FFF; 109 | padding:20px; 110 | } 111 | 112 | #main .ui-tabs-nav li a { padding-left:25px; } 113 | 114 | /* Console boxes */ 115 | .chat { 116 | float:left; 117 | width:585px; 118 | } 119 | 120 | .chat h3 { 121 | font-weight:1em; 122 | text-align:left; 123 | 124 | color:#fff; 125 | 126 | margin:0; 127 | padding:1px 20px; 128 | text-shadow:1px 1px 1px #111; 129 | 130 | font-weight:normal; 131 | 132 | background: #049cdb; /* Old browsers */ 133 | background: -moz-linear-gradient(top, #049cdb 0%, #0064cd 100%); /* FF3.6+ */ 134 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#049cdb), color-stop(100%,#0064cd)); /* Chrome,Safari4+ */ 135 | background: -webkit-linear-gradient(top, #049cdb 0%,#0064cd 100%); /* Chrome10+,Safari5.1+ */ 136 | background: -o-linear-gradient(top, #049cdb 0%,#0064cd 100%); /* Opera 11.10+ */ 137 | background: -ms-linear-gradient(top, #049cdb 0%,#0064cd 100%); /* IE10+ */ 138 | background: linear-gradient(to bottom, #049cdb 0%,#0064cd 100%); /* W3C */ 139 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#049cdb', endColorstr='#0064cd',GradientType=0 ); /* IE6-9 */ 140 | } 141 | 142 | #console pre, #chat pre { 143 | min-height:300px; 144 | background:#111; 145 | color:#fff; 146 | overflow:auto; 147 | padding:5px; 148 | } 149 | 150 | #console input, #chat input { 151 | width:100%; 152 | border:none; 153 | } 154 | 155 | /* Performance Dashboard */ 156 | #dashboard h2 { margin:0 0 10px 0; text-align:left; } 157 | #dashboard h4 { margin:0 0 5px 0; font-weight:bold; } 158 | #dashboard h5 { margin:0; font-size:1.1em; } 159 | #dashboard h6 { margin:0; font-size:1em; text-align:left; } 160 | 161 | #dashboard ul li { 162 | list-style:none; 163 | float:left; 164 | width:25%; 165 | } 166 | 167 | #dashboard li.control { text-align:center; } 168 | #dashboard li.control .button { 169 | margin:2px 0; 170 | width:225px; 171 | } 172 | 173 | .meter { 174 | width:225px; 175 | margin:0 auto; 176 | margin-bottom:5px; 177 | } 178 | 179 | .meter span { 180 | width:225px; 181 | position:absolute; 182 | text-align:center; 183 | font-weight:bold; 184 | margin-top:5px; 185 | 186 | color:#222; 187 | } 188 | 189 | /* 190 | .ui-progressbar span.invert { 191 | color:#FFF; 192 | text-shadow:1px 1px 1px #222; 193 | } 194 | */ 195 | 196 | /* 197 | .meter { 198 | width:100px; 199 | height:100px; 200 | } 201 | */ 202 | 203 | .cprogress-text { 204 | /*font:18px/27px 'BebasNeueRegular', Arial, sans-serif;*/ 205 | color:#ebebeb; 206 | text-shadow:1px 1px 1px #1f1f1f; 207 | position:absolute; 208 | margin-top:45px; 209 | margin-left:25px; 210 | text-align:center; 211 | width:60px; 212 | } 213 | 214 | /* Navigation Menu */ 215 | #nav { 216 | height:70px; 217 | clear:both; 218 | 219 | border-radius:5px 5px 0 0; 220 | 221 | background: #252525; /* Old browsers */ 222 | background: -moz-linear-gradient(top, #252525 0%, #000000 100%); /* FF3.6+ */ 223 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#252525), color-stop(100%,#000000)); /* Chrome,Safari4+ */ 224 | background: -webkit-linear-gradient(top, #252525 0%,#000000 100%); /* Chrome10+,Safari5.1+ */ 225 | background: -o-linear-gradient(top, #252525 0%,#000000 100%); /* Opera 11.10+ */ 226 | background: -ms-linear-gradient(top, #252525 0%,#000000 100%); /* IE10+ */ 227 | background: linear-gradient(to bottom, #252525 0%,#000000 100%); /* W3C */ 228 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#252525', endColorstr='#000000',GradientType=0 ); /* IE6-9 */ 229 | } 230 | 231 | #nav li { 232 | float:left; 233 | list-style:none; 234 | 235 | border-right:solid 1px #222; 236 | } 237 | 238 | #nav li:last-child { 239 | border-right:none; 240 | } 241 | 242 | #nav a { 243 | display:block; 244 | height:70px; 245 | width:127px; 246 | 247 | text-align:center; 248 | line-height:105px; 249 | font-family:'Century Gothic',futura,'URW Gothic L',Verdana,sans-serif; 250 | /*font-family:'Bookman Old Style',Bookman,'URW Bookman L','Palatino Linotype',serif;*/ 251 | font-weight:bold; 252 | 253 | color:#888; 254 | } 255 | 256 | #nav a:hover, #nav a.selected { 257 | color:#046BDB;/*#0552E0;/*#008CDB;*/ 258 | cursor:pointer; 259 | } -------------------------------------------------------------------------------- /public/css/bootstrap/jquery-ui-1.8.16.custom.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Bootstrap (0.22) 3 | * http://addyosmani.github.com/jquery-ui-bootstrap 4 | * 5 | * Copyright 2012, Addy Osmani 6 | * Dual licensed under the MIT or GPL Version 2 licenses. 7 | * 8 | * Portions copyright jQuery UI & Twitter Bootstrap 9 | */ 10 | 11 | 12 | /* Layout helpers 13 | ----------------------------------*/ 14 | .ui-helper-hidden { display: none; } 15 | .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } 16 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 17 | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } 18 | .ui-helper-clearfix { display: inline-block; } 19 | /* required comment for clearfix to work in Opera \*/ 20 | * html .ui-helper-clearfix { height:1%; } 21 | .ui-helper-clearfix { display:block; } 22 | /* end clearfix */ 23 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 24 | 25 | 26 | /* Interaction Cues 27 | ----------------------------------*/ 28 | .ui-state-disabled { cursor: default !important; } 29 | 30 | 31 | /* Icons 32 | ----------------------------------*/ 33 | 34 | /* states and images */ 35 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 36 | 37 | 38 | /* Misc visuals 39 | ----------------------------------*/ 40 | 41 | /* Overlays */ 42 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 43 | 44 | 45 | /* 46 | * jQuery UI CSS Framework 1.8.16 47 | * 48 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 49 | * Dual licensed under the MIT or GPL Version 2 licenses. 50 | * http://jquery.org/license 51 | * 52 | * http://docs.jquery.com/UI/Theming/API 53 | * 54 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller 55 | */ 56 | 57 | 58 | /* Component containers 59 | ----------------------------------*/ 60 | .ui-widget { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size:13px; } 61 | .ui-widget .ui-widget { font-size: 1em; } 62 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1em; } 63 | .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_75_ffffff_1x400.png) 50% 50% repeat-x; color: #404040; } 64 | .ui-widget-content a { color: #404040; } 65 | .ui-widget-header { 66 | font-weight:bold; 67 | border-color: #0064cd #0064cd #003f81; 68 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 69 | border:1px solid #666; 70 | 71 | } 72 | .ui-widget-header a { color: #222222; } 73 | 74 | /* Interaction states 75 | ----------------------------------*/ 76 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { 77 | 78 | background-color: #e6e6e6; 79 | background-repeat: no-repeat; 80 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); 81 | background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 82 | background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); 83 | background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 84 | background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 85 | background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 86 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 87 | 88 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 89 | 90 | color: #333; 91 | font-size: 13px; 92 | line-height: normal; 93 | border: 1px solid #ccc; 94 | border-bottom-color: #bbb; 95 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 96 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 97 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 98 | -webkit-transition: 0.1s linear background-image; 99 | -moz-transition: 0.1s linear background-image; 100 | -ms-transition: 0.1s linear background-image; 101 | -o-transition: 0.1s linear background-image; 102 | transition: 0.1s linear background-image; 103 | overflow: visible; 104 | 105 | } 106 | 107 | 108 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } 109 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { 110 | background-position: 0 -15px; 111 | color: #333; 112 | text-decoration: none; 113 | 114 | 115 | } 116 | .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } 117 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; font-weight: normal; color: #212121; } 118 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } 119 | .ui-widget :active { outline: none; } 120 | 121 | /* Interaction Cues 122 | ----------------------------------*/ 123 | 124 | 125 | .ui-state-highlight p, .ui-state-error p, .ui-state-default p{ 126 | font-size: 13px; 127 | font-weight: normal; 128 | line-height: 18px; 129 | margin:7px 15px; 130 | } 131 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { 132 | 133 | 134 | position: relative; 135 | margin-bottom: 18px; 136 | color: #404040; 137 | background-color: #eedc94; 138 | background-repeat: repeat-x; 139 | background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); 140 | background-image: -moz-linear-gradient(top, #fceec1, #eedc94); 141 | background-image: -ms-linear-gradient(top, #fceec1, #eedc94); 142 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); 143 | background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); 144 | background-image: -o-linear-gradient(top, #fceec1, #eedc94); 145 | background-image: linear-gradient(top, #fceec1, #eedc94); 146 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); 147 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 148 | border-color: #eedc94 #eedc94 #e4c652; 149 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 150 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 151 | border-width: 1px; 152 | border-style: solid; 153 | -webkit-border-radius: 4px; 154 | -moz-border-radius: 4px; 155 | border-radius: 4px; 156 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 157 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 158 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 159 | 160 | 161 | } 162 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } 163 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { 164 | 165 | 166 | position: relative; 167 | margin-bottom: 18px; 168 | color: #ffffff; 169 | border-width: 1px; 170 | border-style: solid; 171 | -webkit-border-radius: 4px; 172 | -moz-border-radius: 4px; 173 | border-radius: 4px; 174 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 175 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 176 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 177 | background-color: #c43c35; 178 | background-repeat: repeat-x; 179 | background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); 180 | background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); 181 | background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); 182 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); 183 | background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); 184 | background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); 185 | background-image: linear-gradient(top, #ee5f5b, #c43c35); 186 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); 187 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 188 | border-color: #c43c35 #c43c35 #882a25; 189 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 190 | 191 | 192 | } 193 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } 194 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } 195 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } 196 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 197 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 198 | 199 | 200 | 201 | /* Icons 202 | ----------------------------------*/ 203 | 204 | /* states and images */ 205 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } 206 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } 207 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } 208 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } 209 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } 210 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } 211 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } 212 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_f6cf3b_256x240.png); } 213 | 214 | /* positioning */ 215 | .ui-icon-carat-1-n { background-position: 0 0; } 216 | .ui-icon-carat-1-ne { background-position: -16px 0; } 217 | .ui-icon-carat-1-e { background-position: -32px 0; } 218 | .ui-icon-carat-1-se { background-position: -48px 0; } 219 | .ui-icon-carat-1-s { background-position: -64px 0; } 220 | .ui-icon-carat-1-sw { background-position: -80px 0; } 221 | .ui-icon-carat-1-w { background-position: -96px 0; } 222 | .ui-icon-carat-1-nw { background-position: -112px 0; } 223 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 224 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 225 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 226 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 227 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 228 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 229 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 230 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 231 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 232 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 233 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 234 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 235 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 236 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 237 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 238 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 239 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 240 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 241 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 242 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 243 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 244 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 245 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 246 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 247 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 248 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 249 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 250 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 251 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 252 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 253 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 254 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 255 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 256 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 257 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 258 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 259 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 260 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 261 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 262 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 263 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 264 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 265 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 266 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 267 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 268 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 269 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 270 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 271 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 272 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 273 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 274 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 275 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 276 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 277 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 278 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 279 | .ui-icon-arrow-4 { background-position: 0 -80px; } 280 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 281 | .ui-icon-extlink { background-position: -32px -80px; } 282 | .ui-icon-newwin { background-position: -48px -80px; } 283 | .ui-icon-refresh { background-position: -64px -80px; } 284 | .ui-icon-shuffle { background-position: -80px -80px; } 285 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 286 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 287 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 288 | .ui-icon-folder-open { background-position: -16px -96px; } 289 | .ui-icon-document { background-position: -32px -96px; } 290 | .ui-icon-document-b { background-position: -48px -96px; } 291 | .ui-icon-note { background-position: -64px -96px; } 292 | .ui-icon-mail-closed { background-position: -80px -96px; } 293 | .ui-icon-mail-open { background-position: -96px -96px; } 294 | .ui-icon-suitcase { background-position: -112px -96px; } 295 | .ui-icon-comment { background-position: -128px -96px; } 296 | .ui-icon-person { background-position: -144px -96px; } 297 | .ui-icon-print { background-position: -160px -96px; } 298 | .ui-icon-trash { background-position: -176px -96px; } 299 | .ui-icon-locked { background-position: -192px -96px; } 300 | .ui-icon-unlocked { background-position: -208px -96px; } 301 | .ui-icon-bookmark { background-position: -224px -96px; } 302 | .ui-icon-tag { background-position: -240px -96px; } 303 | .ui-icon-home { background-position: 0 -112px; } 304 | .ui-icon-flag { background-position: -16px -112px; } 305 | .ui-icon-calendar { background-position: -32px -112px; } 306 | .ui-icon-cart { background-position: -48px -112px; } 307 | .ui-icon-pencil { background-position: -64px -112px; } 308 | .ui-icon-clock { background-position: -80px -112px; } 309 | .ui-icon-disk { background-position: -96px -112px; } 310 | .ui-icon-calculator { background-position: -112px -112px; } 311 | .ui-icon-zoomin { background-position: -128px -112px; } 312 | .ui-icon-zoomout { background-position: -144px -112px; } 313 | .ui-icon-search { background-position: -160px -112px; } 314 | .ui-icon-wrench { background-position: -176px -112px; } 315 | .ui-icon-gear { background-position: -192px -112px; } 316 | .ui-icon-heart { background-position: -208px -112px; } 317 | .ui-icon-star { background-position: -224px -112px; } 318 | .ui-icon-link { background-position: -240px -112px; } 319 | .ui-icon-cancel { background-position: 0 -128px; } 320 | .ui-icon-plus { background-position: -16px -128px; } 321 | .ui-icon-plusthick { background-position: -32px -128px; } 322 | .ui-icon-minus { background-position: -48px -128px; } 323 | .ui-icon-minusthick { background-position: -64px -128px; } 324 | .ui-icon-close { background-position: -80px -128px; } 325 | .ui-icon-closethick { background-position: -96px -128px; } 326 | .ui-icon-key { background-position: -112px -128px; } 327 | .ui-icon-lightbulb { background-position: -128px -128px; } 328 | .ui-icon-scissors { background-position: -144px -128px; } 329 | .ui-icon-clipboard { background-position: -160px -128px; } 330 | .ui-icon-copy { background-position: -176px -128px; } 331 | .ui-icon-contact { background-position: -192px -128px; } 332 | .ui-icon-image { background-position: -208px -128px; } 333 | .ui-icon-video { background-position: -224px -128px; } 334 | .ui-icon-script { background-position: -240px -128px; } 335 | .ui-icon-alert { background-position: 0 -144px; } 336 | .ui-icon-info { background-position: -16px -144px; } 337 | .ui-icon-notice { background-position: -32px -144px; } 338 | .ui-icon-help { background-position: -48px -144px; } 339 | .ui-icon-check { background-position: -64px -144px; } 340 | .ui-icon-bullet { background-position: -80px -144px; } 341 | .ui-icon-radio-off { background-position: -96px -144px; } 342 | .ui-icon-radio-on { background-position: -112px -144px; } 343 | .ui-icon-pin-w { background-position: -128px -144px; } 344 | .ui-icon-pin-s { background-position: -144px -144px; } 345 | .ui-icon-play { background-position: 0 -160px; } 346 | .ui-icon-pause { background-position: -16px -160px; } 347 | .ui-icon-seek-next { background-position: -32px -160px; } 348 | .ui-icon-seek-prev { background-position: -48px -160px; } 349 | .ui-icon-seek-end { background-position: -64px -160px; } 350 | .ui-icon-seek-start { background-position: -80px -160px; } 351 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 352 | .ui-icon-seek-first { background-position: -80px -160px; } 353 | .ui-icon-stop { background-position: -96px -160px; } 354 | .ui-icon-eject { background-position: -112px -160px; } 355 | .ui-icon-volume-off { background-position: -128px -160px; } 356 | .ui-icon-volume-on { background-position: -144px -160px; } 357 | .ui-icon-power { background-position: 0 -176px; } 358 | .ui-icon-signal-diag { background-position: -16px -176px; } 359 | .ui-icon-signal { background-position: -32px -176px; } 360 | .ui-icon-battery-0 { background-position: -48px -176px; } 361 | .ui-icon-battery-1 { background-position: -64px -176px; } 362 | .ui-icon-battery-2 { background-position: -80px -176px; } 363 | .ui-icon-battery-3 { background-position: -96px -176px; } 364 | .ui-icon-circle-plus { background-position: 0 -192px; } 365 | .ui-icon-circle-minus { background-position: -16px -192px; } 366 | .ui-icon-circle-close { background-position: -32px -192px; } 367 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 368 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 369 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 370 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 371 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 372 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 373 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 374 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 375 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 376 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 377 | .ui-icon-circle-check { background-position: -208px -192px; } 378 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 379 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 380 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 381 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 382 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 383 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 384 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 385 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 386 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 387 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 388 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 389 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 390 | 391 | 392 | /* Misc visuals 393 | ----------------------------------*/ 394 | 395 | /* Corner radius */ 396 | .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } 397 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } 398 | .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } 399 | .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } 400 | 401 | 402 | 403 | /* Overlays */ 404 | .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } 405 | .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* 406 | * jQuery UI Resizable 1.8.16 407 | * 408 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 409 | * Dual licensed under the MIT or GPL Version 2 licenses. 410 | * http://jquery.org/license 411 | * 412 | * http://docs.jquery.com/UI/Resizable#theming 413 | */ 414 | .ui-resizable { position: relative;} 415 | .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } 416 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } 417 | .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } 418 | .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } 419 | .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } 420 | .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } 421 | .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } 422 | .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } 423 | .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } 424 | .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* 425 | * jQuery UI Selectable 1.8.16 426 | * 427 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 428 | * Dual licensed under the MIT or GPL Version 2 licenses. 429 | * http://jquery.org/license 430 | * 431 | * http://docs.jquery.com/UI/Selectable#theming 432 | */ 433 | .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } 434 | /* 435 | * jQuery UI Accordion 1.8.16 436 | * 437 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 438 | * Dual licensed under the MIT or GPL Version 2 licenses. 439 | * http://jquery.org/license 440 | * 441 | * http://docs.jquery.com/UI/Accordion#theming 442 | */ 443 | /* IE/Win - Fix animation bug - #4615 */ 444 | .ui-accordion { width: 100%; } 445 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; font-weight:bold; } 446 | .ui-accordion .ui-accordion-li-fix { display: inline; } 447 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } 448 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } 449 | .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 450 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } 451 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } 452 | .ui-accordion .ui-accordion-content-active { display: block; } 453 | /* 454 | * jQuery UI Autocomplete 1.8.16 455 | * 456 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 457 | * Dual licensed under the MIT or GPL Version 2 licenses. 458 | * http://jquery.org/license 459 | * 460 | * http://docs.jquery.com/UI/Autocomplete#theming 461 | */ 462 | .ui-autocomplete { position: absolute; cursor: default; } 463 | 464 | /* workarounds */ 465 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ 466 | 467 | /* 468 | * jQuery UI Menu 1.8.16 469 | * 470 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 471 | * Dual licensed under the MIT or GPL Version 2 licenses. 472 | * http://jquery.org/license 473 | * 474 | * http://docs.jquery.com/UI/Menu#theming 475 | */ 476 | .ui-menu { 477 | list-style:none; 478 | padding: 2px; 479 | margin: 0; 480 | display:block; 481 | float: left; 482 | } 483 | .ui-menu .ui-menu { 484 | margin-top: -3px; 485 | } 486 | .ui-menu .ui-menu-item { 487 | margin:0; 488 | padding: 0; 489 | zoom: 1; 490 | float: left; 491 | clear: left; 492 | width: 100%; 493 | } 494 | .ui-menu .ui-menu-item a { 495 | text-decoration:none; 496 | display:block; 497 | padding:.2em .4em; 498 | line-height:1.5; 499 | zoom:1; 500 | } 501 | .ui-menu .ui-menu-item a.ui-state-hover, 502 | .ui-menu .ui-menu-item a.ui-state-active { 503 | font-weight: normal; 504 | background:#0064CD; 505 | color:#fff 506 | } 507 | 508 | 509 | /* 510 | * jQuery UI Button 1.8.16 511 | * 512 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 513 | * Dual licensed under the MIT or GPL Version 2 licenses. 514 | * http://jquery.org/license 515 | * 516 | * http://docs.jquery.com/UI/Button#theming 517 | */ 518 | .ui-button { 519 | 520 | cursor: pointer; 521 | display: inline-block; 522 | background-color: #e6e6e6; 523 | background-repeat: no-repeat; 524 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); 525 | background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 526 | background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); 527 | background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 528 | background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 529 | background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 530 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 531 | padding: 5px 14px 6px; 532 | margin: 0; 533 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 534 | color: #333; 535 | font-size: 13px; 536 | line-height: normal; 537 | border: 1px solid #ccc; 538 | border-bottom-color: #bbb; 539 | 540 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 541 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 542 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 543 | -webkit-transition: 0.1s linear background-image; 544 | -moz-transition: 0.1s linear background-image; 545 | -ms-transition: 0.1s linear background-image; 546 | -o-transition: 0.1s linear background-image; 547 | transition: 0.1s linear background-image; 548 | overflow: visible; 549 | 550 | } /* the overflow property removes extra width in IE */ 551 | 552 | /* Remove the focus ring for default button in dialog buttonset. */ 553 | .ui-dialog-buttonset .ui-button:focus { 554 | outline:none; 555 | } 556 | 557 | .ui-widget-content .ui-button-primary, .ui-button-primary { 558 | color: #ffffff; 559 | background-color: #0064cd; 560 | background-repeat: repeat-x; 561 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 562 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 563 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 564 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 565 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 566 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 567 | background-image: linear-gradient(top, #049cdb, #0064cd); 568 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 569 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 570 | border-color: #0064cd #0064cd #003f81; 571 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 572 | 573 | } 574 | 575 | 576 | 577 | .ui-widget-content .ui-button-success, .ui-button-success{ 578 | color:#ffffff; 579 | background-color: #57a957; 580 | background-repeat: repeat-x; 581 | background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); 582 | background-image: -moz-linear-gradient(top, #62c462, #57a957); 583 | background-image: -ms-linear-gradient(top, #62c462, #57a957); 584 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); 585 | background-image: -webkit-linear-gradient(top, #62c462, #57a957); 586 | background-image: -o-linear-gradient(top, #62c462, #57a957); 587 | background-image: linear-gradient(top, #62c462, #57a957); 588 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); 589 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 590 | border-color: #57a957 #57a957 #3d773d; 591 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 592 | } 593 | 594 | .ui-widget-content .ui-button-error, .ui-button-error{ 595 | color:#ffffff; 596 | background-color: #c43c35; 597 | background-repeat: repeat-x; 598 | background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); 599 | background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); 600 | background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); 601 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); 602 | background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); 603 | background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); 604 | background-image: linear-gradient(top, #ee5f5b, #c43c35); 605 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); 606 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 607 | border-color: #c43c35 #c43c35 #882a25; 608 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 609 | } 610 | 611 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ 612 | button.ui-button-icon-only { } /* button elements seem to need a little more width */ 613 | .ui-button-icons-only { width: 3.4em; } 614 | button.ui-button-icons-only { width: 3.7em; } 615 | 616 | /*button text element */ 617 | 618 | .ui-button .ui-button-text { display: block; } 619 | .ui-button-text-only .ui-button-text { } 620 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; /*tempfix*/ display:none;} 621 | .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } 622 | .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } 623 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } 624 | /* no icon support for input elements, provide padding by default */ 625 | /* input.ui-button { padding: .4em 1em; } */ 626 | 627 | /*button icon element(s) */ 628 | .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { top: 50%; margin-top:-3px; margin-bottom:3px; } 629 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } 630 | .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } 631 | .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 632 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 633 | 634 | /*button sets*/ 635 | 636 | 637 | .ui-buttonset { margin-right: 7px; } 638 | .ui-buttonset .ui-state-active { 639 | color: #ffffff; 640 | background-color: #0064cd; 641 | background-repeat: repeat-x; 642 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 643 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 644 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 645 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 646 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 647 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 648 | background-image: linear-gradient(top, #049cdb, #0064cd); 649 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 650 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 651 | border-color: #0064cd #0064cd #003f81; 652 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 653 | } 654 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.4em; } 655 | 656 | /* workarounds */ 657 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ 658 | 659 | 660 | 661 | /* 662 | * jQuery UI Dialog 1.8.16 663 | * 664 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 665 | * Dual licensed under the MIT or GPL Version 2 licenses. 666 | * http://jquery.org/license 667 | * 668 | * http://docs.jquery.com/UI/Dialog#theming 669 | */ 670 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } 671 | .ui-dialog .ui-dialog-titlebar { /*padding: .4em 1em;*/ 672 | 673 | position: relative; 674 | padding:5px 15px; 675 | 676 | border:0px 0px 0px 1px solid; 677 | border-color: white; 678 | padding: 5px 15px; 679 | font-size: 18px; 680 | text-decoration:none; 681 | background:none; 682 | -moz-border-radius-bottomright: 0px; 683 | -webkit-border-bottom-right-radius: 0px; 684 | -khtml-border-bottom-right-radius: 0px; 685 | 686 | -moz-border-radius-bottomleft: 0px; 687 | -webkit-border-bottom-left-radius: 0px; 688 | -khtml-border-bottom-left-radius: 0px; 689 | border-bottom-left-radius: 0px; 690 | 691 | border-bottom:1px solid #ccc; 692 | 693 | } 694 | .ui-dialog .ui-dialog-title { 695 | float: left; 696 | color:#404040; 697 | font-weight:bold; 698 | margin-top:5px; 699 | margin-bottom:5px; 700 | padding:5px; 701 | 702 | } 703 | .ui-dialog .ui-dialog-titlebar-close { 704 | position: absolute; 705 | right: .3em; 706 | top: 50%; 707 | width: 19px; 708 | margin: -10px 0 0 0; 709 | padding: 1px; 710 | height: 18px; 711 | font-size: 20px; 712 | font-weight: bold; 713 | line-height: 13.5px; 714 | text-shadow: 0 1px 0 #ffffff; 715 | filter: alpha(opacity=25); 716 | -khtml-opacity: 0.25; 717 | -moz-opacity: 0.25; 718 | opacity: 0.25; 719 | } 720 | 721 | .ui-dialog .ui-dialog-titlebar-close span { 722 | display: block; 723 | margin: 1px; 724 | text-indent: 9999px; 725 | } 726 | 727 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { 728 | filter: alpha(opacity=90); 729 | -khtml-opacity: 0.90; 730 | -moz-opacity: 0.90; 731 | opacity: 0.90; 732 | } 733 | 734 | .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 735 | 736 | .ui-dialog .ui-dialog-buttonpane { 737 | text-align: left; 738 | border-width: 1px 0 0 0; 739 | background-image: none; 740 | margin: .5em 0 0 0; 741 | background-color: #f5f5f5; 742 | padding: 5px 15px 5px; 743 | border-top: 1px solid #ddd; 744 | -webkit-border-radius: 0 0 6px 6px; 745 | -moz-border-radius: 0 0 6px 6px; 746 | border-radius: 0 0 6px 6px; 747 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 748 | -moz-box-shadow: inset 0 1px 0 #ffffff; 749 | box-shadow: inset 0 1px 0 #ffffff; 750 | zoom: 1; 751 | margin-bottom: 0; 752 | 753 | } 754 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } 755 | .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } 756 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 757 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 758 | 759 | .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button{ 760 | color: #ffffff; 761 | background-color: #0064cd; 762 | background-repeat: repeat-x; 763 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 764 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 765 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 766 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 767 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 768 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 769 | background-image: linear-gradient(top, #049cdb, #0064cd); 770 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 771 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 772 | border-color: #0064cd #0064cd #003f81; 773 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 774 | } 775 | /* 776 | * jQuery UI Slider 1.8.16 777 | * 778 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 779 | * Dual licensed under the MIT or GPL Version 2 licenses. 780 | * http://jquery.org/license 781 | * 782 | * http://docs.jquery.com/UI/Slider#theming 783 | */ 784 | .ui-slider { position: relative; text-align: left; } 785 | .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } 786 | .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; 787 | 788 | color: #ffffff; 789 | background-color: #0064cd; 790 | background-repeat: repeat-x; 791 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 792 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 793 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 794 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 795 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 796 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 797 | background-image: linear-gradient(top, #049cdb, #0064cd); 798 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 799 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 800 | border-color: #0064cd #0064cd #003f81; 801 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 802 | 803 | } 804 | 805 | .ui-slider-horizontal { height: .8em; } 806 | .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } 807 | .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } 808 | .ui-slider-horizontal .ui-slider-range-min { left: 0; } 809 | .ui-slider-horizontal .ui-slider-range-max { right: 0; } 810 | 811 | .ui-slider-vertical { width: .8em; height: 100px; } 812 | .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } 813 | .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } 814 | .ui-slider-vertical .ui-slider-range-min { bottom: 0; } 815 | .ui-slider-vertical .ui-slider-range-max { top: 0; }/* 816 | * jQuery UI Tabs 1.8.16 817 | * 818 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 819 | * Dual licensed under the MIT or GPL Version 2 licenses. 820 | * http://jquery.org/license 821 | * 822 | * http://docs.jquery.com/UI/Tabs#theming 823 | */ 824 | .ui-tabs .ui-tabs-nav{ background:none; border-color: #ddd; 825 | border-style: solid; 826 | border-width: 0 0 1px;} 827 | .ui-tabs { position: relative; padding: .2em; zoom: 1; border:0px;} /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 828 | 829 | 830 | .ui-tabs .ui-tabs-nav li:hover, .ui-tabs .ui-tabs-nav li a:hover{ 831 | background:whiteSmoke; 832 | border-bottom:1px solid #ddd; 833 | padding-bottom:0px; 834 | color:#00438A; 835 | } 836 | 837 | 838 | .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; border-bottom:1px solid #DDD; } 839 | .ui-tabs .ui-tabs-nav li { text-decoration: none; list-style: none; float: left; position: relative; top: 1px; padding: 0px 0px 1px 0px; white-space: nowrap; background:none; border:0px; 840 | 841 | } 842 | 843 | .ui-tabs-nav .ui-state-default{ 844 | -webkit-box-shadow: 0px 0px 0px #ffffff; /* Saf3-4, iOS 4.0.2 - 4.2, Android 2.3+ */ 845 | -moz-box-shadow: 0px 0px 0px #ffffff; /* FF3.5 - 3.6 */ 846 | box-shadow: 0px 0px 0px #ffffff; /* Opera 10.5, IE9, FF4+, Chrome 6+, iOS 5 */ 847 | } 848 | .ui-tabs .ui-tabs-nav li a { 849 | 850 | float: left; 851 | text-decoration: none; 852 | cursor: text; 853 | padding: 0 15px; 854 | margin-right: 2px; 855 | line-height: 34px; 856 | border: 1px solid transparent; 857 | -webkit-border-radius: 4px 4px 0 0; 858 | -moz-border-radius: 4px 4px 0 0; 859 | border-radius: 4px 4px 0 0; 860 | 861 | 862 | } 863 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected, 864 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: 0; padding-bottom: 0px; outline:none;} 865 | 866 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, 867 | .ui-tabs .ui-tabs-nav li.ui-state-disabled a, 868 | .ui-tabs .ui-tabs-nav li.ui-state-processing a, 869 | .ui-tabs .ui-tabs-nav li.ui-tabs-active a { 870 | 871 | background-color: #ffffff; 872 | border: 1px solid #ddd; 873 | border-bottom-color: #ffffff; 874 | cursor: default; 875 | color:gray; 876 | outline:none; 877 | } 878 | 879 | 880 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected:hover, .ui-tabs .ui-tabs-nav li.ui-tabs-active:hover { 881 | background:#ffffff; 882 | outline:none; 883 | } 884 | 885 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; color:#0069D6; background:none; font-weight:normal; margin-bottom:-1px;} 886 | /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ 887 | .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } 888 | .ui-tabs-panel .ui-button{text-decoration:none;} 889 | .ui-tabs .ui-tabs-hide { display: none !important; } 890 | 891 | 892 | /* IE fix for background inheritance from ui-widget*/ 893 | .ui-tabs .ui-tabs-nav li{ 894 | filter:none; 895 | } 896 | 897 | 898 | 899 | /* 900 | * jQuery UI Datepicker 1.8.16 901 | * 902 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 903 | * Dual licensed under the MIT or GPL Version 2 licenses. 904 | * http://jquery.org/license 905 | * 906 | * http://docs.jquery.com/UI/Datepicker#theming 907 | */ 908 | .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } 909 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; border:0px; font-weight: bold; width: 100%; padding: 4px 0; background-color: #f5f5f5; color: #808080; } 910 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } 911 | 912 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { /*top: 1px;*/ } 913 | .ui-datepicker .ui-datepicker-prev { left:2px; } 914 | .ui-datepicker .ui-datepicker-next { right:2px; } 915 | 916 | .ui-datepicker .ui-datepicker-prev-hover { /*left:1px;*/ } 917 | .ui-datepicker .ui-datepicker-next-hover { /*right:1px;*/ } 918 | 919 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } 920 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 921 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 922 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 923 | .ui-datepicker select.ui-datepicker-month, 924 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 925 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } 926 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } 927 | .ui-datepicker td { border: 0; padding: 1px; } 928 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } 929 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } 930 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } 931 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } 932 | 933 | /* with multiple calendars */ 934 | .ui-datepicker.ui-datepicker-multi { width:auto; } 935 | .ui-datepicker-multi .ui-datepicker-group { float:left; } 936 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } 937 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } 938 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } 939 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } 940 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } 941 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } 942 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } 943 | .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } 944 | 945 | /* RTL support */ 946 | .ui-datepicker-rtl { direction: rtl; } 947 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } 948 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } 949 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } 950 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } 951 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } 952 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } 953 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } 954 | .ui-datepicker-rtl .ui-datepicker-group { float:right; } 955 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 956 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 957 | 958 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ 959 | .ui-datepicker-cover { 960 | display: none; /*sorry for IE5*/ 961 | display/**/: block; /*sorry for IE5*/ 962 | position: absolute; /*must have*/ 963 | z-index: -1; /*must have*/ 964 | filter: mask(); /*must have*/ 965 | top: -4px; /*must have*/ 966 | left: -4px; /*must have*/ 967 | width: 200px; /*must have*/ 968 | height: 200px; /*must have*/ 969 | } 970 | 971 | .ui-datepicker th{ 972 | font-weight: bold; 973 | color: gray; 974 | } 975 | 976 | .ui-datepicker-today a:hover{ 977 | background-color: #808080; 978 | color: #ffffff; 979 | 980 | } 981 | .ui-datepicker-today a{ 982 | background-color: #BFBFBF; 983 | cursor: pointer; 984 | padding: 0 4px; 985 | margin-bottom:0px; 986 | 987 | } 988 | 989 | 990 | .ui-datepicker td a{ 991 | margin-bottom:0px; 992 | border:0px; 993 | } 994 | 995 | .ui-datepicker td:hover{ 996 | color:white; 997 | } 998 | 999 | .ui-datepicker td .ui-state-default { 1000 | border:0px; 1001 | background:none; 1002 | margin-bottom:0px; 1003 | padding:5px; 1004 | color:gray; 1005 | text-align: center; 1006 | filter:none; 1007 | } 1008 | 1009 | 1010 | .ui-datepicker td .ui-state-active{ 1011 | background:#BFBFBF; 1012 | margin-bottom:0px; 1013 | font-size:normal; 1014 | text-shadow: 0px; 1015 | color:white; 1016 | -webkit-border-radius: 4px; 1017 | -moz-border-radius: 4px; 1018 | border-radius: 4px; 1019 | } 1020 | 1021 | .ui-datepicker td .ui-state-default:hover{ 1022 | background:#0064cd; 1023 | color:white; 1024 | -webkit-border-radius: 4px; 1025 | -moz-border-radius: 4px; 1026 | border-radius: 4px; 1027 | } 1028 | 1029 | 1030 | /* 1031 | * jQuery UI Progressbar 1.8.16 1032 | * 1033 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 1034 | * Dual licensed under the MIT or GPL Version 2 licenses. 1035 | * http://jquery.org/license 1036 | * 1037 | * http://docs.jquery.com/UI/Progressbar#theming 1038 | */ 1039 | .ui-progressbar { height:2em; text-align: left; } 1040 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; 1041 | 1042 | /*this can be removed if ui-widget-header is blue*/ 1043 | color: #ffffff; 1044 | background-color: #0064cd; 1045 | background-repeat: repeat-x; 1046 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 1047 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 1048 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 1049 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 1050 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 1051 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 1052 | background-image: linear-gradient(top, #049cdb, #0064cd); 1053 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 1054 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1055 | border-color: #0064cd #0064cd #003f81; 1056 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1057 | } 1058 | 1059 | 1060 | 1061 | /*** Input field styling from Bootstrap **/ 1062 | input, textarea { 1063 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; 1064 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s; 1065 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s; 1066 | -o-transition: border linear 0.2s, box-shadow linear 0.2s; 1067 | transition: border linear 0.2s, box-shadow linear 0.2s; 1068 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 1069 | -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 1070 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 1071 | } 1072 | input:focus, textarea:focus { 1073 | outline: 0; 1074 | border-color: rgba(82, 168, 236, 0.8); 1075 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 1076 | -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 1077 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 1078 | } 1079 | input[type=file]:focus, input[type=checkbox]:focus, select:focus { 1080 | -webkit-box-shadow: none; 1081 | -moz-box-shadow: none; 1082 | box-shadow: none; 1083 | outline: 1px dotted #666; 1084 | } 1085 | 1086 | input[type="text"], 1087 | input[type="password"], 1088 | .ui-autocomplete-input, 1089 | textarea, 1090 | .uneditable-input { 1091 | display: inline-block; 1092 | padding: 4px; 1093 | font-size: 13px; 1094 | line-height: 18px; 1095 | color: #808080; 1096 | border: 1px solid #ccc; 1097 | -webkit-border-radius: 3px; 1098 | -moz-border-radius: 3px; 1099 | border-radius: 3px; 1100 | } 1101 | 1102 | 1103 | 1104 | /**Toolbar**/ 1105 | 1106 | .ui-toolbar{ 1107 | padding: 7px 14px; 1108 | margin: 0 0 18px; 1109 | background-color: #f5f5f5; 1110 | background-repeat: repeat-x; 1111 | background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5)); 1112 | background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); 1113 | background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); 1114 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5)); 1115 | background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); 1116 | background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); 1117 | background-image: linear-gradient(top, #ffffff, #f5f5f5); 1118 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); 1119 | border: 1px solid #ddd; 1120 | -webkit-border-radius: 3px; 1121 | -moz-border-radius: 3px; 1122 | border-radius: 3px; 1123 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 1124 | -moz-box-shadow: inset 0 1px 0 #ffffff; 1125 | box-shadow: inset 0 1px 0 #ffffff; 1126 | } 1127 | 1128 | 1129 | /***Dialog fixes**/ 1130 | 1131 | .ui-dialog-buttonset .ui-button:nth-child(2){ 1132 | cursor: pointer; 1133 | display: inline-block; 1134 | background-color: #e6e6e6; 1135 | background-repeat: no-repeat; 1136 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); 1137 | background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1138 | background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); 1139 | background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1140 | background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1141 | background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1142 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 1143 | padding: 5px 14px 6px; 1144 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 1145 | color: #333; 1146 | font-size: 13px; 1147 | line-height: normal; 1148 | border: 1px solid #ccc; 1149 | border-bottom-color: #bbb; 1150 | -webkit-border-radius: 4px; 1151 | -moz-border-radius: 4px; 1152 | border-radius: 4px; 1153 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1154 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1155 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1156 | -webkit-transition: 0.1s linear all; 1157 | -moz-transition: 0.1s linear all; 1158 | -ms-transition: 0.1s linear all; 1159 | -o-transition: 0.1s linear all; 1160 | transition: 0.1s linear all; 1161 | overflow: visible; 1162 | } 1163 | 1164 | 1165 | 1166 | /***Wijmo Theming**/ 1167 | 1168 | div.wijmo-wijmenu{ 1169 | padding:0 20px; 1170 | background-color: #222; 1171 | background-color: #222222; 1172 | background-repeat: repeat-x; 1173 | background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); 1174 | background-image: -moz-linear-gradient(top, #333333, #222222); 1175 | background-image: -ms-linear-gradient(top, #333333, #222222); 1176 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); 1177 | background-image: -webkit-linear-gradient(top, #333333, #222222); 1178 | background-image: -o-linear-gradient(top, #333333, #222222); 1179 | background-image: linear-gradient(top, #333333, #222222); 1180 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); 1181 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1182 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1183 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1184 | } 1185 | 1186 | .wijmo-wijmenu .ui-state-default{ 1187 | box-shadow: none; 1188 | color:#BFBFBF; 1189 | } 1190 | 1191 | .wijmo-wijmenu .ui-state-default .wijmo-wijmenu-text{ 1192 | color:#BFBFBF; 1193 | } 1194 | 1195 | .wijmo-wijmenu .ui-state-hover{ 1196 | background: #444; 1197 | background: rgba(255, 255, 255, 0.05); 1198 | } 1199 | 1200 | .wijmo-wijmenu .ui-state-hover .wijmo-wijmenu-text{ 1201 | color:#ffffff; 1202 | } 1203 | 1204 | div.wijmo-wijmenu .ui-widget-header h3{ 1205 | position: relative; 1206 | margin-top:1px; 1207 | padding:0; 1208 | } 1209 | 1210 | .wijmo-wijmenu h3 a{ 1211 | color: #FFFFFF; 1212 | display: block; 1213 | float: left; 1214 | font-size: 20px; 1215 | font-weight: 200; 1216 | line-height: 1; 1217 | margin-left: -20px; 1218 | margin-top:1px; 1219 | padding: 8px 20px 12px; 1220 | } 1221 | 1222 | .wijmo-wijmenu h3 a:hover{ 1223 | background-color: rgba(255, 255, 255, 0.05); 1224 | color: #FFFFFF; 1225 | text-decoration: none; 1226 | } 1227 | 1228 | .wijmo-wijmenu .ui-widget-header{ 1229 | border:0px; 1230 | } 1231 | 1232 | .wijmo-wijmenu .wijmo-wijmenu-parent .wijmo-wijmenu-child{ 1233 | padding: 0.3em 0; 1234 | } 1235 | 1236 | div.wijmo-wijmenu .wijmo-wijmenu-item .wijmo-wijmenu-child{ 1237 | background: #333; 1238 | border:0; 1239 | margin:0; 1240 | padding: 6px 0; 1241 | width:160px; 1242 | -webkit-border-radius: 0 0 6px 6px; 1243 | -moz-border-radius: 0 0 6px 6px; 1244 | border-radius: 0 0 6px 6px; 1245 | -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1246 | -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1247 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1248 | } 1249 | 1250 | div.wijmo-wijmenu .wijmo-wijmenu-item{ 1251 | margin:0; 1252 | border:0; 1253 | } 1254 | 1255 | .wijmo-wijmenu a.wijmo-wijmenu-link{ 1256 | margin:0; 1257 | line-height: 19px; 1258 | padding: 10px 10px 11px; 1259 | border:0; 1260 | -webkit-border-radius: 0; 1261 | -moz-border-radius: 0; 1262 | border-radius:0; 1263 | } 1264 | 1265 | div.wijmo-wijmenu .wijmo-wijmenu-child .wijmo-wijmenu-link{ 1266 | display:block; 1267 | float:none; 1268 | padding: 4px 15px; 1269 | width:auto; 1270 | } 1271 | 1272 | div.wijmo-wijmenu .wijmo-wijmenu-child .wijmo-wijmenu-text 1273 | { 1274 | float:none; 1275 | } 1276 | 1277 | .wijmo-wijmenu .wijmo-wijmenu-item .wijmo-wijmenu-child .ui-state-hover { 1278 | background: #191919; 1279 | } 1280 | 1281 | .wijmo-wijmenu .wijmo-wijmenu-item .wijmo-wijmenu-separator{ 1282 | padding: 5px 0; 1283 | background-image: none; 1284 | background-color: #222; 1285 | border-top: 1px solid #444; 1286 | border-bottom:0; 1287 | border-left:0; 1288 | border-right:0; 1289 | } 1290 | /* Fix for wijmo separator not being centered. */ 1291 | /* Hate having to add the li.wijmo-wijmenu-separator at the end, but because of order of CSS files being loaded, I needed to up the specificity level. */ 1292 | .wijmo-wijmenu-horizontal .wijmo-wijmenu-child li.wijmo-wijmenu-separator{ 1293 | width:96%; 1294 | margin:1px 2%; 1295 | } 1296 | 1297 | .wijmo-wijmenu .wijmo-wijmenu-item input { 1298 | -moz-transition: none 0s ease 0s; 1299 | background-color: rgba(255, 255, 255, 0.3); 1300 | border: 1px solid #111111; 1301 | border-radius: 4px 4px 4px 4px; 1302 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 rgba(255, 255, 255, 0.25); 1303 | color: rgba(255, 255, 255, 0.75); 1304 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; 1305 | line-height: 1; 1306 | margin: 5px 10px 0 10px; 1307 | padding: 4px 9px; 1308 | width:100px; 1309 | } 1310 | 1311 | .wijmo-wijmenu .wijmo-wijmenu-item input:hover { 1312 | background-color: rgba(255, 255, 255, 0.5); 1313 | color: #FFFFFF; 1314 | } 1315 | 1316 | .wijmo-wijmenu .wijmo-wijmenu-item input:focus { 1317 | background-color: #FFFFFF; 1318 | border: 0 none; 1319 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 1320 | color: #404040; 1321 | outline: 0 none; 1322 | padding: 5px 10px; 1323 | text-shadow: 0 1px 0 #FFFFFF; 1324 | } 1325 | 1326 | 1327 | .wijmo-wijmenu .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { 1328 | text-shadow:none; 1329 | } 1330 | 1331 | 1332 | .wijmo-wijmenu .ui-state-default{ 1333 | box-shadow: none; 1334 | color:#BFBFBF; 1335 | filter: none; 1336 | } 1337 | 1338 | --------------------------------------------------------------------------------