Skip to content
Browse files

Fixed statistics and missing files

  • Loading branch information...
1 parent f883d73 commit 95caf28b287054773be482834ec3c5ad46094116 @hjsch hjsch committed Jul 7, 2012
Showing with 977 additions and 785 deletions.
  1. +1 −0 .gitignore
  2. +23 −3 app.js
  3. +0 −34 bin/app_start.sh
  4. +0 −25 bin/app_stop.sh
  5. +0 −15 bin/forever-app
  6. +0 −15 bin/forever-proxy
  7. +0 −39 bin/proxy_start.sh
  8. +0 −25 bin/proxy_stop.sh
  9. +24 −6 bin/proxyd
  10. +2 −1 bin/start_hosted_apps.sh
  11. +1 −1 bin/stop_hosted_apps.sh
  12. +1 −1 bin/top
  13. +3 −3 deps/cloudnode-proxy/proxy-stats.js
  14. +50 −29 lib/app.js
  15. +2 −2 lib/lib.js
  16. +57 −1 lib/middle.js
  17. +0 −109 old/bootstrap.sh
  18. +0 −27 old/installmodules.rb
  19. +0 −64 old/launchnodester.rb
  20. +0 −78 old/readme.txt
  21. +8 −0 proxy/proxy.js
  22. +1 −1 public/static/css/cloudnode-min.css
  23. +50 −66 public/static/css/greycurve.css
  24. +1 −0 public/static/css/jquery.jqplot.min.css
  25. BIN public/static/img/cloudnode-logo-small-light.png
  26. BIN public/static/img/cloudnode-logo2-light.png
  27. BIN public/static/img/page-bg1.jpg
  28. BIN public/static/img/page-bg2.jpg
  29. +14 −6 public/static/js/cloudnode-min.js
  30. +57 −0 public/static/js/jquery.jqplot.min.js
  31. +57 −0 public/static/js/plugins/jqplot.canvasAxisLabelRenderer.min.js
  32. +57 −0 public/static/js/plugins/jqplot.canvasAxisTickRenderer.min.js
  33. +57 −0 public/static/js/plugins/jqplot.canvasTextRenderer.min.js
  34. +57 −0 public/static/js/plugins/jqplot.dateAxisRenderer.min.js
  35. +57 −0 public/static/js/plugins/jqplot.highlighter.min.js
  36. +351 −0 public/static/js/soy-min.js
  37. +43 −0 public/static/js/soyutils-min.js
  38. +0 −234 scripts/launch_chrooted_app.js
  39. +3 −0 scripts/start_hosted_apps.js
View
1 .gitignore
@@ -7,6 +7,7 @@ ssl/*
bin/.nodester.config
*.log
*.log.*
+*.log*.gz
node_modules
logs
public/static/node-*
View
26 app.js
@@ -11,16 +11,13 @@ http://nodester.com
var express = require('express'),
url = require('url'),
- sys = require('sys'),
config = require('./config'),
middle = require('./lib/middle');
process.on('uncaughtException', function(err) {
console.log(err.stack);
});
-var daemon = require('daemon');
-// daemon.setreuid(config.opt.userid);
var myapp = express.createServer();
var gzippo = require('gzippo');
@@ -150,6 +147,29 @@ myapp.post('/appdomains', middle.authenticate, middle.authenticate_app, domains.
myapp.delete('/appdomains', middle.authenticate, middle.authenticate_app, domains.delete);
myapp.get('/appdomains', middle.authenticate, domains.get);
+// Redis DB support
+var redisdb = require('./lib/redisdb');
+// GET will retrieve details of a redis db, read the log/config files or start/stop/restart the database
+// POST will create a named redis db instance
+// DELETE will remove a named redis db instance
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/<dbname>
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/logs/<dbname>
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/config/<dbname>
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/start/<dbname>
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/stop/<dbname>
+// curl -X GET -u "testuser:123" http://localhost:4001/redis/restart/<dbname>
+// curl -X POST -u "testuser:123" -d "dbname=test" http://localhost:4001/redis
+// curl -X DELETE -u "testuser:123" -d "dbname=test" http://localhost:4001/redis
+myapp.get('/redis/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.get);
+myapp.get('/redis', middle.authenticate, redisdb.get_all);
+myapp.get('/redis/start/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_start);
+myapp.get('/redis/stop/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_stop);
+myapp.get('/redis/restart/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.redis_restart);
+myapp.get('/redis/logs/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.logs);
+myapp.get('/redis/config/:dbname', middle.authenticate, middle.authenticate_redisdb, redisdb.config);
+myapp.post('/redis', middle.authenticate, redisdb.post);
+myapp.delete('/redis', middle.authenticate, middle.authenticate_redisdb, redisdb.delete);
+
myapp.use(express.errorHandler({
showStack: true
View
34 bin/app_start.sh
@@ -1,34 +0,0 @@
-#!/bin/bash
-
-#if [ "$USER" != "root" ]; then
-# echo "Must be root to run this.. Please sudo this command."
-# exit
-#fi
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-rm ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
-
-APPDIR=$APP_DIR
-FHOME=$HOME/forever-app/
-
-if [ ! -d $FHOME ]; then
- mkdir -p $FHOME/logs
- mkdir -p $FHOME/pids
-fi
-
-if [ -f $FHOME/logs/forever.log ]; then
- rm -rRf $FHOME/logs/forever.log
-fi
-
-
-wait
-forever start -l logs/forever.log -o $FHOME/logs/app-out.log -e $FHOME/logs/app-err.log -d $APPDIR -p $FHOME ../app.js
-wait
-forever list -p $FHOME app.js
View
25 bin/app_stop.sh
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-#if [ "$USER" != "root" ]; then
-# echo "Must be root to run this.. Please sudo this command."
-# exit
-#fi
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-rm ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
-
-APPDIR=$APP_DIR
-
-
-FHOME=$HOME/forever-app
-
-forever stopall -p $FHOME
-
-sleep 1
View
15 bin/forever-app
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/bin:${PATH}";
-
-FHOME=$HOME/forever-app/
-
-forever "$@" -p $FHOME
-
View
15 bin/forever-proxy
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/bin:${PATH}";
-
-FHOME=$HOME/forever-proxy
-
-
-forever "$@" -p $FHOME
View
39 bin/proxy_start.sh
@@ -1,39 +0,0 @@
-#!/bin/bash
-
-if [ "$USER" != "root" ]; then
- echo "Must be root to run this.. Please sudo this command."
- exit
-fi
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-wait
-rm ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/node-v0.4.0/usr/local/bin:${HOME}/bin:${PATH}";
-
-APPDIR=$APP_DIR/proxy
-
-FHOME=$HOME/forever-proxy
-
-if [ ! -d $HOME/var ]; then
- mkdir $HOME/var
-fi
-
-if [ ! -d $FHOME ]; then
- mkdir -p $FHOME/logs
- mkdir -p $FHOME/pids
-fi
-
-if [ -f $FHOME/logs/forever.log ]; then
- rm -rRf $FHOME/logs/forever.log
-fi
-
-ulimit -n 99999;
-forever start -l logs/forever.log -o $FHOME/logs/proxy-out.log -e $FHOME/logs/proxy-err.log -d $APPDIR -p $FHOME $APPDIR/proxy.js
-wait
-forever list -p $FHOME proxy.js
View
25 bin/proxy_stop.sh
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-if [ "$USER" != "root" ]; then
- echo "Must be root to run this.. Please sudo this command."
- exit
-fi
-
-cd `dirname $0`
-
-./node-config.js
-wait
-source ./.nodester.config
-wait
-rm ./.nodester.config
-
-export HOME=$HOME_DIR;
-export PATH="/usr/local/bin:${HOME}/bin:${PATH}";
-
-APPDIR=$APP_DIR
-
-FHOME=$HOME/forever-proxy
-
-forever stopall -p $FHOME
-
-sleep 1
View
30 bin/proxyd
@@ -6,12 +6,18 @@ APP="Proxy"
DATE=$(date)
LOG="proxyd.log"
+# Stashboard bin path
+STASH_PATH=/home/hajo/bin
+
+# used to append the current date to the archive name
+DATE2=$(date +"%Y%m%d")
+
if [ -z "$USER" ]; then
USER=root
fi
cd /var/cloudnode/nodester
-#echo "$DATE Proxy control started with command $1 as user $USER" | tee -a $LOG
+echo "$DATE Proxy control started with command $1 as user $USER" | tee -a $LOG
get_pid()
{
@@ -26,8 +32,18 @@ case "$1" in
fi
get_pid
if [ -z "$PID" ]; then
- /usr/local/node-v0.4.0/node proxy/proxy.js > proxy.log | tee -a $LOG &
+ # save log file
+ mv proxy.log proxy.log.$DATE2
+ # start proxy
+# /usr/local/node-v0.4.0/node proxy/proxy.js > proxy.log | tee -a $LOG &
+# /usr/local/node-v0.6.11/node proxy/proxy.js > proxy.log | tee -a $LOG &
+ node proxy/proxy.js > proxy.log | tee -a $LOG &
echo "$APP started" | tee -a $LOG
+
+ # log event
+ if [ "$2" = "notify" ]; then
+ python ${STASH_PATH}/stashboard-client/cloudnode-status.py -t cloudnode-proxy -s up -m "online with all services"
+ fi
else
echo "$APP is already running ($PID)" | tee -a$LOG
fi
@@ -38,6 +54,12 @@ case "$1" in
if [ -n "$PID" ]; then
kill -9 $PID
echo "$APP stopped ($PID)" | tee -a $LOG
+
+ # log event
+ if [ "$2" = "notify" ]; then
+ python ${STASH_PATH}/stashboard-client/cloudnode-status.py -t cloudnode-proxy -s down -m "The Cloudnode proxy service is experiencing a service disruption"
+ fi
+
else
echo "$APP is not running ($PID)" | tee -a $LOG
fi
@@ -49,9 +71,7 @@ case "$1" in
exit
fi
$0 stop
- $0 stat
sleep 1
- $0 stat
$0 start
$0 stat
;;
@@ -71,5 +91,3 @@ case "$1" in
;;
esac
-
-
View
3 bin/start_hosted_apps.sh
@@ -6,4 +6,5 @@ cd `dirname $0`
wait
source ./.nodester.config
-node $APP_DIR/scripts/start_hosted_apps.js start "$@"
+ulimit -n 2048
+sudo -u cloudnode /usr/local/node-v0.4.12/node $APP_DIR/scripts/start_hosted_apps.js start "$@"
View
2 bin/stop_hosted_apps.sh
@@ -6,4 +6,4 @@ cd `dirname $0`
wait
source ./.nodester.config
-node $APP_DIR/scripts/start_hosted_apps.js stop "$@"
+/usr/local/node-v0.4.12/node $APP_DIR/scripts/start_hosted_apps.js stop "$@"
View
2 bin/top
@@ -1,7 +1,7 @@
#!/usr/bin/env node
var exec = require('child_process').exec;
-var cmd = "ps aux | awk '/launch_chroot/ && !/awk/ {print $3,$4,$2,$5,$6,$10,$13}' | sort -r | head -n 20";
+var cmd = "ps aux | awk '/launch_/ {print $3,$4,$2,$5,$6,$10,$13}' | sort -r | head -n 20";
require('colors');
View
6 deps/cloudnode-proxy/proxy-stats.js
@@ -59,13 +59,13 @@ exports.recordRequest = function(req, options) {
"hits",
"hits-by-app:" + appName,
"hits-by-day:" + day,
- "hits-by-app-by-month:" + appName + ':' + month,
- "hits-by-ip-by-day:" + ip,
+ "hits-by-app-by-month:" + appName + ':' + month,
+ "hits-by-ip-by-day:" + ip + ':' + day,
];
if (referer) {
urlhash = crypto.createHash("md5").update(referer).digest("hex");
- keys.push("hits-by-app-by-url-by-day:" + urlhash + ":" + day);
+ keys.push("hits-by-app-by-url-by-day:" + appName + ':' + urlhash + ":" + day);
client.set("url:" + urlhash, referer);
}
View
79 lib/app.js
@@ -3,6 +3,7 @@ var config = require('../config'),
path = require('path'),
cradle = require('cradle'),
lib = require('./lib'),
+ util = require('util'),
spawn = require('child_process').spawn,
exec = require('child_process').exec;
@@ -39,17 +40,17 @@ module.exports = {
res.writeHead(500, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({status: "failure", message: err.error + ' - ' + err.reason}) + '\n');
} else {
- console.log('Resetting repo from git: ', app.repo_id);
+ util.log('Resetting repo from git: ' + app.repo_id);
var app_user_home = path.join(config.opt.apps_home_dir, user._id, app.repo_id);
var cmd = 'rm -rf "' + app_user_home + '"';
- console.log('cmd:', cmd);
+ util.log('cmd:' + cmd);
//Delete the Git clone chroot dir
exec(cmd, function() {
var git = 'cd "' + app_user_home + '.git" && git clone . "' + app_user_home + '"';
- console.log('Clone: ', git);
+ util.log('Clone: ' + git);
exec(git, function() {
- console.log('Restarting app');
+ util.log('Restarting app');
//Restart the app to make a fresh clone
app_restart(app.repo_id, function() {
res.send({
@@ -333,10 +334,10 @@ module.exports = {
res.end(JSON.stringify({status: "failure", message: err.error + ' - ' + err.reason}) + '\n');
} else {
var cmd = config.opt.app_dir + '/scripts/gitreposetup.sh ' + [config.opt.app_dir, config.opt.git_home_dir, user._id, repo_id, start, config.opt.userid, appname, config.opt.apps_home_dir].join(' ');
- console.log('gitsetup cmd: %s', cmd);
+ util.log('gitsetup cmd: ' + cmd);
exec(cmd, function(err, stdout, stderr) {
if (err) console.error('gitsetup error: %s', err);
- if (stdout.length > 0) console.log('gitsetup stdout: %s', stdout);
+ if (stdout.length > 0) util.log('gitsetup stdout: ' + stdout);
if (stderr.length > 0) console.error('gitsetup stderr: %s', stderr);
});
@@ -376,7 +377,7 @@ module.exports = {
});
},
env_put: function(req, res, next) {
- var appname = req.body.appname.toLowerCase();
+ var appname = req.body.appname;
var db = lib.get_couchdb_database('apps');
var key = req.body.key,
value = req.body.value;
@@ -406,7 +407,7 @@ module.exports = {
});
},
env_delete: function(req, res, next) {
- var appname = req.body.appname.toLowerCase();
+ var appname = req.body.appname;
var db = lib.get_couchdb_database('apps');
var key = req.body.key;
if (!key) {
@@ -470,23 +471,23 @@ var env_update = function(res, db, appname, appdoc, key, value) {
var force_stop = function(repo_id, callback) {
- console.log('Forcing stop for: ', repo_id);
- console.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
+ util.log('Forcing stop for: ' + repo_id);
+ util.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
exec("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'", function(err, pid) {
if (err) {
callback(false);
return;
}
try {
- console.log('PID: "' + pid + '"');
var pids = pid.split('\n'),
k = false;
var p = parseInt(pids[0]);
- console.log('p: "' + p + '"');
+ util.log('PID: "' + p + '"');
if (p > 0) {
- console.log('Sending SIGKILL to ', p);
+ util.log('Sending SIGKILL to ' + p);
process.kill(p, 'SIGKILL');
k = true;
+ util.log('Application stopped. (Forced SIGKILL)');
}
callback(k);
} catch (e) {
@@ -502,16 +503,24 @@ var app_stop = function (repo_id, callback) {
if (err) {
callback(false);
} else {
+ util.log('### Application ' + doc.appname + ' stopping...');
var app_home = path.join(config.opt.apps_home_dir, doc.username, doc._id);
+ util.log('Reading: ' + path.join(app_home, '.nodester', 'pids', 'app.pid'));
fs.readFile(path.join(app_home, '.nodester', 'pids', 'app.pid'), function (err, data) {
if (err) {
+ util.log('Could not read app.pid - forcing stop');
force_stop(repo_id, callback);
} else {
try {
var p = parseInt(data.toString());
fs.unlink(path.join(app_home, '.nodester', 'pids', 'app.pid'));
if (p > 0) {
process.kill(p, 'SIGKILL');
+ util.log('Application stopped. (SIGKILL)');
+ // write stop event to log file
+ var error_log_fd = fs.openSync(path.join(app_home, '', 'error.log'), 'a');
+ fs.write(error_log_fd, "\n\nApplication stopped. (API app stop) " + new Date());
+ fs.closeSync(error_log_fd);
} else {
force_stop(repo_id, callback);
}
@@ -538,6 +547,7 @@ var app_start = function (repo_id, callback) {
if (err) {
callback(false);
} else {
+ util.log('### Application ' + doc.appname + ' starting...');
var configData = {
appdir: config.opt.app_dir,
userid: config.opt.uid,
@@ -546,46 +556,57 @@ var app_start = function (repo_id, callback) {
port: app.port,
ip: '127.0.0.1',
name: doc.appname,
- env: app.env || {}
+ env: app.env || {}
};
- console.log('Checking: ', app_home);
+ util.log('Checking: ' + app_home);
if (!path.existsSync(app_home)) {
//Bad install??
- console.log('App directory does not exist: ', app_home);
+ util.log('App directory does not exist: ' + app_home);
callback(false);
return;
}
- console.log('Checking: ', path.join(app_home, app.start));
+ util.log('Checking: ' + path.join(app_home, app.start));
if (!path.existsSync(path.join(app_home, app.start))) {
//Bad install??
- console.log('App start file does not exist: ', path.join(app_home, app.start));
+ util.log('App start file does not exist: ' + path.join(app_home, app.start));
callback(false);
return;
}
- console.log('Checking: ', path.join(app_home, '.nodester'));
+ util.log('Checking: ' + path.join(app_home, '.nodester'));
if (!path.existsSync(path.join(app_home, '.nodester'))) {
- console.log('Making Directories..');
+ util.log('Making Directories..');
fs.mkdirSync(path.join(app_home, '.nodester'), 0777);
fs.mkdirSync(path.join(app_home, '.nodester', 'logs'), 0777);
fs.mkdirSync(path.join(app_home, '.nodester', 'pids'), 0777);
}
- console.log('Writing config data: ', path.join(app_home, '.nodester', 'config.json'));
+ util.log('Writing config data: ' + path.join(app_home, '.nodester', 'config.json'));
fs.writeFileSync(path.join(app_home, '.nodester', 'config.json'), JSON.stringify(configData), encoding='utf8');
- //var cmd = "sudo " + path.join(config.opt.app_dir, 'scripts', 'launch_app.sh') + ' ' + config.opt.app_dir + ' ' + config.opt.userid + ' ' + app_home + ' ' + app.start + ' ' + app.port + ' ' + '127.0.0.1' + ' ' + doc.appname;
- var cmd = 'cd ' + app_home + ' && sudo ' + path.join(config.opt.app_dir, 'scripts', 'launch_chrooted_app.js') + ' "' + doc.username + '/' + repo_id + '/' + doc.appname + '/' + app.start + ':' + app.port + '"';
- console.log(cmd);
+
+ var cmd = 'cd ' + app_home + ' && sudo ' + path.join(config.opt.app_dir, 'scripts', 'launch_app.js') +
+ ' "' + doc.username + '/' + repo_id + '/' + doc.appname + '/' + app.start + ':' + app.port + '"';
+
+ // check node version
+ var node_version = configData.env.node_version;
+
+ if (node_version != undefined && node_version.substring(0, 3) == '0.6') {
+ cmd = 'sudo ' + path.join(config.opt.app_dir, 'bin', 'node-runner') + ' ' + app_home + ' ' + doc.appname + ' ' + app.start + ' ' + app.port;
+ }
+
+ util.log(cmd);
exec(cmd, function (error, stdout, stderr) {
if (stdout) {
console.log(stdout);
}
if (stderr) {
- console.log(stderr);
+ console.log('Launcher: ' + stderr);
+ }
+ if (error != null) {
+ console.log('Exec: ' + error);
}
- console.log('Getting new PID');
- console.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
+ util.log('Getting new PID');
+ util.log("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'");
exec("ps aux | awk '/" + repo_id + "/ && !/awk |curl / {print $2}'", function(err, pid) {
- console.log('PID: "' + pid + '"');
var tapp = {
pid: 'unknown',
running: 'failed-to-start'
@@ -597,7 +618,7 @@ var app_start = function (repo_id, callback) {
tapp.pid = p;
tapp.running = 'true';
}
- console.log(tapp);
+ util.log('Application ' + doc.appname + ' has been started - ' + util.inspect(tapp));
apps.merge(doc.appname, tapp, function() {
callback(true, p);
});
View
4 lib/lib.js
@@ -69,8 +69,8 @@ var default_routes = {
router: {}
};
default_routes.router["127.0.0.1"] = "127.0.0.1:4001";
-default_routes.router[www_dom] = "81.169.133.153";
-default_routes.router[tl_dom] = "81.169.133.153";
+default_routes.router[www_dom] = "127.0.0.1:8989";
+default_routes.router[tl_dom] = "127.0.0.1:8989";
default_routes.router[api_dom] = "127.0.0.1:4001";
default_routes.router[docs_dom] = "81.169.133.153";
default_routes.router[gitweb_dom] = "127.0.0.1:90";
View
58 lib/middle.js
@@ -100,9 +100,65 @@ var authenticate_app = function(req, res, next) {
}
};
+/**
+ * Use CouchDB to get redis information, this route must come AFTER middle.authenticate
+ */
+var authenticate_redisdb = function(req, res, next) {
+ //GET Request
+ var dbName = req.params.dbname;
+ //POST|DELETE|PUT requests
+ if (!dbName && req.query && req.query.dbname) {
+ dbName = req.query.dbname;
+ }
+ if (!dbName && req.body && req.body.dbname) {
+ dbName = req.body.dbname;
+ }
+ if (dbName) {
+ dbName = dbName.toLowerCase();
+ }
+
+ if (!dbName || dbName === '') {
+ res.writeHead(400, {
+ 'Content-Type': 'application/json'
+ });
+ res.end('{"status" : "Must pass an redis database name (dbName)."}\n');
+ return;
+ }
+
+ if (req.user) {
+ var db = lib.get_couchdb_database('redis');
+ db.get(dbName, function(err, doc) {
+ if (err) {
+ res.writeHead(400, {
+ 'Content-Type': 'application/json'
+ });
+ res.end('{"status" : "failure - redis database not found (' + dbName + ')"}\n');
+ } else {
+ if (doc.username == req.user._id) {
+ req.dbName = dbName;
+ req.doc = doc;
+ next();
+ } else {
+ res.writeHead(400, {
+ 'Content-Type': 'application/json'
+ });
+ res.end('{"status" : "failure - authentication for ' + dbName + ' failed."}\n');
+ }
+ }
+ });
+ } else {
+ res.writeHead(400, {
+ 'Content-Type': 'application/json'
+ });
+ res.end('{"status" : "failure - authentication."}\n');
+ }
+};
+
module.exports.authenticate = authenticate;
module.exports.authenticate_app = authenticate_app;
+module.exports.authenticate_redisdb = authenticate_redisdb;
+
/*
* Generic request error handler.
*/
@@ -119,4 +175,4 @@ module.exports.error = function() {
};
next();
};
-};
+};
View
109 old/bootstrap.sh
@@ -1,109 +0,0 @@
-#!/bin/bash
-# Paste this in the userdata field while launching a new instance.
-
-########################################
-# Created by John Alberts
-# Mofied by John Dyer
-# Mofied by Chris Matthieu
-# Last modified: 1/9/2011
-#
-# Error Codes:
-# 1 - Not running as root
-# 2 - Invalid hostname
-# 3 - Failed to get remove Ruby OS packages
-# 4 - Failed to compile and install Ruby
-#
-# NOTES:
-# This only works on CentOS 5. Only tested on x86_64
-#
-#########################################
-
-
-RUBY_SOURCE_URL="ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p330.tar.gz"
-# The below URL only works from within the exlibrisgroup network. Anyone else should use the URL above.
-
-if ! ( whoami | grep root > /dev/null 2>&1); then
- echo "YOU MUST BE ROOT TO RUN THIS SCRIPT"'!'
- exit 1
-fi
-
-if ! ( ping -c1 -q `hostname -f` > /dev/null 2>&1 ); then
- echo "hostname -f must be a valid fqdn for Chef to work properly"'!'
- exit 2
-fi
-
-echo "Removing already installed Ruby OS packages..."
-PKGLIST="$(yum list | grep installed | grep ruby | sed -n 's/\([^.]*\)\.\(x86_64\|i386\).*$/\1/p' | tr '\n' ' ')"
- if [[ $PKGLIST != "" ]]; then
- yum -y erase $PKGLIST
- RETVAL=$?
- else
- RETVAL=0
- fi
-
-echo;echo
-if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to remove Ruby OS packages"'!'
- exit 3
-fi
-
-echo "Installing Ruby and dependencies..."
-yum -y install gcc gcc-c++ zlib-devel openssl-devel readline-devel
-
-mkdir /tmp/sources
-cd /tmp/sources
-
-
-# Get # cpu's to make this faster
-CPUS="$(grep processor /proc/cpuinfo | wc -l)"
-
-wget "${RUBY_SOURCE_URL}"
-tar -xvzf $(basename ${RUBY_SOURCE_URL})
-cd $(basename ${RUBY_SOURCE_URL/.tar.gz})
-./configure
-make -j $CPUS
-make -j $CPUS install
-RETVAL=$?
-
-echo;echo
-
-if [[ ${RETVAL} -ne 0 ]]; then
-echo "RUBY INSTALLATION FAILED"'!'
-exit 4
-fi
-
-echo 'gem: --no-ri --no-rdoc' > /root/.gemrc
-
-sudo rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
-
-
-# yum install git-core
-cd /tmp
-wget http://kernel.org/pub/software/scm/git/git-1.7.3.5.tar.bz2
-bzip2 -d git-1.7.3.5.tar.bz2
-tar xvf git-1.7.3.5.tar
-cd git-*
-./configure
-make prefix=/usr install
-# make install
-
-
-# curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.4.1.tgz
-wget http://production.cf.rubygems.org/rubygems/rubygems-1.4.1.tgz
-tar xfz rubygems-1.4.1.tgz
-/usr/local/bin/ruby setup.rb
-
-gem install chef ohai --no-rdoc --no-ri
-mkdir /etc/chef
-chown root:root /etc/chef
-
-cd /tmp
-wget http://nodejs.org/dist/node-v0.3.4.tar.gz
-tar -zxvf node-v0.3.4.tar.gz
-cd node*
-./configure
-make
-make install
-
-
-echo "Installation completed."
View
27 old/installmodules.rb
@@ -1,27 +0,0 @@
-#!/usr/bin/env ruby
-
-# Replace with `npm ls | awk '{print $1}' | xargs npm install`
-
-require 'rubygems'
-require 'json'
-require 'net/http'
-
-class MethodTable # returns JSON hash containing all NPM modules available
-def get_table
-url = "http://registry.npmjs.org"
-url = URI.parse(url)
-method_list = Net::HTTP.get(url)
-end
-end
-
-method_table = MethodTable.new
-table = method_table.get_table
-table = JSON.parse(table)
-
-table.each do |i|
- if i[0].downcase != "uninstall"
- puts "nmp install #{i[0]}"
- # system 'npm install #{i[0]}' rescue nil
- `npm install #{i[0]}` rescue nil
- end
-end
View
64 old/launchnodester.rb
@@ -1,64 +0,0 @@
-#!/usr/bin/env ruby
-
-# Run this app to stop and restart all Nodester jobs
-
-require 'rubygems'
-require 'json'
-
-# Kill all node processes
-# `killall node`
-`sudo sh -c "killall node"`
-
-
-# Launch Nodester
-child_pid = fork do
- # Must be started with SUDO to run on port 80
- `sudo sh -c "/usr/local/bin/node proxy.js"`
- # `sudo sh -c "/usr/local/bin/nodemon proxy.js"`
- # `sudo sh -c "/usr/local/bin/forever proxy.js"`
-end
-Process.detach(child_pid)
-
-child_pid = fork do
- `nodemon app.js`
-end
-Process.detach(child_pid)
-
-
-# Launch Apps
-require 'rest-client'
-res = RestClient.get 'http://nodefu:glitter@nodefu.couchone.com/apps/_design/nodeapps/_view/all', {:accept => :json}
-
-# server = Couch::Server.new("nodefu.couchone.com", "80")
-# res = server.get('/apps/_design/nodeapps/_view/all')
-
-jsonresp = res.body
-dbdata = JSON.parse(jsonresp)
-nodesterdir = Dir.pwd
-dbdata["rows"].each do |app|
- begin
- child_pid = fork do
- begin
- Dir.chdir("apps/#{app["value"]["_rev"]}")
- # Dir.chdir("apps/#{app["value"]["_id"]}")
- `nodemon #{app["value"]["start"]}`
- Dir.chdir("../..")
- puts app["value"]["_id"] + ' : ' + app["value"]["_rev"] + ' : ' + app["value"]["start"]
- # puts app["value"]["_id"] + ' : ' + app["value"]["_id"] + ' : ' + app["value"]["start"]
- rescue Exception => e
- Dir.chdir(nodesterdir)
- end
- end
- Process.detach(child_pid)
- rescue Exception => e
- Dir.chdir(nodesterdir)
- end
-
-
-end
-
-puts "Nodester launched - HiYah!"
-
-exit
-# res = server.put("/imsms/phonosdk", '{ "jid":"' + jid.to_s + '", "_rev":"' + dbdata["_rev"].to_s + '" }')
-
View
78 old/readme.txt
@@ -1,78 +0,0 @@
-Nodester (http://nodester.com) = Node.js Hosting Platform
-
-This is an *experimental* service for managing hosted nodejs apps. It consists of an API that allows developers to create and manage nodejs apps. Node apps are assigned subdomains that proxy to ports with an assigned address. Instances (dynos) are launched using Forever so that they run until you stop them or using Nodemon where they run until a file changes from a git update.
-
-Please see install.txt for setup instructions.
-
-API Documentation:
-
-COUPON
-/coupon - creates coupon request for early access (pass in email) - <b>Note: This resource does not use base api url
-curl -X POST -d "email=chris@nodester.com" http://localhost:8080/coupon
-
-STATUS
-/status - returns status of the platform and number of nodejs apps running
-// curl http://api.localhost:8080/status
-
-USER
-/user - creates user account (pass in user and password and email) - Note: This resource does not use the api subdomain
-curl -X POST -d "user=testuser&password=123&email=chris@nodester.com" http://localhost:8080/user
-
-/user - delete user account (requires basic auth)
-curl -X DELETE -u "testuser:123" http://api.localhost:8080/user
-
-APP
-/app - create nodejs app for hosting (requires basic auth and returns the port address required for use along with a git repo to push to)
-curl -X POST -u "testuser:123" -d "appname=a&start=hello.js" http://api.localhost:8080/app
-
-Get information about an app
-curl -u "testuser:123" http://api.localhost:8080/app/a
-
-Start or stop an app using running=true|false
-curl -X POST -u "testuser:123" -d "appname=a&running=true" http://api.localhost:8080/app
-curl -X POST -u "testuser:123" -d "appname=a&running=false" http://api.localhost:8080/app
-
-/app - update nodejs app for hosting (requires basic auth, appname, and starting page and returns the port address required for use along with a git repo to push to)
-curl -X PUT -u "testuser:123" -d "appname=a&start=hello1.js" http://api.localhost:8080/app
-
-/app - delete nodejs app (requires basic auth and appname)
-curl -X DELETE -u "testuser:123" -d "appname=test" http://api.localhost:8080/app
-
-/app - get nodejs app info (requires basic auth and appname)
-curl -u "testuser:123" http://api.localhost:8080/app/appname
-
-/apps - get all your apps info (requires basic auth)
-curl -u "testuser:123" http://api.localhost:8080/apps
-
-/appnpm - install, update and uninstall npm packages to your application
-curl -X POST -u "testuser:123" -d "appname=a&action=install&package=express" http://api.localhost:8080/appnpm
-
-Testing:
-Subdomains can be tested by editing /etc/hosts like this:
-127.0.0.1 localhost a.localhost b.localhost c.localhost
-save etc/hosts and flush DNS like this: sudo dscacheutil -flushcache
-
-http://localhost:8080 = Homepage
-http://a.localhost:8080 = Runs app associated with subdomain a on couch-configured port
-http://b.localhost:8080 = Runs app associated with subdomain b on couch-configured port
-http://chris:123@api.localhost:8080/status = API to list status of all node apps
-http://chris:123@api.localhost:8080/list/2.json = API TBD
-
-Todos:
-- add rsa keys for private repos (gitolite or gitosis?)
-- add ability to control number of instances
-- Add Command Line Interface
-- Add SSL support
-- Add better error handling
-
-Considerations:
-- 64k port limitation per IP address on Linux - how do we scale horizontally?
- -- We can using 127.0.0.X so aliases on lo device
-- sandbox node instances?
- -- Chroot?
-
-Contribute:
-If this project inspires you, please feel free to help out by forking this project and sending me pull requests.
-
-License:
-Apache 2 - Have fun! :)
View
8 proxy/proxy.js
@@ -106,6 +106,13 @@ var handle_http_request = function(req, res) {
Location: 'http://cloudno.de'
});
res.end();
+ } else if (req.headers.host == 'cloudno.de' &&
+ (req.url.indexOf('/user') == 0 ||
+ req.url.indexOf('/login') == 0 ||
+ req.url.indexOf('/admin') == 0 ||
+ req.url.indexOf('/signup') == 0)) {
+ var proxy = new httpProxy.HttpProxy({host: "81.169.133.153", port: 80});
+ proxy.proxyRequest(req, res);
} else {
var options = lookup_hostport(req.headers.host);
if (options !== null) {
@@ -179,6 +186,7 @@ lib.update_proxytable_map(function(err) {
if (req.headers.host == 'cloudno.de' &&
(req.url.indexOf('/lead') == 0 ||
req.url.indexOf('/api') == 0 ||
+ req.url.indexOf('/beta') == 0 ||
req.url.indexOf('/account') == 0 ||
req.url.indexOf('/contact') == 0 ||
req.url.indexOf('/myapps') == 0 ||
View
2 public/static/css/cloudnode-min.css
@@ -1 +1 @@
-body.landing{margin:8px;background:#254278 url(https://cloudno.de/static/img/cloudnode-bg.png) repeat}div#container{clear:both;padding-top:150px;color:white}div#container h1{text-align:center}div#container h4{text-align:center;margin-top:1.33em}p#thanks{font-weight:bold;color:white}div#form{width:660px;padding:25px 40px;border:1px solid #1b386e;margin:20px auto;display:block;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#254278;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#2f4c82),to(#223f75));background:-moz-linear-gradient(center top,#2f4c82 0%,#223f75 100%);background:-ms-linear-gradient(bottom,#2f4c82,#223f75)}div.rpx_box{float:right;font-size:11px;margin-right:25px;margin-top:5px;padding-left:20px;padding-top:5px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzZJREFUeNpiOHXqFMP/JAYbJkZGxmIGBobDAAHEABZJYWBgPHXuIgPTv99pAAEEFgGLRjP8P336NAMTUJ0bExOTCAM7AwP321sMAAHEeObMGQbjOSYMDH8YGIGS/1mABMPJnNsxQGP+s/z4sJTp////rxV3VS1h/f52KVCuBmSfCPfzKwxGM8xBilsAAogRZAPQUIZ///4xmPabMTBwMvxn+MHAeLr4HANQMdhWEFgEVPT/Yvq2JoZfDAyX07Y0Mf3/943x39+jQHGmV0B77vxnZGbUX+RVx8DGwKA7zacO6AguoEZrJlZWVjEg4z7j/7+/T+VePgl07jsGXgYG4+nGYKMBAogR5DsQMJlrCrHsN0Md0EdNIObZjDNwNzBcjtjCALR/H5BpdjlmC8OZrPNgcRaYgp98Mvo/+BWk/zOz/PrJJ6vL+O/3ZZgCZaB3zv9jZDoIDKt/wND6C0SNQHFQQLCyACXv/P371+k3v/h+9ncP9gAd+fUfK1cq868vmUAFn8FWAL26X3++KwMDM9B5LAyMf1m53gIVtIDlgPgjMBxKr4SvZGD4C7KCgcWyUY7hPzMb2G2gsBcAmpDI+ufb/y/S+kZAsY0M3EBv9+mBFQAEGAsoLkBhDsJAk8DYdAYwTiAGJDH8ZOgC2gOMGAY3UDRcSN0NVgsCfzgEEMGADE7nX2PgenmFQXtxWATQIGFg4L6/Grua4ZuYNgPjr69wA2B+gAGQnUlAyV1Mv789+Cxt8vuTirUzwxcGhg/qziEgPlD8PlB+K1AdMMExqAFxDsgAIaDgFlBcAJ1fzsDEsvgvK7ctz5NTrLz3ju9mACYJgZv714teX88KDD1/oDopIF4MxDeBuJcFGEBHgQwNYHpcAKQT/zMyMUiemc0gu6cPlDZZIe78x8b4+xcDRBOjITAyEV4A2noPnKoYGWWBbB6mf78Y7jvUMKCEDjMDg9LuCga+xyd//mPhRAkvJnZ2dm+g5jogNmJmZv4MNGoG++cXVkern0r8Y+BghloGDiuN9YkMpl1aDOyfnqK4AEQ3A2khIBYHeuUsy59vZWw/35/6KqPPCjTAHijvA9cBdIDOUn84FwCczyRTHGMoXwAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50% transparent}.email{color:#808080;width:490px;font-size:28px;padding:4px;background-color:#d0d0d0;border:1px inset #aaa;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}a:focus{outline:none}.error{background-color:#f9ff9a;border:1px solid #e6db55}div.inline-msg{background:#fff1a8;border-color:#fff1a8;color:black;margin-top:4px;float:right}#footer{font-size:10px;width:620px;margin:auto;color:white}div.rpx_box{color:white}div.rpx_box a,div#footer a,div#container a{color:#4c92e9;text-decoration:none}a#signup{border:solid #ffd452 1px;float:right;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;width:130px;padding:10px;margin-top:2px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a#signup:hover,a#signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a#signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}div.column-fields input{width:98%}form.quickform2{margin-top:-14px}.btn{font-size:1.2em!important;font-family:Arial,Helvetica,Sans-Serif}#appjetfooter{display:none}h3{text-align:center}ul.providers{width:150px;padding:0;margin:0 5px 5px;float:left;list-style-type:none}ul.providers li{background:url(https://cloudno.de/static/img/buttons.png) no-repeat;height:50px;width:150px;cursor:pointer;padding:0;margin:10px 0 8px}li#twitter{background-position:0 0}li#twitter:hover{background-position:-150px 0}li#twitter:active{background-position:-300px 0}li#yahoo{background-position:0 -50px}li#yahoo:hover{background-position:-150px -50px}li#yahoo:active{background-position:-300px -50px}a#deleteAction{background:no-repeat left center;padding-left:16px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC')}a#futonAction{background-repeat:no-repeat;padding-left:20px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX/////////AAD9sbHxk5fFDhn/8PD/MzP/3t7eCA//////wMD/////MzP/ICD///+ar6PEAAAAEHRSTlMA////////////d/9E7v8zd/aTsQAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMC8xNC8wORmp4b0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAAbUlEQVQImWNgwAS8jS3LfC8AGUyJbdJFukAGi6GgkxKIcVFQ0M9dT4GBobBMUFBCCch4rCwo2LgJyFDSaxR5lv4AyFBSE1FSKmBgKJo6RTh0EtCgS1PDBcGM3SYujSbWGxgY/pxaJbjqzAdMuwFN4B3t4yT4+AAAAABJRU5ErkJggg==')}li#google{background-position:0 -100px}li#google:hover{background-position:-150px -100px}li#google:active{background-position:-300px -100px}form.quickform{background-color:#fff;border:1px solid #ccc;padding:.6em}form.quickform div.qfheader{font-size:1em;font-weight:bold;border-bottom:1px solid #ccc;margin-bottom:1em;padding:.1em .2em .2em 0}form.quickform div.qflabeldiv{margin-top:1em}form.quickform label.qflabel{color:#222;font-weight:bold;font-size:76%}form.quickform .qffield{margin-bottom:1em}form.quickform input.qfinputtext,form.quickform textarea.qfinputtextarea{border:1px solid #8faec6}form.quickform input.qfsubmit{margin-top:1em;padding:2px 6px}form.quickform span.surroundtext{color:#555;font-size:80%}div.qfclearfloats{clear:both}.qfcontainer{width:100%;margin-top:15px}.qflabel{color:#555;font-weight:bold;cursor:default}.qflabeldiv{margin-top:10px}.qfbuttondiv{margin-top:1.5em;margin-bottom:1.5em;height:27px}.qfcheckerdiv{margin-top:1.5em;margin-bottom:1.5em}div.checker{margin-left:-3px;margin-top:-3px}body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:0;background-attachment:fixed;background-color:#dee3e5;background-position:0% 40px;background-repeat:repeat-x;color:#333;background-image:none}.header-container{left:0;position:fixed;top:0;width:100%;z-index:12}.top-header a:link,.top-header a:visited{color:black}.top-header{color:black;font-size:13px;height:36px;background:#d4d9db;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d4d9db),to(#bdc0c2));background:-moz-linear-gradient(center top,#d4d9db 0%,#bdc0c2 100%);background:-ms-linear-gradient(bottom,#d4d9db,#bdc0c2)}.rpx_box2{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAM2SURBVHjaYmRAA/wcDAxRZtwMmQ4CDEqiLAzMDP8ZgcKhQJwExOE//zB85OdjZHj95juD5eR/DMfP32QQFRFiAAggFmRDmJiYGAJMRRi4+bgYCjczMIhwMTAsiPg/B2rISyD+7TOPicFMloFBRYgVyP3F8OfPH4a7d+4wAAQQ3CBhAUEGXh4ehoMPWRh+/P4PFpMTAFMmUCU/QcTN1wwMt98wMDAysDFws7EwxESEMzx+9IgBIIBYQK6QEpdg4OTgYPj//z8Yc7MBrf7LwMDKDDbgB9zFjAz/2YBiHGDrQZYxMty+dYuBhYWFASCAWOSkpMGMf//+MeAAjDD6P0Q3CmBjYwPTAAHEAjIE5AokoADEnkDsABT9+Osvw28uoNq//xi+Fm1i6gWKSwHxQSDeDvIpVA8rQACxIBkiA8S1QBwFdALPP6AwMyPDPiD1B+QkRkaGv8DwkQWK+wL5AUDxdqDwKiC+C8SqAAHEBDXEAYhPAnEaEPP8+sewBRhOIWqi/6OANNsfYHgBFXJP8P+XKcjJ4PnzL8NyoDpgQmGIA+JGIDYGCCBQsOkC8TogFgTiL0Abk3/8Zlglyg0JbKAhzNCgZVYTZXjBwsTwCugJf7SgEgMIIJBBk6GGgPyYDjRoFVjjfwiGijP8g0QoGzDG//7+x9DD+p9hLTAWTYFSFiCvAQQQyCB7qKkgvy5DSaCMCDbUUGBQMfwCsu+CMDA+90ClOQECiAlJ30/0qJUVwEwLf7GlAQaG7wABBDLoMpSjhuQ6SJwyY+rggSbWLz9BzmMCYoizAQIIZFAJyCKQPiCeD/SO4X+oH7CBJVH/GLYm/2cosP3H8PPHF4bfv3+DAw8ggEAG7YJG+28gVgQadISdmaELGHO6wETIzMLMAEvyIIsYpPgYGKxUGMAGff74muHR0ycMj549ZQAIIFgYzYOmpb1AzAXMS6VffjFcWnqe6cqVF4x67JCs/Qjk8n//Ibnm1qu/DH/+QcILVAIABBByMXIMiF2A2A0oGc7MxODw5iuDxscfjC8YGf83AMXngiLkzdd/DNO2fmSYfeQL0I08DCsXzWHg5eVlAAggRrR8RjYACDAAHjz4hh8Y0YUAAAAASUVORK5CYII%3D) no-repeat scroll 0 50%;float:right;font-size:12px;padding-left:22px;padding-top:5px;margin-top:5px;margin-right:25px}.login-google{background:url(data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-yahoo{background:url(data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-twitter{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAClklEQVQ4y42TTUhUURzFf/e+Gb+1pjFGqcW4KcsMojZaFBW0Cqxm0TJcRUSLiCQK3EjYSko3LXKn0ictamEUQYjlBNZYphNmjiKp5cw4H46j8977txidIgs6cLhwuff8zzmXC6vo6OjwjI6O3Jifm3k3PzfrHxsbu9zU1FTC/8Dn8xVEwuFuEZGJJZHpZRERkb6+vuv/JdDT03NQbCvxJipyadiUayOmjKVE0snE9I3W1l0AoVAor7+/3/HnXQ1QVlpSmTGtoq8pSFkQzcDXpJBfVFh5/tzZ28upxceecvejndXb738OBi+0tLSUrgk4ACzbFkREKzAUaAXRFZuptKEpcO23bRANZWUlbNvkPnmioWFbMBi82N3dba6zpACngsEYBOJWbt8WyNfg22pQW739TE1NzUPglf5XL6Zk46wxbcNMGj7FAW2UbnK5qnIR/oQABTo7UX5z4MlX7HWBbWaSo8Hg9F8FZHX6AZfisFth2r9ECh2KfGvFvHvvQU9XV9ebnIChNcKvgyJQbMBGp1rnrq9/4Omt9vbmcDi8mHvGWDyeNJSyClcbUQqCCZhNw7INS1aWKzbU19cdam+/dXpN0ADwer32saNHfDgcG4YWsj5iGRhOQCAuvF0Q/FFhKCZUlDgKa7Z49sTiiZd+v39WA7S1tY0PBoae7CiGOrfGFLCASEaYTAlTKWF6SfiQEAbCgNYVu2tra3MRAO50dt6MhOffn6pUHK80cDsVTgV5OkuHBpcTqopBI5mJUCi2rqDGxsZ9kxMTr0VE4rbI55TIx4TIcCK7Tqazn8w/MPDM6/VuznWwhkAg8O3L+HjvYjL5I08sR7m2ljx59sJGSUdcshzNRL7PPX/xovfK1avNoyMjIYCfvt1TZlC7XREAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDUtMjZUMDk6NTk6NDUtMDc6MDACVu8eAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTI2VDA5OjU5OjQ1LTA3OjAwXeeZKgAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.top_nav{height:36px;float:right;font-size:12px;margin-top:10px;margin-bottom:-10px;margin-right:10px}span.free{background-color:#e09000;color:white;text-shadow:none;margin-right:3px;margin-left:3px;padding-right:3px;padding-left:3px}.top-nav-outer{display:block;height:40px;position:relative;text-align:center;width:100%;float:left}.top-nav{-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);height:100%;left:0;position:absolute;top:0;width:100%;background:#333;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#333333),to(#111111));background:-moz-linear-gradient(center top,#333333 0%,#111111 100%);background:-ms-linear-gradient(bottom,#333333,#111111)}.top-nav-inner{max-width:1040px;min-width:920px;position:relative}#logo{float:left;height:40px;with:200px}#logo a{background:transparent url(../img/cloudnode-header-logo.png) no-repeat 20px 9px;color:white;display:block;height:40px;margin-right:5px;margin-top:-9px;width:200px}#global-nav ul{float:left;list-style-type:none;margin:0}#global-nav ul li{float:left;margin:0}#global-nav{float:left;margin-left:8px}#global-nav ul li a{display:block;padding:10px;text-decoration:none;font-weight:bold;-webkit-transition-duration:400ms;-webkit-transition-property:color}#global-nav ul li a:hover{color:white}ul{list-style:disc}#global-nav .active a{background:rgba(0,0,0,0.699219);color:white;font-weight:bold;padding:10px}.page-container{margin:0 auto;max-width:1120px;min-width:1000px}.page{padding-top:100px;margin:0 auto;max-width:1120px;min-width:1000px}#page-inner-hilite{background-color:white;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:0 40px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5)}#page-inner{background:url(../img/page-bg2.jpg) repeat-x;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:1px 0 0 1px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;z-index:1}.left-col{font-size:62.5%;width:50%;position:relative;float:left}.right-col{position:absolute;right:45px;margin-top:45px;margin-left:15px}div.features{margin:15px 0;padding:10px;font-size:12px;color:#333;background:#e8f0f5;border:1px solid #d2d9de;border-right-color:#e5e9ed;border-bottom-color:#e5e9ed;-webkit-border-radius:3px;-moz-border-radius:3px}div.features .rule{width:100%;padding:0 10px;margin:10px 0 10px -10px;border-top:1px solid #c6d5df;border-bottom:1px solid white}ul.features li{list-style-type:none;font-weight:bold;margin:5px 0;padding:2px 0 0 20px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAARCAYAAAAG/yacAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQNJREFUeNpi/P//PwMpgJGRUZWFRA26QKqMiQQNPEBqJRC/ZyLBoglArAnEVxlAfiKEgcAbiEGMF0AsxgK01piADexAPAXKngc05BUxzvMDYgUgvg7EG2CCIJuMoc4AGeIDoqF8LiC+B3VaGUwdE1LomACp7UC8GYgLocIhQKwI1XgYphbZeSCFblB2M9AQPSAdC+UvB+JfcAugzgOBh0B8EoiVoPxHQCwKxKxAbAgNEFBonoXbBOS8AVLZUPeDgBwQc4IMAspdQQ4ZlNADSu6Axjoy2IYenNiCvB2JfQk5mGEAI8ECbbsEDITZQOYJIF4K5P/ESIdIAUEUQAkIUgBAgAEAW55lYzym6yUAAAAASUVORK5CYII%3D) 0 0 no-repeat}.feature-container{position:relative;float:left;width:100%}a{text-decoration:none;color:#0084b4}a:hover{text-decoration:underline;color:#0084b4}.col1,.col2,.col3{width:32%;float:left;padding-bottom:30px;font-size:12px}.col4{width:210px;float:left;padding-bottom:30px;font-size:14px;font-weight:bold;text-align:center;color:#999;border:solid 1px #ddd}div.sep{border-right:solid 1px #ddd;padding-right:5px}img.thumbs{margin-right:5px;margin-top:5px;border:none}#thumbs-container{overflow:hidden;height:114px}.message{-moz-border-radius:4px;-webkit-border-radius:4px;border:1px solid #bfb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#1f5714;background:#dfd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f1fef4),to(#c4e6bd));background:-moz-linear-gradient(center top,#f1fef4 0%,#c4e6bd 100%);background:-ms-linear-gradient(bottom,#f1fef4,#c4e6bd)}.error-msg{border:1px solid #fbb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#900;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#fef1f4),to(#e6c4bd));background:-moz-linear-gradient(center top,#fef1f4 0%,#e6c4bd 100%);background:-ms-linear-gradient(bottom,#fef1f4,#e6c4bd)}.icon_label_feed_sm{background:transparent url(http://apps.jgate.de/static/img/spriteme.png) no-repeat -10px -43px;background-position:-10px -43px;padding-left:15px;padding-top:2px}div.icon_label_feed_sm{margin-bottom:5px}h4.feature{margin-bottom:5px;font-size:20px}.left-col .padded{padding:15px 15px 15px 20px}.padded{padding:15px}.subhead{color:#999;font-size:1.4em;font-weight:normal;margin-top:0;margin-bottom:30px}h1{font-family:'Lucida Grande','Trebuchet MS','Lucida Sans Unicode','Lucida Sans Regular',Verdana,sans-serif;font-weight:bold;letter-spacing:-1px;line-height:1em;text-align:left;color:#999;text-shadow:0 2px 0 rgba(255,255,255,0.7)}h4{margin-top:0;margin-bottom:0;font-size:16px;color:#999}.post{color:#333;line-height:1.8em}.footer-container{margin-top:25px;padding:20px;font-size:12px;background-color:#e8ebec;border-top:1px solid #c4cacc;border-bottom:1px solid #c4cacc}.footer-container a:link,.footer-container a:visited{color:#010259}#appjetfooter{display:none}.content{font-size:12px;color:#acacac;margin:auto}dl{border-bottom:1px solid #ddd;padding:8px 0;line-height:1.4em;margin:0 15px;overflow:hidden;color:#666}dl.row:hover{background-color:#e6e6e6}dt{float:left;margin-left:5px;margin-right:15px;width:150px;overflow:hidden}dd{float:left;margin-right:15px;overflow:hidden}div.header{color:#707070;padding:8px 3px 8px 10px;border:1px solid #999;border-bottom:none;-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 0 5px rgba(0,0,0,0.196094);font-size:14px;text-shadow:0 1px 0 rgba(255,255,255,0.7);-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;background:#c7c7c7;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d0d0d0),to(#bfbfbf));background:-moz-linear-gradient(center top,#d0d0d0 0%,#bfbfbf 100%);background:-ms-linear-gradient(bottom,#d0d0d0,#bfbfbf)}div.group{-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);background-color:white;border:1px solid #999;padding-bottom:15px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}div.sub-header{font-weight:bold;background:#e6e6e6;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f2f2f2),to(#dadada));background:-moz-linear-gradient(center top,#f2f2f2 0%,#dadada 100%);background:-ms-linear-gradient(bottom,#f2f2f2,#dadada)}span.header dl{margin-top:10px;border-bottom:2px solid #2f4e6f}span.header dl:hover{background-color:white}div.detail dt{font-weight:bold;text-align:right}div.detail dl:hover{background-color:white}div.group button{margin-top:10px}div.group button.detail{margin-left:30%}div.rateMe{float:left;height:auto;padding-left:6px;padding-right:10px;padding-top:6px}div.rateMe a.off{float:left;height:12px;width:12px;background:url(../img/small_star_off.gif) no-repeat}div.rateMe a.on{float:left;height:12px;width:12px;background:url(../img/small_star_on.gif) no-repeat}#iframe{width:100%;height:80px;position:absolute;left:0;border:none;margin-top:77px}a.signup{border:solid #ffd452 1px;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;height:22px;width:164px;padding:8px 10px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a.signup:hover,a.signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a.signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}#big-counter{font-size:80px;font-weight:bold;margin-top:0;margin-bottom:10px;letter-spacing:-0.1em;text-shadow:0 -1px 0 rgba(0,0,0,0.7)}#download-button{border:solid #ffd452 1px;color:black;padding:.35em 2.5em;vertical-align:middle;border-style:solid;border-width:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}.twoCols{float:left;width:240px}.twoCols.next{margin-left:0}ul.noStyle li{list-style:none}.clear{clear:both}.htabs{margin:15px 0;border-top:1px solid #ddd}ul.sidetabs{float:left;margin:0 0 25px;width:220px;line-height:1.4em;padding:0;border-right:1px solid #ddd;height:420px}ul.sidetabs li{list-style-type:none;margin:10px 0}ul.sidetabs li a{display:block;padding:8px 10px 7px;font-size:14px;text-decoration:none;border:1px solid transparent;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}ul.sidetabs li a.selected{color:#333;font-weight:bold;text-shadow:1px 1px 0 white;border:1px solid #ddd;border-right:none;background:url(../img/sidebar_selected.gif) 0 0 repeat-x}ul.sidetabs li a:hover{border-top-left-radius:4px;border-bottom-left-radius:4px;background:#f1f1f1}.htabs .tab-content{float:right;width:74%;margin-top:10px}div.column-fields img{background:white;border:1px solid #ddd;margin-right:10px;padding:2px;float:left}div.column-fields p{color:#999;line-height:1.2em}div.avatar{clear:both;border-top:1px solid #ddd;padding-top:10px;margin-top:30px;margin-bottom:30px}div.fingerprint{border-top:1px solid #ddd;margin-top:16px;padding-top:5px}.hidden{display:none}div.column-main{width:440px;float:left}div.column-sidebar{width:190px;float:left;margin-left:20px}div.column-group{background:url(../img/column-group-bg.png) no-repeat}div.column-fields{padding:8px}ul.field-pills{margin:0;padding:0}ul.field-pills li{position:relative;list-style-type:none;margin:3px 0;min-height:24px;line-height:24px;padding:4px 5px;background:#eee;font-size:12px;font-weight:bold;color:#333;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}ul.field-pills li:hover{background-color:#f5f5f5;border-color:#ccc}ul.field-pills li .remove{position:absolute;top:50%;right:6px;margin-top:-6px;width:18px;height:18px;text-indent:-9999px;text-decoration:none;opacity:.7;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC') no-repeat}ul.field-pills li .remove:hover{opacity:1}.explain{font-size:12px;line-height:1.5em}.add-pill{margin:15px 0;padding:4px 5px 12px;background:whiteSmoke;font-size:12px;color:#333;border:1px solid #ddd;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}ul.apps li{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAA1CAYAAADh5qNwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMi8yMi8xMIw6XH0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAEkElEQVRoge2aT3LbNhTGf/J0X92g0jLc1C4X4S70CaqcoNYJap9A1glsn8DKCeIbhNlxwym74dbsCcobsAs8yhBFAAQFN/FMvhnNSBTw8D7g4f0BOOOVkBfVOXAOLICf5ftX+bsEsiSOmtDjtm3LLLTQvKhWwB2KjAtPwE0SR3Wo8YOTEkKfPbs1wDLUqrVty1kIQRrOJ/SZT+xnRDBSeVEtUHvHd8ZL4Pe8qOahdDmZVF5U87yoboFn1IwvgS1QO7qWwDqJowvgGnjOi+r6VH0A/z0lK7KQnwtgo/3Okji6NLTdI4mjrCez1X7WwA0vK177OJLRjiIvqivgDyB1NK2TOFqOVUBkL1CrbEMDZMBDf0L6cJISO/+C30bOUGZVuxrmRZUCj4xz/x12SRytTX+OIXWNijlT8AT8jSKpYw58QK36VK93aVqxtm35ydG5nDgowEo+G0ubBkXSBw0OJ2T0fpLmpMBHlxANNXDpaqSh9JSfifyN7MVBHJmf7KMNys3uvZmQXAG/cLgHasTMkjgqpa3uzaxKavJT1CT+yuHqlcA/A/Ib4AG417ORoz0le2ijCS0ljnhhCqkT5NfANomjHfTSJM0p6LN0Lu7cZ0Afx5JOkP/Ye7QAHvXA3V+pcxSxtNcxAz4BT0OJp9h3ymEg9kGGMqXBckTkr4A/B+TXqBCSgcWljygfMu17Okrt8Wg49Lom+Q3K7O71h9Y4JQ7jGjU7Y91uLW193HSJf7y6RxE6WtW2bZnlRfUFVagNxiRZ+g1wNWKwDFhL+xV2cnvvBfw7QnYn36XraqZ5kp10GCwdxOVusJtbP6FNUSa80NqUqByx1Nq5vGUtuj0ZdNOtqpz1BDaopPHWJF28Vd9L7gefkNDOMa/UWH0OKoU+qb1yaB7FoEgX0/rYYVnxnpwFqvwf2lNWORbLMZLaN8CScYtSd6j9o6NBJbRfURNUJnHUyGR0p0wfBvp1Y24dE3qHeY87SXUwehsZKJWBTjlrqNEyA8M4t7i98WhSYIgLvUH7adZYuUc5XE+uz7GbF6kOJcrWM4MCekLsgvXcz5Lh2DCJ1FiFFqiqdkihkBPTx0mkOmyxm07KS8neoMjsTMImmrCOIKRgnLJXGBJi+T/F/7xiCMFI7QViccdDcJjpJB1Ck+qwQ5GrTQ0cAfwUZKHP0jtcAX9JXDmCmOIz4QkBAc/SBzBHHZCk+kMh+sh0R+DEa5L6ZvhB6q3gB6m3gjP8b/6+dzRnqJs/YznxhtAA2/e/vft4lsRRk8TRDYpc9m31mowd6ob/Fni5ypGU5jJgYvl/IGMg1zy6n5IGywAlwGuixlL6G72flO1L1NJ+T9gCF7Yyx3qTKLXPOi+qB/zL6tCwVto6XNejAMhp6qXnAUgoWEv/IXgFXzn2vUCZwGvHtwZ5ecSHEEzIKCQE3KLI7Xz7j8Q9ykVPkj/K/IYgtr3Oi+oT7ouDscgY+Q6GDZNJdRDTyBwXBy7UWM7ufREsoRVT6V62GovuFGoZihAEztK1/bZEuWAbdqh987byzryo0v5LHPLslIsEK9q25T+aPkwOloQA7AAAAABJRU5ErkJggg%3D%3D) no-repeat;list-style-type:none;line-height:60px;padding-left:70px;font-weight:bold;font-size:16px}div.manage .qfbuttondiv{padding-top:16px;padding-left:120px;padding-bottom:16px;font-size:12px;margin:0;background-color:#f0f0f0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;visibility:hidden}div.manage>.manage{margin-left:25px;padding:10px;background-color:#e0e0e0;visibility:hidden}div.manage:hover>.qfbuttondiv{visibility:visible}div.bar{border:2px solid #ddd}span#bar,div#bar{width:100% height 20px;min-width:2%;max-width:100%;text-indent:-9999px;background:url('../img/usage_bars.gif') 0 0 repeat-x}div.selector,div.selector span,div.checker span,div.radio span,div.uploader,div.uploader span.action{background-image:url(../img/sprite-aristo.png);background-repeat:no-repeat}.selector,.radio,.checker,.uploader,.selector *,.radio *,.checker *,.uploader *{margin:0;padding:0}div.selector{background-position:-483px -160px;line-height:32px;height:32px}div.selector span{background-position:right 0;height:32px;line-height:32px}div.selector select{top:0;left:0}div.selector:active,div.selector.active{background-position:-483px -192px}div.selector:active span,div.selector.active span{background-position:right -32px}div.selector.focus,div.selector.hover,div.selector:hover{background-position:-483px -224px}div.selector.focus span,div.selector.hover span,div.selector:hover span{background-position:right -64px}div.selector.focus:active,div.selector.focus.active,div.selector:hover:active,div.selector.active:hover{background-position:-483px -256px}div.selector.focus:active span,div.selector:hover:active span,div.selector.active:hover span,div.selector.focus.active span{background-position:right -96px}div.selector.disabled,div.selector.disabled:active,div.selector.disabled.active{background-position:-483px -288px}div.selector.disabled span,div.selector.disabled:active span,div.selector.disabled.active span{background-position:right -128px}div.checker,div.checker input{width:23px;height:23px}div.checker span{background-position:0 -320px;height:23px;width:23px}div.checker:active span,div.checker.active span{background-position:-23px -320px}div.checker.focus span,div.checker:hover span{background-position:-46px -320px}div.checker.focus:active span,div.checker:active:hover span,div.checker.active:hover span,div.checker.focus.active span{background-position:-69px -320px}div.checker span.checked{background-position:-92px -320px}div.checker:active span.checked,div.checker.active span.checked{background-position:-115px -320px}div.checker.focus span.checked,div.checker:hover span.checked{background-position:-138px -320px}div.checker.focus:active span.checked,div.checker:hover:active span.checked,div.checker.active:hover span.checked,div.checker.active.focus span.checked{background-position:-161px -320px}div.checker.disabled span,div.checker.disabled:active span,div.checker.disabled.active span{background-position:-184px -320px}div.checker.disabled span.checked,div.checker.disabled:active span.checked,div.checker.disabled.active span.checked{background-position:-207px -320px}div.radio,div.radio input{width:23px;height:23px}div.radio span{height:23px;width:23px;background-position:0 -343px}div.radio:active span,div.radio.active span{background-position:-23px -343px}div.radio.focus span,div.radio:hover span{background-position:-46px -343px}div.radio.focus:active span,div.radio:active:hover span,div.radio.active:hover span,div.radio.active.focus span{background-position:-69px -343px}div.radio span.checked{background-position:-92px -343px}div.radio:active span.checked,div.radio.active span.checked{background-position:-115px -343px}div.radio.focus span.checked,div.radio:hover span.checked{background-position:-138px -343px}div.radio.focus:active span.checked,div.radio:hover:active span.checked,div.radio.focus.active span.checked,div.radio.active:hover span.checked{background-position:-161px -343px}div.radio.disabled span,div.radio.disabled:active span,div.radio.disabled.active span{background-position:-184px -343px}div.radio.disabled span.checked,div.radio.disabled:active span.checked,div.radio.disabled.active span.checked{background-position:-207px -343px}div.uploader{background-position:0 -366px;height:32px}div.uploader span.action{background-position:right -494px;height:24px;line-height:24px}div.uploader span.filename{height:24px;margin:4px 0 4px 4px;line-height:24px}div.uploader.focus,div.uploader.hover,div.uploader:hover{background-position:0 -430px}div.uploader.focus span.action,div.uploader.hover span.action,div.uploader:hover span.action{background-position:right -526px}div.uploader.active span.action,div.uploader:active span.action{background-position:right -558px}div.uploader.focus.active span.action,div.uploader:focus.active span.action,div.uploader.focus:active span.action,div.uploader:focus:active span.action{background-position:right -590px}div.uploader.disabled{background-position:0 -398px}div.uploader.disabled span.action{background-position:right -462px}div.selector{margin-bottom:20px;width:190px;font-weight:bold;color:#464545;font-size:14px}div.selector select{width:190px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1em;border:solid 1px #fff}div.selector span{padding:0 25px 0 2px;cursor:pointer;color:#666;width:158px;text-shadow:0 1px 0 #fff}div.selector.disabled span{color:#bbb}div.checker,div.radio{margin-right:10px}div.uploader{width:190px;margin-bottom:20px;cursor:pointer}div.uploader span.action{width:83px;text-align:center;text-shadow:rgba(255,255,255,0.5) 0 1px 0;background-color:#fff;font-weight:bold;color:#1c4257}div.uploader span.filename{color:#777;width:82px;border-right:solid 1px #567c91;font-size:11px}div.uploader input{width:190px}div.uploader.disabled span.action{color:#aaa}div.uploader.disabled span.filename{border-color:#ddd;color:#aaa}.btn{font-weight:bold;color:#234e70!important;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;box-shadow:rgba(0,0,0,0.15) 0 1px 3px;border:solid 1px #6e93b0;background:url('../img/btn-sm-bg.png') repeat-x 0 0;height:27px;line-height:26px;text-shadow:rgba(255,255,255,0.5) 0 1px 0;display:inline;float:left;margin-right:5px;padding:0 10px;-webkit-transition:-webkit-box-shadow .2s linear}.btn:hover{text-decoration:none!important;color:#234e70;-webkit-box-shadow:0 0 10px #a1cae2;-moz-box-shadow:0 0 10px #a1cae2}.btn:active{background-position:0 bottom}a.btn{text-decoration:none}select{height:28px}input[type=text],input[type=password],select,textarea{border:1px solid #aaa;transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,-moz-box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;resize:none;font:normal normal normal 1.15em/1.1 'Lucida Grande',sans-serif}input[type=text]:focus,input[type=password]:focus,textarea:focus{outline:none;border-color:rgba(82,168,236,.75)!important;box-shadow:0 0 8px rgba(82,168,236,.5);-moz-box-shadow:0 0 8px rgba(82,168,236,.5);-webkit-box-shadow:0 0 8px rgba(82,168,236,.5)}.callout div.group{padding-left:10px}.boxheader h2,.header h2{margin:0;font-size:15px}label.radio,label.checker{color:#555;display:block;font-weight:bold;margin-bottom:10px}.selector select:focus,.radio input:focus,.checker input:focus,uploader input:focus{outline:0}div.selector{position:relative;padding-left:10px}div.selector span{display:block;float:left}div.selector select{position:absolute;opacity:0}div.checker{position:relative;float:left}div.checker span{display:block;float:left;text-align:center}div.checker input{opacity:0;display:inline-block}div.radio{position:relative;float:left}div.radio span{display:block;float:left;text-align:center}div.radio input{opacity:0;text-align:center;display:inline-block}div.uploader{position:relative;float:left;overflow:hidden}div.uploader span.action{float:left;display:inline;padding:4px 0;overflow:hidden;cursor:pointer}div.uploader span.filename{padding:0 10px;float:left;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.uploader input{opacity:0;position:absolute;top:0;right:0;bottom:0;float:right}
+body.landing{margin:8px;background:#254278 url(https://cloudno.de/static/img/cloudnode-bg.png) repeat}div#container{clear:both;padding-top:150px;color:white}div#container h1{text-align:center}div#container h4{text-align:center;margin-top:1.33em}p#thanks{font-weight:bold;color:white}div#form{width:660px;padding:25px 40px;border:1px solid #1b386e;margin:20px auto;display:block;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#254278;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#2f4c82),to(#223f75));background:-moz-linear-gradient(center top,#2f4c82 0%,#223f75 100%);background:-ms-linear-gradient(bottom,#2f4c82,#223f75)}div.rpx_box{float:right;font-size:11px;margin-right:25px;margin-top:5px;padding-left:20px;padding-top:5px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAFo9M/3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAzZJREFUeNpiOHXqFMP/JAYbJkZGxmIGBobDAAHEABZJYWBgPHXuIgPTv99pAAEEFgGLRjP8P336NAMTUJ0bExOTCAM7AwP321sMAAHEeObMGQbjOSYMDH8YGIGS/1mABMPJnNsxQGP+s/z4sJTp////rxV3VS1h/f52KVCuBmSfCPfzKwxGM8xBilsAAogRZAPQUIZ///4xmPabMTBwMvxn+MHAeLr4HANQMdhWEFgEVPT/Yvq2JoZfDAyX07Y0Mf3/943x39+jQHGmV0B77vxnZGbUX+RVx8DGwKA7zacO6AguoEZrJlZWVjEg4z7j/7+/T+VePgl07jsGXgYG4+nGYKMBAogR5DsQMJlrCrHsN0Md0EdNIObZjDNwNzBcjtjCALR/H5BpdjlmC8OZrPNgcRaYgp98Mvo/+BWk/zOz/PrJJ6vL+O/3ZZgCZaB3zv9jZDoIDKt/wND6C0SNQHFQQLCyACXv/P371+k3v/h+9ncP9gAd+fUfK1cq868vmUAFn8FWAL26X3++KwMDM9B5LAyMf1m53gIVtIDlgPgjMBxKr4SvZGD4C7KCgcWyUY7hPzMb2G2gsBcAmpDI+ufb/y/S+kZAsY0M3EBv9+mBFQAEGAsoLkBhDsJAk8DYdAYwTiAGJDH8ZOgC2gOMGAY3UDRcSN0NVgsCfzgEEMGADE7nX2PgenmFQXtxWATQIGFg4L6/Grua4ZuYNgPjr69wA2B+gAGQnUlAyV1Mv789+Cxt8vuTirUzwxcGhg/qziEgPlD8PlB+K1AdMMExqAFxDsgAIaDgFlBcAJ1fzsDEsvgvK7ctz5NTrLz3ju9mACYJgZv714teX88KDD1/oDopIF4MxDeBuJcFGEBHgQwNYHpcAKQT/zMyMUiemc0gu6cPlDZZIe78x8b4+xcDRBOjITAyEV4A2noPnKoYGWWBbB6mf78Y7jvUMKCEDjMDg9LuCga+xyd//mPhRAkvJnZ2dm+g5jogNmJmZv4MNGoG++cXVkern0r8Y+BghloGDiuN9YkMpl1aDOyfnqK4AEQ3A2khIBYHeuUsy59vZWw/35/6KqPPCjTAHijvA9cBdIDOUn84FwCczyRTHGMoXwAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50% transparent}.email{color:#808080;width:490px;font-size:28px;padding:4px;background-color:#d0d0d0;border:1px inset #aaa;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}a:focus{outline:none}.error{background-color:#f9ff9a;border:1px solid #e6db55}div.inline-msg{background:#fff1a8;border-color:#fff1a8;color:black;margin-top:4px;float:right}#footer{font-size:12px;width:640px;margin:auto;color:white}div.rpx_box{color:white}div.rpx_box a,div#footer a,div#container a{color:#4c92e9;text-decoration:none}a#signup{border:solid #ffd452 1px;float:right;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;width:130px;padding:10px;margin-top:2px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a#signup:hover,a#signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a#signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}div.column-fields input{width:98%}form.quickform2{margin-top:-14px}.btn{font-size:1.2em!important;font-family:Arial,Helvetica,Sans-Serif}#appjetfooter{display:none}h3{text-align:center}ul.providers{width:150px;padding:0;margin:0 5px 5px;float:left;list-style-type:none}ul.providers li{background:url(https://cloudno.de/static/img/buttons.png) no-repeat;height:50px;width:150px;cursor:pointer;padding:0;margin:10px 0 8px}li#twitter{background-position:0 0}li#twitter:hover{background-position:-150px 0}li#twitter:active{background-position:-300px 0}li#yahoo{background-position:0 -50px}li#yahoo:hover{background-position:-150px -50px}li#yahoo:active{background-position:-300px -50px}a#deleteAction{background:no-repeat left center;padding-left:16px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC')}a#futonAction{background-repeat:no-repeat;padding-left:20px;padding-right:8px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAMFBMVEX/////////AAD9sbHxk5fFDhn/8PD/MzP/3t7eCA//////wMD/////MzP/ICD///+ar6PEAAAAEHRSTlMA////////////d/9E7v8zd/aTsQAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMC8xNC8wORmp4b0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAAbUlEQVQImWNgwAS8jS3LfC8AGUyJbdJFukAGi6GgkxKIcVFQ0M9dT4GBobBMUFBCCch4rCwo2LgJyFDSaxR5lv4AyFBSE1FSKmBgKJo6RTh0EtCgS1PDBcGM3SYujSbWGxgY/pxaJbjqzAdMuwFN4B3t4yT4+AAAAABJRU5ErkJggg==')}li#google{background-position:0 -100px}li#google:hover{background-position:-150px -100px}li#google:active{background-position:-300px -100px}form.quickform{background-color:#fff;border:1px solid #ccc;padding:.6em}form.quickform div.qfheader{font-size:1em;font-weight:bold;border-bottom:1px solid #ccc;margin-bottom:1em;padding:.1em .2em .2em 0}form.quickform div.qflabeldiv{margin-top:1em}form.quickform label.qflabel{color:#222;font-weight:bold;font-size:76%}form.quickform .qffield{margin-bottom:1em}form.quickform input.qfinputtext,form.quickform textarea.qfinputtextarea{border:1px solid #8faec6}form.quickform input.qfsubmit{margin-top:1em;padding:2px 6px}form.quickform span.surroundtext{color:#555;font-size:80%}div.qfclearfloats{clear:both}.qfcontainer{width:100%;margin-top:15px}.qflabel{color:#555;font-weight:bold;cursor:default}.qflabeldiv{margin-top:10px}.qfbuttondiv{margin-top:1.5em;margin-bottom:1.5em;height:27px}.qfcheckerdiv{margin-top:1.5em;margin-bottom:1.5em}div.checker{margin-left:-3px;margin-top:-3px}body{font-family:Arial,Helvetica,sans-serif;margin:0;padding:0;background-color:#dee3e5;background-image:url(https://cloudno.de/static/img/page-bg1.jpg);color:#333}.header-container{left:0;position:fixed;top:0;width:100%;z-index:12}.top-header a:link,.top-header a:visited{color:black}.top-header{color:black;font-size:13px;height:36px;background:#d4d9db;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d4d9db),to(#bdc0c2));background:-moz-linear-gradient(center top,#d4d9db 0%,#bdc0c2 100%);background:-ms-linear-gradient(bottom,#d4d9db,#bdc0c2)}.rpx_box2{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAM2SURBVHjaYmRAA/wcDAxRZtwMmQ4CDEqiLAzMDP8ZgcKhQJwExOE//zB85OdjZHj95juD5eR/DMfP32QQFRFiAAggFmRDmJiYGAJMRRi4+bgYCjczMIhwMTAsiPg/B2rISyD+7TOPicFMloFBRYgVyP3F8OfPH4a7d+4wAAQQ3CBhAUEGXh4ehoMPWRh+/P4PFpMTAFMmUCU/QcTN1wwMt98wMDAysDFws7EwxESEMzx+9IgBIIBYQK6QEpdg4OTgYPj//z8Yc7MBrf7LwMDKDDbgB9zFjAz/2YBiHGDrQZYxMty+dYuBhYWFASCAWOSkpMGMf//+MeAAjDD6P0Q3CmBjYwPTAAHEAjIE5AokoADEnkDsABT9+Osvw28uoNq//xi+Fm1i6gWKSwHxQSDeDvIpVA8rQACxIBkiA8S1QBwFdALPP6AwMyPDPiD1B+QkRkaGv8DwkQWK+wL5AUDxdqDwKiC+C8SqAAHEBDXEAYhPAnEaEPP8+sewBRhOIWqi/6OANNsfYHgBFXJP8P+XKcjJ4PnzL8NyoDpgQmGIA+JGIDYGCCBQsOkC8TogFgTiL0Abk3/8Zlglyg0JbKAhzNCgZVYTZXjBwsTwCugJf7SgEgMIIJBBk6GGgPyYDjRoFVjjfwiGijP8g0QoGzDG//7+x9DD+p9hLTAWTYFSFiCvAQQQyCB7qKkgvy5DSaCMCDbUUGBQMfwCsu+CMDA+90ClOQECiAlJ30/0qJUVwEwLf7GlAQaG7wABBDLoMpSjhuQ6SJwyY+rggSbWLz9BzmMCYoizAQIIZFAJyCKQPiCeD/SO4X+oH7CBJVH/GLYm/2cosP3H8PPHF4bfv3+DAw8ggEAG7YJG+28gVgQadISdmaELGHO6wETIzMLMAEvyIIsYpPgYGKxUGMAGff74muHR0ycMj549ZQAIIFgYzYOmpb1AzAXMS6VffjFcWnqe6cqVF4x67JCs/Qjk8n//Ibnm1qu/DH/+QcILVAIABBByMXIMiF2A2A0oGc7MxODw5iuDxscfjC8YGf83AMXngiLkzdd/DNO2fmSYfeQL0I08DCsXzWHg5eVlAAggRrR8RjYACDAAHjz4hh8Y0YUAAAAASUVORK5CYII%3D) no-repeat scroll 0 50%;float:right;font-size:12px;padding-left:22px;padding-top:5px;margin-top:5px;margin-right:25px}.login-google{background:url(data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7PT7/3zF6/9Ptu//RbHx/0227/+Tzvb/9vv5/97h0f9JeBz/NHoA/z98Av9AfAD/PHsA/0F6AP8AAAAA/vz7/1+33/8Mp+z/FrHw/xWy8f8bs/T/Hqrx/3zE7v////7/t8qp/zF2A/87gwH/P4ID/z59AP8+egD/Q3kA/97s8v8botj/ELn3/wy58f8PtfL/D7Lw/xuz9P8vq+f/8/n///779v9KhR3/OYYA/0GFAv88hgD/QIAC/z17AP/0+/j/N6bM/wC07/8Cxf7/CsP7/wm+9v8Aqur/SrDb//7+/v///P7/VZEl/zSJAP87jQD/PYYA/0OBBf8+fQH///3//9Dp8/84sM7/CrDf/wC14/8CruL/KqnW/9ns8f/8/v//4OjX/z+GDf85kAD/PIwD/z2JAv8+hQD/PoEA/9C7pv/97uv////+/9Xw+v+w3ej/ls/e/+rz9///////+/z6/22mSf8qjQH/OJMA/zuQAP85iwL/PIgA/zyFAP+OSSL/nV44/7J+Vv/AkG7/7trP//7//f/9//7/6/Lr/2uoRv8tjQH/PJYA/zuTAP87kwD/PY8A/z2KAP89hAD/olkn/6RVHP+eSgj/mEgR//Ho3//+/v7/5Ozh/1GaJv8tlAD/OZcC/zuXAv84lAD/O5IC/z2PAf89iwL/OIkA/6hWFf+cTxD/pm9C/76ihP/8/v//+////8nav/8fdwL/NZsA/zeZAP83mgD/PJQB/zyUAf84jwD/PYsB/z6HAf+fXif/1r6s//79///58u//3r+g/+3i2v/+//3/mbiF/yyCAP87mgP/OpgD/zeWAP85lgD/OpEB/z+TAP9ChwH/7eHb/////v/28ej/tWwo/7tUAP+5XQ7/5M+5/////v+bsZn/IHAd/zeVAP89lgP/O5MA/zaJCf8tZTr/DyuK//3////9////0qmC/7lTAP/KZAT/vVgC/8iQWf/+//3///j//ygpx/8GGcL/ESax/xEgtv8FEMz/AALh/wAB1f///f7///z//758O//GXQL/yGYC/8RaAv/Ojlf/+/////////9QU93/BAD0/wAB//8DAP3/AAHz/wAA5f8DAtr///////v7+/+2bCT/yGMA/89mAP/BWQD/0q+D///+/////P7/Rkbg/wEA+f8AA/z/AQH5/wMA8P8AAev/AADf///7/P////7/uINQ/7lXAP/MYwL/vGIO//Lm3P/8/v//1dT2/woM5/8AAP3/AwH+/wAB/f8AAfb/BADs/wAC4P8AAAAA//z7/+LbzP+mXyD/oUwE/9Gshv/8//3/7/H5/zo/w/8AAdX/AgL6/wAA/f8CAP3/AAH2/wAA7v8AAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAA%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-yahoo{background:url(data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgJqAIoCdgCaAnoAnhKCAKYijgCuLpIAskKeALpSpgC+Yq4AzHy8ANqezgDmvt4A7tLqAPz5+wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKlRFIoABWAKERERE6ADcKMzzu2hOgAAhERK8REWCWBERE36ERMHMEREvo6iEgY6hEn6Pu0mAzqkz/xjMzoDNwpERERDoAMzAKlERIoAAzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAOQAAgBkAAAAPAAAACQAAAAkAAAAIAAAACAAAAAgAAIAYAADAOAAA//8AAP//AAD//wAA) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.login-twitter{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAClklEQVQ4y42TTUhUURzFf/e+Gb+1pjFGqcW4KcsMojZaFBW0Cqxm0TJcRUSLiCQK3EjYSko3LXKn0ictamEUQYjlBNZYphNmjiKp5cw4H46j8977txidIgs6cLhwuff8zzmXC6vo6OjwjI6O3Jifm3k3PzfrHxsbu9zU1FTC/8Dn8xVEwuFuEZGJJZHpZRERkb6+vuv/JdDT03NQbCvxJipyadiUayOmjKVE0snE9I3W1l0AoVAor7+/3/HnXQ1QVlpSmTGtoq8pSFkQzcDXpJBfVFh5/tzZ28upxceecvejndXb738OBi+0tLSUrgk4ACzbFkREKzAUaAXRFZuptKEpcO23bRANZWUlbNvkPnmioWFbMBi82N3dba6zpACngsEYBOJWbt8WyNfg22pQW739TE1NzUPglf5XL6Zk46wxbcNMGj7FAW2UbnK5qnIR/oQABTo7UX5z4MlX7HWBbWaSo8Hg9F8FZHX6AZfisFth2r9ECh2KfGvFvHvvQU9XV9ebnIChNcKvgyJQbMBGp1rnrq9/4Omt9vbmcDi8mHvGWDyeNJSyClcbUQqCCZhNw7INS1aWKzbU19cdam+/dXpN0ADwer32saNHfDgcG4YWsj5iGRhOQCAuvF0Q/FFhKCZUlDgKa7Z49sTiiZd+v39WA7S1tY0PBoae7CiGOrfGFLCASEaYTAlTKWF6SfiQEAbCgNYVu2tra3MRAO50dt6MhOffn6pUHK80cDsVTgV5OkuHBpcTqopBI5mJUCi2rqDGxsZ9kxMTr0VE4rbI55TIx4TIcCK7Tqazn8w/MPDM6/VuznWwhkAg8O3L+HjvYjL5I08sR7m2ljx59sJGSUdcshzNRL7PPX/xovfK1avNoyMjIYCfvt1TZlC7XREAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMDUtMjZUMDk6NTk6NDUtMDc6MDACVu8eAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTA1LTI2VDA5OjU5OjQ1LTA3OjAwXeeZKgAAAABJRU5ErkJggg%3D%3D) no-repeat scroll 0 50%;padding-left:18px;margin-left:8px}.top_nav{height:36px;float:right;font-size:12px;margin-top:10px;margin-bottom:-10px;margin-right:10px}span.free{background-color:#e09000;color:white;text-shadow:none;margin-right:3px;margin-left:3px;padding-right:3px;padding-left:3px}.top-nav-outer{display:block;height:40px;position:relative;text-align:center;width:100%;float:left}.top-nav{-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);height:100%;left:0;position:absolute;top:0;width:100%;background:#333;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#333333),to(#111111));background:-moz-linear-gradient(center top,#333333 0%,#111111 100%);background:-ms-linear-gradient(bottom,#333333,#111111)}.top-nav-inner{max-width:1040px;min-width:920px;position:relative}#logo{float:left;height:40px;with:200px}#logo a{background:transparent url(../img/cloudnode-header-logo.png) no-repeat 20px 9px;color:white;display:block;height:40px;margin-right:5px;margin-top:-9px;width:200px}#global-nav ul{float:left;list-style-type:none;margin:0}#global-nav ul li{float:left;margin:0}#global-nav{float:left;margin-left:8px}#global-nav ul li a{display:block;padding:10px;text-decoration:none;font-weight:bold;-webkit-transition-duration:400ms;-webkit-transition-property:color}#global-nav ul li a:hover{color:white}ul{list-style:disc}#global-nav .active a{background:rgba(0,0,0,0.699219);color:white;font-weight:bold;padding:10px}.page-container{margin:0 auto;max-width:1120px;min-width:1000px}.page{padding-top:100px;margin:0 auto;max-width:1120px;min-width:1000px}#page-inner-hilite{background-color:white;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:0 40px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;-webkit-box-shadow:rgba(0,0,0,0.496094) 0 1px 2px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5)}#page-inner{background:url(../img/page-bg2.jpg) repeat-x;-moz-border-radius:5px 5px 5px 5px;border-bottom-left-radius:5px 5px;border-bottom-right-radius:5px 5px;border-top-left-radius:5px 5px;border-top-right-radius:5px 5px;margin:1px 0 0 1px;max-width:1040px;min-width:920px;overflow:hidden;position:relative;text-align:left;z-index:1}.left-col{font-size:62.5%;width:50%;position:relative;float:left}.right-col{position:absolute;right:45px;margin-top:45px;margin-left:15px}div.features{margin:15px 0;padding:10px;font-size:12px;color:#333;background:#e8f0f5;border:1px solid #d2d9de;border-right-color:#e5e9ed;border-bottom-color:#e5e9ed;-webkit-border-radius:3px;-moz-border-radius:3px}div.features .rule{width:100%;padding:0 10px;margin:10px 0 10px -10px;border-top:1px solid #c6d5df;border-bottom:1px solid white}ul.features li{list-style-type:none;font-weight:bold;margin:5px 0;padding:2px 0 0 20px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAARCAYAAAAG/yacAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQNJREFUeNpi/P//PwMpgJGRUZWFRA26QKqMiQQNPEBqJRC/ZyLBoglArAnEVxlAfiKEgcAbiEGMF0AsxgK01piADexAPAXKngc05BUxzvMDYgUgvg7EG2CCIJuMoc4AGeIDoqF8LiC+B3VaGUwdE1LomACp7UC8GYgLocIhQKwI1XgYphbZeSCFblB2M9AQPSAdC+UvB+JfcAugzgOBh0B8EoiVoPxHQCwKxKxAbAgNEFBonoXbBOS8AVLZUPeDgBwQc4IMAspdQQ4ZlNADSu6Axjoy2IYenNiCvB2JfQk5mGEAI8ECbbsEDITZQOYJIF4K5P/ESIdIAUEUQAkIUgBAgAEAW55lYzym6yUAAAAASUVORK5CYII%3D) 0 0 no-repeat}.feature-container{position:relative;float:left;width:100%}a{text-decoration:none;color:#0084b4}a:hover{text-decoration:underline;color:#0084b4}.col1,.col2,.col3{width:32%;float:left;padding-bottom:30px;font-size:12px}.col4{width:210px;float:left;padding-bottom:30px;font-size:14px;font-weight:bold;text-align:center;color:#999;border:solid 1px #ddd}div.sep{border-right:solid 1px #ddd;padding-right:5px}img.thumbs{margin-right:5px;margin-top:5px;border:none}#thumbs-container{overflow:hidden;height:114px}.message{-moz-border-radius:4px;-webkit-border-radius:4px;border:1px solid #bfb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#1f5714;background:#dfd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f1fef4),to(#c4e6bd));background:-moz-linear-gradient(center top,#f1fef4 0%,#c4e6bd 100%);background:-ms-linear-gradient(bottom,#f1fef4,#c4e6bd)}.error-msg{border:1px solid #fbb;margin:.5em 0 1em;padding:.5em 1em .5em 40px;position:relative;color:#900;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdd;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#fef1f4),to(#e6c4bd));background:-moz-linear-gradient(center top,#fef1f4 0%,#e6c4bd 100%);background:-ms-linear-gradient(bottom,#fef1f4,#e6c4bd)}.icon_label_feed_sm{background:transparent url(http://apps.jgate.de/static/img/spriteme.png) no-repeat -10px -43px;background-position:-10px -43px;padding-left:15px;padding-top:2px}div.icon_label_feed_sm{margin-bottom:5px}h4.feature{margin-bottom:5px;font-size:20px}.left-col .padded{padding:15px 15px 15px 20px}.padded{padding:15px}.subhead{color:#999;font-size:1.4em;font-weight:normal;margin-top:0;margin-bottom:30px}h1{font-family:'Lucida Grande','Trebuchet MS','Lucida Sans Unicode','Lucida Sans Regular',Verdana,sans-serif;font-weight:bold;letter-spacing:-1px;line-height:1em;text-align:left;color:#999;text-shadow:0 2px 0 rgba(255,255,255,0.7)}h4{margin-top:0;margin-bottom:0;font-size:16px;color:#999}.post{color:#333;line-height:1.8em}.footer-container{max-width:1120px;min-width:1000px;margin:auto;padding:10px;font-size:12px;text-align:center;color:#4d4d4d}.footer-container a:link,.footer-container a:visited{color:#486999}#appjetfooter{display:none}.content{font-size:12px;color:#acacac;margin:auto}dl{border-bottom:1px solid #ddd;padding:8px 0;line-height:1.4em;margin:0 15px;overflow:hidden;color:#666}dl.row:hover{background-color:#e6e6e6}dt{float:left;margin-left:5px;margin-right:15px;width:150px;overflow:hidden}dd{float:left;margin-right:15px;overflow:hidden}div.header{color:#707070;padding:8px 3px 8px 10px;border:1px solid #999;border-bottom:none;-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 0 5px rgba(0,0,0,0.196094);font-size:14px;text-shadow:0 1px 0 rgba(255,255,255,0.7);-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;background:#c7c7c7;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#d0d0d0),to(#bfbfbf));background:-moz-linear-gradient(center top,#d0d0d0 0%,#bfbfbf 100%);background:-ms-linear-gradient(bottom,#d0d0d0,#bfbfbf)}div.group{-webkit-box-shadow:rgba(0,0,0,0.196094) 0 0 5px;-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);background-color:white;border:1px solid #999;padding-bottom:15px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}div.sub-header{font-weight:bold;background:#e6e6e6;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f2f2f2),to(#dadada));background:-moz-linear-gradient(center top,#f2f2f2 0%,#dadada 100%);background:-ms-linear-gradient(bottom,#f2f2f2,#dadada)}span.header dl{margin-top:10px;border-bottom:2px solid #2f4e6f}span.header dl:hover{background-color:white}div.detail dt{font-weight:bold;text-align:right}div.detail dl:hover{background-color:white}div.group button{margin-top:10px}div.group button.detail{margin-left:30%}div.rateMe{float:left;height:auto;padding-left:6px;padding-right:10px;padding-top:6px}div.rateMe a.off{float:left;height:12px;width:12px;background:url(../img/small_star_off.gif) no-repeat}div.rateMe a.on{float:left;height:12px;width:12px;background:url(../img/small_star_on.gif) no-repeat}#iframe{width:100%;height:80px;position:absolute;left:0;border:none;margin-top:77px}a.signup{border:solid #ffd452 1px;color:#333;display:block;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:bold;height:22px;width:164px;padding:8px 10px;text-align:center;text-decoration:none;text-shadow:#df6 0 1px 0;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}a.signup:hover,a.signup:focus{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#eee4a2),to(#ebcc52));background:-moz-linear-gradient(center top,#eee4a2 0%,#ebcc52 100%);background:-ms-linear-gradient(bottom,#eee4a2,#ebcc52)}a.signup:active{background:#111;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#b7a424),to(#b7a424));background:-moz-linear-gradient(center top,#b7a424 0%,#b7a424 100%);background:-ms-linear-gradient(bottom,#b7a424,#b7a424)}#big-counter{font-size:80px;font-weight:bold;margin-top:0;margin-bottom:10px;letter-spacing:-0.1em;text-shadow:0 -1px 0 rgba(0,0,0,0.7)}#download-button{border:solid #ffd452 1px;color:black;padding:.35em 2.5em;vertical-align:middle;border-style:solid;border-width:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;background:#ecd87a;background:-webkit-gradient(linear,0% 0%,0% 100%,from(#f8efae),to(#f5d55a));background:-moz-linear-gradient(center top,#f8efae 0%,#f5d55a 100%);background:-ms-linear-gradient(bottom,#f8efae,#f5d55a)}.twoCols{float:left;width:240px}.twoCols.next{margin-left:0}ul.noStyle li{list-style:none}.clear{clear:both}.htabs{margin:15px 0;border-top:1px solid #ddd}ul.sidetabs{float:left;margin:0 0 25px;width:220px;line-height:1.4em;padding:0;border-right:1px solid #ddd;height:420px}ul.sidetabs li{list-style-type:none;margin:10px 0}ul.sidetabs li a{display:block;padding:8px 10px 7px;font-size:14px;text-decoration:none;border:1px solid transparent;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}ul.sidetabs li a.selected{color:#333;font-weight:bold;text-shadow:1px 1px 0 white;border:1px solid #ddd;border-right:none;background:url(../img/sidebar_selected.gif) 0 0 repeat-x}ul.sidetabs li a:hover{border-top-left-radius:4px;border-bottom-left-radius:4px;background:#f1f1f1}.htabs .tab-content{float:right;width:74%;margin-top:10px}div.column-fields img{background:white;border:1px solid #ddd;margin-right:10px;padding:2px;float:left}div.column-fields p{color:#999;line-height:1.2em}div.avatar{clear:both;border-top:1px solid #ddd;padding-top:10px;margin-top:30px;margin-bottom:30px}div.fingerprint{border-top:1px solid #ddd;margin-top:16px;padding-top:5px}.hidden{display:none}div.column-main{width:440px;float:left}div.column-sidebar{width:190px;float:left;margin-left:20px}div.column-group{background:url(../img/column-group-bg.png) no-repeat}div.column-fields{padding:8px}ul.field-pills{margin:0;padding:0}ul.field-pills li{position:relative;list-style-type:none;margin:3px 0;min-height:24px;line-height:24px;padding:4px 5px;background:#eee;font-size:12px;font-weight:bold;color:#333;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}ul.field-pills li:hover{background-color:#f5f5f5;border-color:#ccc}ul.field-pills li .remove{position:absolute;top:50%;right:6px;margin-top:-6px;width:18px;height:18px;text-indent:-9999px;text-decoration:none;opacity:.7;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALBAMAAABbgmoVAAAAA3NCSVQICAjb4U/gAAAAGFBMVEX///+ZmZmZmZmZmZn///+ZmZmJiYl7e3trE/RpAAAACHRSTlMARIjM/////wcesEcAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAWdEVYdENyZWF0aW9uIFRpbWUAMTAvMTQvMDkZqeG9AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAAERJREFUCJljYBAODRZgYGAKDQ0NYmAQBVKhAgymIaEhoQYMoWGubqEBDKGhKalgyt0VSJmGpKYA5UTDQsOAKqH6IKYAAHwFEI290O6NAAAAAElFTkSuQmCC') no-repeat}ul.field-pills li .remove:hover{opacity:1}.explain{font-size:12px;line-height:1.5em}.add-pill{margin:15px 0;padding:4px 5px 12px;background:whiteSmoke;font-size:12px;color:#333;border:1px solid #ddd;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}ul.apps li{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAA1CAYAAADh5qNwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAxMi8yMi8xMIw6XH0AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAAEkElEQVRoge2aT3LbNhTGf/J0X92g0jLc1C4X4S70CaqcoNYJap9A1glsn8DKCeIbhNlxwym74dbsCcobsAs8yhBFAAQFN/FMvhnNSBTw8D7g4f0BOOOVkBfVOXAOLICf5ftX+bsEsiSOmtDjtm3LLLTQvKhWwB2KjAtPwE0SR3Wo8YOTEkKfPbs1wDLUqrVty1kIQRrOJ/SZT+xnRDBSeVEtUHvHd8ZL4Pe8qOahdDmZVF5U87yoboFn1IwvgS1QO7qWwDqJowvgGnjOi+r6VH0A/z0lK7KQnwtgo/3Okji6NLTdI4mjrCez1X7WwA0vK177OJLRjiIvqivgDyB1NK2TOFqOVUBkL1CrbEMDZMBDf0L6cJISO/+C30bOUGZVuxrmRZUCj4xz/x12SRytTX+OIXWNijlT8AT8jSKpYw58QK36VK93aVqxtm35ydG5nDgowEo+G0ubBkXSBw0OJ2T0fpLmpMBHlxANNXDpaqSh9JSfifyN7MVBHJmf7KMNys3uvZmQXAG/cLgHasTMkjgqpa3uzaxKavJT1CT+yuHqlcA/A/Ib4AG417ORoz0le2ijCS0ljnhhCqkT5NfANomjHfTSJM0p6LN0Lu7cZ0Afx5JOkP/Ye7QAHvXA3V+pcxSxtNcxAz4BT0OJp9h3ymEg9kGGMqXBckTkr4A/B+TXqBCSgcWljygfMu17Okrt8Wg49Lom+Q3K7O71h9Y4JQ7jGjU7Y91uLW193HSJf7y6RxE6WtW2bZnlRfUFVagNxiRZ+g1wNWKwDFhL+xV2cnvvBfw7QnYn36XraqZ5kp10GCwdxOVusJtbP6FNUSa80NqUqByx1Nq5vGUtuj0ZdNOtqpz1BDaopPHWJF28Vd9L7gefkNDOMa/UWH0OKoU+qb1yaB7FoEgX0/rYYVnxnpwFqvwf2lNWORbLMZLaN8CScYtSd6j9o6NBJbRfURNUJnHUyGR0p0wfBvp1Y24dE3qHeY87SXUwehsZKJWBTjlrqNEyA8M4t7i98WhSYIgLvUH7adZYuUc5XE+uz7GbF6kOJcrWM4MCekLsgvXcz5Lh2DCJ1FiFFqiqdkihkBPTx0mkOmyxm07KS8neoMjsTMImmrCOIKRgnLJXGBJi+T/F/7xiCMFI7QViccdDcJjpJB1Ck+qwQ5GrTQ0cAfwUZKHP0jtcAX9JXDmCmOIz4QkBAc/SBzBHHZCk+kMh+sh0R+DEa5L6ZvhB6q3gB6m3gjP8b/6+dzRnqJs/YznxhtAA2/e/vft4lsRRk8TRDYpc9m31mowd6ob/Fni5ypGU5jJgYvl/IGMg1zy6n5IGywAlwGuixlL6G72flO1L1NJ+T9gCF7Yyx3qTKLXPOi+qB/zL6tCwVto6XNejAMhp6qXnAUgoWEv/IXgFXzn2vUCZwGvHtwZ5ecSHEEzIKCQE3KLI7Xz7j8Q9ykVPkj/K/IYgtr3Oi+oT7ouDscgY+Q6GDZNJdRDTyBwXBy7UWM7ufREsoRVT6V62GovuFGoZihAEztK1/bZEuWAbdqh987byzryo0v5LHPLslIsEK9q25T+aPkwOloQA7AAAAABJRU5ErkJggg%3D%3D) no-repeat;list-style-type:none;line-height:60px;padding-left:70px;font-weight:bold;font-size:16px}div.manage .qfbuttondiv{padding-top:16px;padding-left:120px;padding-bottom:16px;font-size:12px;margin:0;background-color:#f0f0f0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;visibility:hidden}div.manage>.manage{margin-left:25px;padding:10px;background-color:#e0e0e0;visibility:hidden}div.manage:hover>.qfbuttondiv{visibility:visible}div.bar{border:2px solid #ddd}span#bar,div#bar{width:100% height 20px;min-width:2%;max-width:100%;text-indent:-9999px;background:url('../img/usage_bars.gif') 0 0 repeat-x}div.page{padding-top:0}div.selector{margin-left:-4px}div.notifier{height:17px;width:13px;background-color:#cc3c29;margin:7px 10px 0 0;float:right;padding:3px 1px 1px 8px;border-radius:4px;color:white}a.notifier:hover{text-decoration:none}div.username{margin-top:-12px}span.username{color:#495961}div.following{color:#495961;font-size:14px;font-weight:bold;clear:both;margin-top:72px}div.vcard{border-top:1px solid #ddd;margin-top:20px;padding-top:10px;float:left;width:50%;min-height:400px;margin-bottom:50px}div.vcard dl{border-bottom:none;line-height:1em;padding:4px 0;margin-left:-5px}div.vcard dt{width:80px}div.vcard h4{font-size:14px;color:#495961;margin-top:30px;margin-bottom:10px}div.vcard a:hover{text-decoration:none;opacity:.6}div.actions{float:left;width:250px;line-height:2em;font-size:14px;min-height:300px}div.posts{color:#666;float:left;margin-top:-14px;margin-bottom:50px}ul.social-stats{padding:0}ul.social-stats li{list-style-type:none;display:inline;font-size:18px;font-weight:bold;display:inline;float:left;border-right:1px solid #ddd;margin-right:6px;padding-right:6px}ul.social-stats span.meta{color:#999;font-size:12px;font-weight:normal;display:block}ul.avatars{padding:0}ul.avatars li{list-style-type:none;display:inline}ul.avatars li img{padding:1px;border:1px solid #ddd;margin-right:6px}ul.following,ul.messages{padding:0;color:#666}ul.following li,ul.messages li{list-style-type:none;border-bottom:1px solid #ddd;padding:10px 0}ul.following li img,ul.messages li img{padding:1px;border:1px solid #ddd;margin-right:6px}ul.following div.follow-avatar,ul.following div.follow-user{float:left}div.bio{font-style:italic;width:440px;margin-top:5px}li.unread{background-color:#eaf2f5}ul.messages div.follow-avatar{float:left;padding-left:8px}ul.messages div.follow-user{float:left;width:490px}div.compose{margin:0 60px 12px 0;border-bottom:1px solid #ddd;color:#333}span.compose{font-size:24px;margin-right:3px;vertical-align:-3px}div.posts h4{color:#495961;margin:20px 0 0 10px}div.notification{margin-top:4px}div.subject{margin:3px 0;font-weight:bold}div.selector,div.selector span,div.checker span,div.radio span,div.uploader,div.uploader span.action{background-image:url(../img/sprite-aristo.png);background-repeat:no-repeat}.selector,.radio,.checker,.uploader,.selector *,.radio *,.checker *,.uploader *{margin:0;padding:0}div.selector{background-position:-483px -160px;line-height:32px;height:32px}div.selector span{background-position:right 0;height:32px;line-height:32px}div.selector select{top:0;left:0}div.selector:active,div.selector.active{background-position:-483px -192px}div.selector:active span,div.selector.active span{background-position:right -32px}div.selector.focus,div.selector.hover,div.selector:hover{background-position:-483px -224px}div.selector.focus span,div.selector.hover span,div.selector:hover span{background-position:right -64px}div.selector.focus:active,div.selector.focus.active,div.selector:hover:active,div.selector.active:hover{background-position:-483px -256px}div.selector.focus:active span,div.selector:hover:active span,div.selector.active:hover span,div.selector.focus.active span{background-position:right -96px}div.selector.disabled,div.selector.disabled:active,div.selector.disabled.active{background-position:-483px -288px}div.selector.disabled span,div.selector.disabled:active span,div.selector.disabled.active span{background-position:right -128px}div.checker,div.checker input{width:23px;height:23px}div.checker span{background-position:0 -320px;height:23px;width:23px}div.checker:active span,div.checker.active span{background-position:-23px -320px}div.checker.focus span,div.checker:hover span{background-position:-46px -320px}div.checker.focus:active span,div.checker:active:hover span,div.checker.active:hover span,div.checker.focus.active span{background-position:-69px -320px}div.checker span.checked{background-position:-92px -320px}div.checker:active span.checked,div.checker.active span.checked{background-position:-115px -320px}div.checker.focus span.checked,div.checker:hover span.checked{background-position:-138px -320px}div.checker.focus:active span.checked,div.checker:hover:active span.checked,div.checker.active:hover span.checked,div.checker.active.focus span.checked{background-position:-161px -320px}div.checker.disabled span,div.checker.disabled:active span,div.checker.disabled.active span{background-position:-184px -320px}div.checker.disabled span.checked,div.checker.disabled:active span.checked,div.checker.disabled.active span.checked{background-position:-207px -320px}div.radio,div.radio input{width:23px;height:23px}div.radio span{height:23px;width:23px;background-position:0 -343px}div.radio:active span,div.radio.active span{background-position:-23px -343px}div.radio.focus span,div.radio:hover span{background-position:-46px -343px}div.radio.focus:active span,div.radio:active:hover span,div.radio.active:hover span,div.radio.active.focus span{background-position:-69px -343px}div.radio span.checked{background-position:-92px -343px}div.radio:active span.checked,div.radio.active span.checked{background-position:-115px -343px}div.radio.focus span.checked,div.radio:hover span.checked{background-position:-138px -343px}div.radio.focus:active span.checked,div.radio:hover:active span.checked,div.radio.focus.active span.checked,div.radio.active:hover span.checked{background-position:-161px -343px}div.radio.disabled span,div.radio.disabled:active span,div.radio.disabled.active span{background-position:-184px -343px}div.radio.disabled span.checked,div.radio.disabled:active span.checked,div.radio.disabled.active span.checked{background-position:-207px -343px}div.uploader{background-position:0 -366px;height:32px}div.uploader span.action{background-position:right -494px;height:24px;line-height:24px}div.uploader span.filename{height:24px;margin:4px 0 4px 4px;line-height:24px}div.uploader.focus,div.uploader.hover,div.uploader:hover{background-position:0 -430px}div.uploader.focus span.action,div.uploader.hover span.action,div.uploader:hover span.action{background-position:right -526px}div.uploader.active span.action,div.uploader:active span.action{background-position:right -558px}div.uploader.focus.active span.action,div.uploader:focus.active span.action,div.uploader.focus:active span.action,div.uploader:focus:active span.action{background-position:right -590px}div.uploader.disabled{background-position:0 -398px}div.uploader.disabled span.action{background-position:right -462px}div.selector{margin-bottom:20px;width:190px;font-weight:bold;color:#464545;font-size:14px}div.selector select{width:190px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1em;border:solid 1px #fff}div.selector span{padding:0 25px 0 2px;cursor:pointer;color:#666;width:158px;text-shadow:0 1px 0 #fff}div.selector.disabled span{color:#bbb}div.checker,div.radio{margin-right:10px}div.uploader{width:190px;margin-bottom:20px;cursor:pointer}div.uploader span.action{width:83px;text-align:center;text-shadow:rgba(255,255,255,0.5) 0 1px 0;background-color:#fff;font-weight:bold;color:#1c4257}div.uploader span.filename{color:#777;width:82px;border-right:solid 1px #567c91;font-size:11px}div.uploader input{width:190px}div.uploader.disabled span.action{color:#aaa}div.uploader.disabled span.filename{border-color:#ddd;color:#aaa}.btn{font-weight:bold;color:#234e70!important;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;-webkit-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;-moz-box-shadow:rgba(0,0,0,0.15) 0 1px 3px;box-shadow:rgba(0,0,0,0.15) 0 1px 3px;border:solid 1px #6e93b0;background:url('../img/btn-sm-bg.png') repeat-x 0 0;height:27px;line-height:26px;text-shadow:rgba(255,255,255,0.5) 0 1px 0;display:inline;float:left;margin-right:5px;padding:0 10px;-webkit-transition:-webkit-box-shadow .2s linear}.btn:hover{text-decoration:none!important;color:#234e70;-webkit-box-shadow:0 0 10px #a1cae2;-moz-box-shadow:0 0 10px #a1cae2}.btn:active{background-position:0 bottom}a.btn{text-decoration:none}select{height:28px}input[type=text],input[type=password],select,textarea{border:1px solid #aaa;transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,-moz-box-shadow linear .2s;-webkit-transition:border linear .2s,-webkit-box-shadow linear .2s;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;resize:none;font:normal normal normal 1.15em/1.1 'Lucida Grande',sans-serif}input[type=text]:focus,input[type=password]:focus,textarea:focus{outline:none;border-color:rgba(82,168,236,.75)!important;box-shadow:0 0 8px rgba(82,168,236,.5);-moz-box-shadow:0 0 8px rgba(82,168,236,.5);-webkit-box-shadow:0 0 8px rgba(82,168,236,.5)}.callout div.group{padding-left:10px}.boxheader h2,.header h2{margin:0;font-size:15px}label.radio,label.checker{color:#555;display:block;font-weight:bold;margin-bottom:10px}.selector select:focus,.radio input:focus,.checker input:focus,uploader input:focus{outline:0}div.selector{position:relative;padding-left:10px}div.selector span{display:block;float:left}div.selector select{position:absolute;opacity:0}div.checker{position:relative;float:left}div.checker span{display:block;float:left;text-align:center}div.checker input{opacity:0;display:inline-block}div.radio{position:relative;float:left}div.radio span{display:block;float:left;text-align:center}div.radio input{opacity:0;text-align:center;display:inline-block}div.uploader{position:relative;float:left;overflow:hidden}div.uploader span.action{float:left;display:inline;padding:4px 0;overflow:hidden;cursor:pointer}div.uploader span.filename{padding:0 10px;float:left;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.uploader input{opacity:0;position:absolute;top:0;right:0;bottom:0;float:right}
View
116 public/static/css/greycurve.css
@@ -1,4 +1,4 @@
-body
+body
{
font-family: Arial, Helvetica, sans-serif;
margin: 0;
@@ -27,12 +27,10 @@
.top-header
{
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#D4D9DB), to(#BDC0C2));
- background: -moz-linear-gradient(center top , #D4D9DB, #BDC0C2) repeat scroll 0 0 transparent;
- background-color: #D4D9DB;
color: black;
font-size: 13px;
height: 36px;
+ @mixin gradient(#D4D9DB, #D4D9DB, #BDC0C2);
}
.rpx_box2
@@ -96,14 +94,12 @@ span.free {
{
-webkit-box-shadow: rgba(0, 0, 0, 0.496094) 0px 1px 2px;
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#333), to(#111));
- background: -moz-linear-gradient(center top , #333333, #111111) repeat scroll 0 0 transparent;
- background-color: #333333;
height: 100%;
left: 0px;
position: absolute;
top: 0px;
width: 100%;
+ @mixin gradient(#333333, #333333, #111111);
}
.top-nav-inner
@@ -332,29 +328,25 @@ img.thumbs
}
.message {
- background: #DDFFDD;
- background: url(../img/accept.png) no-repeat scroll 10px 0.6em, -moz-linear-gradient(center top,#F1FEF4,#C4E6BD);
- background: url(../img/accept.png) no-repeat scroll 10px 0.6em, -webkit-gradient(linear,0% 0%,0% 100%,from(#F1FEF4),to(#C4E6BD));
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border: 1px solid #BFB;
margin: 0.5em 0 1em;
padding: 0.5em 1em 0.5em 40px;
position: relative;
color: #1F5714;
+ @mixin gradient(#DDFFDD, #F1FEF4,#C4E6BD);
}
.error-msg {
- background: #FFDDDD;
- background: url(../img/error.png) no-repeat scroll 10px 0.6em, -moz-linear-gradient(center top,#FEF1F4,#E6C4BD);
- background: url(../img/error.png) no-repeat scroll 10px 0.6em, -webkit-gradient(linear,0% 0%,0% 100%,from(#FEF1F4),to(#E6C4BD));
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
+ /* @alternate */ background: url(../img/error.png) no-repeat scroll 10px 0.6em;
border: 1px solid #FFBBBB;
margin: 0.5em 0 1em;
padding: 0.5em 1em 0.5em 40px;
position: relative;
color: #900;
+ @mixin radius(4px);
+ @mixin gradient(#FFDDDD, #FEF1F4, #E6C4BD);
}
.icon_label_feed_sm
@@ -422,18 +414,18 @@ h4
.footer-container
{
- /*background-color: #8EC1DA;*/
- margin-top: 25px;
- padding: 20px 20px 20px 20px;
+ max-width: 1120px;
+ min-width: 1000px;
+ margin: auto;
+ padding: 10px 10px 10px 10px;
font-size: 12px;
- background-color: #E8EBEC;
- border-top: 1px solid #C4CACC;
- border-bottom: 1px solid #C4CACC;
+ text-align: center;
+ color: #4d4d4d;
}
.footer-container a:link, .footer-container a:visited
{
- color: #010259;
+ color: #486999;
}
#appjetfooter
@@ -476,41 +468,30 @@ dd {
}
div.header {
- -moz-border-radius-topleft: 5px;
- -moz-border-radius-topright: 5px;
- -webkit-border-radius: 5px 0px;
- border-top-left-radius: 5px 5px;
- border-top-right-radius: 5px 5px;
- background-color: #C7C7C7;
color: #707070;
padding: 8px 3px 8px 10px;
border: 1px solid #999999;
border-bottom: none;
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#D0D0D0), to(#BFBFBF) );
- background: -moz-linear-gradient(center top, #D0D0D0, #BFBFBF) repeat scroll 0 0 transparent;
-webkit-box-shadow: rgba(0, 0, 0, 0.196094) 0px 0px 5px;
-moz-box-shadow: 0 0px 5px rgba(0, 0, 0, 0.196094);
font-size: 14px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7)
+ @mixin radius(5px 5px 0px 0px);
+ @mixin gradient(#C7C7C7, #D0D0D0, #BFBFBF);
}
div.group {
- -moz-border-radius: 5px 5px 5px 5px;
- border-bottom-left-radius: 5px 5px;
- border-bottom-right-radius: 5px 5px;
-webkit-box-shadow: rgba(0, 0, 0, 0.196094) 0px 0px 5px;
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
background-color: white;
border: 1px solid #999999;
padding-bottom: 15px;
+ @mixin radius(0px 0px 5px 5px);
}
div.sub-header {
- font-weight: bold;
- background-color: #E6E6E6;
- /* background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#E6E6E6), to(#BFBFBF)); */
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F2F2F2), to(#DADADA) );
- background: -moz-linear-gradient(center top, #F2F2F2, #DADADA) repeat scroll 0 0 transparent;
+ font-weight: bold;
+ @mixin gradient(#E6E6E6, #F2F2F2, #DADADA);
}
span.header dl {
@@ -573,12 +554,7 @@ div.rateMe a.on {
a.signup
{
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F8EFAE), to(#F5D55A));
- background: -moz-linear-gradient(center top , #F8EFAE, #F5D55A) repeat scroll 0 0 transparent;
- background-color: #ECD87A;
border: solid #FFD452 1px;
- -webkit-border-radius: 5px 5px;
- -moz-border-radius: 5px;
color: #333;
display: block;
font-family: Helvetica, Arial, sans-serif;
@@ -590,20 +566,18 @@ a.signup
text-align: center;
text-decoration: none;
text-shadow: #DF6 0px 1px 0px;
+ @mixin radius(5px);
+ @mixin gradient(#ECD87A, #F8EFAE, #F5D55A);
}
a.signup:hover, a.signup:focus
{
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#EEE4A2), to(#EBCC52));
- background: -moz-linear-gradient(center top , #EEE4A2, #EBCC52) repeat scroll 0 0 transparent;
- color: #111111;
+ @mixin gradient(#111111, #EEE4A2, #EBCC52);
}
a.signup:active
{
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#B7A424), to(#B7A424));
- background: -moz-linear-gradient(center top , #B7A424, #B7A424) repeat scroll 0 0 transparent;
- color: #111111;
+ @mixin gradient(#111111, #B7A424, #B7A424);
}
#big-counter
@@ -618,16 +592,13 @@ a.signup:active
#download-button
{
- background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F8EFAE), to(#F5D55A));
- background: -moz-linear-gradient(center top , #F8EFAE, #F5D55A) repeat scroll 0 0 transparent;
- background-color: #ECD87A;
border: solid #FFD452 1px;
- -webkit-border-radius: 5px 5px;
- -moz-border-radius: 5px;
color: black;
padding: .35em 2.5em;
vertical-align: middle;
border-style: solid; border-width: 1px;
+ @mixin radius(5px);
+ @mixin gradient(#ECD87A, #F8EFAE, #F5D55A);
}
.twoCols { float: left; width: 240px;}
@@ -663,12 +634,7 @@ padding: 8px 10px 7px 10px;
font-size: 14px;
text-decoration: none;
border: 1px solid transparent;
--webkit-border-top-left-radius: 4px;
--webkit-border-bottom-left-radius: 4px;
--moz-border-radius-topleft: 4px;
--moz-border-radius-bottomleft: 4px;
-border-top-left-radius: 4px 4px;
-border-bottom-left-radius: 4px 4px;
+ @mixin radius(4px);
}
ul.sidetabs li a.selected {
@@ -735,8 +701,7 @@ font-size: 12px;
font-weight: bold;
color: #333;
border: 1px solid #DDD;
--webkit-border-radius: 3px;
--moz-border-radius: 3px;
+ @mixin radius(3px);
}
ul.field-pills li:hover {
@@ -775,8 +740,7 @@ background: whiteSmoke;
font-size: 12px;
color: #333;
border: 1px solid #DDD;
--webkit-border-radius: 5px;
--moz-border-radius: 5px;
+ @mixin radius(5px);
}
ul.apps li {
@@ -795,8 +759,7 @@ div.manage .qfbuttondiv {
font-size: 12px;
margin: 0px;
background-color: #f0f0f0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
+ @mixin radius(4px);
visibility: hidden;
}
@@ -811,3 +774,24 @@ div.manage:hover > .qfbuttondiv {
visibility: visible;
}
+div.bar {
+ border: 2px solid #ddd;
+}
+
+span#bar {
+ width: 100%
+ height 20px;
+ min-width: 2%;
+ max-width: 100%;
+ text-indent: -9999px;
+ background: url('../img/usage_bars.gif') 0 0 repeat-x;
+}
+
+div#bar {
+ width: 100%
+ height 20px;
+ min-width: 2%;
+ max-width: 100%;
+ text-indent: -9999px;
+ background: url('../img/usage_bars.gif') 0 0 repeat-x;
+}
View
1 public/static/css/jquery.jqplot.min.css
@@ -0,0 +1 @@
+.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em;}.jqplot-axis{font-size:.75em;}.jqplot-xaxis{margin-top:10px;}.jqplot-x2axis{margin-bottom:10px;}.jqplot-yaxis{margin-right:10px;}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis,.jqplot-yMidAxis{margin-left:10px;margin-right:10px;}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick,.jqplot-yMidAxis-tick{position:absolute;white-space:pre;}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top;}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom;}.jqplot-yaxis-tick{right:0;top:15px;text-align:right;}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px 1px 5px;z-index:2;font-size:1.5em;}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left;}.jqplot-yMidAxis-tick{text-align:center;white-space:nowrap;}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute;}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute;}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute;}.jqplot-yMidAxis-label{font-size:11pt;position:absolute;}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;margin-left:10px;position:absolute;}.jqplot-meterGauge-tick{font-size:.75em;color:#999;}.jqplot-meterGauge-label{font-size:1em;color:#999;}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px;}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em;}td.jqplot-table-legend{vertical-align:middle;}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer;}.jqplot-table-legend .jqplot-series-hidden{text-decoration:line-through;}div.jqplot-table-legend-swatch-outline{border:1px solid #ccc;padding:1px;}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em;}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-highlighter-tooltip,.jqplot-canvasOverlay-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-point-label{font-size:.75em;z-index:2;}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center;}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em;}.jqplot-error{text-align:center;}.jqplot-error-message{position:relative;top:46%;display:inline-block;}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%);}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7);}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,0.3);}
View
BIN public/static/img/cloudnode-logo-small-light.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN public/static/img/cloudnode-logo2-light.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN public/static/img/page-bg1.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN public/static/img/page-bg2.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
20 public/static/js/cloudnode-min.js
@@ -1,14 +1,22 @@
function isValidEmail(a){return/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{1,5})$/.test(a)}function isValidName(a){return void 0!=a&&2<=a.length}function isValidSubdomain(a){return/^[0-9a-z][0-9a-z-]{1,18}[0-9a-z]$/i.test(a)}$(function(){$("select, input:checkbox, input:radio, input:file").uniform();$(":button").addClass("btn");$(":submit").addClass("btn");$("form").removeClass("quickform")});function submitForm(){var a=$("form");null!=a&&a.submit&&a.submit();return!1}
-function submit(){var a=$("#email").val();validateForm()&&($("#form :input").each(function(){$(this).attr("disabled",!0)}),$.ajax({type:"POST",url:"/lead",data:{email:a},success:function(){_gaq.push(["_trackPageview","/process-form-complete"]);$("#form").fadeOut(500,function(){$("#form").html("<p id='thanks'><span class=\"underline\">Thanks for your interest!</span> You are now on our list and you will soon receive an invite code. Once your account is ready, we will provide you with additional information and details. We keep you informed.</p>");
-$("#form").fadeIn(500)})}}))}function validateForm(){return validateItem("email",isValidEmail)}function validateAppForm(){return validateItem("subdomain",isValidSubdomain)&&validateItem("description",isValidName)&&validateItem("coupon",isValidName)}function validateDBForm(){return validateItem("dbname",isValidName)}function validateItem(a,b){var c=$("#"+a),d=c.val();if(b(d))return $(c).removeClass("error"),!0;$(c).addClass("error");return!1}var _gaq=_gaq||[];_gaq.push(["_setAccount","UA-276011-5"]);
-_gaq.push(["_setDomainName",".cloudno.de"]);_gaq.push(["_trackPageview"]);(function(){var a=document.createElement("script");a.type="text/javascript";a.async=!0;a.src=("https:"==document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)})();
+function twit(a,b){var c,d=a.getElementsByTagName("script")[0];if(!a.getElementById(b))c=a.createElement("script"),c.id=b,c.src="//platform.twitter.com/widgets.js",d.parentNode.insertBefore(c,d)}
+function submit(){var a=$("#email").val(),b=$("#ref").val();validateForm()&&($("#form :input").each(function(){$(this).attr("disabled",!0)}),$.ajax({type:"POST",url:"/lead",data:{email:a,ref:b},success:function(a){_gaq.push(["_trackPageview","/process-form-complete"]);$("#form").fadeOut(500,function(){$("#form").html('<p id="thanks"><span class="underline">Thanks for your interest!</span> You are now on our list for a beta invite code.<br/>Share with your friends to get early access.<br/><br/><label>Share Link: </label><input type="text" title="'+a+
+'" readonly="readonly" value="'+a+'" style="width:400px; background:none repeat scroll 0 0 transparent; color:whitesmoke; font-size: 14px;" onClick="this.select()"></input></p><a href="https://twitter.com/share" class="twitter-share-button" data-counturl="http://cloudno.de" data-url="'+a+'" data-text="Time to get your Node.js app online? Check this out:" data-related="cloudno_de">Tweet</a><script>twit(document, "twitter-wsj");<\/script>');$("#form").fadeIn(500)})}}))}
+function validateForm(){var a=$("#email").val(),b="admin,me,contact,stuff,junk,mail,email,webmaster,tech,info,web,support,hello,projects,account,internet,social,online".split(","),c=validateItem("email",isValidEmail);if(c){var d=a.indexOf("@");if(-1!=d){var a=a.substring(0,d),e;for(e in b)if(b[e]==a)return alert("Please check your email address. You cannot join the beta list using a role-based email address.\n\nDetails at: http://docs.cloudno.de/beta-list"),!1}}return c}
+function validateAppForm(){return validateItem("subdomain",isValidSubdomain)&&validateItem("description",isValidName)&&validateItem("coupon",isValidName)}function validateDBForm(){return validateItem("dbname",isValidName)}function validateItem(a,b){var c=$("#"+a),d=c.val();if(b(d))return $(c).removeClass("error"),!0;$(c).addClass("error");return!1}var _gaq=_gaq||[];_gaq.push(["_setAccount","UA-276011-5"]);_gaq.push(["_setDomainName",".cloudno.de"]);_gaq.push(["_trackPageview"]);
+(function(){var a=document.createElement("script");a.type="text/javascript";a.async=!0;a.src=("https:"==document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js";var b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b)})();
function tab(a){var b=$("li#"+a.hash).siblings();b.each(function(a){""!=b[a].id&&($(b[a].firstChild).removeClass("selected"),$("div#"+b[a].id).addClass("hidden"))});$(a).addClass("selected");$("div"+a.hash).removeClass("hidden");return!1}function addPill(a){$("div."+a).removeClass("hidden");return!1}function closePill(a){$("div."+a).addClass("hidden");return!1}function validate(a){var b=a.val();if(isValidName(b))$(a).removeClass("error");else return $(a).addClass("error"),!1;return!0}
function submitKey(){var a=$("#keyname"),b=$("#sshkey");if(!validate(a)||!validate(b))return!1;$("form :input").each(function(){$(this).attr("disabled",!0)});$.post("/account",{keyname:a.val(),sshkey:b.val()},function(a){a.success?window.location="/account?ssh":alert(a.status);$("form :input").each(function(){$(this).attr("disabled",!1)})},"json")}
function removeKey(a){if(!confirm('Are you sure you want to delete the public SSH key for "'+a+'" ?'))return!1;$.post("/api/removekey",{keyname:a},function(a){a.success?window.location="/account?ssh":alert(a)},"json");return!1}function deleteDB(a){if(!confirm('Are you sure you want to delete the database "'+a+'" ?'))return!1;$.post("/api/deletedb",{dbname:a},function(a){a.success?window.location="/database":alert(a.status)},"json");return!1}
function submitProfile(){var a=$("#publicemail"),b=$("#website"),c=$("#company"),d=$("#location");if(a.val()&&!validateItem("publicemail",isValidEmail)||b.val()&&!validateItem("website",isValidName)||c.val()&&!validateItem("company",isValidName)||d.val()&&!validateItem("location",isValidName))return!1;a.attr("disabled",!0);b.attr("disabled",!0);c.attr("disabled",!0);d.attr("disabled",!0);$.post("/api/profile",{email:a.val(),website:b.val(),company:c.val(),location:d.val()},function(e){e.success&&
($(".inline-msg").removeClass("hidden"),a.attr("disabled",!1),b.attr("disabled",!1),c.attr("disabled",!1),d.attr("disabled",!1),$("span#bar").width($("span#bar").width()+10),setTimeout(function(){$(".inline-msg").addClass("hidden")},3E3))},"json")}
function submitBio(){var a=$("#biotext");if(!validateItem("biotext",isValidName))return!1;$("#biotext").attr("disabled",!0);$.post("/api/bio",{bio:a.val()},function(a){a.success&&($(".inline-msg").removeClass("hidden"),$("#biotext").attr("disabled",!1),$("span#bar").width($("span#bar").width()+10),setTimeout(function(){$(".inline-msg").addClass("hidden")},3E3))},"json")}
function controlApp(a,b){$.ajax({type:"POST",url:"/api/control/"+a,data:{running:b},success:function(a){"success"==a?window.location.reload():alert(a)}})}function deleteApp(a){confirm('Are you sure you want to delete the app "'+a+' and its repository"? This action cannot be undone.')&&$.ajax({type:"POST",url:"/api/deleteapp/"+a,data:{},success:function(a){"success"==a?window.location="/myapps":alert(a)}})}
-function getLog(a){$.ajax({type:"GET",url:"/api/applogs/"+a,dataType:"json",data:{},success:function(a){if(a.success){var c="<h4>Application Log</h4><br />",d;for(d in a.lines)c+=a.lines[d]+"<br/>";$("#log").html(c)}else alert(a.success)}})}function getEnv(a){$.ajax({type:"GET",url:"/api/env/"+a,dataType:"json",data:{},success:function(a){if("success"==a.status){var c="<h4>Environment</h4><br />",d;for(d in a.message)c+=d+" = "+a.message[d]+"<br/>";$("#log").html(c)}else alert(a.success)}})}
-function getCoupon(){$.get("/api/coupon",function(a){a.success?$("#coupon").val(a.coupon):alert("No coupons left, please retry in a few days.")},"json")}function deleteUser(a,b){confirm('Are you sure you want to delete the account "'+a+"? This action cannot be undone.")&&$.ajax({type:"POST",url:"/api/deleteuser",data:{id:b},success:function(a){"success"==a?window.location="/admin/userlist":alert(a)}})}
-function gitWeb(a){a=a.substr(30);window.location="http://gitweb.cloudno.de/git-web/gitweb.cgi?p="+a;return!1};
+function getLog(a){$.ajax({type:"GET",url:"/api/applogs/"+a,dataType:"json",data:{},success:function(a){if(a.success){var c="<h4>Application Log</h4><br />";$("div.detail").slideUp();for(var d in a.lines)c+=a.lines[d]+"<br/>";$("#log").html(c)}else alert(a.success)}})}
+function getEnv(a){$.ajax({type:"GET",url:"/api/env/"+a,dataType:"json",data:{},success:function(a){if("success"==a.status){var c="<h4>Environment</h4><br />";$("div.detail").slideUp();for(var d in a.message)c+=d+" = "+a.message[d]+"<br/>";$("#log").html(c)}else alert(a.success)}})}function getCoupon(){$.get("/api/coupon",function(a){a.success?$("#coupon").val(a.coupon):alert("No coupons left, please retry in a few days.")},"json")}
+function deleteUser(a,b){confirm('Are you sure you want to delete the account "'+a+"? This action cannot be undone.")&&$.ajax({type:"POST",url:"/api/deleteuser",data:{id:b},success:function(a){"success"==a?window.location="/admin/userlist":alert(a)}})}function gitWeb(a){a=a.substr(30);window.location="http://gitweb.cloudno.de/git-web/gitweb.cgi?p="+a;return!1}
+function followUser(a){var b=$("#follow"),c=$("span#followers"),d=1*$(c).text(),e="Unfollow"==$(b).text();$.post("/api/follow",{name:a,on:e},function(a){a.success&&(e?($(b).text("Follow"),$(c).text(d-1)):($(b).text("Unfollow"),$(c).text(d+1)))},"json")}function limitText(a,b,c){a.value.length>c?a.value=a.value.substring(0,c):b.value=c-a.value.length}
+function submitMessage(){var a=$("#to"),b=$("#subject"),c=$("#message");if(!validate(a)||!validate(b)||!validate(c))return!1;$("form :input").each(function(){$(this).attr("disabled",!0)});$.post("/api/message",{to:a.val(),subject:b.val(),message:c.val()},function(a){a.success?window.location="/account/sent":alert(a.status);$("form :input").each(function(){$(this).attr("disabled",!1)})},"json")}
+function markRead(a,b,c){var d=$("span#"+b),e=1*$(d).text();$.post("/api/markRead",{id:c},function(b){b.success?($(a).parent().parent().parent().removeClass("unread"),$(d).text(e-1)):alert(b.status)},"json")}function deleteMessage(a,b,c){var d=$(a).parent().parent().parent();$.post("/api/deleteMessage",{id:c,target:b},function(a){a.success?d.remove():alert(a.status)},"json")}
+function controlRedis(a,b){("delete"!=b||confirm('Are you sure you want to delete the Redis database "'+a+'" and all its data? This action cannot be undone.'))&&$.post("/api/controlredis",{dbname:a,action:b},function(a){if("ok"==a.status)switch(b){case "delete":window.location="/database";break;case "logs":var d="<h4>Redis Log</h4><br />";$("div.detail").slideUp();for(var e in a.data)d+=a.data[e]+"<br/>";$("#log").html(d);break;case "config":d="<h4>Redis Configuration</h4><br />";$("div.detail").slideUp();
+for(e in a.data)d+=a.data[e]+"<br/>";$("#log").html(d);break;default:window.location.reload()}else alert(a.status)},"json")};
View
57 public/static/js/jquery.jqplot.min.js
57 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
57 public/static/js/plugins/jqplot.canvasAxisLabelRenderer.min.js
@@ -0,0 +1,57 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r1012
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * Although not required, the author would appreciate an email letting him
+ * know of any substantial use of jqPlot. You can reach the author at:
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ * version 2007.04.27
+ * author Ash Searle
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
+ * http://hexmen.com/js/sprintf.js
+ * The author (Ash Searle) has placed this code in the public domain:
+ * "This code is unrestricted: you are free to use it however you like."
+ *
+ * included jsDate library by Chris Leonello:
+ *
+ * Copyright (c) 2010-2011 Chris Leonello
+ *
+ * jsDate is currently available for use in all personal or commercial projects
+ * under both the MIT and GPL version 2.0 licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * jsDate borrows many concepts and ideas from the Date Instance
+ * Methods by Ken Snyder along with some parts of Ken's actual code.
+ *
+ * Ken's origianl Date Instance Methods and copyright notice:
+ *
+ * Ken Snyder (ken d snyder at gmail dot com)
+ * 2008-09-10
+ * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
+ * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+ *
+ * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
+ * Larry has generously given permission to adapt his code for inclusion
+ * into jqPlot.
+ *
+ * Larry's original code can be found here:
+ *
+ * https://github.com/lsiden/export-jqplot-to-png
+ *
+ *
+ */
+(function(a){a.jqplot.CanvasAxisLabelRenderer=function(b){this.angle=0;this.axis;this.show=true;this.showLabel=true;this.label="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="11pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);if(b.angle==null&&this.axis!="xaxis"&&this.axis!="x2axis"){this.angle=-90}var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisLabelRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisLabelRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisLabelRenderer.prototype.draw=function(c,f){if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css({position:"absolute"});this._elem.addClass("jqplot-"+this.axis+"-label");e=null;return this._elem};a.jqplot.CanvasAxisLabelRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);
View
57 public/static/js/plugins/jqplot.canvasAxisTickRenderer.min.js
@@ -0,0 +1,57 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r1012
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * Although not required, the author would appreciate an email letting him
+ * know of any substantial use of jqPlot. You can reach the author at:
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ * version 2007.04.27
+ * author Ash Searle
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
+ * http://hexmen.com/js/sprintf.js
+ * The author (Ash Searle) has placed this code in the public domain:
+ * "This code is unrestricted: you are free to use it however you like."
+ *
+ * included jsDate library by Chris Leonello:
+ *
+ * Copyright (c) 2010-2011 Chris Leonello
+ *
+ * jsDate is currently available for use in all personal or commercial projects
+ * under both the MIT and GPL version 2.0 licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * jsDate borrows many concepts and ideas from the Date Instance
+ * Methods by Ken Snyder along with some parts of Ken's actual code.
+ *
+ * Ken's origianl Date Instance Methods and copyright notice:
+ *
+ * Ken Snyder (ken d snyder at gmail dot com)
+ * 2008-09-10
+ * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
+ * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+ *
+ * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
+ * Larry has generously given permission to adapt his code for inclusion
+ * into jqPlot.
+ *
+ * Larry's original code can be found here:
+ *
+ * https://github.com/lsiden/export-jqplot-to-png
+ *
+ *
+ */
+(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);
View
57 public/static/js/plugins/jqplot.canvasTextRenderer.min.js
@@ -0,0 +1,57 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r1012
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * Although not required, the author would appreciate an email letting him
+ * know of any substantial use of jqPlot. You can reach the author at:
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ * version 2007.04.27
+ * author Ash Searle
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
+ * http://hexmen.com/js/sprintf.js
+ * The author (Ash Searle) has placed this code in the public domain:
+ * "This code is unrestricted: you are free to use it however you like."
+ *
+ * included jsDate library by Chris Leonello:
+ *
+ * Copyright (c) 2010-2011 Chris Leonello
+ *
+ * jsDate is currently available for use in all personal or commercial projects
+ * under both the MIT and GPL version 2.0 licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * jsDate borrows many concepts and ideas from the Date Instance
+ * Methods by Ken Snyder along with some parts of Ken's actual code.
+ *
+ * Ken's origianl Date Instance Methods and copyright notice:
+ *
+ * Ken Snyder (ken d snyder at gmail dot com)
+ * 2008-09-10
+ * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
+ * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+ *
+ * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
+ * Larry has generously given permission to adapt his code for inclusion
+ * into jqPlot.
+ *
+ * Larry's original code can be found here:
+ *
+ * https://github.com/lsiden/export-jqplot-to-png
+ *
+ *
+ */
+(function(a){a.jqplot.CanvasTextRenderer=function(b){this.fontStyle="normal";this.fontVariant="normal";this.fontWeight="normal";this.fontSize="10px";this.fontFamily="sans-serif";this.fontStretch=1;this.fillStyle="#666666";this.angle=0;this.textAlign="start";this.textBaseline="alphabetic";this.text;this.width;this.height;this.pt2px=1.28;a.extend(true,this,b);this.normalizedFontSize=this.normalizeFontSize(this.fontSize);this.setHeight()};a.jqplot.CanvasTextRenderer.prototype.init=function(b){a.extend(true,this,b);this.normalizedFontSize=this.normalizeFontSize(this.fontSize);this.setHeight()};a.jqplot.CanvasTextRenderer.prototype.normalizeFontSize=function(b){b=String(b);var c=parseFloat(b);if(b.indexOf("px")>-1){return c/this.pt2px}else{if(b.indexOf("pt")>-1){return c}else{if(b.indexOf("em")>-1){return c*12}else{if(b.indexOf("%")>-1){return c*12/100}else{return c/this.pt2px}}}}};a.jqplot.CanvasTextRenderer.prototype.fontWeight2Float=function(b){if(Number(b)){return b/400}else{switch(b){case"normal":return 1;break;case"bold":return 1.75;break;case"bolder":return 2.25;break;case"lighter":return 0.75;break;default:return 1;break}}};a.jqplot.CanvasTextRenderer.prototype.getText=function(){return this.text};a.jqplot.CanvasTextRenderer.prototype.setText=function(c,b){this.text=c;this.setWidth(b);return this};a.jqplot.CanvasTextRenderer.prototype.getWidth=function(b){return this.width};a.jqplot.CanvasTextRenderer.prototype.setWidth=function(c,b){if(!b){this.width=this.measure(c,this.text)}else{this.width=b}return this};a.jqplot.CanvasTextRenderer.prototype.getHeight=function(b){return this.height};a.jqplot.CanvasTextRenderer.prototype.setHeight=function(b){if(!b){this.height=this.normalizedFontSize*this.pt2px}else{this.height=b}return this};a.jqplot.CanvasTextRenderer.prototype.letter=function(b){return this.letters[b]};a.jqplot.CanvasTextRenderer.prototype.ascent=function(){return this.normalizedFontSize};a.jqplot.CanvasTextRenderer.prototype.descent=function(){return 7*this.normalizedFontSize/25};a.jqplot.CanvasTextRenderer.prototype.measure=function(d,g){var f=0;var b=g.length;for(var e=0;e<b;e++){var h=this.letter(g.charAt(e));if(h){f+=h.width*this.normalizedFontSize/25*this.fontStretch}}return f};a.jqplot.CanvasTextRenderer.prototype.draw=function(s,n){var r=0;var o=this.height*0.72;var p=0;var l=n.length;var k=this.normalizedFontSize/25;s.save();var h,f;if((-Math.PI/2<=this.angle&&this.angle<=0)||(Math.PI*3/2<=this.angle&&this.angle<=Math.PI*2)){h=0;f=-Math.sin(this.angle)*this.width}else{if((0<this.angle&&this.angle<=Math.PI/2)||(-Math.PI*2<=this.angle&&this.angle<=-Math.PI*3/2)){h=Math.sin(this.angle)*this.height;f=0}else{if((-Math.PI<this.angle&&this.angle<-Math.PI/2)||(Math.PI<=this.angle&&this.angle<=Math.PI*3/2)){h=-Math.cos(this.angle)*this.width;f=-Math.sin(this.angle)*this.width-Math.cos(this.angle)*this.height}else{if((-Math.PI*3/2<this.angle&&this.angle<Math.PI)||(Math.PI/2<this.angle&&this.angle<Math.PI)){h=Math.sin(this.angle)*this.height-Math.cos(this.angle)*this.width;f=-Math.cos(this.angle)*this.height}}}}s.strokeStyle=this.fillStyle;s.fillStyle=this.fillStyle;s.translate(h,f);s.rotate(this.angle);s.lineCap="round";var t=(this.normalizedFontSize>30)?2:2+(30-this.normalizedFontSize)/20;s.lineWidth=t*k*this.fontWeight2Float(this.fontWeight);for(var g=0;g<l;g++){var m=this.letter(n.charAt(g));if(!m){continue}s.beginPath();var e=1;var b=0;for(var d=0;d<m.points.length;d++){var q=m.points[d];if(q[0]==-1&&q[1]==-1){e=1;continue}if(e){s.moveTo(r+q[0]*k*this.fontStretch,o-q[1]*k);e=false}else{s.lineTo(r+q[0]*k*this.fontStretch,o-q[1]*k)}}s.stroke();r+=m.width*k*this.fontStretch}s.restore();return p};a.jqplot.CanvasTextRenderer.prototype.letters={" ":{width:16,points:[]},"!":{width:10,points:[[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},'"':{width:16,points:[[4,21],[4,14],[-1,-1],[12,21],[12,14]]},"#":{width:21,points:[[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]]},"$":{width:20,points:[[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},"%":{width:24,points:[[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]]},"&":{width:26,points:[[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]]},"'":{width:10,points:[[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]]},"(":{width:14,points:[[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]]},")":{width:14,points:[[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]]},"*":{width:16,points:[[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]]},"+":{width:26,points:[[13,18],[13,0],[-1,-1],[4,9],[22,9]]},",":{width:10,points:[[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"-":{width:18,points:[[6,9],[12,9]]},".":{width:10,points:[[5,2],[4,1],[5,0],[6,1],[5,2]]},"/":{width:22,points:[[20,25],[2,-7]]},"0":{width:20,points:[[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]]},"1":{width:20,points:[[6,17],[8,18],[11,21],[11,0]]},"2":{width:20,points:[[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]]},"3":{width:20,points:[[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},"4":{width:20,points:[[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]]},"5":{width:20,points:[[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]]},"6":{width:20,points:[[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]]},"7":{width:20,points:[[17,21],[7,0],[-1,-1],[3,21],[17,21]]},"8":{width:20,points:[[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]]},"9":{width:20,points:[[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]]},":":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]]},";":{width:10,points:[[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]]},"<":{width:24,points:[[20,18],[4,9],[20,0]]},"=":{width:26,points:[[4,12],[22,12],[-1,-1],[4,6],[22,6]]},">":{width:24,points:[[4,18],[20,9],[4,0]]},"?":{width:18,points:[[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]]},"@":{width:27,points:[[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]]},A:{width:18,points:[[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]]},B:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]]},C:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]]},D:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]]},E:{width:19,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]]},F:{width:18,points:[[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]]},G:{width:21,points:[[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]]},H:{width:22,points:[[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]]},I:{width:8,points:[[4,21],[4,0]]},J:{width:16,points:[[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]]},K:{width:21,points:[[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]]},L:{width:17,points:[[4,21],[4,0],[-1,-1],[4,0],[16,0]]},M:{width:24,points:[[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]]},N:{width:22,points:[[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]]},O:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]]},P:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]]},Q:{width:22,points:[[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]]},R:{width:21,points:[[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]]},S:{width:20,points:[[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]]},T:{width:16,points:[[8,21],[8,0],[-1,-1],[1,21],[15,21]]},U:{width:22,points:[[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]]},V:{width:18,points:[[1,21],[9,0],[-1,-1],[17,21],[9,0]]},W:{width:24,points:[[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]]},X:{width:20,points:[[3,21],[17,0],[-1,-1],[17,21],[3,0]]},Y:{width:18,points:[[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]]},Z:{width:20,points:[[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]]},"[":{width:14,points:[[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]]},"\\":{width:14,points:[[0,21],[14,-3]]},"]":{width:14,points:[[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]]},"^":{width:16,points:[[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]]},_:{width:16,points:[[0,-2],[16,-2]]},"`":{width:10,points:[[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]]},a:{width:19,points:[[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},b:{width:19,points:[[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},c:{width:18,points:[[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},d:{width:19,points:[[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},e:{width:18,points:[[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},f:{width:12,points:[[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]]},g:{width:19,points:[[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},h:{width:19,points:[[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},i:{width:8,points:[[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]]},j:{width:10,points:[[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]]},k:{width:17,points:[[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]]},l:{width:8,points:[[4,21],[4,0]]},m:{width:30,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]]},n:{width:19,points:[[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]]},o:{width:19,points:[[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]]},p:{width:19,points:[[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]]},q:{width:19,points:[[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]]},r:{width:13,points:[[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]]},s:{width:17,points:[[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]]},t:{width:12,points:[[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]]},u:{width:19,points:[[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]]},v:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0]]},w:{width:22,points:[[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]]},x:{width:17,points:[[3,14],[14,0],[-1,-1],[14,14],[3,0]]},y:{width:16,points:[[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]]},z:{width:17,points:[[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]]},"{":{width:14,points:[[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]]},"|":{width:8,points:[[4,25],[4,-7]]},"}":{width:14,points:[[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]]},"~":{width:24,points:[[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]]}};a.jqplot.CanvasFontRenderer=function(b){b=b||{};if(!b.pt2px){b.pt2px=1.5}a.jqplot.CanvasTextRenderer.call(this,b)};a.jqplot.CanvasFontRenderer.prototype=new a.jqplot.CanvasTextRenderer({});a.jqplot.CanvasFontRenderer.prototype.constructor=a.jqplot.CanvasFontRenderer;a.jqplot.CanvasFontRenderer.prototype.measure=function(c,e){var d=this.fontSize+" "+this.fontFamily;c.save();c.font=d;var b=c.measureText(e).width;c.restore();return b};a.jqplot.CanvasFontRenderer.prototype.draw=function(e,g){var c=0;var h=this.height*0.72;e.save();var d,b;if((-Math.PI/2<=this.angle&&this.angle<=0)||(Math.PI*3/2<=this.angle&&this.angle<=Math.PI*2)){d=0;b=-Math.sin(this.angle)*this.width}else{if((0<this.angle&&this.angle<=Math.PI/2)||(-Math.PI*2<=this.angle&&this.angle<=-Math.PI*3/2)){d=Math.sin(this.angle)*this.height;b=0}else{if((-Math.PI<this.angle&&this.angle<-Math.PI/2)||(Math.PI<=this.angle&&this.angle<=Math.PI*3/2)){d=-Math.cos(this.angle)*this.width;b=-Math.sin(this.angle)*this.width-Math.cos(this.angle)*this.height}else{if((-Math.PI*3/2<this.angle&&this.angle<Math.PI)||(Math.PI/2<this.angle&&this.angle<Math.PI)){d=Math.sin(this.angle)*this.height-Math.cos(this.angle)*this.width;b=-Math.cos(this.angle)*this.height}}}}e.strokeStyle=this.fillStyle;e.fillStyle=this.fillStyle;var f=this.fontSize+" "+this.fontFamily;e.font=f;e.translate(d,b);e.rotate(this.angle);e.fillText(g,c,h);e.restore()}})(jQuery);
View
57 public/static/js/plugins/jqplot.dateAxisRenderer.min.js
@@ -0,0 +1,57 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r1012
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * Although not required, the author would appreciate an email letting him
+ * know of any substantial use of jqPlot. You can reach the author at:
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ * version 2007.04.27
+ * author Ash Searle
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
+ * http://hexmen.com/js/sprintf.js
+ * The author (Ash Searle) has placed this code in the public domain:
+ * "This code is unrestricted: you are free to use it however you like."
+ *
+ * included jsDate library by Chris Leonello:
+ *
+ * Copyright (c) 2010-2011 Chris Leonello
+ *
+ * jsDate is currently available for use in all personal or commercial projects
+ * under both the MIT and GPL version 2.0 licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * jsDate borrows many concepts and ideas from the Date Instance
+ * Methods by Ken Snyder along with some parts of Ken's actual code.
+ *
+ * Ken's origianl Date Instance Methods and copyright notice:
+ *
+ * Ken Snyder (ken d snyder at gmail dot com)
+ * 2008-09-10
+ * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
+ * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+ *
+ * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
+ * Larry has generously given permission to adapt his code for inclusion
+ * into jqPlot.
+ *
+ * Larry's original code can be found here:
+ *
+ * https://github.com/lsiden/export-jqplot-to-png
+ *
+ *
+ */
+(function(h){h.jqplot.DateAxisRenderer=function(){h.jqplot.LinearAxisRenderer.call(this);this.date=new h.jsDate()};var c=1000;var e=60*c;var f=60*e;var l=24*f;var b=7*l;var j=30.4368499*l;var k=365.242199*l;var g=[31,28,31,30,31,30,31,30,31,30,31,30];var i=["%M:%S.%#N","%M:%S.%#N","%M:%S.%#N","%M:%S","%M:%S","%M:%S","%M:%S","%H:%M:%S","%H:%M:%S","%H:%M","%H:%M","%H:%M","%H:%M","%H:%M","%H:%M","%a %H:%M","%a %H:%M","%b %e %H:%M","%b %e %H:%M","%b %e %H:%M","%b %e %H:%M","%v","%v","%v","%v","%v","%v","%v"];var m=[0.1*c,0.2*c,0.5*c,c,2*c,5*c,10*c,15*c,30*c,e,2*e,5*e,10*e,15*e,30*e,f,2*f,4*f,6*f,8*f,12*f,l,2*l,3*l,4*l,5*l,b,2*b];var d=[];function a(p,s,t){var o=Number.MAX_VALUE;var u,r,v;for(var q=0,n=m.length;q<n;q++){u=Math.abs(t-m[q]);if(u<o){o=u;r=m[q];v=i[q]}}return[r,v]}h.jqplot.DateAxisRenderer.prototype=new h.jqplot.LinearAxisRenderer();h.jqplot.DateAxisRenderer.prototype.constructor=h.jqplot.DateAxisRenderer;h.jqplot.DateTickFormatter=function(n,o){if(!n){n="%Y/%m/%d"}return h.jsDate.strftime(o,n)};h.jqplot.DateAxisRenderer.prototype.init=function(E){this.tickOptions.formatter=h.jqplot.DateTickFormatter;this.tickInset=0;this.drawBaseline=true;this.baselineWidth=null;this.baselineColor=null;this.daTickInterval=null;this._daTickInterval=null;h.extend(true,this,E);var C=this._dataBounds,u,x,D,y,A,z,o;for(var t=0;t<this._series.length;t++){u={intervals:[],frequencies:{},sortedIntervals:[],min:null,max:null,mean:null};x=0;D=this._series[t];y=D.data;A=D._plotData;z=D._stackData;o=0;for(var r=0;r<y.length;r++){if(this.name=="xaxis"||this.name=="x2axis"){y[r][0]=new h.jsDate(y[r][0]).getTime();A[r][0]=new h.jsDate(y[r][0]).getTime();z[r][0]=new h.jsDate(y[r][0]).getTime();if((y[r][0]!=null&&y[r][0]<C.min)||C.min==null){C.min=y[r][0]}if((y[r][0]!=null&&y[r][0]>C.max)||C.max==null){C.max=y[r][0]}if(r>0){o=Math.abs(y[r][0]-y[r-1][0]);u.intervals.push(o);if(u.frequencies.hasOwnProperty(o)){u.frequencies[o]+=1}else{u.frequencies[o]=1}}x+=o}else{y[r][1]=new h.jsDate(y[r][1]).getTime();A[r][1]=new h.jsDate(y[r][1]).getTime();z[r][1]=new h.jsDate(y[r][1]).getTime();if((y[r][1]!=null&&y[r][1]<C.min)||C.min==null){C.min=y[r][1]}if((y[r][1]!=null&&y[r][1]>C.max)||C.max==null){C.max=y[r][1]}if(r>0){o=Math.abs(y[r][1]-y[r-1][1]);u.intervals.push(o);if(u.frequencies.hasOwnProperty(o)){u.frequencies[o]+=1}else{u.frequencies[o]=1}}}x+=o}if(D.renderer.bands){if(D.renderer.bands.hiData.length){var w=D.renderer.bands.hiData;for(var r=0,q=w.length;r<q;r++){if(this.name==="xaxis"||this.name==="x2axis"){w[r][0]=new h.jsDate(w[r][0]).getTime();if((w[r][0]!=null&&w[r][0]>C.max)||C.max==null){C.max=w[r][0]}}else{w[r][1]=new h.jsDate(w[r][1]).getTime();if((w[r][1]!=null&&w[r][1]>C.max)||C.max==null){C.max=w[r][1]}}}}if(D.renderer.bands.lowData.length){var w=D.renderer.bands.lowData;for(var r=0,q=w.length;r<q;r++){if(this.name==="xaxis"||this.name==="x2axis"){w[r][0]=new h.jsDate(w[r][0]).getTime();if((w[r][0]!=null&&w[r][0]<C.min)||C.min==null){C.min=w[r][0]}}else{w[r][1]=new h.jsDate(w[r][1]).getTime();if((w[r][1]!=null&&w[r][1]<C.min)||C.min==null){C.min=w[r][1]}}}}}var B=0,v=0;for(var p in u.frequencies){u.sortedIntervals.push({interval:p,frequency:u.frequencies[p]})}u.sortedIntervals.sort(function(s,n){return n.frequency-s.frequency});u.min=h.jqplot.arrayMin(u.intervals);u.max=h.jqplot.arrayMax(u.intervals);u.mean=x/y.length;this._intervalStats.push(u);u=x=D=y=A=z=null}C=null};h.jqplot.DateAxisRenderer.prototype.reset=function(){this.min=this._options.min;this.max=this._options.max;this.tickInterval=this._options.tickInterval;this.numberTicks=this._options.numberTicks;this._autoFormatString="";if(this._overrideFormatString&&this.tickOptions&&this.tickOptions.formatString){this.tickOptions.formatString=""}this.daTickInterval=this._daTickInterval};h.jqplot.DateAxisRenderer.prototype.createTicks=function(p){var U=this._ticks;var J=this.ticks;var E=this.name;var G=this._dataBounds;var L=this._intervalStats;var n=(this.name.charAt(0)==="x")?this._plotDimensions.width:this._plotDimensions.height;var w;var ab,I;var y,x;var aa,X;var s=30;var N=1;var v=this.tickInterval;ab=((this.min!=null)?new h.jsDate(this.min).getTime():G.min);I=((this.max!=null)?new h.jsDate(this.max).getTime():G.max);var A=p.plugins.cursor;if(A&&A._zoom&&A._zoom.zooming){this.min=null;this.max=null}var B=I-ab;if(this.tickOptions==null||!this.tickOptions.formatString){this._overrideFormatString=true}if(J.length){for(X=0;X<J.length;X++){var O=J[X];var V=new this.tickRenderer(this.tickOptions);if(O.constructor==Array){V.value=new h.jsDate(O[0]).getTime();V.label=O[1];if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(V.value,this.name);this._ticks.push(V)}else{V.value=new h.jsDate(O).getTime();if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(V.value,this.name);this._ticks.push(V)}}this.numberTicks=J.length;this.min=this._ticks[0].value;this.max=this._ticks[this.numberTicks-1].value;this.daTickInterval=[(this.max-this.min)/(this.numberTicks-1)/1000,"seconds"]}else{if(this.min==null&&this.max==null){var M=h.extend(true,{},this.tickOptions,{name:this.name,value:null});var Y,H;if(!this.tickInterval&&!this.numberTicks){var Q=Math.max(n,s+1);var W=115;if(this.tickRenderer===h.jqplot.CanvasAxisTickRenderer&&this.tickOptions.angle){W=115-40*Math.abs(Math.sin(this.tickOptions.angle/180*Math.PI))}Y=Math.ceil((Q-s)/W+1);H=(I-ab)/(Y-1)}else{if(this.tickInterval){H=this.tickInterval}else{if(this.numberTicks){Y=this.numberTicks;H=(I-ab)/(Y-1)}}}if(H<=19*l){var P=a(ab,I,H);var r=P[0];this._autoFormatString=P[1];ab=Math.floor(ab/r)*r;ab=new h.jsDate(ab);ab=ab.getTime()+ab.getUtcOffset();Y=Math.ceil((I-ab)/r)+1;this.min=ab;this.max=ab+(Y-1)*r;if(this.max<I){this.max+=r;Y+=1}this.tickInterval=r;this.numberTicks=Y;for(var X=0;X<Y;X++){M.value=this.min+X*r;V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=this.tickInterval}else{if(H<=9*j){this._autoFormatString="%v";var D=Math.round(H/j);if(D<1){D=1}else{if(D>6){D=6}}var S=new h.jsDate(ab).setDate(1).setHours(0,0,0,0);var q=new h.jsDate(I);var z=new h.jsDate(I).setDate(1).setHours(0,0,0,0);if(q.getTime()!==z.getTime()){z=z.add(1,"month")}var R=z.diff(S,"month");Y=Math.ceil(R/D)+1;this.min=S.getTime();this.max=S.clone().add((Y-1)*D,"month").getTime();this.numberTicks=Y;for(var X=0;X<Y;X++){if(X===0){M.value=S.getTime()}else{M.value=S.add(D,"month").getTime()}V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=D*j}else{this._autoFormatString="%v";var D=Math.round(H/k);if(D<1){D=1}var S=new h.jsDate(ab).setMonth(0,1).setHours(0,0,0,0);var z=new h.jsDate(I).add(1,"year").setMonth(0,1).setHours(0,0,0,0);var K=z.diff(S,"year");Y=Math.ceil(K/D)+1;this.min=S.getTime();this.max=S.clone().add((Y-1)*D,"year").getTime();this.numberTicks=Y;for(var X=0;X<Y;X++){if(X===0){M.value=S.getTime()}else{M.value=S.add(D,"year").getTime()}V=new this.tickRenderer(M);if(this._overrideFormatString&&this._autoFormatString!=""){V.formatString=this._autoFormatString}if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}this._ticks.push(V)}N=D*k}}}else{if(E=="xaxis"||E=="x2axis"){n=this._plotDimensions.width}else{n=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}if(this.tickInterval!=null){if(Number(this.tickInterval)){this.daTickInterval=[Number(this.tickInterval),"seconds"]}else{if(typeof this.tickInterval=="string"){var Z=this.tickInterval.split(" ");if(Z.length==1){this.daTickInterval=[1,Z[0]]}else{if(Z.length==2){this.daTickInterval=[Z[0],Z[1]]}}}}}if(ab==I){var o=24*60*60*500;ab-=o;I+=o}B=I-ab;var F=2+parseInt(Math.max(0,n-100)/100,10);var T,C;T=(this.min!=null)?new h.jsDate(this.min).getTime():ab-B/2*(this.padMin-1);C=(this.max!=null)?new h.jsDate(this.max).getTime():I+B/2*(this.padMax-1);this.min=T;this.max=C;B=this.max-this.min;if(this.numberTicks==null){if(this.daTickInterval!=null){var u=new h.jsDate(this.max).diff(this.min,this.daTickInterval[1],true);this.numberTicks=Math.ceil(u/this.daTickInterval[0])+1;this.max=new h.jsDate(this.min).add((this.numberTicks-1)*this.daTickInterval[0],this.daTickInterval[1]).getTime()}else{if(n>200){this.numberTicks=parseInt(3+(n-200)/100,10)}else{this.numberTicks=2}}}N=B/(this.numberTicks-1)/1000;if(this.daTickInterval==null){this.daTickInterval=[N,"seconds"]}for(var X=0;X<this.numberTicks;X++){var ab=new h.jsDate(this.min);aa=ab.add(X*this.daTickInterval[0],this.daTickInterval[1]).getTime();var V=new this.tickRenderer(this.tickOptions);if(!this.showTicks){V.showLabel=false;V.showMark=false}else{if(!this.showTickMarks){V.showMark=false}}V.setTick(aa,this.name);this._ticks.push(V)}}}if(this.tickInset){this.min=this.min-this.tickInset*N;this.max=this.max+this.tickInset*N}if(this._daTickInterval==null){this._daTickInterval=this.daTickInterval}U=null}})(jQuery);
View
57 public/static/js/plugins/jqplot.highlighter.min.js
@@ -0,0 +1,57 @@
+/**
+ * jqPlot
+ * Pure JavaScript plotting plugin using jQuery
+ *
+ * Version: 1.0.0b2_r1012
+ *
+ * Copyright (c) 2009-2011 Chris Leonello
+ * jqPlot is currently available for use in all personal or commercial projects
+ * under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
+ * version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * Although not required, the author would appreciate an email letting him
+ * know of any substantial use of jqPlot. You can reach the author at:
+ * chris at jqplot dot com or see http://www.jqplot.com/info.php .
+ *
+ * If you are feeling kind and generous, consider supporting the project by
+ * making a donation at: http://www.jqplot.com/donate.php .
+ *
+ * sprintf functions contained in jqplot.sprintf.js by Ash Searle:
+ *
+ * version 2007.04.27
+ * author Ash Searle
+ * http://hexmen.com/blog/2007/03/printf-sprintf/
+ * http://hexmen.com/js/sprintf.js
+ * The author (Ash Searle) has placed this code in the public domain:
+ * "This code is unrestricted: you are free to use it however you like."
+ *
+ * included jsDate library by Chris Leonello:
+ *
+ * Copyright (c) 2010-2011 Chris Leonello
+ *
+ * jsDate is currently available for use in all personal or commercial projects
+ * under both the MIT and GPL version 2.0 licenses. This means that you can
+ * choose the license that best suits your project and use it accordingly.
+ *
+ * jsDate borrows many concepts and ideas from the Date Instance
+ * Methods by Ken Snyder along with some parts of Ken's actual code.
+ *
+ * Ken's origianl Date Instance Methods and copyright notice:
+ *
+ * Ken Snyder (ken d snyder at gmail dot com)
+ * 2008-09-10
+ * version 2.0.2 (http://kendsnyder.com/sandbox/date/)
+ * Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
+ *
+ * jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
+ * Larry has generously given permission to adapt his code for inclusion
+ * into jqPlot.
+ *
+ * Larry's original code can be found here:
+ *
+ * https://github.com/lsiden/export-jqplot-to-png
+ *
+ *
+ */
+(function(d){d.jqplot.eventListenerHooks.push(["jqplotMouseMove",f]);d.jqplot.Highlighter=function(h){this.show=d.jqplot.config.enablePlugins;this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.showMarker=true;this.lineWidthAdjust=2.5;this.sizeAdjust=5;this.showTooltip=true;this.tooltipLocation="nw";this.fadeTooltip=true;this.tooltipFadeSpeed="fast";this.tooltipOffset=2;this.tooltipAxes="both";this.tooltipSeparator=", ";this.tooltipContentEditor=null;this.useAxesFormatters=true;this.tooltipFormatString="%.5P";this.formatString=null;this.yvalues=1;this.bringSeriesToFront=false;this._tooltipElem;this.isHighlighting=false;this.currentNeighbor=null;d.extend(true,this,h)};var b=["nw","n","ne","e","se","s","sw","w"];var e={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var c=["se","s","sw","w","nw","n","ne","e"];d.jqplot.Highlighter.init=function(k,j,i){var h=i||{};this.plugins.highlighter=new d.jqplot.Highlighter(h.highlighter)};d.jqplot.Highlighter.parseOptions=function(i,h){this.showHighlight=true};d.jqplot.Highlighter.postPlotDraw=function(){if(this.plugins.highlighter&&this.plugins.highlighter.highlightCanvas){this.plugins.highlighter.highlightCanvas.resetCanvas();this.plugins.highlighter.highlightCanvas=null}if(this.plugins.highlighter&&this.plugins.highlighter._tooltipElem){this.plugins.highlighter._tooltipElem.emptyForce();this.plugins.highlighter._tooltipElem=null}this.plugins.highlighter.highlightCanvas=new d.jqplot.GenericCanvas();this.eventCanvas._elem.before(this.plugins.highlighter.highlightCanvas.createElement(this._gridPadding,"jqplot-highlight-canvas",this._plotDimensions,this));this.plugins.highlighter.highlightCanvas.setContext();var h=document.createElement("div");this.plugins.highlighter._tooltipElem=d(h);h=null;this.plugins.highlighter._tooltipElem.addClass("jqplot-highlighter-tooltip");this.plugins.highlighter._tooltipElem.css({position:"absolute",display:"none"});this.eventCanvas._elem.before(this.plugins.highlighter._tooltipElem)};d.jqplot.preInitHooks.push(d.jqplot.Highlighter.init);d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Highlighter.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Highlighter.postPlotDraw);function a(m,o){var j=m.plugins.highlighter;var p=m.series[o.seriesIndex];var h=p.markerRenderer;var i=j.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+j.lineWidthAdjust;i.size=h.size+j.sizeAdjust;var l=d.jqplot.getColorComponents(h.color);var n=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);i.color="rgba("+n[0]+","+n[1]+","+n[2]+","+k+")";i.init();i.draw(p.gridData[o.pointIndex][0],p.gridData[o.pointIndex][1],j.highlightCanvas._ctx)}function g(A,q,m){var k=A.plugins.highlighter;var D=k._tooltipElem;var r=q.highlighter||{};var t=d.extend(true,{},k,r);if(t.useAxesFormatters){var w=q._xaxis._ticks[0].formatter;var h=q._yaxis._ticks[0].formatter;var E=q._xaxis._ticks[0].formatString;var s=q._yaxis._ticks[0].formatString;var z;var u=w(E,m.data[0]);var l=[];for(var B=1;B<t.yvalues+1;B++){l.push(h(s,m.data[B]))}if(typeof t.formatString==="string"){switch(t.tooltipAxes){case"both":case"xy":l.unshift(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;case"yx":l.push(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;case"x":z=d.jqplot.sprintf.apply(d.jqplot.sprintf,[t.formatString,u]);break;case"y":l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break;default:l.unshift(u);l.unshift(t.formatString);z=d.jqplot.sprintf.apply(d.jqplot.sprintf,l);break}}else{switch(t.tooltipAxes){case"both":case"xy":z=u;for(var B=0;B<l.length;B++){z+=t.tooltipSeparator+l[B]}break;case"yx":z="";for(var B=0;B<l.length;B++){z+=l[B]+t.tooltipSeparator}z+=u;break;case"x":z=u;break;case"y":z=l.join(t.tooltipSeparator);break;default:z=u;for(var B=0;B<l.length;B++){z+=t.tooltipSeparator+l[B]}break}}}else{var z;if(typeof t.formatString==="string"){z=d.jqplot.sprintf.apply(d.jqplot.sprintf,[t.formatString].concat(m.data))}else{if(t.tooltipAxes=="both"||t.tooltipAxes=="xy"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[0])+t.tooltipSeparator+d.jqplot.sprintf(t.tooltipFormatString,m.data[1])}else{if(t.tooltipAxes=="yx"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[1])+t.tooltipSeparator+d.jqplot.sprintf(t.tooltipFormatString,m.data[0])}else{if(t.tooltipAxes=="x"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[0])}else{if(t.tooltipAxes=="y"){z=d.jqplot.sprintf(t.tooltipFormatString,m.data[1])}}}}}}if(d.isFunction(t.tooltipContentEditor)){z=t.tooltipContentEditor(z,m.seriesIndex,m.pointIndex,A)}D.html(z);var C={x:m.gridData[0],y:m.gridData[1]};var v=0;var j=0.707;if(q.markerRenderer.show==true){v=(q.markerRenderer.size+t.sizeAdjust)/2}var o=b;if(q.fillToZero&&q.fill&&m.data[1]<0){o=c}switch(o[e[t.tooltipLocation]]){case"nw":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break;case"n":var p=C.x+A._gridPadding.left-D.outerWidth(true)/2;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-v;break;case"ne":var p=C.x+A._gridPadding.left+t.tooltipOffset+j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break;case"e":var p=C.x+A._gridPadding.left+t.tooltipOffset+v;var n=C.y+A._gridPadding.top-D.outerHeight(true)/2;break;case"se":var p=C.x+A._gridPadding.left+t.tooltipOffset+j*v;var n=C.y+A._gridPadding.top+t.tooltipOffset+j*v;break;case"s":var p=C.x+A._gridPadding.left-D.outerWidth(true)/2;var n=C.y+A._gridPadding.top+t.tooltipOffset+v;break;case"sw":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top+t.tooltipOffset+j*v;break;case"w":var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-v;var n=C.y+A._gridPadding.top-D.outerHeight(true)/2;break;default:var p=C.x+A._gridPadding.left-D.outerWidth(true)-t.tooltipOffset-j*v;var n=C.y+A._gridPadding.top-t.tooltipOffset-D.outerHeight(true)-j*v;break}D.css("left",p);D.css("top",n);if(t.fadeTooltip){D.stop(true,true).fadeIn(t.tooltipFadeSpeed)}else{D.show()}D=null}function f(k,j,n,m,l){var h=l.plugins.highlighter;var o=l.plugins.cursor;if(h.show){if(m==null&&h.isHighlighting){var i=h.highlightCanvas._ctx;i.clearRect(0,0,i.canvas.width,i.canvas.height);if(h.fadeTooltip){h._tooltipElem.fadeOut(h.tooltipFadeSpeed)}else{h._tooltipElem.hide()}if(h.bringSeriesToFront){l.restorePreviousSeriesOrder()}h.isHighlighting=false;h.currentNeighbor=null;i=null}else{if(m!=null&&l.series[m.seriesIndex].showHighlight&&!h.isHighlighting){h.isHighlighting=true;h.currentNeighbor=m;if(h.showMarker){a(l,m)}if(h.showTooltip&&(!o||!o._zoom.started)){g(l,l.series[m.seriesIndex],m)}if(h.bringSeriesToFront){l.moveSeriesToFront(m.seriesIndex)}}else{if(m!=null&&h.isHighlighting&&h.currentNeighbor!=m){if(l.series[m.seriesIndex].showHighlight){var i=h.highlightCanvas._ctx;i.clearRect(0,0,i.canvas.width,i.canvas.height);h.isHighlighting=true;h.currentNeighbor=m;if(h.showMarker){a(l,m)}if(h.showTooltip&&(!o||!o._zoom.started)){g(l,l.series[m.seriesIndex],m)}if(h.bringSeriesToFront){l.moveSeriesToFront(m.seriesIndex)}}}}}}}})(jQuery);
View
351 public/static/js/soy-min.js
@@ -0,0 +1,351 @@
+// This file was automatically generated from cloudnode.soy.
+// Please don't edit this file by hand.
+
+if (typeof cloudnode == 'undefined') { var cloudnode = {}; }
+if (typeof cloudnode.global == 'undefined') { cloudnode.global = {}; }
+
+
+cloudnode.global.startPage = function(opt_data, opt_sb) {
+ var output = opt_sb || new soy.StringBuilder();
+ output.append('<div class="page-container"><div class="page"><div id="page-inner-hilite"><div id="page-inner"><div class="padded content">');
+ return opt_sb ? '' : output.toString();
+};
+
+
+cloudnode.global.endPage = function(opt_data, opt_sb) {
+ var output = opt_sb || new soy.StringBuilder();
+ output.append('</div></div></div></div></div>');
+ return opt_sb ? '' : output.toString();
+};
+
+
+cloudnode.global.page = function(opt_data, opt_sb) {
+ var output = opt_sb || new soy.StringBuilder();
+ output.append('<div class="page-container"><div class="page"><div id="page-inner-hilite"><div id="page-inner"><div class="padded content"><h1>', soy.$$escapeHtml(opt_data.title), '</h1><div class="subhead">', soy.$$escapeHtml(opt_data.subTitle), '</div><div class="post">', opt_data.html, '</div></div></div></div></div></div>');
+ return opt_sb ? '' : output.toString();
+};
+
+
+cloudnode.global.buttonBar = function(opt_data, opt_sb) {
+ var output = opt_sb || new soy.StringBuilder();
+ output.append('<div class="qfbuttondiv">', (opt_data.status != 'empty') ? '<a id="start" class="btn" onclick="controlApp(\'' + soy.$$escapeHtml(opt_data.appName) + '\', true)" label="Start" href="#">Start</a><a id="stop" class="btn" onclick="controlApp(\'' + soy.$$escapeHtml(opt_data.appName) + '\', false)" label="Stop" href="#">Stop</a>' : '', '<a id="manage" class="btn" label="Manage" href="/myapps/', soy.$$escapeHtml(opt_data.appName), '">Manage</a>', (opt_data.gitrepo) ? '<a href="#" class="btn" onclick="gitWeb(\'' + soy.$$escapeHtml(opt_data.gitrepo) + '\'); return false;" label="Git-Web">Git-Web</a>' : '', '</div>');
+ return opt_sb ? '' : output.toString();
+};
+
+
+cloudnode.global.appPage = function(opt_data, opt_sb) {
+ var output = opt_sb || new soy.StringBuilder();
+ output.append('<div class="page-container"><div class="page"><div id="page-inner-hilite"><div id="page-inner"><div class="padded content"><h1>Applications</h1><div class="subhead" style="float:left;">Your Apps at Cloudnode</div><div class="qfbuttondiv" style="float:right; margin-top: -20px;"><a id="newapp" class="btn" label="New Application" href="/myapps?new">New Application</a></div><div class="clear"></div><div class="app-container"><ul class="apps">');
+ var appList38 = opt_data.apps;
+ var appListLen38 = appList38.length;
+ for (var appIndex38 = 0; appIndex38 < appListLen38; appIndex38++) {
+ var appData38 = appList38[appIndex38];
+ output.append('<li><div class="manage">');
+ switch (appData38.running) {
+ case 'true':
+ output.append('<a style="float: left; padding-left: 12px; margin-right: 10px;" href="http://', soy.$$escapeHtml(appData38.name), '.cloudno.de">', soy.$$escapeHtml(appData38.name), '</a>');
+ break;
+ case 'empty':
+ output.append('<span style="float: left; padding-left: 12px; margin-right: 10px;">', soy.$$escapeHtml(appData38.name), ' - repository is empty</span>');
+ break;
+ default:
+ output.append('<span style="float: left; padding-left: 12px; margin-right: 10px;">', soy.$$escapeHtml(appData38.name), ' - Running: ', soy.$$escapeHtml(appData38.running), '</span>');
+ }
+ cloudnode.global.buttonBar({appName: appData38.name, gitrepo: appData38.gitrepo, status: appData38.running}, output);
+ output.append('<div class="clear"></div></div></li>');
+ }
+ output.append('</ul></div></div></div></div></div></div>');
+ return opt_sb ? '' : output.toString();
+};
+
+
+cloudnode.global.newAppPage = function(opt_data, opt_sb) {
+ var output = opt_sb