Index: Dev/trunk/docs/DESIGN.txt
===================================================================
--- Dev/trunk/docs/DESIGN.txt	(revision 443)
+++ Dev/trunk/docs/DESIGN.txt	(revision 443)
@@ -0,0 +1,37 @@
+QED Design
+==========
+
+QED consists of a one-page web app (using Dojo) talking directly to a
+CouchDB server.
+
+Client
+------
+
+A small app framework to handle URL parsing, navigation and
+notifications is implemented in app/.
+
+All code that deals with persisted objects is located in the model/
+folder. This is split into modules that handle data access and widgets
+that can display these objects. The data access includes field access,
+(de)serialization, schema's for checking.
+
+Issues
+------
+
+ * UI is clunky.  Place where model schema is checked, data is
+   serialized (dates) database is accessed is not very clear.
+
+ * Question has too little structure now. Header can be last, no
+   inputs or several. It should have a more fixed structure. Also
+   maybe we want to be able to Include section headers and text in a
+   survey? Double questions still an issue. If questions can be asked
+   multiple times, it might be usefull to include scope? A block in
+   the survey can have scope (e.g. about team red, or team green), the
+   session of a survey can contain scope, date of the question etc.
+
+Server
+------
+
+Currently this is a bare CouchDB server. In the future we will
+probably introduce a small REST interface in Node in between, to
+handle and abstract authentication and maybe search.
Index: Dev/trunk/docs/STYLE.txt
===================================================================
--- Dev/trunk/docs/STYLE.txt	(revision 443)
+++ Dev/trunk/docs/STYLE.txt	(revision 443)
@@ -0,0 +1,25 @@
+QED Style Guide
+===============
+
+Attachpoints:
+ - blablaNode when it's a dom node
+ - blablaWidgetName for a widget (e.g. blablaContainer or blablaSelector)
+
+Events:
+ - always own an event
+ - onBalbla are events that are intended for use by others
+ - _onBlabla are our own handlers for events
+ 
+Composite from elements:
+ - Derive _ComplextValue{Mixin,Widget}
+ - Value will now be an object. Take care when using the value,
+   because not all fields might be there.
+
+Database objects:
+ - make sure to not destroy fields that you don't expose in your form
+   value = store.get(id) // get original value
+   this.set('value', value) // fill form
+   newValue = lang.mixin(value, this.get('value'))     // store form values
+                                                       // OR
+   newValue = lang.mixin({}, value, this.get('value')) // store in copy
+   store.put(newValue) // carefull, only newValue get's an updated revid!
Index: Dev/trunk/docs/TODO.txt
===================================================================
--- Dev/trunk/docs/TODO.txt	(revision 443)
+++ Dev/trunk/docs/TODO.txt	(revision 443)
@@ -0,0 +1,47 @@
+Todo
+====
+
+ * Check that question codes are unique.
+   Are we going to create the node server for this?
+   This will allow auth, more rest-like search, server side validation
+ * Check that answers are saved correctly.
+   Answers to multi-item questions (like scales) are stored in an object
+   now with index as keys. This is not symmetrical with the fact that the
+   configuration is an array.
+ * Export answers for a survey run
+ * Revive json schema checks for our data.
+   Questions don't pass the schema at the moment.
+ * Fragile: widget creation relies on the names in Factory, but these
+   must match the types returned by the actual widgets. Fix this.
+ * Write a spec for the codes.
+ * Don't allow Save in Question unless all question items are done editing.
+ * Use node as a server, adopt the layout described in
+   http://dojotoolkit.org/documentation/tutorials/1.8/node/
+   This will require quite a lot of moving and creating a rest interface
+   -> can be just a proxy to CouchDB in he beginning.
+
+Checklist
+=========
+
+ * Form validation (use tooltips!)
+ * Input validation & escaping
+   - E.g. texts and labels of ScaleWidget are directly put in innerHTML, I don't think TextBox does any escaping.
+ * Output escaping
+ * Widget life-cycle
+   buildRendering -> widgets in code before set attributes
+   postCreate -> after all inits, but before in DOM
+   startup -> after insertion in DOM?
+ * Review current JSON formats, do they allow for extension or extra meta-data?
+ 
+Open issues
+===========
+
+ * Do different inputs in one question get different codes? E.g. in 
+   To ease exporting into other programs and easy communication, the codes
+   are important I think. It should be easy to pronounce, and easy to
+   find in the tool (people might get a dataset and not know where it
+   came from).
+ * What if a question is included in a survey multiple times. Use block
+   or allow a pre/post-fix on the code to differentiate it.
+   Should not be too much work, so if an scale with 5 items has 5 codes,
+   you should be able to set a prefix on all of them at once.
Index: Dev/trunk/src/.htmlhintrc
===================================================================
--- Dev/trunk/src/.htmlhintrc	(revision 443)
+++ Dev/trunk/src/.htmlhintrc	(revision 443)
@@ -0,0 +1,14 @@
+{
+    "tagname-lowercase": true,
+    "attr-lowercase": true,
+    "attr-value-double-quotes": true,
+    "attr-value-not-empty": false,
+    "tag-pair": true,
+    "tag-self-close": true,
+    "spec-char-escape": true,
+    "id-unique": true,
+    "head-script-disabled": true,
+    "style-disabled": true,
+    "id-class-calue": true,
+    "doctype-html5": true
+}
Index: Dev/trunk/src/.jshintrc
===================================================================
--- Dev/trunk/src/.jshintrc	(revision 443)
+++ Dev/trunk/src/.jshintrc	(revision 443)
@@ -0,0 +1,23 @@
+{
+    "bitwise": true,
+    "curly": true,
+    "eqeqeq": true,
+    "immed": true,
+    "indent": 4,
+    "latedef": true,
+    "newcap": true,
+    "noarg": true,
+    "undef": true,
+    "unused": false,
+    "strict": false,
+
+    "loopfunc": true,
+
+    "devel": true,
+    "node": true,
+
+    "globals": {
+        "require": true,
+        "define": true
+    }
+}
Index: Dev/trunk/src/Gruntfile.js
===================================================================
--- Dev/trunk/src/Gruntfile.js	(revision 443)
+++ Dev/trunk/src/Gruntfile.js	(revision 443)
@@ -0,0 +1,46 @@
+var fs = require('fs');
+var path = require('path');
+
+module.exports = function(grunt) {
+
+    grunt.initConfig({
+        //pkg: grunt.file.readJSON('package.json'),
+        less: {
+            options: {
+                strictImports: false,
+                dumpLineNumbers: "all"
+            },
+            all: {
+                files: {
+                    'qed-client/css/qed.css': 'qed-client/css/qed.less'
+                }
+            }
+        },
+        jshint: {
+            options: {
+                jshintrc: ".jshintrc"
+            },
+            all: {
+                files: {
+                    src: ['qed**/*.js', '!node_modules/**']
+                }
+            }
+        },
+        htmlhint: {
+            options: {
+                htmlhintrc: ".htmlhintrc"
+            },
+            all: {
+                files: {
+                    src: ['*.html', 'qed**/*.html', '!node_modules/**']
+                }
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-contrib-less');
+    grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.loadNpmTasks('grunt-htmlhint');
+
+    grunt.registerTask('default', ['less', 'jshint', 'htmlhint']);
+};
Index: Dev/trunk/src/index.html
===================================================================
--- Dev/trunk/src/index.html	(revision 443)
+++ Dev/trunk/src/index.html	(revision 443)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>QED - Researcher</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="stylesheet" type="text/css" href="qed-client/css/qed.css" />
+    </head>
+    <body class="dijitReset claro" id="rft">
+        <script type="text/javascript">
+            var dojoConfig = {
+                baseUrl: ".",
+                async: true,
+                parseOnLoad: false,
+                isDebug: true,
+                packages: [
+                    { name: "dojo", location: "dojo" },
+                    { name: "dijit", location: "dijit" },
+                    { name: "dojox", location: "dojox" },
+                    { name: "qed", location: "qed" },
+                    { name: "qed-client", location: "qed-client" }
+                ],
+                deps: [ "qed-client/index" ]
+            };
+        </script>
+        <script type="text/javascript" src="dojo/dojo.js"></script>
+        <div id="content" class="page" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'" style="width: 100%; height: 100%;">
+            <div class="topbar" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+                <a href="#!/"><h1>QED</h1></a>
+                <div id="menu"></div>
+            </div>
+        </div>
+        <div id="toaster" data-dojo-type="qed-client/app/Notifications"></div>
+    </body>
+</html>
Index: Dev/trunk/src/qed-client/app/Content.js
===================================================================
--- Dev/trunk/src/qed-client/app/Content.js	(revision 443)
+++ Dev/trunk/src/qed-client/app/Content.js	(revision 443)
@@ -0,0 +1,46 @@
+define([
+    'dojo/_base/declare',
+    'dijit/registry'
+],function(declare,registry){
+
+    var Content = declare(null,{
+        _started: false,
+        _container: null,
+        _previousContent: null,
+        startup: function() {
+            if ( this._started ) { return; }
+
+            this._container = registry.byId('content');
+            if ( !this._container || !this._container.addChild ) {
+                throw new Error("Cannot find container widget with id 'content'.");
+            }
+
+            this._toaster = registry.byId('toaster');
+            if ( !this._toaster || !this._toaster.setContent ) {
+                throw new Error("Cannot find toaster widget with id 'toaster'.");
+            }
+
+            this._started = true;
+        },
+        set: function(widget) {
+            if ( !this._started ) {
+                throw new Error('Call startup() before setting content.');
+            }
+            if ( this._previousContent ) {
+                this._previousContent.destroyRecursive();
+                this._previousContent = null;
+            }
+            widget.region = 'center';
+            this._container.addChild(widget);
+            this._previousContent = widget;
+        },
+        notify: function(text,type) {
+            if ( !this._started ) {
+                throw new Error('Call startup() before setting content.');
+            }
+            this._toaster.setContent(text,type || 'message');
+        }
+    });
+
+    return new Content();
+});
Index: Dev/trunk/src/qed-client/app/Notifications.js
===================================================================
--- Dev/trunk/src/qed-client/app/Notifications.js	(revision 443)
+++ Dev/trunk/src/qed-client/app/Notifications.js	(revision 443)
@@ -0,0 +1,7 @@
+define(['dojo/_base/declare','dojox/widget/Toaster'],
+function(declare,Toaster){
+    return declare([Toaster],{
+        positionDirection: "br-up",
+        duration: 3000
+    });
+});
Index: Dev/trunk/src/qed-client/app/Page.js
===================================================================
--- Dev/trunk/src/qed-client/app/Page.js	(revision 443)
+++ Dev/trunk/src/qed-client/app/Page.js	(revision 443)
@@ -0,0 +1,10 @@
+define([
+    'dojo/_base/declare',
+    'dijit/_TemplatedMixin',
+    'dijit/_WidgetsInTemplateMixin',
+    'dijit/layout/BorderContainer'
+],function(declare,_TemplatedMixin,_WidgetsInTemplateMixin,BorderContainer){
+    return declare([BorderContainer,_TemplatedMixin,_WidgetsInTemplateMixin],{
+        templateString: '<div>Empty page.</div>'
+    });
+});
Index: Dev/trunk/src/qed-client/app/Path.js
===================================================================
--- Dev/trunk/src/qed-client/app/Path.js	(revision 443)
+++ Dev/trunk/src/qed-client/app/Path.js	(revision 443)
@@ -0,0 +1,51 @@
+define([
+    'dojo/_base/declare',
+    'dojo/io-query'
+],function(declare,ioQuery){
+
+    var _paramMatch = /:(\w[\w\d]*)/g;
+    var _paramReplace = "([^\\/!]+)";
+
+    var Path = declare(null,{
+        _paramNames: null,
+        _matcher: null,
+        constructor: function(pattern) {
+            var match = null;
+            this._paramNames = [];
+			while((match = _paramMatch.exec(pattern)) !== null){
+				this._paramNames.push(match[1]);
+			}
+            pattern = pattern.replace(_paramMatch, _paramReplace);
+            this._matcher = new RegExp('^!'+pattern+'(!(.*))?$');
+        },
+        match: function(path) {
+            var params = null;
+            var result = null;
+            if ((result = this._matcher.exec(path)) !== null) {
+                var numParams = this._paramNames.length;
+                params = {};
+                for (var j = 0; j < numParams; j++) {
+                    params[this._paramNames[j]] = result[j+1];
+                }
+                if ( result.length > numParams+1 && result[numParams+2] ) {
+                    params.options = ioQuery.queryToObject(result[numParams+2]);
+                }
+            }
+            return params;
+        }
+    });
+
+    Path.getDefault = function() {
+        return "!/";
+    };
+
+    Path.format = function(path,options) {
+        var hash = '!'+path;
+        if ( options ) {
+            hash += '!'+ioQuery.objectToQuery(options);
+        }
+        return hash;
+    };
+
+    return Path;
+});
Index: Dev/trunk/src/qed-client/app/Router.js
===================================================================
--- Dev/trunk/src/qed-client/app/Router.js	(revision 443)
+++ Dev/trunk/src/qed-client/app/Router.js	(revision 443)
@@ -0,0 +1,105 @@
+define([
+    'dojo/_base/declare',
+    'dojo/hash',
+    'dojo/topic',
+    './Content',
+    './Page',
+    './Path'
+],function(declare,hash,topic,Content,Page,Path){
+
+    var Router = declare(null,{
+        _started: false,
+        _routes: null,
+        _previousHash: null,
+
+        constructor: function() {
+            this._routes = [];
+        },
+        startup: function() {
+            if ( this._started ) { return; }
+            if ( !Content._started ) {
+                Content.startup();
+            }
+            this._started = true;
+
+            var self = this;
+
+            if ( hash() === "" ) {
+                hash(Path.getDefault());
+            }
+            this._handlePathChange(hash());
+			topic.subscribe("/dojo/hashchange", function(){
+                self._handlePathChange.apply(self,arguments);
+            });
+        },
+        register: function(route) {
+            if ( this._started ) {
+                console.warn('Registering routes after startup() is called is discouraged.');
+            }
+            var callback = this._normalizeCallback(route);
+            if ( callback ) {
+                if ( route.path ) {
+                    route.callback = callback;
+                    route.path = new Path(route.path);
+                    this._routes.push(route);
+                } else {
+                    this._defaultCallback = callback;
+                }
+            } else {
+                console.warn("Route "+(route.path||"default")+" has no action.");
+            }
+        },
+        _normalizeCallback: function(route) {
+            var self = this;
+            var callback = null;
+            if ( route.callback ) {
+                callback = function(params){
+                    Content.set(route.callback(params));
+                };
+            } else if ( route.redirect ) {
+                callback = function(params){
+                    self.go(route.redirect);
+                };
+            } else if ( route.constructor ) {
+                callback = function(params){
+                    Content.set( new route.constructor(params) );
+                };
+            }
+            return callback;
+        },
+        _handlePathChange: function(newHash) {
+            if ( this._previousHash === newHash ) { return; }
+            this._previousHash = newHash;
+            for (var i = this._routes.length-1; i >= 0; i--) {
+                var route = this._routes[i];
+                var params = null;
+                if ((params = route.path.match(newHash)) !== null) {
+                    try {
+                        route.callback(params);
+                    } catch(err) {
+                        console.error("Page change failed.",err);
+                    }
+                    return;
+                }
+            }
+            try {
+                this._defaultCallback();
+            } catch(err) {
+                console.error("Default page failed.",err);
+            }
+        },
+        go: function(path,args) {
+            if ( !this._started ) { return; }
+            var newHash = Path.format(path,args);
+            this._handlePathChange(newHash);
+            hash(newHash);
+        },
+        _defaultCallback: function() {
+            Content.set(new Page({
+                templateString: "<div>Requested page not found. Go <a href=\"#"+Path.getDefault()+"\">home</a>.</div>"
+            }));
+        }
+    });
+
+    return new Router();
+});
Index: Dev/trunk/src/qed-client/css/colors.less
===================================================================
--- Dev/trunk/src/qed-client/css/colors.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/colors.less	(revision 443)
@@ -0,0 +1,106 @@
+DESCRIPTION {
+	/*
+How to use colour system:
+Apply a combination of at most 1 "colour" class and one or more "modifier" classes.
+Colour classes: Red, Blue, Green, Orange, Purple
+Modifer classes:
+- textColor: Change the font colour of element to the "colour" class combined with.
+- bgColor: Change the background colour to the "colour" class combined with.
+- doesHover: If present in combination with one of the above two modifiers, 
+the element will shift it's background- or text colour to a lighter version on hover.
+- hoverTextColor: Same as .textColor, but only affects elements being hovered over.
+- hoverBgColor: Same as .bgColor, but only affects elements being hovered over.
+NOTE: .doesHover does nothing in combination with the above two modifiers!
+*/
+}
+
+// Variables/Colour scheme parameters
+.textColor (@color) {
+	color: @@color;
+}
+.textColorH (@color) {
+	color: @@color;
+	&.doesHover:hover {
+		@colorName: "@{color}_light";
+		color: @@colorName;
+	}
+}
+.hoverTextColor (@color) {
+	&:hover {
+		color: @@color;
+
+	}
+}
+.bgColor (@color) {
+	background-color: @@color;
+}
+.bgColorH (@color) {
+	background-color: @@color;
+	&.doesHover:hover {
+		@colorName: "@{color}_light";
+		background-color: @@colorName;
+	}
+}
+.hoverBgColor (@color) {
+	&:hover {
+		background-color: @@color;
+
+	}
+}
+
+
+// Private color mixin is used to assign the colour classes below, don't use this in external CSS!
+.privateColorMixin (@color) {
+	&.textColor {	//Change text colour to C-Class
+		color: @@color;
+		&.doesHover:hover {	//If also .doesHover, shift colour to light version on hover
+			@colorName: "@{color}_light";
+			color: @@colorName;
+		}
+	}
+	&.bgColor {	// Change background colour to C-Class
+		background-color: @@color;
+		color: @text;
+		&.doesHover:hover {	//If .doesHover, shift to light on hover
+			@colorName: "@{color}_light";
+			background-color: @@colorName;
+			color: @darkest;
+		}
+	}
+	&.hoverTextColor:hover {	// Only change text colour to C-class on hover
+		color: @@color;
+	}
+	&.hoverBgColor:hover {	// Only change background colour to C-class on hover
+		background-color: @@color;
+	}
+}
+
+#rft {
+	&.claro {
+
+		.blue {
+			.privateColorMixin("blue");
+		}
+		.red {
+			.privateColorMixin("red");
+		}
+		.orange {
+			.privateColorMixin("orange");
+		}
+		.green {
+			.privateColorMixin("green");
+		}
+		.purple {
+			.privateColorMixin("purple");
+		}
+
+		.textColor,
+		.hoverTextColor {
+			transition: color 0.2s;
+		}
+		.bgColor, 
+		.hoverBgColor {
+			transition: background-color 0.2s;
+		}
+	}
+}
Index: Dev/trunk/src/qed-client/css/dijit/ContentPane.less
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/ContentPane.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/ContentPane.less	(revision 443)
@@ -0,0 +1,52 @@
+#rft.claro {
+
+    .dijitBorderContainer, .dijitContentPane, .dijitTabContainer, .dijitTabPaneWrapper {
+            background: transparent;
+            border: none;
+    }		
+
+    .dijitContentPane.page {
+            .noOffset;
+    }
+
+    .dijitContentPane.content {
+            .noOffset;
+            display: block;
+            clear: both;
+            background-color: @base2;
+            background-image: -webkit-gradient(
+                    50% 50%, 
+                    circle, 
+                    #666666 1%,
+                    #444444 100%
+                    );
+            -moz-background-image: gradient(
+                    50% 50%, 
+                    circle, 
+                    #666666 1%,
+                    #444444 100%
+                    );
+            -o-background-image: gradient(
+                    50% 50%, 
+                    circle, 
+                    #666666 1%,
+                    #444444 100%
+                    );
+            -ms-background-image: gradient(
+                    50% 50%, 
+                    circle, 
+                    #666666 1%,
+                    #444444 100%
+                    );
+            background-image: gradient(
+                    50% 50%, 
+                    circle, 
+                    #666666 1%,
+                    #444444 100%
+                    );
+
+            .dijitBorderContainer {
+                    padding: @std_offset;
+            }
+    }
+}
Index: Dev/trunk/src/qed-client/css/dijit/MenuPopup.less
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/MenuPopup.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/MenuPopup.less	(revision 443)
@@ -0,0 +1,53 @@
+#rft.claro {
+    .dijitMenuPopup {
+        .dijitMenu {
+            
+            .flatShading;
+            color: @headers;
+            background-color: @base;
+            border: none;
+
+            .dijitMenuItem {
+                color: @headers;
+                .flatShading;
+                background-color: @base;
+
+                &.dijitMenuItemHover,
+                &.dijitMenuItemActive,
+                &.dijitMenuItemSelected {
+                    .dijitMenuItemLabel {
+                        color: @text;
+                    }
+
+                    &.red {
+                        background-color: @red;
+                    }
+                    &.blue {
+                        background-color: @blue;
+                    }
+                    &.green {
+                        background-color: @green;
+                    }
+                    &.orange {
+                        background-color: @orange;
+                    }
+                    &.purple {
+                        background-color: @purple;
+                    }
+
+                }
+
+                .rftIcon {
+                    .setIcon (16px);
+                    .noMargin;
+                    margin-right: @std_offset_big;
+                }
+
+                &.dijitMenuItemActive .rftIcon {
+                    .setIcon(16px, black);
+                }
+            }
+
+        }
+    }
+}
Index: Dev/trunk/src/qed-client/css/dijit/TabContainer.less
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/TabContainer.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/TabContainer.less	(revision 443)
@@ -0,0 +1,85 @@
+#rft.claro {
+
+    .verticalTabList {
+            width: 190px;
+    }
+
+    .dijitTab {
+            .transition(0.2s);
+            background-color: transparent;
+            padding: @std_offset @std_offset_big;
+            color: @headers;
+            overflow: hidden;
+
+
+
+
+    }
+
+    .dijitTabContainerLeft-tabs {
+            border: none;
+            padding: @std_offset;
+
+            .dijitTab {
+                    margin: @std_offset;
+                    width: 200px;
+                    min-height: @tab_height;
+                    border: 1px solid @headers;
+
+                    .dijitTabContent {
+                            min-height: @tab_height;
+                            line-height: @tab_height;
+                            width: 190px;
+                    }
+
+                    &.dijitTabChecked {
+                            .transition (0.1s);
+                            color: @text;
+                            border: 1px solid transparent;
+
+                            &.dijitTabHover {
+                                    border: 1px solid transparent;
+                            }
+                    }
+
+                    &.dijitTabHover {
+                            .transition (0.1s);
+                            color: @text;
+                            border-color: @text;
+                    }
+
+                    &.dijitTabActive {
+                            .transition (0.1s);
+                            color: @headers;
+                    }
+            }
+
+    }
+    //Tab colour settings
+    &.blue .dijitTabChecked,
+    .blue .dijitTabChecked,
+    div.blue.dijitTabChecked {
+            .bgColor ("blue");
+    }
+    &.green .dijitTabChecked,
+    .green .dijitTabChecked,
+    div.green.dijitTabChecked {
+            .bgColor ("green");
+    }
+    &.red .dijitTabChecked,
+    .red .dijitTabChecked,
+    div.red.dijitTabChecked {
+            .bgColor ("red");
+    }
+    &.orange .dijitTabChecked,
+    .orange .dijitTabChecked,
+    div.orange.dijitTabChecked {
+            .bgColor ("orange");
+    }
+    &.purple .dijitTabChecked,
+    .purple .dijitTabChecked,
+    div.purple.dijitTabChecked {
+            .bgColor ("purple");
+    }
+
+}
Index: Dev/trunk/src/qed-client/css/dijit/TitleGroup.less
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/TitleGroup.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/TitleGroup.less	(revision 443)
@@ -0,0 +1,34 @@
+#rft.claro .dojoxTitleGroup .dijitTitlePane {
+    .noMargin;
+
+    .dijitTitlePaneTitle {
+        .flatShading;
+        .noMargin;
+        background-color: @orange;
+        border: none;
+        padding: 0 @std_offset;
+        height: @std_height;
+
+        &.dijitTitlePaneTitleHover,
+        &.dijitTitlePaneTitleFocused {
+            background-color: @orange_light;
+        }
+
+    }
+
+    .dijitTitlePaneTextNode {
+        color: @text;
+        font-size: @font_size;
+        line-height: @std_height;
+    }
+
+    .dijitTitlePaneContentOuter {
+        background-color: @base1;
+        border: none;
+    }
+
+    .dijitTitlePaneTitleFocus {
+        .noMargin;
+    }
+
+}
Index: Dev/trunk/src/qed-client/css/dijit/claro.css
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/claro.css	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/claro.css	(revision 443)
@@ -0,0 +1,4 @@
+@import url('../../../dijit/themes/claro/claro.css');
+@import url('../../../dojox/grid/resources/Grid.css');
+@import url('../../../dojox/grid/resources/claroGrid.css');
+@import url('../../../dojox/widget/Toaster/Toaster.css');
Index: Dev/trunk/src/qed-client/css/dijit/overrides.less
===================================================================
--- Dev/trunk/src/qed-client/css/dijit/overrides.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/dijit/overrides.less	(revision 443)
@@ -0,0 +1,116 @@
+/* This stylesheet compensates for the restoration of the claro style to its original specs. (21-6-2012)
+ * These changes should be moved to relevant stylesheets as soon as possible!
+*/
+
+
+/* Menu.css */
+.claro .topbar .dijitMenuitem {
+    width: 90px;
+    background-image: none;
+    background-position: top;
+    text-align: center;
+}
+.claro .dijitMenuPassive .dijitMenuItemHover, .claro .dijitMenuPassive .dijitMenuItemSelected {
+    background-color: transparent;
+    color: #ffffff;
+    border: none;
+    padding: 0 4px;
+}
+.claro .dijitMenuPassive .dijitMenuItemActive {
+    background-position: top;
+}
+
+/* layout/BorderContainer.css */
+.claro .dijitSplitContainer-child, .claro .dijitBorderContainer-child {
+    border: none;
+}
+.claro .dijitTabContainerTop-dijitContentPane,
+.claro .dijitTabContainerLeft-dijitContentPane,
+.claro .dijitTabContainerBottom-dijitContentPane,
+.claro .dijitTabContainerRight-dijitContentPane,
+.claro .dijitAccordionContainer-dijitContentPane {
+    background-color: transparent;
+}
+.claro .dijitSplitContainer-dijitContentPane,
+.claro .dijitBorderContainer-dijitContentPane {
+    background-color: transparent;
+}
+
+/* layout/TabContainer.css */
+.claro .dijitTabPaneWrapper {
+    background: transparent;
+}
+.claro .dijitTabInnerDiv {
+    background-color: transparent;
+    color: #999999;
+    border: none;
+}
+.claro .dijitTabContent {
+    border: none;
+}
+.claro .dijitTabHover .dijitTabInnerDiv {
+    background-color: transparent;
+    color: #ffffff;
+}
+.claro .dijitTabActive .dijitTabInnerDiv {
+    color: #0072bc;
+}
+.claro .dijitTabChecked .dijitTabInnerDiv {
+    background-color: transparent;
+    color: #ffffff;
+}
+.claro .dijitTabContent {
+    border: 1px solid #999999;
+}
+.claro .dijitTabHover .dijitTabContent {
+    border-color: #ffffff;
+}
+.claro .dijitTabActive .dijitTabContent {
+    border-color: transparent;
+}
+.claro .dijitTabChecked .dijitTabContent {
+    color: #ffffff;
+    border-color: #0072bc;
+}
+/*lefttabs*/
+.claro .dijitTabContainerLeft-tabs .dijitTab {
+    border-width: 1px;
+    left: 0;
+    margin-bottom: 4px;
+    margin-right: 8px;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+    border: none;
+    background: transparent;
+    background-image: none;
+    background-position: top;
+    background-repeat: no-repeat;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabContent {
+    padding: 3px 8px 4px 8px;
+    background-image: none;
+
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
+    padding-right: 8px;
+    background-image: none;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerLeft-tabs .dijitTabContent {
+    -moz-border-radius: 0;
+    border-radius: 0;
+    border: none;
+}
+
+.claro .dojoDndItemAnchor {
+    background-color: #000000;
+}
+
+.claro .dojoDndItemOver {
+    background-color: #333333;
+}
Index: Dev/trunk/src/qed-client/css/fonts.less
===================================================================
--- Dev/trunk/src/qed-client/css/fonts.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/fonts.less	(revision 443)
@@ -0,0 +1,45 @@
+#rft.claro {
+    font-family: @font;
+    font-size: @font_size;
+    color: @darkest;
+
+    a {
+        color: inherit;
+    }
+
+    h1 {
+            .noMargin;
+            padding: 0 10px 8px 10px;
+            font-size: @h1Size;
+            color: @headers;
+            line-height: @h1Size;
+            font-weight: normal;
+            -webkit-user-select: none;
+            -moz-user-select: none;
+            -ms-user-select: none;
+            user-select: none;
+    }
+
+    h2 {
+            .noOffset;
+            color: @headers;
+            font-size: @h2Size;
+            line-height: floor(@h2Size * 1.365);
+
+            .rftIcon {
+                    .setIcon(32px);
+                    margin-right: 8px;
+            }
+    }
+
+    h3 {
+            .noMargin;
+            font-size: @h3Size;
+            margin-bottom: @std_offset;
+    }
+
+    h4 {
+            font-size: @h4Size;
+    }
+
+}
Index: Dev/trunk/src/qed-client/css/forms.less
===================================================================
--- Dev/trunk/src/qed-client/css/forms.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/forms.less	(revision 443)
@@ -0,0 +1,59 @@
+#rft.claro {
+
+    fieldset {
+        border: none;
+
+        &.align {
+
+            input,
+            .dijitTextBox,
+            textarea {
+                margin-left: 0;
+            }
+
+            label {
+                color: @text;
+                display: inline-block;
+                width: 100px !important;
+            }
+        }
+    }
+
+    .floatRight {
+        float: right;
+        .noMargin
+    }
+
+
+    .qedInfo {
+        max-width: 500px;
+    }
+
+    .qedLabel {
+        width: 150px;
+        display: inline-block;
+        text-align: right;
+        padding: 1px;
+    }
+
+    .qedField {
+        max-width: 350px;
+        display: inline-block;
+        vertical-align: top;
+        padding: 1px;
+
+        &.dijitTextArea {
+            min-height: 5em;
+        }
+    }
+
+    .qedField.qedFill {
+        width: 350px;
+    }
+
+    .qedFieldset {
+        margin: 1em 0px;
+        border: 1px solid grey;
+    }
+    
+}
Index: Dev/trunk/src/qed-client/css/icons.less
===================================================================
--- Dev/trunk/src/qed-client/css/icons.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/icons.less	(revision 443)
@@ -0,0 +1,168 @@
+#rft {
+	&.claro {
+		.rftIcon {
+			.noOffset;
+			float: left;
+			display: inline-block;
+			border: none;
+			background-color: transparent;
+			background-repeat: no-repeat;
+		}
+	}
+
+	.rftIconApplication {
+		background-position: 0px 0px;
+	}
+	.rftIconDashboard {
+		background-position: -32px 0px;
+	}
+	.rftIconSession {
+		background-position: -64px 0px;
+	}
+	.rftIconSessionActive {
+		background-position: -96px 0px;
+	}
+	.rftIconSessionTemplate {
+		background-position: -128px 0px;
+	}
+	.rftIconSurvey {
+		background-position: -160px 0px;
+	}
+	.rftIconQuestion {
+		background-position: -192px 0px;
+	}
+	.rftIconQuestionFill {
+		background-position: -224px 0px;
+	}
+	.rftIconRespondent {
+		background-position: -256px 0px;
+	}
+	.rftIconAnswer {
+		background-position: -288px 0px;
+	}
+	.rftIconAnswerSet {
+		background-position: -320px 0px;
+	}
+	.rftIconGameData {
+		background-position: -352px 0px;
+	}
+	.rftIconUser {
+		background-position: -384px 0px;
+	}
+		//Actions
+	.rftIconAccept {
+		background-position: -416px 0px;
+	}
+	.rftIconCancel {
+		background-position: -448px 0px;
+	}
+	.rftIconPlus {
+		background-position: -480px 0px;
+	}
+	.rftIconMinus {
+		background-position: -512px 0px;
+	}
+	.rftIconIncrease {
+		background-position: -544px 0px;
+	}
+	.rftIconDecrease {
+		background-position: -576px 0px;
+	}
+	.rftIconDelete {
+		background-position: -608px 0px;
+	}
+	.rftIconHome {
+		background-position: -640px 0px;
+	}
+	.rftIconPreview {
+		background-position: -672px 0px;
+	}
+	.rftIconSave {
+		background-position: -704px 0px;
+	}
+	.rftIconDiscard {
+		background-position: -736px 0px;
+	}
+	.rftIconProperties {
+		background-position: -768px 0px;
+	}
+	.rftIconUndo {
+		background-position: -800px 0px;
+	}
+	.rftIconRedo {
+		background-position: -832px 0px;
+	}
+	.rftIconBack {
+		background-position: -864px 0px;
+	}
+	.rftIconForward {
+		background-position: -896px 0px;
+	}
+	.rftIconRefresh {
+		background-position: -928px 0px;
+	}
+	.rftIconHelp {
+		background-position: -960px 0px;
+	}
+	.rftIconInspect {
+		background-position: -992px 0px;
+	}
+	.rftIconTag {
+		background-position: -1024px 0px;
+	}
+	.rftIconImage {
+		background-position: -1056px 0px;
+	}
+	.rftIconEdit {
+		background-position: -1088px 0px;
+	}
+	.rftIconLock {
+		background-position: -1120px 0px;
+	}
+	.rftIconUnlock {
+		background-position: -1152px 0px;
+	}
+	.rftIconPreset {
+		background-position: -1184px 0px;
+	}
+	.rftIconTextBlock {
+		background-position: -1216px 0px;
+	}
+	.rftIconPageBreak {
+		background-position: -1248px 0px;
+	}
+	.rftIconExternal {
+		background-position: -1280px 0px;
+	}
+	.rftIconInput {
+		background-position: -1312px 0px;
+	}
+	.rftIconPublish {
+		background-position: -1344px 0px;
+	}
+	//Arrows
+	.rftIconFullArrowUp {
+		background-position: -1696px 0px;
+	}
+	.rftIconFullArrowDown {
+		background-position: -1728px 0px;
+	}
+	.rftIconFullArrowLeft {
+		background-position: -1760px 0px;
+	}
+	.rftIconFullArrowRight {
+		background-position: -1792px 0px;
+	}
+	.rftIconHalfArrowUp {
+		background-position: -1824px 0px;
+	}
+	.rftIconHalfArrowDown {
+		background-position: -1856px 0px;
+	}
+	.rftIconHalfArrowLeft {
+		background-position: -1888px 0px;
+	}
+	.rftIconHalfArrowRight {
+		background-position: -1920px 0px;
+	}
+}
Index: Dev/trunk/src/qed-client/css/layout.less
===================================================================
--- Dev/trunk/src/qed-client/css/layout.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/layout.less	(revision 443)
@@ -0,0 +1,9 @@
+*:focus {
+    //disable Chrome outline of focused elements
+    outline: none;
+}
+html, body {
+    width: 100%;
+    height: 100%;
+    background-color: @base;
+}
Index: Dev/trunk/src/qed-client/css/mixins.less
===================================================================
--- Dev/trunk/src/qed-client/css/mixins.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/mixins.less	(revision 443)
@@ -0,0 +1,96 @@
+//LAYOUT
+.newLine () {
+	float: left;
+	clear: left;
+}
+
+.transition (@time: @transition_time) {
+	-webkit-transition: all @time;
+	-moz-transition: all @time;
+	-o-transition: all @time;
+	-ms-transition: all @time;
+	transition: all @time;
+}
+
+.flatShading () {
+	//Disable borders, gradients and other effects. One flat colour shading.
+	border: none;
+	background-image: none;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+	border-radius: 0;
+}
+
+.noOffset () {
+	.noMargin;
+	.noPadding;
+}
+
+.noMargin () {
+	margin: 0 0 0 0;
+}
+
+.noPadding () {
+	padding: 0 0 0 0;
+}
+//------------------------------------------
+//ICONS
+
+.setIconSize (@size, @b) when (@size < 24px) {
+	width: @size;
+	height: @size;
+	margin: ((24px - @size) / 2) 0;
+	.noPadding ();
+	background-image: url('images/icons/rftIcons16@{b}.png');
+}
+
+.setIconSize (@size, @b) when (@size >= 24px) and (@size < 32) {
+	width: 24px;
+	height: 24px;
+	.noMargin ();
+	.noPadding ();
+	background-image: url('images/icons/rftIcons24@{b}.png');
+}
+
+.setIconSize (@size, @b) when (@size >= 32px) {
+	width: 32px;
+	height: 32px;
+	margin: 0;
+	.noPadding ();
+	background-image: url('images/icons/rftIcons32@{b}.png');
+}
+
+.setIcon (@size, black) {
+	.setIconSize(@size, "b");
+}
+.setIcon (@size, white) {
+	.setIconSize(@size, "");
+}
+.setIcon (@size) {
+	.setIconSize(@size, "");
+}
+//------------------------------------------
+
+//Old colour settings
+//TODO: I AM NOT SURE IF THIS ACTUALLY WORKS! THOROUGHLY TEST WHEN APPLIED TO PAGES!!!!
+// Oke, wat. Deze shit is echt niet te snappen. :P Gewoon maar weer de oude meuk erin hangen?
+.blockButtonColorMixin (@color) {
+	.dijitButtonNode {
+		background-color: @@color;
+	}
+
+	&.dijitHover {
+		.dijitButtonNode {
+			background-color: @text;
+			color: @darkest;
+		}
+	}
+	&.dijitActive {
+		.dijitButtonNode {
+			@colorName: "@{color}_light";
+			background-color: @@colorName;
+			color: @text;
+		}
+	}
+
+}
Index: Dev/trunk/src/qed-client/css/model/widgets/QuestionEditor.less
===================================================================
--- Dev/trunk/src/qed-client/css/model/widgets/QuestionEditor.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/model/widgets/QuestionEditor.less	(revision 443)
@@ -0,0 +1,9 @@
+#rft.claro {
+    .qedQuestionEditorPreviewItem {
+        overflow: hidden;
+    }
+
+    .surveyEditorPreview {
+        overflow-y: auto;
+    }
+}
Index: Dev/trunk/src/qed-client/css/model/widgets/QuestionListView.less
===================================================================
--- Dev/trunk/src/qed-client/css/model/widgets/QuestionListView.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/model/widgets/QuestionListView.less	(revision 443)
@@ -0,0 +1,9 @@
+#rft.claro .rftSurveyListView {
+
+    .rftSurveyListViewContent {
+        min-height: 300px;
+        background: @base1;
+        overflow: auto;
+    }
+
+}
Index: Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less
===================================================================
--- Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less	(revision 443)
@@ -0,0 +1,18 @@
+#rft.claro .qedScaleWidget {
+    table {
+        text-align: center;
+    }
+    th { font-weight: normal; }
+    .item {
+        text-align: left;
+        min-width: 10em;
+        max-width: 15em;
+    }
+    .min { text-align: right; padding-left: 2em; }
+    .max { text-align: left;  padding-right: 2em; }
+    .na { text-align: center; }
+
+    .dijitTextBox {
+        width: 10em;
+    } 
+}
Index: Dev/trunk/src/qed-client/css/old/main.less
===================================================================
--- Dev/trunk/src/qed-client/css/old/main.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/old/main.less	(revision 443)
@@ -0,0 +1,26 @@
+// Setup up compilation context and shared functionality
+@import "variables.less";
+@import "mixins.less";
+@import "colors2.less";
+
+// Link to dijit/claro/dojox css
+@import "external.css";
+@import "hva-mods.css";
+@import "claroOverride.less";
+
+// RFT specific styling
+@import "layout.less";
+@import "rftIcons.less";
+@import "rftSelector.less";
+@import "rftLineWithActions.less";
+@import "menus.less";
+@import "questionEditor.less";
+@import "surveyEditor.less";
+@import "rftButtons.less";
+@import "rftObjectBox.less";
+@import "sessionEditor.less";
+
+
+// Page specific stylesheets!
+@import "pages/questions.less";
+@import "pages/sessions.less";
Index: Dev/trunk/src/qed-client/css/old/tutorial.less
===================================================================
--- Dev/trunk/src/qed-client/css/old/tutorial.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/old/tutorial.less	(revision 443)
@@ -0,0 +1,142 @@
+//Variables and operations
+@variable: value;
+@variable2; @variable + value;	// /*-+, etc...
+//Variables are a constant!
+
+//You can use variables in varnames - eval()??
+@varName: "This is the value";
+@var: "varName";
+property: @@var; // read this as: Paste @var into X for the expression 'property is variable X'
+//property = variable(variable(a));
+
+//Mixins
+.mixin {
+	border-top: 1px solid #fff;	//Compilation preserves, so can be used as actual class in HTML
+}
+.mixin () {
+	border-top: 1px solid #fff;	//Compilation does not preserve, only for LESS purposes.
+}
+.mixin (@color: #default) {
+	border-top: 1px solid @color;	//Arguments.
+}
+.mixin (@x: 0, @y: 0) {
+	margin: @arguments;	//Use this to get space-separated list of all arguments!
+}
+
+// The following two mixins use a switch argument, behaving like an if/else or switch(arg1){}.
+.mixin (black, @color) {
+	border-top: 1px solid #fff;
+	background-color: black;
+}
+.mixin (white, @color) {
+	border-top: 1px solid #fff;
+	background-color: white;
+}
+
+//Match on arity (argument count):
+.mixin (@a) {
+	content: "Only if one arg: @{a}";
+}
+.mixin (@a, @b) {
+	content: "When two args: @{a}, @{b}";
+}
+
+//GUARDS! When you want to match on expressions!
+.mixin (@a) when (lightness(@a) >= 50%) {
+	background-color: black;
+}
+
+.mixin (@a) when (isnumber(@a)), (isstring(@a)) {
+	//This matches when @a is a string OR number (comma separated guards)
+}
+.mixin (@a) when (iscolor(@a)) and (lightness(@a) < 50%) {
+	// This matches when @a is a color with lightness under 50% (AND separated guards)
+}
+.mixin (@a) when not (@a > 0) {
+	//derp. Not keyword werkt ook
+}
+
+/*Expressions:
+- iscolor
+- isnumber
+- isstring
+- iskeyword?
+- isurl
+
+isnumber specifiek:
+- ispixel
+- ispercentage
+- isem
+*/
+
+.parent {
+	.descendant {
+		//descendant selector, evaluates to .parent .descendant{}
+	}
+	&.concat {
+		//concatenate selector, evaluates to .parent.concat{}
+	}
+	&[dojo-type="Button"] {
+		// works as well, evaluates to .parent[dojo-type="Button"]{}
+	}
+	&:hover {
+		//sets hover property for .parent:hover !!
+	}
+}
+
+// Operations: Can be applied to all numbers, color and variables. //These can be nested as well!
+@base: 5%;
+@other: @base + #aaa; //apaarently, LESS understands and converts these units?
+@var123: 1px + 5; // Output will be in px as well, since you specified them.
+border: (@width * 2) solid black; // Use brackets in compound statements!
+
+// Color operations: all colours are first converted to HSL space
+lighten/darken	//lightness (%)
+saturate/desaturate	//saturation (%)
+fadein/fadeout/fade	//transparency. fade sets absolute alpha, the others are relative to @color passed in (%)
+spin //hue, degrees spun on colour wheel (unitless number)
+mix // mix two colours.
+
+hue/saturation/lightness/alpha //return these for @color passed as argument
+@new = hsl(hue(@old), 45%, 90%); // generate new colour
+
+//Math functions!
+round, ceil, floor	//do what you'd expect.
+percentage	//returns rational as percentage
+
+//NAMESPACES
+#nameSpace {
+	.button() {
+		//stuff
+	}
+}
+
+.header a {
+	#nameSpace > .button;	// Access namespace variables:) CANNOT DO THIS WITH VARIABLES!!!!
+}
+
+/* These will be added to compiled CSS */
+// These won't, and are for use in LESS sheet only
+
+@import "lib.less";
+@import "lib";	//assumed to be LESS file
+@import "file.css";	//normal css imports
+
+
+//String interpolation: Same as DOJO templates, with @ instead of $
+@base-url: "http://assets.fnord.com";
+background-image: url("@{base-url}/images/bg.png");
+
+//String escapes:
+~"stuffffff"; //Will be added to compiled CSS as-is. Useful for retarded MS-specific (invalid CSS) statements/hacks
+
+//Wait, WHUT
+//JAVASCRIPT EVALUATION?!?!?!?!
+
+@var: `"hello".toUpperCase() + '!'`; // Wrap stuff in backticks and it will eval before compilation! :D
+@str: "hello";
+@var: ~`"@{str}".toUpperCase() + '!'`;	//You can still use string interp for this! Why the ~ though?
+
+@height: `document.body.clientHeight`; //WTF. How does this even work if it is compiled serverside?
+@color: color(`window.colors.baseColor`);	//Use color() to parse JS colours as CSS colours
+@darkcolor: darken(@color, 10%);
Index: Dev/trunk/src/qed-client/css/pages/questions.less
===================================================================
--- Dev/trunk/src/qed-client/css/pages/questions.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/pages/questions.less	(revision 443)
@@ -0,0 +1,23 @@
+#rft.claro {
+	.page_questions {
+		
+		.rftSelector {
+			.rftSelectorCategory .rftLineWithActions {
+				.bgColor ("orange");
+			}
+
+			.rftSelectorSelected { 
+				.rftLineWithActions {
+					.bgColor ("text");
+					color: @darkest;
+				}
+
+				.rftBlockButton {
+					background-color: #ff00ff;
+					.blockButtonColorMixin ("orange");
+				}
+				
+			}
+		}
+	}
+}
Index: Dev/trunk/src/qed-client/css/pages/session.less
===================================================================
--- Dev/trunk/src/qed-client/css/pages/session.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/pages/session.less	(revision 443)
@@ -0,0 +1,45 @@
+#rft.claro .rftSessionObject {
+    .noOffset;
+    width: @sessionobject_size;
+    height: @sessionobject_size;
+    background: @headers;
+    margin: @std_offset_big;
+    display: inline-block;
+
+
+    .rftIcon {
+        .setIcon (32px);
+        @iconOffsetX: ((@sessionobject_size - 32px)/2);
+        margin: @std_offset_big @iconOffsetX 0 @iconOffsetX;
+    }
+
+    label {
+        .noOffset;
+        float: left;
+        clear: both;
+        width: @sessionobject_size;
+        text-align: center;
+        color: @text;
+        overflow: hidden;
+    }
+
+    &.blue {
+        background-color: @blue;
+        &.selected {
+            background-color: @blue_light;
+        }
+    }
+    &.green {
+        background-color: @green;
+        &.selected {
+            background-color: @green_light;
+        }
+    }
+    &.red {
+        background-color: @red;
+        &.selected {
+            background-color: @red_light;
+        }
+    }
+    
+}
Index: Dev/trunk/src/qed-client/css/pages/sessions.less
===================================================================
--- Dev/trunk/src/qed-client/css/pages/sessions.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/pages/sessions.less	(revision 443)
@@ -0,0 +1,20 @@
+#rft.claro {
+	.page_sessions {
+
+		.rftObjectBox {
+			.noPadding ();
+			color: @text;
+
+			.typeIcon.rftIcon {
+				.setIcon(32px);
+			}
+
+			.rftLineWithActions {
+				background-color: @green;
+				.rftBlockButton {
+					.blockButtonColorMixin ("green");
+				}
+			}
+		}
+	}
+}
Index: Dev/trunk/src/qed-client/css/qed.css
===================================================================
--- Dev/trunk/src/qed-client/css/qed.css	(revision 443)
+++ Dev/trunk/src/qed-client/css/qed.css	(revision 443)
@@ -0,0 +1,1896 @@
+@import "dijit/claro.css";
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\000031}}
+DESCRIPTION {
+  /*
+How to use colour system:
+Apply a combination of at most 1 "colour" class and one or more "modifier" classes.
+Colour classes: Red, Blue, Green, Orange, Purple
+Modifer classes:
+- textColor: Change the font colour of element to the "colour" class combined with.
+- bgColor: Change the background colour to the "colour" class combined with.
+- doesHover: If present in combination with one of the above two modifiers, 
+the element will shift it's background- or text colour to a lighter version on hover.
+- hoverTextColor: Same as .textColor, but only affects elements being hovered over.
+- hoverBgColor: Same as .bgColor, but only affects elements being hovered over.
+NOTE: .doesHover does nothing in combination with the above two modifiers!
+*/
+
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000354}}
+#rft.claro .blue.textColor {
+  color: #0072bc;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000356}}
+#rft.claro .blue.textColor.doesHover:hover {
+  color: #0794d1;
+}
+/* line 61, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000361}}
+#rft.claro .blue.bgColor {
+  background-color: #0072bc;
+  color: #ffffff;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000364}}
+#rft.claro .blue.bgColor.doesHover:hover {
+  background-color: #0794d1;
+  color: #111111;
+}
+/* line 70, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000370}}
+#rft.claro .blue.hoverTextColor:hover {
+  color: #0072bc;
+}
+/* line 73, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000373}}
+#rft.claro .blue.hoverBgColor:hover {
+  background-color: #0072bc;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000354}}
+#rft.claro .red.textColor {
+  color: #8c0310;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000356}}
+#rft.claro .red.textColor.doesHover:hover {
+  color: #bd0013;
+}
+/* line 61, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000361}}
+#rft.claro .red.bgColor {
+  background-color: #8c0310;
+  color: #ffffff;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000364}}
+#rft.claro .red.bgColor.doesHover:hover {
+  background-color: #bd0013;
+  color: #111111;
+}
+/* line 70, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000370}}
+#rft.claro .red.hoverTextColor:hover {
+  color: #8c0310;
+}
+/* line 73, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000373}}
+#rft.claro .red.hoverBgColor:hover {
+  background-color: #8c0310;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000354}}
+#rft.claro .orange.textColor {
+  color: #ff5b12;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000356}}
+#rft.claro .orange.textColor.doesHover:hover {
+  color: #ff9140;
+}
+/* line 61, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000361}}
+#rft.claro .orange.bgColor {
+  background-color: #ff5b12;
+  color: #ffffff;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000364}}
+#rft.claro .orange.bgColor.doesHover:hover {
+  background-color: #ff9140;
+  color: #111111;
+}
+/* line 70, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000370}}
+#rft.claro .orange.hoverTextColor:hover {
+  color: #ff5b12;
+}
+/* line 73, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000373}}
+#rft.claro .orange.hoverBgColor:hover {
+  background-color: #ff5b12;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000354}}
+#rft.claro .green.textColor {
+  color: #25a000;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000356}}
+#rft.claro .green.textColor.doesHover:hover {
+  color: #63c400;
+}
+/* line 61, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000361}}
+#rft.claro .green.bgColor {
+  background-color: #25a000;
+  color: #ffffff;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000364}}
+#rft.claro .green.bgColor.doesHover:hover {
+  background-color: #63c400;
+  color: #111111;
+}
+/* line 70, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000370}}
+#rft.claro .green.hoverTextColor:hover {
+  color: #25a000;
+}
+/* line 73, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000373}}
+#rft.claro .green.hoverBgColor:hover {
+  background-color: #25a000;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000354}}
+#rft.claro .purple.textColor {
+  color: #6529b7;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000356}}
+#rft.claro .purple.textColor.doesHover:hover {
+  color: #993dec;
+}
+/* line 61, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000361}}
+#rft.claro .purple.bgColor {
+  background-color: #6529b7;
+  color: #ffffff;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000364}}
+#rft.claro .purple.bgColor.doesHover:hover {
+  background-color: #993dec;
+  color: #111111;
+}
+/* line 70, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000370}}
+#rft.claro .purple.hoverTextColor:hover {
+  color: #6529b7;
+}
+/* line 73, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000373}}
+#rft.claro .purple.hoverBgColor:hover {
+  background-color: #6529b7;
+}
+/* line 97, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\0000397}}
+#rft.claro .textColor,
+#rft.claro .hoverTextColor {
+  transition: color 0.2s;
+}
+/* line 101, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/colors.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/colors\.less}line{font-family:\00003101}}
+#rft.claro .bgColor,
+#rft.claro .hoverBgColor {
+  transition: background-color 0.2s;
+}
+/* This stylesheet compensates for the restoration of the claro style to its original specs. (21-6-2012)
+ * These changes should be moved to relevant stylesheets as soon as possible!
+*/
+/* Menu.css */
+/* line 7, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\000037}}
+.claro .topbar .dijitMenuitem {
+  width: 90px;
+  background-image: none;
+  background-position: top;
+  text-align: center;
+}
+/* line 13, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000313}}
+.claro .dijitMenuPassive .dijitMenuItemHover,
+.claro .dijitMenuPassive .dijitMenuItemSelected {
+  background-color: transparent;
+  color: #ffffff;
+  border: none;
+  padding: 0 4px;
+}
+/* line 19, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000319}}
+.claro .dijitMenuPassive .dijitMenuItemActive {
+  background-position: top;
+}
+/* layout/BorderContainer.css */
+/* line 24, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000324}}
+.claro .dijitSplitContainer-child,
+.claro .dijitBorderContainer-child {
+  border: none;
+}
+/* line 27, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000327}}
+.claro .dijitTabContainerTop-dijitContentPane,
+.claro .dijitTabContainerLeft-dijitContentPane,
+.claro .dijitTabContainerBottom-dijitContentPane,
+.claro .dijitTabContainerRight-dijitContentPane,
+.claro .dijitAccordionContainer-dijitContentPane {
+  background-color: transparent;
+}
+/* line 34, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000334}}
+.claro .dijitSplitContainer-dijitContentPane,
+.claro .dijitBorderContainer-dijitContentPane {
+  background-color: transparent;
+}
+/* layout/TabContainer.css */
+/* line 40, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000340}}
+.claro .dijitTabPaneWrapper {
+  background: transparent;
+}
+/* line 43, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000343}}
+.claro .dijitTabInnerDiv {
+  background-color: transparent;
+  color: #999999;
+  border: none;
+}
+/* line 48, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000348}}
+.claro .dijitTabContent {
+  border: none;
+}
+/* line 51, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000351}}
+.claro .dijitTabHover .dijitTabInnerDiv {
+  background-color: transparent;
+  color: #ffffff;
+}
+/* line 55, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000355}}
+.claro .dijitTabActive .dijitTabInnerDiv {
+  color: #0072bc;
+}
+/* line 58, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000358}}
+.claro .dijitTabChecked .dijitTabInnerDiv {
+  background-color: transparent;
+  color: #ffffff;
+}
+/* line 62, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000362}}
+.claro .dijitTabContent {
+  border: 1px solid #999999;
+}
+/* line 65, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000365}}
+.claro .dijitTabHover .dijitTabContent {
+  border-color: #ffffff;
+}
+/* line 68, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000368}}
+.claro .dijitTabActive .dijitTabContent {
+  border-color: transparent;
+}
+/* line 71, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000371}}
+.claro .dijitTabChecked .dijitTabContent {
+  color: #ffffff;
+  border-color: #0072bc;
+}
+/*lefttabs*/
+/* line 76, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000376}}
+.claro .dijitTabContainerLeft-tabs .dijitTab {
+  border-width: 1px;
+  left: 0;
+  margin-bottom: 4px;
+  margin-right: 8px;
+}
+/* line 82, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000382}}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+  border: none;
+  background: transparent;
+  background-image: none;
+  background-position: top;
+  background-repeat: no-repeat;
+}
+/* line 89, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000389}}
+.claro .dijitTabContainerLeft-tabs .dijitTabContent {
+  padding: 3px 8px 4px 8px;
+  background-image: none;
+}
+/* line 94, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000394}}
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
+  padding-right: 8px;
+  background-image: none;
+}
+/* line 98, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\0000398}}
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+/* line 103, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\00003103}}
+.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
+.claro .dijitTabContainerLeft-tabs .dijitTabContent {
+  -moz-border-radius: 0;
+  border-radius: 0;
+  border: none;
+}
+/* line 110, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\00003110}}
+.claro .dojoDndItemAnchor {
+  background-color: #000000;
+}
+/* line 114, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/overrides.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/overrides\.less}line{font-family:\00003114}}
+.claro .dojoDndItemOver {
+  background-color: #333333;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/ContentPane.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/ContentPane\.less}line{font-family:\000033}}
+#rft.claro .dijitBorderContainer,
+#rft.claro .dijitContentPane,
+#rft.claro .dijitTabContainer,
+#rft.claro .dijitTabPaneWrapper {
+  background: transparent;
+  border: none;
+}
+/* line 8, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/ContentPane.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/ContentPane\.less}line{font-family:\000038}}
+#rft.claro .dijitContentPane.page {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+}
+/* line 12, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/ContentPane.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/ContentPane\.less}line{font-family:\0000312}}
+#rft.claro .dijitContentPane.content {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  display: block;
+  clear: both;
+  background-color: #555555;
+  background-image: -webkit-gradient(50% 50%, circle, #666666 1%, #444444 100%);
+  -moz-background-image: gradient(50% 50%, circle, #666666 1%, #444444 100%);
+  -o-background-image: gradient(50% 50%, circle, #666666 1%, #444444 100%);
+  -ms-background-image: gradient(50% 50%, circle, #666666 1%, #444444 100%);
+  background-image: gradient(50% 50%, circle, #666666 1%, #444444 100%);
+}
+/* line 48, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/ContentPane.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/ContentPane\.less}line{font-family:\0000348}}
+#rft.claro .dijitContentPane.content .dijitBorderContainer {
+  padding: 4px;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\000033}}
+#rft.claro .verticalTabList {
+  width: 190px;
+}
+/* line 7, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\000037}}
+#rft.claro .dijitTab {
+  -webkit-transition: all 0.2s;
+  -moz-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  -ms-transition: all 0.2s;
+  transition: all 0.2s;
+  background-color: transparent;
+  padding: 4px 8px;
+  color: #999999;
+  overflow: hidden;
+}
+/* line 19, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000319}}
+#rft.claro .dijitTabContainerLeft-tabs {
+  border: none;
+  padding: 4px;
+}
+/* line 23, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000323}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab {
+  margin: 4px;
+  width: 200px;
+  min-height: 30px;
+  border: 1px solid #999999;
+}
+/* line 29, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000329}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab .dijitTabContent {
+  min-height: 30px;
+  line-height: 30px;
+  width: 190px;
+}
+/* line 35, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000335}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab.dijitTabChecked {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+  color: #ffffff;
+  border: 1px solid transparent;
+}
+/* line 40, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000340}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab.dijitTabChecked.dijitTabHover {
+  border: 1px solid transparent;
+}
+/* line 45, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000345}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab.dijitTabHover {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+  color: #ffffff;
+  border-color: #ffffff;
+}
+/* line 51, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000351}}
+#rft.claro .dijitTabContainerLeft-tabs .dijitTab.dijitTabActive {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+  color: #999999;
+}
+/* line 59, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000359}}
+#rft.claro.blue .dijitTabChecked,
+#rft.claro .blue .dijitTabChecked,
+#rft.claro div.blue.dijitTabChecked {
+  background-color: #0072bc;
+}
+/* line 64, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000364}}
+#rft.claro.green .dijitTabChecked,
+#rft.claro .green .dijitTabChecked,
+#rft.claro div.green.dijitTabChecked {
+  background-color: #25a000;
+}
+/* line 69, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000369}}
+#rft.claro.red .dijitTabChecked,
+#rft.claro .red .dijitTabChecked,
+#rft.claro div.red.dijitTabChecked {
+  background-color: #8c0310;
+}
+/* line 74, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000374}}
+#rft.claro.orange .dijitTabChecked,
+#rft.claro .orange .dijitTabChecked,
+#rft.claro div.orange.dijitTabChecked {
+  background-color: #ff5b12;
+}
+/* line 79, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TabContainer.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TabContainer\.less}line{font-family:\0000379}}
+#rft.claro.purple .dijitTabChecked,
+#rft.claro .purple .dijitTabChecked,
+#rft.claro div.purple.dijitTabChecked {
+  background-color: #6529b7;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\000033}}
+#rft.claro .dijitMenuPopup .dijitMenu {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  color: #999999;
+  background-color: #333333;
+  border: none;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000310}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem {
+  color: #999999;
+  border: none;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  background-color: #333333;
+}
+/* line 18, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000318}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover .dijitMenuItemLabel,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive .dijitMenuItemLabel,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected .dijitMenuItemLabel {
+  color: #ffffff;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000322}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover.red,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive.red,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected.red {
+  background-color: #8c0310;
+}
+/* line 25, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000325}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover.blue,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive.blue,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected.blue {
+  background-color: #0072bc;
+}
+/* line 28, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000328}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover.green,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive.green,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected.green {
+  background-color: #25a000;
+}
+/* line 31, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000331}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover.orange,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive.orange,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected.orange {
+  background-color: #ff5b12;
+}
+/* line 34, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000334}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemHover.purple,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive.purple,
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemSelected.purple {
+  background-color: #6529b7;
+}
+/* line 40, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000340}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16.png');
+  margin: 0 0 0 0;
+  margin-right: 8px;
+}
+/* line 46, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/MenuPopup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/MenuPopup\.less}line{font-family:\0000346}}
+#rft.claro .dijitMenuPopup .dijitMenu .dijitMenuItem.dijitMenuItemActive .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16b.png');
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\000031}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane {
+  margin: 0 0 0 0;
+}
+/* line 4, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\000034}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneTitle {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  margin: 0 0 0 0;
+  background-color: #ff5b12;
+  border: none;
+  padding: 0 4px;
+  height: 24px;
+}
+/* line 12, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\0000312}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneTitle.dijitTitlePaneTitleHover,
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneTitle.dijitTitlePaneTitleFocused {
+  background-color: #ff9140;
+}
+/* line 19, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\0000319}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneTextNode {
+  color: #ffffff;
+  font-size: 13px;
+  line-height: 24px;
+}
+/* line 25, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\0000325}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneContentOuter {
+  background-color: #444444;
+  border: none;
+}
+/* line 30, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/dijit/TitleGroup.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/dijit\/TitleGroup\.less}line{font-family:\0000330}}
+#rft.claro .dojoxTitleGroup .dijitTitlePane .dijitTitlePaneTitleFocus {
+  margin: 0 0 0 0;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\000031}}
+#rft.claro {
+  font-family: 'Segoe UI', Helvetica, Verdana, Arial, sans-serif;
+  font-size: 13px;
+  color: #111111;
+}
+/* line 6, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\000036}}
+#rft.claro a {
+  color: inherit;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\0000310}}
+#rft.claro h1 {
+  margin: 0 0 0 0;
+  padding: 0 10px 8px 10px;
+  font-size: 48px;
+  color: #999999;
+  line-height: 48px;
+  font-weight: normal;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+/* line 23, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\0000323}}
+#rft.claro h2 {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  color: #999999;
+  font-size: 22px;
+  line-height: 30px;
+}
+/* line 29, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\0000329}}
+#rft.claro h2 .rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32.png');
+  margin-right: 8px;
+}
+/* line 35, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\0000335}}
+#rft.claro h3 {
+  margin: 0 0 0 0;
+  font-size: 18px;
+  margin-bottom: 4px;
+}
+/* line 41, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/fonts.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/fonts\.less}line{font-family:\0000341}}
+#rft.claro h4 {
+  font-size: 16px;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\000033}}
+#rft.claro .rftIcon {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  float: left;
+  display: inline-block;
+  border: none;
+  background-color: transparent;
+  background-repeat: no-repeat;
+}
+/* line 13, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000313}}
+#rft .rftIconApplication {
+  background-position: 0px 0px;
+}
+/* line 16, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000316}}
+#rft .rftIconDashboard {
+  background-position: -32px 0px;
+}
+/* line 19, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000319}}
+#rft .rftIconSession {
+  background-position: -64px 0px;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000322}}
+#rft .rftIconSessionActive {
+  background-position: -96px 0px;
+}
+/* line 25, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000325}}
+#rft .rftIconSessionTemplate {
+  background-position: -128px 0px;
+}
+/* line 28, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000328}}
+#rft .rftIconSurvey {
+  background-position: -160px 0px;
+}
+/* line 31, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000331}}
+#rft .rftIconQuestion {
+  background-position: -192px 0px;
+}
+/* line 34, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000334}}
+#rft .rftIconQuestionFill {
+  background-position: -224px 0px;
+}
+/* line 37, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000337}}
+#rft .rftIconRespondent {
+  background-position: -256px 0px;
+}
+/* line 40, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000340}}
+#rft .rftIconAnswer {
+  background-position: -288px 0px;
+}
+/* line 43, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000343}}
+#rft .rftIconAnswerSet {
+  background-position: -320px 0px;
+}
+/* line 46, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000346}}
+#rft .rftIconGameData {
+  background-position: -352px 0px;
+}
+/* line 49, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000349}}
+#rft .rftIconUser {
+  background-position: -384px 0px;
+}
+/* line 53, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000353}}
+#rft .rftIconAccept {
+  background-position: -416px 0px;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000356}}
+#rft .rftIconCancel {
+  background-position: -448px 0px;
+}
+/* line 59, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000359}}
+#rft .rftIconPlus {
+  background-position: -480px 0px;
+}
+/* line 62, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000362}}
+#rft .rftIconMinus {
+  background-position: -512px 0px;
+}
+/* line 65, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000365}}
+#rft .rftIconIncrease {
+  background-position: -544px 0px;
+}
+/* line 68, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000368}}
+#rft .rftIconDecrease {
+  background-position: -576px 0px;
+}
+/* line 71, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000371}}
+#rft .rftIconDelete {
+  background-position: -608px 0px;
+}
+/* line 74, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000374}}
+#rft .rftIconHome {
+  background-position: -640px 0px;
+}
+/* line 77, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000377}}
+#rft .rftIconPreview {
+  background-position: -672px 0px;
+}
+/* line 80, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000380}}
+#rft .rftIconSave {
+  background-position: -704px 0px;
+}
+/* line 83, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000383}}
+#rft .rftIconDiscard {
+  background-position: -736px 0px;
+}
+/* line 86, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000386}}
+#rft .rftIconProperties {
+  background-position: -768px 0px;
+}
+/* line 89, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000389}}
+#rft .rftIconUndo {
+  background-position: -800px 0px;
+}
+/* line 92, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000392}}
+#rft .rftIconRedo {
+  background-position: -832px 0px;
+}
+/* line 95, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000395}}
+#rft .rftIconBack {
+  background-position: -864px 0px;
+}
+/* line 98, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\0000398}}
+#rft .rftIconForward {
+  background-position: -896px 0px;
+}
+/* line 101, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003101}}
+#rft .rftIconRefresh {
+  background-position: -928px 0px;
+}
+/* line 104, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003104}}
+#rft .rftIconHelp {
+  background-position: -960px 0px;
+}
+/* line 107, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003107}}
+#rft .rftIconInspect {
+  background-position: -992px 0px;
+}
+/* line 110, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003110}}
+#rft .rftIconTag {
+  background-position: -1024px 0px;
+}
+/* line 113, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003113}}
+#rft .rftIconImage {
+  background-position: -1056px 0px;
+}
+/* line 116, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003116}}
+#rft .rftIconEdit {
+  background-position: -1088px 0px;
+}
+/* line 119, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003119}}
+#rft .rftIconLock {
+  background-position: -1120px 0px;
+}
+/* line 122, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003122}}
+#rft .rftIconUnlock {
+  background-position: -1152px 0px;
+}
+/* line 125, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003125}}
+#rft .rftIconPreset {
+  background-position: -1184px 0px;
+}
+/* line 128, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003128}}
+#rft .rftIconTextBlock {
+  background-position: -1216px 0px;
+}
+/* line 131, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003131}}
+#rft .rftIconPageBreak {
+  background-position: -1248px 0px;
+}
+/* line 134, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003134}}
+#rft .rftIconExternal {
+  background-position: -1280px 0px;
+}
+/* line 137, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003137}}
+#rft .rftIconInput {
+  background-position: -1312px 0px;
+}
+/* line 140, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003140}}
+#rft .rftIconPublish {
+  background-position: -1344px 0px;
+}
+/* line 144, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003144}}
+#rft .rftIconFullArrowUp {
+  background-position: -1696px 0px;
+}
+/* line 147, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003147}}
+#rft .rftIconFullArrowDown {
+  background-position: -1728px 0px;
+}
+/* line 150, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003150}}
+#rft .rftIconFullArrowLeft {
+  background-position: -1760px 0px;
+}
+/* line 153, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003153}}
+#rft .rftIconFullArrowRight {
+  background-position: -1792px 0px;
+}
+/* line 156, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003156}}
+#rft .rftIconHalfArrowUp {
+  background-position: -1824px 0px;
+}
+/* line 159, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003159}}
+#rft .rftIconHalfArrowDown {
+  background-position: -1856px 0px;
+}
+/* line 162, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003162}}
+#rft .rftIconHalfArrowLeft {
+  background-position: -1888px 0px;
+}
+/* line 165, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/icons.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/icons\.less}line{font-family:\00003165}}
+#rft .rftIconHalfArrowRight {
+  background-position: -1920px 0px;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/layout.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/layout\.less}line{font-family:\000031}}
+*:focus {
+  outline: none;
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/layout.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/layout\.less}line{font-family:\000035}}
+html,
+body {
+  width: 100%;
+  height: 100%;
+  background-color: #333333;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\000033}}
+#rft.claro fieldset {
+  border: none;
+}
+/* line 8, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\000038}}
+#rft.claro fieldset.align input,
+#rft.claro fieldset.align .dijitTextBox,
+#rft.claro fieldset.align textarea {
+  margin-left: 0;
+}
+/* line 14, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000314}}
+#rft.claro fieldset.align label {
+  color: #ffffff;
+  display: inline-block;
+  width: 100px !important;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000322}}
+#rft.claro .floatRight {
+  float: right;
+  margin: 0 0 0 0;
+}
+/* line 28, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000328}}
+#rft.claro .qedInfo {
+  max-width: 500px;
+}
+/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000332}}
+#rft.claro .qedLabel {
+  width: 150px;
+  display: inline-block;
+  text-align: right;
+  padding: 1px;
+}
+/* line 39, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000339}}
+#rft.claro .qedField {
+  max-width: 350px;
+  display: inline-block;
+  vertical-align: top;
+  padding: 1px;
+}
+/* line 45, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000345}}
+#rft.claro .qedField.dijitTextArea {
+  min-height: 5em;
+}
+/* line 50, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000350}}
+#rft.claro .qedField.qedFill {
+  width: 350px;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/forms.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/forms\.less}line{font-family:\0000354}}
+#rft.claro .qedFieldset {
+  margin: 1em 0px;
+  border: 1px solid grey;
+}
+/* line 2, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\000032}}
+#rft.claro .rftIndexMenuBlock {
+  width: 400px;
+  height: 400px;
+  background: #444444;
+  float: left;
+  margin: 16px;
+  overflow: hidden;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000310}}
+#rft.claro .rftIndexMenuBlock:hover .rftIndexMenuMask {
+  margin-top: -400px;
+}
+/* line 14, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000314}}
+#rft.claro .rftIndexMenuMask {
+  width: 400px;
+  height: 400px;
+  background: #444444;
+  color: #999999;
+  margin-top: 0;
+}
+/* line 21, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000321}}
+#rft.claro .rftIndexMenuMask .label {
+  color: #999999;
+  font-size: 32px;
+  height: 32px;
+  line-height: 32px;
+  margin-top: 184px;
+  float: left;
+}
+/* line 30, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000330}}
+#rft.claro .rftIndexMenuMask .rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32.png');
+  float: left;
+  margin: 184px 8px 0 8px;
+}
+/* line 36, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000336}}
+#rft.claro .rftIndexMenuButton {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  -ms-transition: all 0.3s;
+  transition: all 0.3s;
+  line-height: 32px;
+  border: none;
+}
+/* line 43, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000343}}
+#rft.claro .rftIndexMenuButton .dijitButtonNode {
+  border: none;
+  color: #999999;
+  font-size: 22px;
+}
+/* line 48, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000348}}
+#rft.claro .rftIndexMenuButton .dijitButtonNode .dijitButtonContents {
+  vertical-align: top;
+}
+/* line 51, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000351}}
+#rft.claro .rftIndexMenuButton .dijitButtonNode .dijitButtonContents .dijitButtonText {
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+/* line 56, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000356}}
+#rft.claro .rftIndexMenuButton .dijitButtonNode .dijitButtonContents .rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32.png');
+  margin: 0 8px;
+}
+/* line 74, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000374}}
+#rft.claro .rftIndexMenuButton.oneHeight {
+  height: 100px;
+  width: 400px;
+}
+/* line 69, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000369}}
+#rft.claro .rftIndexMenuButton.oneHeight .dijitButtonNode {
+  margin: 38px 0 0 0;
+}
+/* line 77, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000377}}
+#rft.claro .rftIndexMenuButton.twoHeight {
+  height: 200px;
+  width: 400px;
+}
+/* line 69, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000369}}
+#rft.claro .rftIndexMenuButton.twoHeight .dijitButtonNode {
+  margin: 88px 0 0 0;
+}
+/* line 80, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000380}}
+#rft.claro .rftIndexMenuButton.fourHeight {
+  height: 400px;
+  width: 400px;
+}
+/* line 69, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000369}}
+#rft.claro .rftIndexMenuButton.fourHeight .dijitButtonNode {
+  margin: 188px 0 0 0;
+}
+/* line 84, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000384}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover {
+  color: #ffffff;
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+}
+/* line 87, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000387}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover .dijitButtonText {
+  color: #ffffff;
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+}
+/* line 92, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000392}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover.blue {
+  background-color: #0072bc;
+}
+/* line 95, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000395}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover.red {
+  background-color: #8c0310;
+}
+/* line 98, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\0000398}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover.green {
+  background-color: #25a000;
+}
+/* line 101, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\00003101}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover.orange {
+  background-color: #ff5b12;
+}
+/* line 104, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\00003104}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonHover.purple {
+  background-color: #6529b7;
+}
+/* line 109, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\00003109}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonActive {
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  -ms-transition: all 0.3s;
+  transition: all 0.3s;
+  color: #111111;
+  background: #ffffff;
+}
+/* line 110, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/IndexMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/IndexMenu\.less}line{font-family:\00003110}}
+#rft.claro .rftIndexMenuButton.rftIndexMenuButtonActive .rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32b.png');
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/MainMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/MainMenu\.less}line{font-family:\000033}}
+#rft.claro .dijitMenuBar .rftMainMenuButton {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+  border: none;
+  height: 30px;
+  width: auto;
+  background: transparent;
+  color: #999999;
+  text-align: center;
+  font-size: 24px;
+  line-height: 30px;
+  padding: 0 4px;
+  margin: 0 5px;
+}
+/* line 17, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/MainMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/MainMenu\.less}line{font-family:\0000317}}
+#rft.claro .dijitMenuBar .rftMainMenuButton.dijitMenuItemHover,
+#rft.claro .dijitMenuBar .rftMainMenuButton.dijitMenuitemActive {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/MainMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/MainMenu\.less}line{font-family:\0000322}}
+#rft.claro .dijitMenuBar .rftMainMenuButton.dijitMenuItemHover {
+  color: #ffffff;
+  font-size: 26px;
+}
+/* line 27, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/MainMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/MainMenu\.less}line{font-family:\0000327}}
+#rft.claro .dijitMenuBar .rftMainMenuButton.dijitMenuItemActive {
+  color: #0072bc;
+  font-size: 26px;
+}
+/* line 31, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/MainMenu.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/MainMenu\.less}line{font-family:\0000331}}
+#rft.claro .dijitMenuBar .rftMainMenuButton.dijitMenuItemSelected {
+  font-size: 26px;
+  color: #ffffff;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\000031}}
+#rft.claro .topbar {
+  overflow-y: hidden;
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\000035}}
+#rft.claro .topbar h1 {
+  float: left;
+  clear: left;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\0000310}}
+#rft.claro .topbar .dijitMenuBar {
+  border: none;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  background-color: transparent;
+  float: right;
+  clear: right;
+  margin-top: 16px;
+}
+/* line 18, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\0000318}}
+#rft.claro .topbar .breadcrumbs {
+  color: #999999;
+}
+/* line 20, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\0000320}}
+#rft.claro .topbar .breadcrumbs .breadcrumb {
+  font-size: 13px;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\0000322}}
+#rft.claro .topbar .breadcrumbs .breadcrumb.breadcrumbCurrent {
+  color: #ffffff;
+  font-size: 15px;
+}
+/* line 26, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/ui/topbar.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/ui\/topbar\.less}line{font-family:\0000326}}
+#rft.claro .topbar .breadcrumbs .breadcrumb.breadcrumbHover {
+  color: #0072bc;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/MultipleChoiceWidget\.less}line{font-family:\000031}}
+#rft.claro .rftMultipleChoiceWidget {
+  display: table;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/MultipleChoiceWidget\.less}line{font-family:\000033}}
+#rft.claro .rftMultipleChoiceWidget .row {
+  display: table-row;
+}
+/* line 6, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/MultipleChoiceWidget\.less}line{font-family:\000036}}
+#rft.claro .rftMultipleChoiceWidget .rowBox {
+  display: table-cell;
+}
+/* line 9, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/MultipleChoiceWidget\.less}line{font-family:\000039}}
+#rft.claro .rftMultipleChoiceWidget .rowText {
+  display: table-cell;
+  width: 100px;
+}
+/* line 13, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/MultipleChoiceWidget\.less}line{font-family:\0000313}}
+#rft.claro .rftMultipleChoiceWidget .rowBtn {
+  display: table-cell;
+  width: 30px;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/lists/List.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/lists\/List\.less}line{font-family:\000031}}
+#rft.claro .rftLineListView {
+  max-width: 300px;
+  max-height: 500px;
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/lists/List.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/lists\/List\.less}line{font-family:\000035}}
+#rft.claro .rftLineListView .rftLineListViewContent {
+  width: auto;
+  overflow: auto;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\000033}}
+#rft.claro .rftSelector {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  margin: 4px;
+}
+/* line 13, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000313}}
+#rft.claro .rftSelector .rftLineWithActions {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+}
+/* line 15, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000315}}
+#rft.claro .rftSelector .rftLineWithActions.dojoDndItem.dojoDndItemAnchor {
+  background-color: #ffffff;
+}
+/* line 22, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000322}}
+#rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  float: left;
+  width: 8px;
+  height: 24px;
+  background-color: #bedead;
+}
+/* line 29, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000329}}
+#rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.conflict {
+  background-color: #ff0000;
+}
+/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000332}}
+#rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.pending {
+  background-color: #ff8000;
+}
+/* line 35, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000335}}
+#rft.claro .rftSelector .rftSelectorSelected .rftSelectorIndicator.success {
+  background-color: #00ff00;
+}
+/* line 44, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000344}}
+#rft.claro .rftSelector .rftSelectorOptions .rftLineWithActions,
+#rft.claro .rftSelector .rftSelectorSelected .rftLineWithActions {
+  background-color: #ffffff;
+  color: #111111;
+}
+/* line 53, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/Selector.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/Selector\.less}line{font-family:\0000353}}
+#rft.claro .rftSelector .rftSelectorOptions .rftLineWithActions .rftInlineButton .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16b.png');
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/ObjectBox.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/ObjectBox\.less}line{font-family:\000031}}
+#rft.claro .rftObjectBox {
+  margin: 8px 0;
+}
+/* line 9, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/ObjectBox.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/ObjectBox\.less}line{font-family:\000039}}
+#rft.claro .rftObjectBox .rftLineWithActions {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\000033}}
+#rft.claro .rftLargeButton {
+  border: none;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  margin-right: 16px;
+  height: 24px;
+  padding: 3px;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000310}}
+#rft.claro .rftLargeButton*,
+#rft.claro .rftLargeButton * {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+/* line 17, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000317}}
+#rft.claro .rftLargeButton .dijitButtonNode {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  border: none;
+  height: 24px;
+  background: transparent;
+  color: #999999;
+  font-size: 20px;
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  -ms-transition: all 0.3s;
+  transition: all 0.3s;
+}
+/* line 27, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000327}}
+#rft.claro .rftLargeButton .dijitButtonNode .rftIcon {
+  width: 24px;
+  height: 24px;
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons24.png');
+}
+/* line 31, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000331}}
+#rft.claro .rftLargeButton .dijitButtonNode .dijitButtonText {
+  line-height: 24px;
+  margin: 0 0 0 24px;
+  padding-left: 8px;
+  display: block;
+}
+/* line 39, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000339}}
+#rft.claro .rftLargeButton.black .dijitButtonNode .rftIcon {
+  width: 24px;
+  height: 24px;
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons24b.png');
+}
+/* line 43, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000343}}
+#rft.claro .rftLargeButton.rftLargeButtonHover .dijitButtonNode,
+#rft.claro .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+}
+/* line 50, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000350}}
+#rft.claro span.blue.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+#rft.claro .blue .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  color: #0794d1;
+}
+/* line 54, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000354}}
+#rft.claro span.orange.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+#rft.claro .orange .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  color: #ff9140;
+}
+/* line 58, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000358}}
+#rft.claro span.green.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+#rft.claro .green .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  color: #63c400;
+}
+/* line 62, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000362}}
+#rft.claro span.red.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+#rft.claro .red .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  color: #bd0013;
+}
+/* line 66, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LargeButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LargeButton\.less}line{font-family:\0000366}}
+#rft.claro span.purple.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+#rft.claro .purple .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+  color: #993dec;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\000031}}
+#rft.claro .rftBlockButton {
+  border: none;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  margin: 0 0 0 0;
+  height: 24px;
+  vertical-align: top;
+}
+/* line 8, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\000038}}
+#rft.claro .rftBlockButton .dijitButtonContents {
+  height: 24px;
+}
+/* line 12, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\0000312}}
+#rft.claro .rftBlockButton .dijitButtonNode {
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  -webkit-transition: all 0.3s;
+  -moz-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  -ms-transition: all 0.3s;
+  transition: all 0.3s;
+  line-height: 24px;
+  vertical-align: top;
+  height: 24px;
+  padding: 0 4px;
+  border: none;
+  color: #ffffff;
+  font-size: 13px;
+}
+/* line 23, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\0000323}}
+#rft.claro .rftBlockButton .dijitButtonNode .dijitButtonText {
+  line-height: 24px;
+}
+/* line 27, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\0000327}}
+#rft.claro .rftBlockButton .dijitButtonNode .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16.png');
+}
+/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\0000332}}
+#rft.claro .rftBlockButton.rftBlockButtonHover,
+#rft.claro .rftBlockButton.rftBlockButtonActive {
+  -webkit-transition: all 0.1s;
+  -moz-transition: all 0.1s;
+  -o-transition: all 0.1s;
+  -ms-transition: all 0.1s;
+  transition: all 0.1s;
+}
+/* line 35, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/BlockButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/BlockButton\.less}line{font-family:\0000335}}
+#rft.claro .rftBlockButton.rftBlockButtonHover .rftIcon,
+#rft.claro .rftBlockButton.rftBlockButtonActive .rftIcon {
+  vertical-align: top;
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16b.png');
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/InlineButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/InlineButton\.less}line{font-family:\000031}}
+#rft.claro .rftInlineButton {
+  float: right;
+  height: 24px;
+  width: 24px;
+}
+/* line 6, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/InlineButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/InlineButton\.less}line{font-family:\000036}}
+#rft.claro .rftInlineButton .dijitButtonNode {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  width: 24px;
+  height: 24px;
+  border: none;
+}
+/* line 14, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/InlineButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/InlineButton\.less}line{font-family:\0000314}}
+#rft.claro .rftInlineButton .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16.png');
+}
+/* line 17, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/InlineButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/InlineButton\.less}line{font-family:\0000317}}
+#rft.claro .rftInlineButton.white .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16.png');
+}
+/* line 20, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/InlineButton.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/InlineButton\.less}line{font-family:\0000320}}
+#rft.claro .rftInlineButton.black .rftIcon {
+  width: 16px;
+  height: 16px;
+  margin: 4px 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons16b.png');
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\000035}}
+#rft.claro .rftLineWithActions {
+  border: none;
+  background-image: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-radius: 0;
+  position: relative;
+  height: 24px;
+  white-space: nowrap;
+  margin: 4px 0;
+  color: #ffffff;
+  background-color: #0072bc;
+}
+/* line 14, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000314}}
+#rft.claro .rftLineWithActions.dojoDndItem {
+  -webkit-transition: all 0.2s;
+  -moz-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  -ms-transition: all 0.2s;
+  transition: all 0.2s;
+}
+/* line 17, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000317}}
+#rft.claro .rftLineWithActions.dojoDndItem.dojoDndItemBefore {
+  margin-top: 6px;
+  border-top: 6px solid #ffffff;
+}
+/* line 21, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000321}}
+#rft.claro .rftLineWithActions.dojoDndItem.dojoDndItemAfter {
+  margin-bottom: 6px;
+  border-bottom: 6px solid #ffffff;
+}
+/* line 25, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000325}}
+#rft.claro .rftLineWithActions.dojoDndItem.dojoDndItemover,
+#rft.claro .rftLineWithActions.dojoDndItem.dojoDndItemAnchor {
+  background-image: none;
+  border: none;
+  padding: 2px;
+  background-color: rgba(255, 255, 255, 0.1);
+}
+/* line 34, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000334}}
+#rft.claro .rftLineWithActions .rftLineWithActionsTitle {
+  float: left;
+  margin: 0 8px;
+  overflow: hidden;
+  white-space: nowrap;
+  word-wrap: break-word;
+  line-height: 24px;
+}
+/* line 43, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000343}}
+#rft.claro .rftLineWithActions .rftLineWithActionsButtons {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  line-height: 24px;
+  height: 24px;
+  position: absolute;
+  right: 0;
+  float: left;
+}
+/* line 55, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/widgets/LineWithActions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/widgets\/LineWithActions\.less}line{font-family:\0000355}}
+#rft.claro .dojoDndSourceMoved .rftLineWithActions.dojoDndItemAnchor {
+  height: 0;
+}
+/* line 2, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\000032}}
+#rft.claro .qedScaleWidget table {
+  text-align: center;
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\000035}}
+#rft.claro .qedScaleWidget th {
+  font-weight: normal;
+}
+/* line 6, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\000036}}
+#rft.claro .qedScaleWidget .item {
+  text-align: left;
+  min-width: 10em;
+  max-width: 15em;
+}
+/* line 11, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\0000311}}
+#rft.claro .qedScaleWidget .min {
+  text-align: right;
+  padding-left: 2em;
+}
+/* line 12, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\0000312}}
+#rft.claro .qedScaleWidget .max {
+  text-align: left;
+  padding-right: 2em;
+}
+/* line 13, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\0000313}}
+#rft.claro .qedScaleWidget .na {
+  text-align: center;
+}
+/* line 15, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/ScaleWidget.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/ScaleWidget\.less}line{font-family:\0000315}}
+#rft.claro .qedScaleWidget .dijitTextBox {
+  width: 10em;
+}
+/* line 3, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/QuestionListView.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/QuestionListView\.less}line{font-family:\000033}}
+#rft.claro .rftSurveyListView .rftSurveyListViewContent {
+  min-height: 300px;
+  background: #444444;
+  overflow: auto;
+}
+/* line 2, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/QuestionEditor.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/QuestionEditor\.less}line{font-family:\000032}}
+#rft.claro .qedQuestionEditorPreviewItem {
+  overflow: hidden;
+}
+/* line 6, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/model/widgets/QuestionEditor.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/model\/widgets\/QuestionEditor\.less}line{font-family:\000036}}
+#rft.claro .surveyEditorPreview {
+  overflow-y: auto;
+}
+/* line 5, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/questions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/questions\.less}line{font-family:\000035}}
+#rft.claro .page_questions .rftSelector .rftSelectorCategory .rftLineWithActions {
+  background-color: #ff5b12;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/questions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/questions\.less}line{font-family:\0000310}}
+#rft.claro .page_questions .rftSelector .rftSelectorSelected .rftLineWithActions {
+  background-color: #ffffff;
+  color: #111111;
+}
+/* line 15, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/questions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/questions\.less}line{font-family:\0000315}}
+#rft.claro .page_questions .rftSelector .rftSelectorSelected .rftBlockButton {
+  background-color: #ff00ff;
+}
+/* line 78, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000378}}
+#rft.claro .page_questions .rftSelector .rftSelectorSelected .rftBlockButton .dijitButtonNode {
+  background-color: #ff5b12;
+}
+/* line 83, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000383}}
+#rft.claro .page_questions .rftSelector .rftSelectorSelected .rftBlockButton.dijitHover .dijitButtonNode {
+  background-color: #ffffff;
+  color: #111111;
+}
+/* line 89, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000389}}
+#rft.claro .page_questions .rftSelector .rftSelectorSelected .rftBlockButton.dijitActive .dijitButtonNode {
+  background-color: #ff9140;
+  color: #ffffff;
+}
+/* line 4, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/sessions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/sessions\.less}line{font-family:\000034}}
+#rft.claro .page_sessions .rftObjectBox {
+  padding: 0 0 0 0;
+  color: #ffffff;
+}
+/* line 8, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/sessions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/sessions\.less}line{font-family:\000038}}
+#rft.claro .page_sessions .rftObjectBox .typeIcon.rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32.png');
+}
+/* line 12, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/sessions.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/sessions\.less}line{font-family:\0000312}}
+#rft.claro .page_sessions .rftObjectBox .rftLineWithActions {
+  background-color: #25a000;
+}
+/* line 78, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000378}}
+#rft.claro .page_sessions .rftObjectBox .rftLineWithActions .rftBlockButton .dijitButtonNode {
+  background-color: #25a000;
+}
+/* line 83, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000383}}
+#rft.claro .page_sessions .rftObjectBox .rftLineWithActions .rftBlockButton.dijitHover .dijitButtonNode {
+  background-color: #ffffff;
+  color: #111111;
+}
+/* line 89, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/mixins.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/mixins\.less}line{font-family:\0000389}}
+#rft.claro .page_sessions .rftObjectBox .rftLineWithActions .rftBlockButton.dijitActive .dijitButtonNode {
+  background-color: #63c400;
+  color: #ffffff;
+}
+/* line 1, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\000031}}
+#rft.claro .rftSessionObject {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  width: 100px;
+  height: 100px;
+  background: #999999;
+  margin: 8px;
+  display: inline-block;
+}
+/* line 10, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000310}}
+#rft.claro .rftSessionObject .rftIcon {
+  width: 32px;
+  height: 32px;
+  margin: 0;
+  padding: 0 0 0 0;
+  background-image: url('images/icons/rftIcons32.png');
+  margin: 8px 34px 0 34px;
+}
+/* line 16, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000316}}
+#rft.claro .rftSessionObject label {
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  float: left;
+  clear: both;
+  width: 100px;
+  text-align: center;
+  color: #ffffff;
+  overflow: hidden;
+}
+/* line 26, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000326}}
+#rft.claro .rftSessionObject.blue {
+  background-color: #0072bc;
+}
+/* line 28, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000328}}
+#rft.claro .rftSessionObject.blue.selected {
+  background-color: #0794d1;
+}
+/* line 32, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000332}}
+#rft.claro .rftSessionObject.green {
+  background-color: #25a000;
+}
+/* line 34, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000334}}
+#rft.claro .rftSessionObject.green.selected {
+  background-color: #63c400;
+}
+/* line 38, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000338}}
+#rft.claro .rftSessionObject.red {
+  background-color: #8c0310;
+}
+/* line 40, /home/hendrik/gamelab/qed.svn/Dev/trunk/src/qed-client/css/pages/session.less */
+@media -sass-debug-info{filename{font-family:file\:\/\/\/home\/hendrik\/gamelab\/qed\.svn\/Dev\/trunk\/src\/qed-client\/css\/pages\/session\.less}line{font-family:\0000340}}
+#rft.claro .rftSessionObject.red.selected {
+  background-color: #bd0013;
+}
Index: Dev/trunk/src/qed-client/css/qed.less
===================================================================
--- Dev/trunk/src/qed-client/css/qed.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/qed.less	(revision 443)
@@ -0,0 +1,39 @@
+// Variables, mixins and configuration
+@import "variables.less";
+@import "mixins.less";
+@import "colors.less";
+
+// Claro and Dijit/DojoX widgets
+@import "dijit/claro.css";
+@import "dijit/overrides.less";
+@import "dijit/ContentPane.less";
+@import "dijit/TabContainer.less";
+@import "dijit/MenuPopup.less";
+@import "dijit/TitleGroup.less";
+
+// General
+@import "fonts.less";
+@import "icons.less";
+@import "layout.less";
+@import "forms.less";
+
+// Widgets
+@import "ui/IndexMenu.less";
+@import "ui/MainMenu.less";
+@import "ui/topbar.less";
+@import "widgets/MultipleChoiceWidget.less";
+@import "widgets/lists/List.less";
+@import "widgets/Selector.less";
+@import "widgets/ObjectBox.less";
+@import "widgets/LargeButton.less";
+@import "widgets/BlockButton.less";
+@import "widgets/InlineButton.less";
+@import "widgets/LineWithActions.less";
+@import "model/widgets/ScaleWidget.less";
+@import "model/widgets/QuestionListView.less";
+@import "model/widgets/QuestionEditor.less";
+
+// Pages
+@import "pages/questions.less";
+@import "pages/sessions.less";
+@import "pages/session.less";
Index: Dev/trunk/src/qed-client/css/ui/IndexMenu.less
===================================================================
--- Dev/trunk/src/qed-client/css/ui/IndexMenu.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/ui/IndexMenu.less	(revision 443)
@@ -0,0 +1,120 @@
+#rft.claro {
+    .rftIndexMenuBlock {
+        width: @indexmenu_blockwidth;
+        height: @indexmenu_blockheight;
+        background: @base1;
+        float: left;
+        margin: @indexmenu_blockmargin;
+        overflow: hidden;
+
+        &:hover .rftIndexMenuMask {
+            margin-top: -@indexmenu_blockheight;
+        }
+    }
+    .rftIndexMenuMask {
+        width: @indexmenu_blockwidth;
+        height: @indexmenu_blockheight;
+        background: @base1;
+        color: @headers;
+        margin-top: 0;
+
+        .label {
+            color: @headers;
+            font-size: @indexmenu_font_size;
+            height: @indexmenu_font_size;
+            line-height: @indexmenu_font_size;
+            margin-top: (@indexmenu_blockheight - @indexmenu_font_size) / 2;
+            float: left;
+        }
+
+        .rftIcon {
+            .setIcon(32px);
+            float: left;
+            margin: ((@indexmenu_blockheight - @indexmenu_font_size)/2) 8px 0 8px;
+        }
+    }
+    .rftIndexMenuButton {
+        .flatShading;
+        .noOffset;
+        .transition (0.3s);
+        line-height: @button_indexmenu_height;
+        border: none;
+
+        .dijitButtonNode {
+            border: none;
+            color: @headers;
+            font-size: @h2Size;
+
+            .dijitButtonContents {
+                vertical-align: top;
+
+                .dijitButtonText {
+                    padding-bottom: 10px;
+                    line-height: 20px;
+                }
+
+                .rftIcon {
+                    .setIcon (32px);
+                    margin: 0 @std_offset_big;
+                }
+            }
+
+        }
+
+        .indexMenuMixin (@number) when (@number > 0){
+            @height: @indexmenu_blockheight / @number;
+            height: @height;
+            width: @indexmenu_blockwidth;
+                
+            .dijitButtonNode {
+                margin: ((@height - @button_indexmenu_content_size)/2) 0 0 0;
+            }
+        }
+
+        &.oneHeight {
+            .indexMenuMixin (4);
+        }
+        &.twoHeight {
+            .indexMenuMixin (2);
+        }
+        &.fourHeight {
+            .indexMenuMixin (1);
+        }
+
+        &.rftIndexMenuButtonHover {
+            color: @text;
+            .transition (0.1s);
+            .dijitButtonText {
+                color: @text;
+                .transition(0.1s);
+            }
+
+            &.blue {
+                background-color: @blue;
+            }
+            &.red {
+                background-color: @red;
+            }
+            &.green {
+                background-color: @green;
+            }
+            &.orange {
+                background-color: @orange;
+            }
+            &.purple {
+                background-color: @purple;
+            }
+        }
+
+        &.rftIndexMenuButtonActive {
+            .rftIcon {
+                .setIcon (32px, black);
+            }
+            .transition(0.3s);
+            color: @darkest;
+            background: @text;
+
+        }
+
+    }
+}
Index: Dev/trunk/src/qed-client/css/ui/MainMenu.less
===================================================================
--- Dev/trunk/src/qed-client/css/ui/MainMenu.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/ui/MainMenu.less	(revision 443)
@@ -0,0 +1,36 @@
+#rft.claro {
+
+    .dijitMenuBar .rftMainMenuButton {
+        .flatShading;
+        .transition (0.1s);
+        border: none;
+        height: @button_mainmenu_height;
+        width: auto;
+        background: transparent;
+        color: @headers;
+        text-align: center;
+        font-size: @button_mainmenu_font_size;
+        line-height: @button_mainmenu_height;
+        padding: 0 @button_mainmenu_padding;
+        margin: 0 @button_mainmenu_spacing;
+
+        &.dijitMenuItemHover, 
+        &.dijitMenuitemActive {
+            .transition (0.1s);
+        }
+
+        &.dijitMenuItemHover {
+            color: @text;
+            font-size: @button_mainmenu_font_size + @button_mainmenu_font_grow;
+        }
+
+        &.dijitMenuItemActive {
+            color: @blue;
+            font-size: @button_mainmenu_font_size + @button_mainmenu_font_grow;
+        }
+        &.dijitMenuItemSelected {
+            font-size: @button_mainmenu_font_size + @button_mainmenu_font_grow;
+            color: @text;
+        }
+    }
+}
Index: Dev/trunk/src/qed-client/css/ui/topbar.less
===================================================================
--- Dev/trunk/src/qed-client/css/ui/topbar.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/ui/topbar.less	(revision 443)
@@ -0,0 +1,31 @@
+#rft.claro .topbar {
+
+    overflow-y: hidden;
+
+    h1 {
+        float: left;
+        clear: left;
+    }
+    
+    .dijitMenuBar {
+        .flatShading;
+        background-color: transparent;
+        float: right;
+        clear: right;
+        margin-top: 16px;
+    }
+
+    .breadcrumbs {
+        color: @headers;
+        .breadcrumb {
+            font-size: @font_size;
+            &.breadcrumbCurrent {
+                color: @text;
+                font-size: round(@font_size * 1.125);
+            }
+            &.breadcrumbHover {
+                color: @blue;
+            }
+        }
+    }
+}
Index: Dev/trunk/src/qed-client/css/variables.less
===================================================================
--- Dev/trunk/src/qed-client/css/variables.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/variables.less	(revision 443)
@@ -0,0 +1,78 @@
+// Graytones
+@darkest: #111111;
+@base: #333333;
+@base1: #444444;
+@base2: #555555;
+@headers: #999999;
+@text: #ffffff;
+
+// Colours
+@blue: #0072bc;
+@blue_light: #0794d1;
+// @green: #3aa605;					For now use the newer colours. Almost negligible difference, but looks better on non-calibrated monitors
+// @green_light: #79ca0a;
+@green: #25a000;
+@green_light: #63c400;
+
+@orange: #ff5b12;
+@orange_light: #ff9140;
+@purple: #6529b7;
+@purple_light: #993dec;
+@red: #8c0310;
+@red_light: #bd0013;
+
+// Layout related
+@std_height: 24px;
+@std_offset: 4px;
+@std_offset_big: 8px;
+@transition_time: 0.2s;
+@tab_height: 30px;
+@tab_width: 200px;
+
+// Headers and fonts
+@h1Size: 48px;
+@h2Size: 22px;
+@h3Size: 18px;
+@h4Size: 16px;
+@font_size: 13px;
+@font: 'Segoe UI', Helvetica, Verdana, Arial, sans-serif;
+
+// Icons
+@icon_mainSize: 32px;
+@icon_midSize: 24px;
+@icon_smallSize: 16px;
+
+// IndexMenu
+@indexmenu_blockheight: 400px;
+@indexmenu_blockwidth: 400px;
+@indexmenu_blockmargin: 16px;
+@indexmenu_font_size: 32px;
+
+// Mainmenu
+@button_mainmenu_height: 30px;
+@button_mainmenu_spacing: 5px;
+@button_mainmenu_padding: 4px;
+@button_mainmenu_font_size: 24px;
+@button_mainmenu_font_grow: @button_mainmenu_font_size / 12;
+
+// Index menu
+@button_indexmenu_height: 32px;
+@button_indexmenu_content_size: 24px;
+@button_indexmenu_font_size: @h1Size;
+
+// SessionObject
+@sessionobject_size: 100px;
+@sessionObject_spacing: 2 * @std_offset_big;
+
+// Buttons
+@button_large_height: 24px;
+@button_large_spacing: @std_offset_big * 2;
+@button_large_font_size: @button_large_height / 1.2;
+
+@button_block_height: 24px;
+@button_block_spacing: 0;
+@button_block_font_size: @font_size;
+
+@button_inline_height: 24px;
+@button_inline_spacing: 0;
+@button_inline_font_size: @font_size;
Index: Dev/trunk/src/qed-client/css/widgets/BlockButton.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/BlockButton.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/BlockButton.less	(revision 443)
@@ -0,0 +1,58 @@
+#rft.claro .rftBlockButton {
+        
+    .flatShading;
+    .noMargin;
+    height: @button_block_height;
+    vertical-align: top;
+
+    .dijitButtonContents {
+        height: 24px;
+    }
+
+    .dijitButtonNode {
+        .flatShading;
+        .transition (0.3s);
+        line-height: @button_block_height;
+        vertical-align: top;
+        height: @button_block_height;
+        padding: 0 @std_offset;
+        border: none;
+        color: @text;
+        font-size: @button_block_font_size;
+
+        .dijitButtonText {
+            line-height: @button_block_height;
+        }
+
+        .rftIcon {
+            .setIcon(16px);
+        }
+    }
+
+    &.rftBlockButtonHover, 
+    &.rftBlockButtonActive {
+        .transition (0.1s);
+        .rftIcon {
+            vertical-align: top;
+            .setIcon(16px, black);
+        }
+    }
+
+    //Disabled because this is presumably useless
+    // &.blue {
+    //     .blockButtonColorMixin ("blue");
+    // }
+    // &.green {
+    //     .blockButtonColorMixin ("green");
+    // }
+    // &.orange {
+    //     .blockButtonColorMixin ("orange");
+    // }
+    // &.red {
+    //     .blockButtonColorMixin ("red");
+    // }
+    // &.purple {
+    //     .blockButtonColorMixin ("purple");
+    // }
+
+}
Index: Dev/trunk/src/qed-client/css/widgets/InlineButton.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/InlineButton.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/InlineButton.less	(revision 443)
@@ -0,0 +1,29 @@
+#rft.claro .rftInlineButton {
+    float: right;
+    height: @button_inline_height;
+    width: @button_inline_height;
+
+    .dijitButtonNode {
+        .noOffset;
+        .flatShading;
+        width: @button_inline_height;
+        height: @button_inline_height;
+        border: none;
+    }
+
+    .rftIcon {
+        .setIcon(16px);
+    }
+    &.white .rftIcon {
+        .setIcon(16px);
+    }
+    &.black .rftIcon {
+        .setIcon(16px, black);
+    }
+
+    &.dijitHover {
+        .rftIcon {
+            // outline: @headers solid thin;
+        }
+    }
+}
Index: Dev/trunk/src/qed-client/css/widgets/LargeButton.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/LargeButton.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/LargeButton.less	(revision 443)
@@ -0,0 +1,71 @@
+#rft.claro {
+
+    .rftLargeButton {
+
+        .flatShading;
+        margin-right: @button_large_spacing;
+        height: @button_large_height;
+        padding: 3px;
+
+        &*, * {
+            -webkit-user-select: none;
+            -moz-user-select: none;
+            -ms-user-select: none;
+            user-select: none;
+        }
+
+        .dijitButtonNode {
+
+            .flatShading;
+            border: none;
+            height: @button_large_height;
+            background: transparent;
+            color: @headers;
+            font-size: @button_large_font_size;
+            .transition(0.3s);
+
+            .rftIcon {
+                .setIcon(24px);
+            }
+
+            .dijitButtonText {
+                line-height: @button_large_height;
+                margin: 0 0 0 @button_large_height;
+                padding-left: @std_offset_big;
+                display: block;
+            }
+        }
+        
+        &.black .dijitButtonNode .rftIcon {
+            .setIcon(24px, black);
+        }
+
+        &.rftLargeButtonHover .dijitButtonNode,
+        &.rftLargeButtonActive .dijitButtonNode {
+            .transition (0.1s);
+        }
+    }
+
+    //colors on hover
+    span.blue.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+    .blue .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+        color: @blue_light;
+    }
+    span.orange.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+    .orange .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+        color: @orange_light;
+    }
+    span.green.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+    .green .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+        color: @green_light;
+    }
+    span.red.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+    .red .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+        color: @red_light;
+    }
+    span.purple.rftLargeButton.rftLargeButtonActive .dijitButtonNode,
+    .purple .rftLargeButton.rftLargeButtonActive .dijitButtonNode {
+        color: @purple_light;
+    }
+
+}
Index: Dev/trunk/src/qed-client/css/widgets/LineWithActions.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/LineWithActions.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/LineWithActions.less	(revision 443)
@@ -0,0 +1,59 @@
+@dndBorderSize: 6px;
+
+#rft.claro {
+
+    .rftLineWithActions {
+        .flatShading();
+        position: relative;
+        height: @std_height;
+        white-space: nowrap;
+        margin: @std_offset 0;
+        color: @text;
+        .bgColor("blue");
+
+        &.dojoDndItem {
+            .transition;
+
+            &.dojoDndItemBefore {
+                margin-top: @dndBorderSize;
+                border-top: @dndBorderSize solid @text;
+            }
+            &.dojoDndItemAfter {
+                margin-bottom: @dndBorderSize;
+                border-bottom: @dndBorderSize solid @text;
+            }
+            &.dojoDndItemover, &.dojoDndItemAnchor {
+                background-image: none;
+                border: none;
+                padding: 2px;
+                background-color: fade(#fff, 10%);    // Not sure if this will work.
+                // This is an attempt to lighten the rftLWA's colour by overlaying with transparent white.
+            }
+        }
+
+        .rftLineWithActionsTitle {
+            float: left;
+            margin: 0 8px;
+            overflow: hidden;
+            white-space: nowrap;
+            word-wrap: break-word;
+            line-height: 24px;
+        }
+
+        .rftLineWithActionsButtons {
+            .noOffset();
+            line-height: @std_height;
+            height: @std_height;
+            position: absolute;
+            right: 0;
+            float: left;
+        }
+    }
+
+    // Make the currently lineWithActions draggable "wipe out" when dragging, so only the Avatar is visible!
+    .dojoDndSourceMoved {
+        .rftLineWithActions.dojoDndItemAnchor {
+            height: 0;
+        }
+    }    
+}
Index: Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/MultipleChoiceWidget.less	(revision 443)
@@ -0,0 +1,17 @@
+#rft.claro .rftMultipleChoiceWidget {
+    display: table;
+    .row {
+        display: table-row;
+    }
+    .rowBox {
+        display: table-cell;
+    }
+    .rowText {
+        display: table-cell;
+        width: 100px;
+    }
+    .rowBtn {
+        display: table-cell;
+        width: 30px;
+    }
+}
Index: Dev/trunk/src/qed-client/css/widgets/ObjectBox.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/ObjectBox.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/ObjectBox.less	(revision 443)
@@ -0,0 +1,12 @@
+#rft.claro .rftObjectBox {
+    margin: @std_offset_big 0;
+
+    .typeIcon {
+        // .setIcon (32px);
+		// margin: 20px @std_offset_big;
+    }
+
+    .rftLineWithActions {
+        .noOffset;
+    }
+}
Index: Dev/trunk/src/qed-client/css/widgets/Selector.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/Selector.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/Selector.less	(revision 443)
@@ -0,0 +1,59 @@
+//Variables
+
+#rft.claro .rftSelector {
+
+    @indicatorWidth: 8px;
+    @colorConflict: #ff0000;
+    @colorPending: #ff8000;
+    @colorSuccess: #00ff00;
+
+    .noOffset;
+    margin: @std_offset;
+
+    .rftLineWithActions {
+        .noOffset;
+        &.dojoDndItem.dojoDndItemAnchor {
+            background-color: @text;
+        }
+    }
+
+    .rftSelectorSelected {
+        // Operation indicator styling
+        .rftSelectorIndicator {
+            .noOffset;
+            float: left;
+            width: @indicatorWidth;
+            height: @std_height;
+            background-color: #bedead;
+
+            &.conflict {
+                background-color: @colorConflict;
+            }
+            &.pending {
+                background-color: @colorPending;
+            }
+            &.success {
+                background-color: @colorSuccess;
+            }
+        }
+    }
+
+    // Set dropdown background and text color to black on white
+    .rftSelectorOptions, .rftSelectorSelected {
+
+        .rftLineWithActions {
+            background-color: @text;
+            color: @darkest;
+        }
+    }
+
+    .rftSelectorOptions {
+        .rftLineWithActions {
+            .rftInlineButton {
+                .rftIcon {
+                    .setIcon (16px, black);
+                }
+            }
+        }
+    }
+}
Index: Dev/trunk/src/qed-client/css/widgets/lists/List.less
===================================================================
--- Dev/trunk/src/qed-client/css/widgets/lists/List.less	(revision 443)
+++ Dev/trunk/src/qed-client/css/widgets/lists/List.less	(revision 443)
@@ -0,0 +1,9 @@
+#rft.claro .rftLineListView {
+    max-width: 300px;
+    max-height: 500px;
+
+    .rftLineListViewContent {
+        width: auto;
+        overflow: auto;
+    }
+}
Index: Dev/trunk/src/qed-client/index.js
===================================================================
--- Dev/trunk/src/qed-client/index.js	(revision 443)
+++ Dev/trunk/src/qed-client/index.js	(revision 443)
@@ -0,0 +1,28 @@
+define([
+    'dojo/_base/array',
+    'dojo/parser',
+    './app/Content',
+    './app/Page',
+    './app/Router',
+    './ui/MainMenu',
+    './routes',
+    './store',
+    'dojo/domReady!',
+    './stddeps'
+],function(array,parser,Content,Page,Router,MainMenu,routes,store) {
+    parser.parse();
+
+    store.info()
+    .then(function(){
+        new MainMenu({},"menu").startup();
+        array.forEach(routes,function(route){
+            Router.register(route);
+        });
+        Router.startup();
+    },function(){
+        Content.startup();
+        Content.set(new Page({
+            templateString: "<div>Application database is not properly configured. Contact your system administrator.</div>"
+        }));
+    });
+});
Index: Dev/trunk/src/qed-client/lib/async.js
===================================================================
--- Dev/trunk/src/qed-client/lib/async.js	(revision 443)
+++ Dev/trunk/src/qed-client/lib/async.js	(revision 443)
@@ -0,0 +1,134 @@
+define([
+    'dojo/_base/array',
+    'dojo/_base/lang',
+    'dojo/when',
+    'dojo/Deferred'
+],function(array,lang,when,Deferred){
+
+    /** Execute possible async functions in sequence
+     * Execute functions in order. When a function returns a Promise,
+     * the next function is only executed when the promise resolves.
+     * If the function returns a value, the next function is executed
+     * synchronously. The return value of every function is passed as argument
+     * to the next.
+     * Returns the return value of the last function in the chain.
+     */
+    function seq(functions,ctx) {
+        var d = new Deferred();
+
+        var cancelled = false;
+        var running = null;
+        function cancel(err) {
+            if ( cancelled ) { return; }
+            cancelled = true;
+            if ( running && running.cancel && !running.isFulfilled() ) {
+                running.cancel();
+            }
+            d.reject(err);
+        }
+
+        function update(fs,arg) {
+            if ( cancelled ) { return; }
+            if ( fs.length > 0 ) {
+                try {
+                    var f = fs.shift();
+                    running = when(f.call(ctx,arg))
+                    .then(function(res){
+                        update(fs,res);
+                    },function(err){
+                        cancel(err);
+                    });
+                } catch(err) {
+                    cancel(err);
+                }
+            } else {
+                d.resolve(arg);
+            }
+        }
+
+        update(functions);
+
+        return d.promise;
+    }
+
+    /** Execute possible async functions in parallel
+     * Execute all functions in parallel, resolve only when all have resolved.
+     * NB. When a function is not async, it will fully complete before the next
+     * async function is started. If you mix async and non async functions, put
+     * the sync functions last to fully exploit the async ones.
+     * Return an array with all the return values of the functions.
+     */
+    function par(functions,ctx) {
+        var d; // later: Deferred
+        
+        var cancelled = false;
+        var running = [];
+        function cancel(err) {
+            if (cancelled) { return; }
+            cancelled = true;
+            array.forEach(running,function(running){
+                if ( running && running.cancel && !running.isFulfilled() ) {
+                    running.cancel();
+                }
+            });
+            d.reject(err);
+        }
+
+        d = new Deferred(cancel);
+
+        var results = [];
+        var left = functions.length;
+        function update(res,idx) {
+            if (cancelled) { return; }
+            results[idx] = res;
+            left -= 1; // Works because/as long as AJAX/JS is single-threaded.
+            if ( left === 0 ) {
+                d.resolve(results);
+            }
+        }
+
+        array.forEach(functions,function(f,idx){
+            if (cancelled) { return; }
+            try {
+                running.push(when(f.call(ctx)).then(function(res){
+                    update(res,idx);
+                },function(err){
+                    cancel(err);
+                }));
+            } catch (err) {
+                cancel();
+            }
+        });
+
+        return d.promise;
+    }
+
+    /** Iterate over an array with async callback
+     * Execute the callback and if it's async, wait until it's finished before
+     * executing the next one.
+     */
+    function forEach(list,callback,ctx) {
+        var fs = array.map(list,function(item,index,items){
+            return lang.hitch(ctx,callback,item,index,items);
+        });
+        return seq(fs);
+    }
+
+    /** Map a list, possible async
+     * Map every element of a list, returning a promise to the mapped list.
+     */
+    function map(list,callback,ctx) {
+        var fs = array.map(list,function(item,index,items){
+            return lang.hitch(ctx,callback,item,index,items);
+        });
+        return par(fs);
+    }
+
+    return {
+        seq: seq,
+        par: par,
+        forEach: forEach,
+        map: map
+    };
+
+});
Index: Dev/trunk/src/qed-client/lib/func.js
===================================================================
--- Dev/trunk/src/qed-client/lib/func.js	(revision 443)
+++ Dev/trunk/src/qed-client/lib/func.js	(revision 443)
@@ -0,0 +1,21 @@
+define(['dojo/_base/lang'],function(lang){
+
+    Function.prototype.compose = function(g) {
+        var f = this;
+        return function(){
+            return f(g.apply(arguments));
+        };
+    };
+
+    function modPropIf(object,prop,pred,map) {
+        var value = object[prop];
+        if ( pred(value) ) {
+            object[prop] = map(value);
+        }
+        return object;
+    }
+
+    return {
+        modPropIf: modPropIf
+    };
+});
Index: Dev/trunk/src/qed-client/model/classes/Question.js
===================================================================
--- Dev/trunk/src/qed-client/model/classes/Question.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/classes/Question.js	(revision 443)
@@ -0,0 +1,20 @@
+define(function(){
+    return {
+        create: function(){
+            return { type:'Question' };
+        },
+        DisplayTitle: {
+            get: function(q) {
+                return q.title || '';
+            }
+        },
+        Content: {
+            get: function(q) {
+                return q.content || [];
+            },
+            set: function(q,content) {
+                q.content = content;
+            }
+        }
+    };
+});
Index: Dev/trunk/src/qed-client/model/classes/Response.js
===================================================================
--- Dev/trunk/src/qed-client/model/classes/Response.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/classes/Response.js	(revision 443)
@@ -0,0 +1,17 @@
+define([],function(){
+    var SurveyRun = {
+        create: function(){
+            return { type:'Response' };
+        },
+        SurveyRun: {
+            get: function(r) {
+                return r.surveyRunId || null;
+            },
+            set: function(r,sr) {
+                r.surveyRunId = sr;
+                return r;
+            }
+        }
+    };
+    return SurveyRun;
+});
Index: Dev/trunk/src/qed-client/model/classes/SessionTemplate.js
===================================================================
--- Dev/trunk/src/qed-client/model/classes/SessionTemplate.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/classes/SessionTemplate.js	(revision 443)
@@ -0,0 +1,12 @@
+define(function(){
+    return {
+        create: function(){
+            return { type:'SessionTemplate' };
+        },
+        DisplayTitle: {
+            get: function(st) {
+                return st.title || '';
+            }
+        }
+    };
+});
Index: Dev/trunk/src/qed-client/model/classes/Survey.js
===================================================================
--- Dev/trunk/src/qed-client/model/classes/Survey.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/classes/Survey.js	(revision 443)
@@ -0,0 +1,20 @@
+define(function(){
+    return {
+        create: function(){
+            return { type:'Survey' };
+        },
+        DisplayTitle: {
+            get: function(s) {
+                return s.title || '';
+            }
+        },
+        Questions: {
+            get: function(s) {
+                return s.questions || [];
+            },
+            set: function(s,questions) {
+                s.questions = questions;
+            }
+        }
+    };
+});
Index: Dev/trunk/src/qed-client/model/classes/SurveyRun.js
===================================================================
--- Dev/trunk/src/qed-client/model/classes/SurveyRun.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/classes/SurveyRun.js	(revision 443)
@@ -0,0 +1,47 @@
+define(['dojo/_base/lang','dojo/date/locale','dojo/date/stamp'],function(lang,locale,stamp){
+    var SurveyRun = {
+        create: function(){
+            return { type:'SurveyRun' };
+        },
+        StartDate: {
+            get: function(sr) {
+                var d;
+                if ( sr.startDate ) {
+                    d = lang.isString(sr.startDate) ? stamp.fromISOString(sr.startDate) : sr.startDate;
+                }
+                return d;
+            }
+        },
+        EndDate: {
+            get: function(sr) {
+                var d;
+                if ( sr.endDate ) {
+                    d = lang.isString(sr.endDate) ? stamp.fromISOString(sr.endDate) : sr.endDate;
+                }
+                return d;
+            }
+        },
+        DisplayTitle: {
+            get: function(sr) {
+                var t = "Run of '"+sr.survey.title+"'";
+                if ( sr.startDate ) {
+                    t += " from "+locale.format(SurveyRun.StartDate.get(sr));
+                }
+                if ( sr.endDate ) {
+                    t += " until "+locale.format(SurveyRun.EndDate.get(sr));
+                }
+                return t;
+            }
+        },
+        Survey: {
+            get: function(sr) {
+                return sr.survey || null;
+            },
+            set: function(sr,s) {
+                sr.survey = s;
+                return sr;
+            }
+        }
+    };
+    return SurveyRun;
+});
Index: Dev/trunk/src/qed-client/model/schema.js
===================================================================
--- Dev/trunk/src/qed-client/model/schema.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/schema.js	(revision 443)
@@ -0,0 +1,157 @@
+define(['dojo/_base/lang'],function(lang){
+
+    /** Note on dojox.json.schema
+     * This implementation is not according to the version 03 of the json-schema
+     * draft. Differences:
+     * - doesn't support the 'required' property, but uses 'optional' (which is
+     *   false by default).
+     */
+
+    ////////////////////////////////////////
+    // Base schema types
+    //
+
+    var dateRe = "\\d{4}-\\d{2}-\\d{2}"; // YYYY-MM-DD
+    var timeRe = "\\d{2}:\\d{2}:\\d{2}"; // hh:mm:ss 
+    var datetimeRe = dateRe+"T"+timeRe+"Z"; // YYYY-MM-DDThh:mm:ssZ
+
+    function mixin(obj1,obj2) {
+        return lang.mixin({},obj1||{},obj2||{});
+    }
+    function mkType(base) {
+        return function(props) {
+            return mixin(base,props);
+        };
+    }
+
+    var nestring = mkType({ type:'string', minLength:1 });
+    var string = mkType({ type:'string' });
+    var integer = mkType({ type: 'integer' });
+    var bool = mkType({ type: 'boolean' });
+    var pattern = function(p){
+        return mixin({
+            type: 'string',
+            pattern: p
+        });
+    };
+    var date = mkType(pattern(dateRe));
+    var time = mkType(pattern(timeRe));
+    var datetime = mkType(pattern(datetimeRe));
+    var array = function(items,props) {
+        return mixin({
+            type: 'array',
+            items: items
+        },props);
+    };
+    var object = function(properties,props) {
+        return mixin({
+            type: 'object',
+            properties: properties,
+            additionalProperties: false
+        },props);
+    };
+    var optional = mkType({ optional: true });
+
+    ////////////////////////////////////////
+    // Domain specific
+    //
+
+    var typedobject = function(type,properties,props) {
+        return object(mixin(properties,{
+            type: pattern(type)
+        }),props);
+    };
+
+    var dbobject = function(type,properties,props) {
+        return typedobject(type,mixin(properties,{
+            _id: nestring(optional()),
+            _rev: nestring(optional())
+        }),props);
+    };
+
+    ////////////////////////////////////////
+    // The QED schema
+    //
+
+    var Respondent = dbobject('Respondent',{
+        secret: nestring()
+    });
+
+    var Question = dbobject('Question',{
+        code:nestring(),
+        title: nestring(),
+        description: string(optional()),
+        topic: string(optional()),
+        categories: array(nestring(),optional()),
+        content: array([
+            typedobject('Header',{
+                content:string(optional())
+            }),
+            typedobject('Text',{
+                content:string(optional())
+            }),
+            typedobject('Divider'),
+            typedobject('StringInput'),
+            typedobject('TextInput',{
+                maxLength:integer()
+            }),
+            typedobject('IntegerInput',{
+                min:integer(),
+                max:integer(),
+                step:integer()
+            }),
+            typedobject('MultipleChoiceInput',{
+                multiple:bool(),
+                items:array(nestring())
+            })
+        ],optional()),
+        publicationDate:datetime(optional())
+    });
+
+    var Survey = dbobject('Survey',{
+        title: nestring(),
+        description: string(optional()),
+        questions: array(Question,optional()),
+        publicationDate:datetime(optional())
+    });
+
+    var SurveyRun = dbobject('SurveyRun',{
+        description: string(optional()),
+        survey: Survey,
+        publicationDate:datetime(optional()),
+        startDate:datetime(optional()),
+        endDate:datetime(optional()),
+        mode:{type:'string',enum:['open','closed'],optional:true},
+        metadata:string(optional())
+    });
+
+    var Response = dbobject('Response',{
+        surveyRunId: nestring(),
+        answers:{type:'object',optional:true},
+        publicationDate:datetime(optional())
+    });
+
+    var Session = dbobject('Session',{
+        title: nestring(),
+        description: string(optional()),
+        publicationDate: datetime(optional())
+    });
+
+    var SessionTemplate = dbobject('SessionTemplate',{
+        title: nestring(),
+        description: string(optional()),
+        publicationDate: datetime(optional()),
+        plannedDate: datetime(optional())
+    });
+
+    var schema = {type:[
+        Question,
+        Survey,
+        SurveyRun,
+        Response,
+        Session,
+        SessionTemplate
+    ]};
+
+    return schema;
+});
Index: Dev/trunk/src/qed-client/model/widgets/AccountListView.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/AccountListView.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/AccountListView.js	(revision 443)
@@ -0,0 +1,37 @@
+define([
+    "../../widgets/LineWithActionsWidget",
+    "../../widgets/ListWidget",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dom-construct"
+], function(LineWithActionsWidget, ListWidget, declare, lang, domConstruct) {
+    return declare([ListWidget],{
+        baseClass: 'rftAccountListView',
+        type: 'account',
+
+        createAvatar: function(id, item){
+            return domConstruct.create("div",{
+                'class': 'dragAvatar',
+                innerHTML: item.title
+            });
+        },
+        createListElement: function(id, item) {
+            var w = new LineWithActionsWidget({
+                id: id,
+                title: item.title,
+                'class': "green",
+                actions: {
+                    "Remove" : {
+                        callback: lang.hitch(this, 'removeItem', item),
+                        properties: {
+                            blockButton: false,
+                            icon: "Delete"
+                        }
+                    }
+                }
+            });
+            w.startup();
+            return w;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/CategoryListView.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/CategoryListView.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/CategoryListView.js	(revision 443)
@@ -0,0 +1,40 @@
+define([
+    "../../widgets/LineWithActionsWidget",
+    "../../widgets/ListWidget",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dom-construct"
+], function(LineWithActionsWidget, ListWidget, declare, lang, domConstruct) {
+    return declare([ListWidget],{
+        baseClass: 'rftLineListView',
+        type: 'category',
+
+        createAvatar: function(id, item) {
+            var node = domConstruct.create("div",{
+                className: "dragAvatar",
+                innerHTML: item.title
+            });
+            return node;
+        },
+
+        createListElement: function(id, item) {
+            var w = new LineWithActionsWidget({
+                id: id,
+                title: item,
+                'class': "orange",
+                actions: {
+                    "Remove" : {
+                        callback: lang.hitch(this, 'removeItem', id),
+                        properties: {
+                            blockButton: false,
+                            icon: "Delete"
+                        }
+                    }
+                }
+            });
+            w.startup();
+            return w;
+        }
+
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreview.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreview.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreview.js	(revision 443)
@@ -0,0 +1,31 @@
+define([
+    "../../widgets/ListWidget",
+    "./QuestionEditorPreviewItem",
+    "dijit/registry",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dom-construct"
+], function(ListWidget, QuestionEditorPreviewItem, registry, array, declare, lang, domConstruct) {
+    return declare([ListWidget], {
+        baseClass: 'surveyEditorPreview',
+        type: 'questionContent',
+        withHandles: true,
+
+        createAvatar: function(id, item) {
+            return domConstruct.create("div",{
+                innerHTML: item.type || "(unkown)"
+            });
+        },
+        createListElement: function(id, item) {
+            var previewItem = new QuestionEditorPreviewItem({
+                id: id,
+                value: item
+            });
+            this.own(previewItem.on('destroy',
+                                    lang.hitch(this,'removeItem',id)));
+            previewItem.startup();
+            return previewItem;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreviewItem.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/QuestionEditorPreviewItem.js	(revision 443)
@@ -0,0 +1,153 @@
+define([
+    "./questions/Factory",
+    "dijit/_Container",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/fx",
+    "dojo/_base/lang",
+    "dojo/dom-class",
+    "dojo/dom-geometry",
+    "dojo/dom-style",
+    "dojo/on",
+    "dojo/text!./templates/QuestionEditorPreviewItem.html"
+], function(QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, fx, lang, domClass, domGeom, domStyle, on, template) {
+    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Container], {
+        templateString: template,
+        baseClass: "qedQuestionEditorPreviewItem",
+        previousContentHeight: 200,
+        value: null,
+        innerWidget: null,
+        foldDuration: [250, 250],
+        animation: null,
+        _editing: false,
+        _factory: new QuestionWidgetFactory(),
+
+        startup: function() {
+            if ( this._started ){ return; }
+            this.inherited(arguments);
+            this.own(this.foldButton.on('click',
+                        lang.hitch(this, 'onToggleFold')));
+            this.own(this.removeButton.on('click',
+                        lang.hitch(this, 'onDestroy')));
+            this.own(this.editButton.on('click',
+                        lang.hitch(this, 'onToggleEdit')));
+            this.showEdit();
+        },
+        onDestroy: function() {},
+        _getValueAttr: function(value) {
+            if ( this._editing ) {
+                this.value = this.innerWidget.get('value');
+            }
+            return this.value;
+        },
+        _setValueAttr: function(value) {
+            this.value = value;
+            if ( this._editing ) {
+                this._showEditWidget();
+            } else {
+                this._showViewWidget();
+            }
+        },
+        validate: function() {
+            return !this._editing || this.innerWidget.validate();
+        },
+        focus: function() {
+            if ( this._editing ) {
+                this.innerWidget.focus();
+            }
+        },
+        showView: function() {
+            if ( this._editing ) {
+                if (!this.innerWidget.validate || this.innerWidget.validate() ) {
+                    this.value = this.innerWidget.get('value');
+                    this._showViewWidget();
+                }
+            }
+        },
+        showEdit: function() {
+            if (!this._editing) {
+                this._showEditWidget();
+            }
+        },
+        onToggleEdit: function(evt) {
+            if (this._editing) {
+                this.showView();
+            } else {
+                this.showEdit();
+            }
+            if ( evt ) { event.stop(evt); }
+            return false;
+        },
+        _showViewWidget: function() {
+            var newWidget = this._factory.createViewWidget( this.value );
+            if ( newWidget !== null ) {
+                this._destroyInnerWidget();
+                this.innerWidget = newWidget;
+                this.innerWidget.placeAt(this.containerNode);
+                this.innerWidget.startup();
+                this.innerWidget.set('readOnly',true);
+                this.titleNode.innerHTML = this.value.type+" [preview]";
+                domClass.replace(this.editButton.iconNode, "rftIconEdit", "rftIconAccept");
+                this.editButton.set("label", "Edit");
+                this._editing = false;
+            }
+        },
+        _showEditWidget: function() {
+            var newWidget = this._factory.createEditWidget( this.value );
+            if ( newWidget !== null ) {
+                this._destroyInnerWidget();
+                this.innerWidget = newWidget;
+                this.innerWidget.placeAt(this.containerNode);
+                this.innerWidget.startup();
+                this.titleNode.innerHTML = this.value.type+" [editing]";
+                domClass.replace(this.editButton.iconNode, "rftIconAccept", "rftIconEdit");
+                this.editButton.set("label", "Done");
+                this._editing = true;
+            }
+        },
+        _destroyInnerWidget: function() {
+            if ( this.innerWidget !== null ) {
+                this.innerWidget.destroyRecursive();
+            }
+        },
+        onToggleFold: function(evt) {
+            if (!this.animation) {
+                if (!domClass.contains(this.domNode, "fold")) {
+                    this.previousContentHeight = domGeom.getMarginBox(this.innerNode).h;
+                    this.animation = fx.animateProperty({
+                        node: this.innerNode,
+                        duration: this.foldDuration[0],
+                        properties: {
+                            height: 1
+                        },
+                        onEnd: lang.hitch(this, function(){
+                            domClass.add(this.domNode, "fold");
+                            this.animation = null;
+                        })
+                    }).play();
+                    domClass.replace(this.foldButton.iconNode, "rftIconHalfArrowDown", "rftIconHalfArrowUp");
+                } else {
+                    this.animation = fx.animateProperty({
+                        node: this.innerNode,
+                        duration: this.foldDuration[1],
+                        properties: {
+                            height: this.previousContentHeight
+                        },
+                        onEnd: lang.hitch(this, function(){
+                            domClass.remove(this.domNode, "fold");
+                            domStyle.set(this.innerNode, 'height', 'auto');
+                            this.animation = null;
+                        })
+                    }).play();
+                    domClass.replace(this.foldButton.iconNode, "rftIconHalfArrowUp", "rftIconHalfArrowDown");
+                }
+            }
+            if ( evt ) { event.stop(evt); }
+            return false;
+        }
+
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/QuestionEditorToolkit.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/QuestionEditorToolkit.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/QuestionEditorToolkit.js	(revision 443)
@@ -0,0 +1,147 @@
+define([
+    "../../store",
+    "./CategoryListView",
+    "dijit/_Container",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dijit/form/Button",
+    "dijit/form/ComboBox",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dnd/Source",
+    "dojo/dom-construct",
+    "dojo/store/Memory",
+    "require",
+    "dojo/text!./templates/QuestionEditorToolkit.html"
+], function(store, CategoryListView, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, Button, ComboBox, declare, lang, Source, domConstruct, Memory, require, template) {
+    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _Container], {
+
+        contextRequire: require,
+        templateString: template,
+        _categoryList: null,
+        _categorySelect: null,
+        _categoryStore: null,
+        _topicSelect: null,
+        _topicStore: null,
+
+        _contentItems: [
+            { type: "Header" },
+            { type: "Text" },
+            { type: "Image" },
+            { type: "ExternalMedia" },
+            { type: "Divider" }
+        ],
+        _inputsItems: [
+            { type: "StringInput" },
+            { type: "TextInput" },
+            { type: "NumberInput" },
+            { type: "ScaleInput" },
+            { type: "MultipleChoiceInput" }
+        ],
+        _labelMap: {
+            "Header": "Header",
+            "Text": "Text",
+            "Image": "Image",
+            "ExternalMedia": "External media",
+            "Divider": "Divider",
+            "StringInput": "Text line",
+            "TextInput": "Free text",
+            "NumberInput": "Number",
+            "ScaleInput": "Scale",
+            "MultipleChoiceInput": "Multiple choice"
+        },
+        _iconMap: {
+            "Header": "Header",
+            "Text": "TextBox",
+            "Image": "Image",
+            "ExternalMedia": "External",
+            "Divider": "Divider",
+            "StringInput": "Text",
+            "TextInput": "Text",
+            "NumberInput": "Number",
+            "ScaleInput": "Scale",
+            "MultipleChoiceInput": "MultipleChoice"
+        },
+
+        buildRendering: function() {
+            this.inherited(arguments);
+
+            this._categoryList = new CategoryListView({
+                name: "categories"
+            }).placeAt(this.categoryListNode);
+
+            this._categoryStore = new Memory({data: [] });
+            this._categorySelect = new ComboBox( {
+                store: this._categoryStore,
+                searchAttr: "id"
+            }, this.categoryBoxNode);
+
+            this._topicStore = new Memory( {data: [] });
+            this._topicSelect = new ComboBox({
+                name: "topic",
+                store: this._topicStore,
+                searchAttr: "id"
+            }, this.topicBoxNode);
+
+            var creator = lang.hitch(this,"_creator");
+            this.contentSource = new Source(this.ToolkitContentSourceNode, {
+                accept: [],
+                copyOnly: true,
+                selfAccept: false,
+                singular: true,
+                creator: creator
+            });
+            this.inputsSource = new Source(this.ToolkitInputsSourceNode, {
+                accept: [],
+                copyOnly: true,
+                selfAccept: false,
+                singular: true,
+                creator: creator
+            });
+            this.contentSource.insertNodes(false, this._contentItems);
+            this.inputsSource.insertNodes(false, this._inputsItems);
+        },
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+
+            store.query("_design/questions/_view/all", {reduce:true, group:false, group_level:1})
+            .forPairs(lang.hitch(this, function(value, key) {
+                this._categoryStore.put({ id: key[0] });
+            }));
+
+            store.query("_design/questions/_view/all_topics", {reduce:true, group:true})
+            .forPairs(lang.hitch(this, function(value, key) {
+                this._topicStore.put({ id: key });
+            }));
+        },
+        _onCategoryAdd: function() {
+            this._categoryList.appendItem(this._categorySelect.get('displayedValue')); 
+            this._categorySelect.reset();
+        },
+        _creator: function(item, hint) {
+            var node;
+            if (hint === "avatar") {
+                node = domConstruct.create('span',{
+                    innerHTML: this._labelMap[item.type] || item.type
+                });
+            } else {
+                var w = new Button({
+                    baseClass: "rftLargeButton",
+                    iconClass: "rftIcon rftIcon"+(this._iconMap[item.type]||"Unknown"),
+                    label: this._labelMap[item.type] || item.type,
+                    showLabel: true,
+                    style: "display: block"
+                });
+                node = w.domNode;
+            }
+            return {
+                node: node,
+                data: item,
+                type: ["questionContent"]
+            };
+        }
+
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/QuestionListView.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/QuestionListView.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/QuestionListView.js	(revision 443)
@@ -0,0 +1,48 @@
+define([
+    "../../widgets/LineWithActionsWidget",
+    "../../widgets/ListWidget",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dom-construct"
+], function(LineWithActionsWidget, ListWidget, declare, lang, domConstruct) {
+    return declare([ListWidget],{
+        baseClass: 'rftSurveyListView',
+        type: 'question',
+
+        createAvatar: function(id, item){
+            return domConstruct.create("div",{
+                'class': 'dragAvatar',
+                innerHTML: item.title
+            });
+        },
+        createListElement: function(id, item) {
+            var w = new LineWithActionsWidget({
+                id: id,
+                title: item.title,
+                'class': "inheritBgColor",
+                actions: {
+                    "Remove" : {
+                        callback: lang.hitch(this, 'removeItem', id),
+                        properties: {
+                            blockButton: false,
+                            icon: "Delete",
+                            label: "Remove"
+                        }
+                    },
+                    "Info" : {
+                        callback: function(){
+                            if ( item.description ) { alert(item.description); }
+                        },
+                        properties: {
+                            blockButton: false,
+                            icon: "Inspect",
+                            label: "Show info"
+                        }
+                    }
+                }
+            });
+            w.startup();
+            return w;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/SurveyFieldset.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/SurveyFieldset.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/SurveyFieldset.js	(revision 443)
@@ -0,0 +1,13 @@
+define([
+    'dojo/_base/declare',
+    'dijit/_Container',
+    'dijit/_WidgetBase',
+    'dijit/_TemplatedMixin',
+    'dijit/_WidgetsInTemplateMixin',
+    'dojo/text!./templates/SurveyFieldset.html'
+],function(declare,_Container,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,template){
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: template,
+        baseClass: "rftSurveyFieldset"
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/SurveyRunFieldset.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/SurveyRunFieldset.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/SurveyRunFieldset.js	(revision 443)
@@ -0,0 +1,13 @@
+define([
+    'dojo/_base/declare',
+    'dijit/_Container',
+    'dijit/_WidgetBase',
+    'dijit/_TemplatedMixin',
+    'dijit/_WidgetsInTemplateMixin',
+    'dojo/text!./templates/SurveyRunFieldset.html'
+],function(declare,_Container,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,template){
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: template,
+        baseClass: "rftSurveyRunFieldset"
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/SurveySummary.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/SurveySummary.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/SurveySummary.js	(revision 443)
@@ -0,0 +1,22 @@
+define([
+    'dojo/_base/declare',
+    'dijit/_WidgetBase',
+    'dijit/_TemplatedMixin',
+    'dojo/text!./templates/SurveySummary.html'
+],function(declare,_WidgetBase,_TemplatedMixin,template){
+    return declare([_WidgetBase,_TemplatedMixin],{
+        templateString: template,
+        survey: null,
+        startup: function() {
+            this.inherited(arguments);
+            if ( this.survey ) {
+                this._setValueAttr(this.survey);
+            }
+        },
+        _setValueAttr: function(survey) {
+            this.titleNode.innerHTML = survey.title;
+            this.descriptionNode.innerHTML = survey.description;
+            this.questionsNode.innerHTML = (survey.questions || []).length;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/SurveyWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/SurveyWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/SurveyWidget.js	(revision 443)
@@ -0,0 +1,39 @@
+define([
+    "../classes/Survey",
+    "./questions/Factory",
+    "dijit/_Container",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/dom-construct",
+    "dojo/text!./templates/SurveyWidget.html"
+], function(Survey, QuestionWidgetFactory, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, array, declare, domConstruct, template) {
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: template,
+        survey: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            if ( this.survey ) {
+                this._setSurveyAttr(this.survey);
+            }
+        },
+        _setSurveyAttr: function(survey) {
+            domConstruct.empty(this.domNode);
+            this.survey = survey;
+            var f = new QuestionWidgetFactory();
+            array.forEach(Survey.Questions.get(this.survey),function(question){
+                array.forEach(question.content || [],function(item,index){
+                    // The dot causes values to be grouped in an object!
+                    item.code = question.code.toString()+'.'+index.toString();
+                    var w = f.createViewWidget(item);
+                    if ( w !== null ) {
+                        w.placeAt(this.domNode);
+                    }
+                },this);
+            },this);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/TabbedQuestionBrowser.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/TabbedQuestionBrowser.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/TabbedQuestionBrowser.js	(revision 443)
@@ -0,0 +1,128 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/_base/window',
+    'dijit/layout/ContentPane',
+    'dijit/layout/TabContainer',
+    'dojox/widget/Standby',
+    '../../store',
+    '../../widgets/Selector'
+],function(declare,lang,win,ContentPane,TabContainer,Standby,store,Selector){
+    return declare([TabContainer],{
+        tabPosition: 'left-h',
+        include: 'all',
+
+        selectedActions: null,
+        itemActions: null,
+        dndType: "question",
+
+        _dataMap: null,
+        _busyCount: 0,
+        constructor: function(){
+            this.inherited(arguments);
+            this._dataMap = {};
+        },
+        postCreate: function() {
+            this.inherited(arguments);
+            this._query = '_design/questions/_view/'+this.include;
+        },
+        startup: function() {
+            if ( this._started ){ return; }
+            this.inherited(arguments);
+            this._busyWidget = new Standby({
+                target: this.domNode,
+                duration: 200
+            }).placeAt(win.body());
+            this._busyWidget.startup();
+            this.watch("selectedChildWidget",lang.hitch(this,function(name,oldTab,newTab){
+                this._fillCategoryTab(newTab.__category);
+            }));
+            store.query(this._query, {reduce:true,group:true,group_level:1})
+            .forPairs(lang.hitch(this,function(value,key){
+                this._createCategoryTab(key[0],value);
+            }));
+        },
+        _createCategoryTab: function(category,count) {
+            if (this._dataMap[category] === undefined) {
+                var categoryTab = new ContentPane({
+                    __category: category,
+                    title: (category || '[No category]')+" ("+count+")"
+                });
+                categoryTab.startup();
+                this._dataMap[category] = {
+                    _widget: categoryTab
+                };
+                this.addChild(categoryTab);
+            }
+        },
+        _fillCategoryTab: function(category) {
+            var categoryMap = this._dataMap[category];
+            if (!categoryMap._filled) {
+                this._busy();
+                categoryMap._filled = true;
+                store.query(this._query, {reduce:true,group:true,group_level:2,startkey:[category],endkey:[category,{}]})
+                .forPairs(lang.hitch(this,function(value,key){
+                    this._createTopicSelector(key[1],category,value);
+                })).then(lang.hitch(this,function(){
+                    this._done();
+                }));
+            }
+        },
+        _createTopicSelector: function(topic,category,count){
+            var categoryMap = this._dataMap[category];
+            if (categoryMap[topic] === undefined) {
+                var w = new Selector({
+                    __category: category,
+                    __topic: topic,
+                    dndType: this.dndType,
+                    title: (topic || '[No topic]')+" ("+count+")",
+                    selectedActions: this.selectedActions,
+                    itemActions: this.itemActions
+                }).placeAt(categoryMap._widget.containerNode);
+                w.startup();
+                categoryMap[topic] = {
+                    _widget: w
+                };
+                this._fillTopicSelector(topic,category);
+            }
+        },
+        _fillTopicSelector: function(topic,category) {
+            var categoryMap = this._dataMap[category];
+            var topicMap = categoryMap[topic];
+            if (!topicMap._filled) {
+                topicMap._filled = true;
+                this._busy();
+                store.query(this._query, {reduce:false,include_docs:true,key:[category,topic]})
+                .forEach(lang.hitch(this,function(value){
+                    var title;
+                    if ( this.include === 'all' ) {
+                        title = value.title+(value.publicationDate?' (published on '+value.publicationDate+')':' (unpublished)');
+                    }
+                    topicMap._widget.addItem(value,title);
+                })).then(lang.hitch(this,function(){
+                    this._done();
+                }));
+            }
+        },
+        _busy: function() {
+            if ( this._busyCount === 0 ) {
+                this._busyWidget.show();
+            }
+            this._busyCount++;
+        },
+        _done: function() {
+            if ( this._busyCount > 0 ) {
+                this._busyCount--;
+                if ( this._busyCount === 0 ) {
+                    this._busyWidget.hide();
+                }
+            } else {
+                console.warn('_done() was called more times than _busy().');
+            }
+        },
+        destroy: function() {
+            this._busyWidget.destroyRecursive();
+            this.inherited(arguments);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/Factory.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/Factory.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/Factory.js	(revision 443)
@@ -0,0 +1,111 @@
+define([
+    "./HeaderConfigWidget",
+    "./HeaderWidget",
+    "./MultipleChoiceInputConfigWidget",
+    "./MultipleChoiceInputWidget",
+    "./NumberInputConfigWidget",
+    "./NumberInputWidget",
+    "./ScaleInputConfigWidget",
+    "./ScaleInputWidget",
+    "./StringInputConfigWidget",
+    "./StringInputWidget",
+    "./TextConfigWidget",
+    "./TextInputConfigWidget",
+    "./TextInputWidget",
+    "./TextWidget",
+    "dijit/_WidgetBase",
+    "dojo/_base/declare"
+], function(HeaderConfigWidget, HeaderWidget, MultipleChoiceInputConfigWidget, MultipleChoiceInputWidget, NumberInputConfigWidget, NumberInputWidget, ScaleInputConfigWidget, ScaleInputWidget, StringInputConfigWidget, StringInputWidget, TextConfigWidget, TextInputConfigWidget, TextInputWidget, TextWidget, _WidgetBase, declare) {
+    var factory = declare(null, {
+        createViewWidget: function(/*Object*/options) {
+            // options: Object
+            //            type: "Header", "Text", "TextInput", etc.
+            //            other type specific fields
+            var fun = this['create'+options.type+'ViewWidget'];
+            var view = fun !== undefined ? fun(options) : null;
+            return view;
+        },
+        createEditWidget: function(/*Object*/options) {
+            var fun = this['create'+options.type+'EditWidget'];
+            var view = fun !== undefined ? fun(options) : null;
+            return view;
+        },
+
+        createHeaderViewWidget: function(config) {
+            return new HeaderWidget(config);
+        },
+        createHeaderEditWidget: function(config) {
+            return new HeaderConfigWidget({
+                value: config
+            });
+        },
+
+        createTextViewWidget: function(config) {
+            return new TextWidget(config);
+        },
+        createTextEditWidget: function(config) {
+            return new TextConfigWidget({
+                value: config
+            });
+        },
+
+        createDividerViewWidget: function(options) {
+            return new DividerView({
+                options: options
+            });
+        },
+
+        createStringInputViewWidget: function(config) {
+            return new StringInputWidget(config);
+        },
+        createStringInputEditWidget: function(config) {
+            return new StringInputConfigWidget({
+                value: config
+            });
+        },
+
+        createTextInputViewWidget: function(config) {
+            return new TextInputWidget(config);
+        },
+        createTextInputEditWidget: function(config) {
+            return new TextInputConfigWidget({
+                value: config
+            });
+        },
+
+        createNumberInputViewWidget: function(config) {
+            return new NumberInputWidget(config);
+        },
+        createNumberInputEditWidget: function(config) {
+            return new NumberInputConfigWidget({
+                value: config
+            });
+        },
+
+        createMultipleChoiceInputViewWidget: function(config) {
+            return new MultipleChoiceInputWidget(config);
+        },
+        createMultipleChoiceInputEditWidget: function(config) {
+            return new MultipleChoiceInputConfigWidget({
+                value: config
+            });
+        },
+
+        createScaleInputViewWidget: function(options) {
+            return new ScaleInputWidget(options);
+        },
+        createScaleInputEditWidget: function(options) {
+            return new ScaleInputConfigWidget({
+                value: options || {}
+            });
+        }
+    });
+
+    var DividerView = declare([_WidgetBase], {
+        postCreate: function() {
+            this.domNode.innerHTML = "<hr>";
+        }
+    });
+
+    return factory;
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/HeaderConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/HeaderConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/HeaderConfigWidget.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/HeaderConfigWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        type: 'Header',
+        templateString: template,
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.type = this.type;
+            return value;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/HeaderWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/HeaderWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/HeaderWidget.js	(revision 443)
@@ -0,0 +1,11 @@
+define([
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dojo/_base/declare",
+    "dojo/text!./templates/HeaderWidget.html"
+], function(_TemplatedMixin, _WidgetBase, declare, template) {
+    return declare([_WidgetBase,_TemplatedMixin],{
+        templateString: template,
+        text: ''
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputConfigWidget.js	(revision 443)
@@ -0,0 +1,68 @@
+define([
+    "../../../widgets/ListWidget",
+    "../../../widgets/_ComplexValueWidget",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/dom-construct",
+    "dojo/text!./templates/MultipleChoiceInputConfigRowWidget.html",
+    "dojo/text!./templates/MultipleChoiceInputConfigWidget.html"
+], function(ListWidget, _ComplexValueWidget, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, event, lang, domConstruct, rowTemplate, template) {
+
+    var Row = declare([_ComplexValueWidget],{
+        templateString: rowTemplate,
+        onDestroy: function(evt) {}
+    });
+    
+    return declare([_ComplexValueWidget],{
+        type: 'MultipleChoiceInput',
+        templateString: template,
+        buildRendering: function() {
+            this.inherited(arguments);
+            this.itemsWidget = new ListWidget({
+                name: "items",
+                type: "MultipleChoiceItem",
+                skipForm: true,
+                delay: 5,
+                createListElement: lang.hitch(this, "_createRow"),
+                createAvatar: lang.hitch(this, "_createAvatar")
+            }, this.itemsNode);
+        },
+        _createRow: function(id, item) {
+            var widget = new Row({
+                id: id,
+                value: item,
+                onDestroy: lang.hitch(this,function(evt){
+                    this.itemsWidget.removeItem(id);
+                    event.stop(evt);
+                    return false;
+                })
+            });
+            widget.startup();
+            return widget;
+        },
+        _createAvatar: function(id, item) {
+            return domConstruct.create("div", {
+                innerHTML: item.text || "(empty)"
+            });
+        },
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.allowMultiple = value.allowMultiple && value.allowMultiple.length > 0;
+            value.type = this.type;
+            return value;
+        },
+        _setValueAttr: function(value) {
+            value.allowMultiple = value.allowMultiple === true ? ["on"] : [];
+            this.inherited(arguments);
+        },
+        onAddItem: function(evt) {
+            this.itemsWidget.appendItem({});
+            event.stop(evt);
+            return false;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/MultipleChoiceInputWidget.js	(revision 443)
@@ -0,0 +1,30 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dijit/form/CheckBox",
+    "dijit/form/RadioButton",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/dom-construct",
+    "dojo/text!./templates/MultipleChoiceInputWidget.html"
+], function(_ComplexValueWidget, CheckBox, RadioButton, array, declare, domConstruct, template) {
+    return declare([_ComplexValueWidget],{
+        templateString: template,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+
+            domConstruct.empty(this.domNode);
+            var Ctor = this.allowMultiple === true ? CheckBox : RadioButton;
+            array.forEach(this.items, function(item, index){
+                var div = domConstruct.create("div", {
+                }, this.domNode, "last");
+                var input = new Ctor({
+                    name: index.toString()
+                }).placeAt(div);
+                var label = domConstruct.create("label",{
+                    innerHTML: item.text
+                }, div);
+            }, this);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/NumberInputConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/NumberInputConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/NumberInputConfigWidget.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/NumberInputConfigWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        type: 'NumberInput',
+        templateString: template,
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.type = this.type;
+            return value;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/NumberInputWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/NumberInputWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/NumberInputWidget.js	(revision 443)
@@ -0,0 +1,30 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/NumberInputWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        text: '',
+        maxLength: null,
+        templateString: template,
+        startup: function() {
+            var constraints = {};
+            if ( this.min !== null && !isNaN(this.min) ) {
+                constraints.min = this.min;
+            }
+            if ( this.max !== null && !isNaN(this.max) ) {
+                constraints.max = this.max;
+            }
+            if ( this.places !== null && !isNaN(this.places) ) {
+                constraints.places = this.places;
+            }
+            this.numberBox.set('constraints', constraints);
+        },
+        _getValueAttr: function() {
+            return this.numberBox.get('value');
+        },
+        _setValueAttr: function(value) {
+            return this.numberBox.set('value', value);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputConfigWidget.js	(revision 443)
@@ -0,0 +1,96 @@
+define([
+    "../../../widgets/ListWidget",
+    "../../../widgets/_ComplexValueWidget",
+    "dijit/form/Button",
+    "dijit/form/RadioButton",
+    "dijit/form/TextBox",
+    "dijit/form/ValidationTextBox",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/dom-attr",
+    "dojo/dom-construct",
+    "dojo/dom-style",
+    "dojo/text!./templates/ScaleInputConfigRowWidget.html",
+    "dojo/text!./templates/ScaleInputConfigWidget.html",
+    "dijit/form/NumberTextBox",
+    "dijit/form/TextBox"
+], function(ListWidget, _ComplexValueWidget, Button, RadioButton, TextBox, ValidationTextBox, array, declare, event, lang, domAttr, domConstruct, domStyle, rowTemplate, template) {
+
+    var Row = declare([_ComplexValueWidget],{
+        templateString: rowTemplate,
+        hasNA: true,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+        },
+        onDestroy: function(evt) {},
+        _setHasNAAttr: function(value) {
+            if ( value === true ) {
+                domStyle.set(this.naRadioButton.domNode, "display", "");
+            } else {
+                domStyle.set(this.naRadioButton.domNode, "display", "none");
+            }
+        }
+    });
+    
+    return declare([_ComplexValueWidget],{
+        templateString: template,
+        baseClass: "qedScaleWidget",
+        _hasNA: false,
+        constuctor: function() {
+            this.inherited(arguments);
+            this.value = {};
+        },
+        buildRendering: function() {
+            this.inherited(arguments);
+            this.itemsWidget = new ListWidget({
+                name: "items",
+                type: "ScaleItem",
+                delay: 5,
+                skipForm: true,
+                createListElement: lang.hitch(this, "_createRowWidget"),
+                createAvatar: lang.hitch(this, "_createAvatar")
+            }, this.itemsNode);
+        },
+        _createRowWidget: function(id, item) {
+            var widget = new Row({
+                value: item,
+                hasNA: this._hasNA,
+                id: id,
+                onDestroy: lang.hitch(this,function(evt){
+                    this.itemsWidget.removeItem(id);
+                    event.stop(evt);
+                    return false;
+                })
+            });
+            widget.startup();
+            return widget;
+        },
+        _createAvatar: function(id, item) {
+            return domConstruct.create("div", {
+                innerHTML: item.text || "(empty item)"
+            });
+        },
+        onAddNewItem: function(e) {
+            this.itemsWidget.appendItem({});
+            event.stop(e);
+            return false;
+        },
+        _getValueAttr: function(){
+            var value = this.inherited(arguments);
+            value.type = 'ScaleInput';
+            return value;
+        },
+        onNAChange: function(value) {
+            this._hasNA = value !== null && value !== "";
+            this._updateNA();
+        },
+        _updateNA: function(value) {
+            array.forEach(this.itemsWidget.getChildren(), function(child) {
+                child.set('hasNA', this._hasNA);
+            }, this);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/ScaleInputWidget.js	(revision 443)
@@ -0,0 +1,79 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dijit/form/RadioButton",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dom-attr",
+    "dojo/dom-construct",
+    "dojo/text!./templates/ScaleInputWidget.html"
+], function(_ComplexValueWidget, RadioButton, array, declare, lang, domAttr, domConstruct, template) {
+    return declare([_ComplexValueWidget],{
+        templateString: template,
+        baseClass: "qedScaleWidget",
+        min: 0,
+        max: 0,
+        minLabel: "",
+        maxLabel: "",
+        naLabel: null,
+        items: null,
+        value: null,
+        constuctor: function() {
+            this.items = [];
+            this.value = {};
+        },
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this._renderHead();
+            this._renderItems();
+        },
+        _renderHead: function() {
+            this.minNode.innerHTML = this.minLabel || "";
+            this.maxNode.innerHTML = this.maxLabel || "";
+            if ( this.naLabel !== null ) {
+                this.naNode.innerHTML = this.naLabel;
+            }
+            for (var i = this.min; i <= this.max; i++) {
+                domConstruct.create("th", {
+                    innerHTML: i.toString()
+                }, this.maxNode, "before");
+            }
+        },
+        _renderItems: function() {
+            array.forEach(this.items, function(item,index) {
+                var tr = domConstruct.create("tr", {}, this.itemsNode);
+                var td;
+                var radio;
+                domConstruct.create("th", {
+                    innerHTML: item.text || "",
+                    'class': "item"
+                }, tr);
+                domConstruct.create("th", {
+                    innerHTML: item.minLabel || "",
+                    'class': 'min'
+                }, tr);
+                for (var i = this.min; i <= this.max; i++) {
+                    td = domConstruct.create("td", {}, tr);
+                    radio = new RadioButton({
+                        name: index.toString(),
+                        value: i.toString()
+                    });
+                    domConstruct.place(radio.domNode, td); 
+                }
+                domConstruct.create("th", {
+                    innerHTML: item.maxLabel || "",
+                    className: 'max'
+                }, tr);
+                if ( this.naLabel !== null && this.naLabel !== "" ) {
+                    td = domConstruct.create("td", {}, tr);
+                    radio = new RadioButton({
+                        name: index.toString(),
+                        value: "n/a"
+                    });
+                    domConstruct.place(radio.domNode, td); 
+                }
+            }, this);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/StringInputConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/StringInputConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/StringInputConfigWidget.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/StringInputConfigWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        type: 'StringInput',
+        templateString: template,
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.type = this.type;
+            return value;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/StringInputWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/StringInputWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/StringInputWidget.js	(revision 443)
@@ -0,0 +1,16 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/StringInputWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        text: '',
+        templateString: template,
+        _getValueAttr: function() {
+            return this.textBox.get('value');
+        },
+        _setValueAttr: function(value) {
+            return this.textBox.set('value', value);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/TextConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/TextConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/TextConfigWidget.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/TextConfigWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        type: 'Text',
+        templateString: template,
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.type = this.type;
+            return value;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/TextInputConfigWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/TextInputConfigWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/TextInputConfigWidget.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/TextInputConfigWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        type: 'TextInput',
+        templateString: template,
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            value.type = this.type;
+            return value;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/TextInputWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/TextInputWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/TextInputWidget.js	(revision 443)
@@ -0,0 +1,22 @@
+define([
+    "../../../widgets/_ComplexValueWidget",
+    "dojo/_base/declare",
+    "dojo/text!./templates/TextInputWidget.html"
+], function(_ComplexValueWidget, declare, template) {
+    return declare([_ComplexValueWidget],{
+        text: '',
+        maxLength: null,
+        templateString: template,
+        startup: function() {
+            if ( this.maxLength ) {
+                this.textArea.set('maxLength', this.maxLength);
+            }
+        },
+        _getValueAttr: function() {
+            return this.textBox.get('value');
+        },
+        _setValueAttr: function(value) {
+            return this.textBox.set('value', value);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/TextWidget.js
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/TextWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/TextWidget.js	(revision 443)
@@ -0,0 +1,11 @@
+define([
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dojo/_base/declare",
+    "dojo/text!./templates/TextWidget.html"
+], function(_TemplatedMixin, _WidgetBase, declare, template) {
+    return declare([_WidgetBase,_TemplatedMixin],{
+        templateString: template,
+        text: ''
+    });
+});
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderConfigWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <label for="text" class="qedLabel">Text</label>
+  <div class="qedField" data-dojo-type="dijit/form/TextBox" name="text"></div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/HeaderWidget.html	(revision 443)
@@ -0,0 +1,1 @@
+<h2>${text}</h2>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigRowWidget.html	(revision 443)
@@ -0,0 +1,3 @@
+<div>
+  <div data-dojo-type="dijit/form/ValidationTextBox" name="text" required="required" data-dojo-attach-point="textBox"></div><div data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onDestroy">X</div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputConfigWidget.html	(revision 443)
@@ -0,0 +1,9 @@
+<div>
+  <div>
+    <label class="qedLabel" for="allowMultiple">Allow multiple</label>
+    <div name="allowMultiple" data-dojo-type="dijit/form/CheckBox"></div>
+  </div>
+  <div data-dojo-attach-point="itemsNode">
+  </div>
+  <div data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onAddItem">Add item</div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/MultipleChoiceInputWidget.html	(revision 443)
@@ -0,0 +1,2 @@
+<div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputConfigWidget.html	(revision 443)
@@ -0,0 +1,18 @@
+<div>
+  <div>
+    <label class="qedLabel" for="text">Item/Question Text</label>
+    <div class="qedField" data-dojo-type="dijit/form/TextBox" data-dojo-props="placeholder: 'Item/Question Text'" name="text"></div>
+  </div>
+  <div>
+    <label class="qedLabel" for="min">Minimum Value</label>
+    <div class="qedField" data-dojo-type="dijit/form/NumberTextBox" name="min"></div>
+  </div>
+  <div>
+    <label class="qedLabel" for="max">Maximum Value</label>
+    <div class="qedField" data-dojo-type="dijit/form/NumberTextBox" name="max"></div>
+  </div>
+  <div>
+    <label class="qedLabel" for="places">Decimal Places</label>
+    <div class="qedField" data-dojo-type="dijit/form/NumberTextBox" data-dojo-props="constraints:{ min: 0 }" name="places"></div>
+  </div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/NumberInputWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <p>${text}</p>
+  <div class="qedField" data-dojo-attach-point="numberBox" data-dojo-type="dijit/form/NumberTextBox" name="text"></div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigRowWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigRowWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigRowWidget.html	(revision 443)
@@ -0,0 +1,38 @@
+<tr>
+  <th class="item">
+    <div name="text"
+         required="required"
+         data-dojo-type="dijit/form/ValidationTextBox"
+         data-dojo-props="placeholder: 'Item/Question text'"></div>
+  </th>
+  <th class="min">
+    <div name="minLabel"
+         required="required"
+         data-dojo-type="dijit/form/TextBox"
+         data-dojo-props="placeholder: 'Minimum label'"></div>
+  </th>
+  <td>
+    <div disabled="disabled"
+         data-dojo-type="dijit/form/RadioButton"></div>
+  </td>
+  <td>...</td>
+  <td>
+    <div disabled="disabled"
+         data-dojo-type="dijit/form/RadioButton"></div>
+  </td>
+  <th class="max">
+    <div name="maxLabel"
+         required="required"
+         data-dojo-type="dijit/form/TextBox"
+         data-dojo-props="placeholder: 'Maximum label'"></div>
+  </th>
+  <td class="na">
+    <div disabled="disabled"
+         data-dojo-attach-point="naRadioButton"
+         data-dojo-type="dijit/form/RadioButton"></div>
+  </td>
+  <th>
+    <button data-dojo-type="dijit/form/Button"
+            data-dojo-attach-event="onClick:onDestroy">X</button>
+  </th>
+</tr>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputConfigWidget.html	(revision 443)
@@ -0,0 +1,48 @@
+<div class="${baseClass}">
+  <table>
+    <thead>
+      <tr>
+        <th class="item"></th>
+        <th data-dojo-attach-point="minLabelNode"
+            class="min">
+          <div name="minLabel"
+               data-dojo-type="dijit/form/TextBox"
+               data-dojo-props="placeholder: 'Minimum label'"></div>
+        </th>
+        <th data-dojo-attach-point="minNode">
+          <div name="min"
+               data-dojo-type="dijit/form/NumberTextBox"
+               data-dojo-props="required: true, placeholder: 'Minimum value'"></div>
+        </th>
+        <th>...</th>
+        <th data-dojo-attach-point="maxNode">
+          <div name="max"
+               data-dojo-type="dijit/form/NumberTextBox"
+               data-dojo-props="required: true, placeholder: 'Maximum value'"></div>
+        </th>
+        <th data-dojo-attach-point="maxLabelNode" class="max">
+          <div name="maxLabel"
+               data-dojo-type="dijit/form/TextBox"
+               data-dojo-props="placeholder: 'Maximum label'"></div>
+        </th>
+        <th class="na">
+          <div name="naLabel"
+               data-dojo-attach-point="naTextBox"
+               data-dojo-attach-event="onChange: onNAChange"
+               data-dojo-type="dijit/form/TextBox"
+               data-dojo-props="placeholder: 'N/A label', intermediateChanges: true"></div>
+        </th>
+      </tr>
+    </thead>
+    <tbody data-dojo-attach-point="itemsNode">
+    </tbody>
+    <tbody>
+      <tr>
+        <td class="item">
+          <button data-dojo-type="dijit/form/Button"
+                  data-dojo-attach-event="onClick:onAddNewItem">Click to add item</button>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/ScaleInputWidget.html	(revision 443)
@@ -0,0 +1,14 @@
+<div class="${baseClass}">
+  <table>
+    <thead>
+      <tr>
+        <th class="item"></th>
+        <th data-dojo-attach-point="minNode" class="min"></th>
+        <th data-dojo-attach-point="maxNode" class="max"></th>
+        <th class="na" data-dojo-attach-point="naNode"></th>
+      </tr>
+    </thead>
+    <tbody data-dojo-attach-point="itemsNode">
+    </tbody>
+  </table>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputConfigWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <label class="qedLabel" for="text">Item/Question Text</label>
+  <div class="qedField" data-dojo-attach-point="textBox" data-dojo-type="dijit/form/TextBox" data-dojo-props="placeholder: 'Item/Question Text'" name="text"></div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/StringInputWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <p>${text}</p>
+  <div data-dojo-attach-point="textBox" data-dojo-type="dijit/form/TextBox" name="text"></div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/TextConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/TextConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/TextConfigWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <label for="text" class="qedLabel">Text</label>
+  <textarea class="qedField" data-dojo-type="dijit/form/Textarea" name="text"></textarea>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputConfigWidget.html	(revision 443)
@@ -0,0 +1,10 @@
+<div>
+  <div>
+    <label class="qedLabel" for="text">Item/Question Text</label>
+    <div class="qedField" data-dojo-type="dijit/form/TextBox" data-dojo-props="placeholder: 'Item/Question Text'" name="text"></div>
+  </div>
+  <div>
+    <label class="qedLabel" for="maxLength">Maximum Length</label>
+    <div class="qedField" data-dojo-type="dijit/form/NumberTextBox" data-dojo-props="placeholder: 'Maximum length', constraints: { min: 0 }" name="maxLength"></div>
+  </div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/TextInputWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div>
+  <p>${text}</p>
+  <div class="qedField" data-dojo-attach-point="textArea" data-dojo-type="dijit/form/Textarea" name="text"></div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/questions/templates/TextWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/questions/templates/TextWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/questions/templates/TextWidget.html	(revision 443)
@@ -0,0 +1,1 @@
+<p>${text}</p>
Index: Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorPreviewItem.html	(revision 443)
@@ -0,0 +1,15 @@
+<div>
+	<div class="topBorder inheritBgColor bg dojoDndHandle">
+		<span class="title" data-dojo-attach-point="titleNode">Default title</span>
+		<span class="floatRight" data-dojo-attach-point="buttonsNode">
+			<button class="trans bg inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-point="editButton" data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconEdit'">Edit</button>
+			<button class="trans bg inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-point="foldButton" data-dojo-props="baseClass: 'rftBlockButton', showLabel: false, iconClass: 'rftIcon rftIconHalfArrowUp'">Fold</button>
+			<button class="trans bg inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-point="removeButton" data-dojo-props="baseClass: 'rftBlockButton', showLabel: false, iconClass: 'rftIcon rftIconDelete'">Remove</button>
+		</span>
+	</div>
+	
+	<div class="surveyEditorPreviewItemInner" data-dojo-attach-point="innerNode">
+		<div class="surveyEditorPreviewItemContent" data-dojo-attach-point="containerNode">
+		</div>
+	</div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorToolkit.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorToolkit.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/QuestionEditorToolkit.html	(revision 443)
@@ -0,0 +1,25 @@
+<div>
+	<div data-dojo-type="../../widgets/TitleGroup">
+		<div data-dojo-type="dijit/TitlePane" class="orange" data-dojo-props="open:true" title="Properties" data-dojo-props="iconClass:'rftIcon rftIconProperties'">
+            <fieldset class="align">
+                <label>Title:</label><input data-dojo-type="dijit/form/ValidationTextBox" required="required" name="title"/>
+                <label>Code:</label><input data-dojo-type="dijit/form/ValidationTextBox" required="required" name="code"/>
+                <label>Categories:</label>
+                <div data-dojo-attach-point="categoryListNode" class="rftLineListView"></div> 
+                <div data-dojo-attach-point="categoryBoxNode"></div>
+                <button class="inheritBgColor" data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:_onCategoryAdd" data-dojo-props="baseClass:'rftBlockButton', iconClass: 'rftIcon rftIconPlus'">Add</button><br/>
+                <label>Topic:</label>
+                <div data-dojo-attach-point="topicBoxNode"></div>
+                <label>Description:</label><textarea data-dojo-type="dijit/form/Textarea" name="description"></textarea>
+            </fieldset>
+		</div>
+
+		<div data-dojo-type="dijit/TitlePane" title="Content" data-dojo-props="iconClass:'rftIcon rftIconPlus', open:false">
+			<div data-dojo-attach-point="ToolkitContentSourceNode"></div>
+		</div>
+
+		<div data-dojo-type="dijit/TitlePane" title="Inputs" data-dojo-props="iconClass:'rftIcon rftIconInput', open:false">
+			<div data-dojo-attach-point="ToolkitInputsSourceNode"></div>
+		</div>
+	</div>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/templates/QuestionWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/QuestionWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/QuestionWidget.html	(revision 443)
@@ -0,0 +1,23 @@
+<div>
+    <form data-dojo-type="dijit/form/Form" data-dojo-attach-point="ourForm">
+        <fieldset>
+            <label for="code" class="loginLabel">Code</label>
+            <input data-dojo-type="dijit/form/TextBox" name="code" type="text" class="loginInput" />
+            <label for="question" class="loginLabel">Title</label>
+            <input data-dojo-type="dijit/form/TextBox" name="title" type="text" class="loginInput" />
+            <label for="question" class="loginLabel">Description</label>
+            <input data-dojo-type="dijit/form/Textarea" name="description" type="text" class="loginInput"/>
+            <label for="category" class="loginLabel">Category</label>
+            <input data-dojo-type="dijit/form/TextBox" name="category" type="text" class="loginInput" />
+        </fieldset>
+        <fieldset>
+            <select data-dojo-type="dijit/form/Select" data-dojo-attach-point="scaleSelector" data-dojo-attach-event="onChange:_onTypeChange" name="scale">
+                <option value="string" selected="selected">String</option>
+                <option value="text">Text</option>
+                <option value="singleChoice">Single choice</option>
+                <option value="multipleChoice">Multiple choice</option>
+            </select>
+            <div data-dojo-attach-point="scaleDetails"></div>
+        </fieldset>
+    </form>
+</div>
Index: Dev/trunk/src/qed-client/model/widgets/templates/SurveyFieldset.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/SurveyFieldset.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/SurveyFieldset.html	(revision 443)
@@ -0,0 +1,6 @@
+<fieldset class="${baseClass}">
+    <label for="title">Title</label>
+    <input data-dojo-type="dijit/form/TextBox" name="title"/><br/>
+    <label for="description">Description</label>
+    <input data-dojo-type="dijit/form/Textarea" name="description"/><br/>
+</fieldset>
Index: Dev/trunk/src/qed-client/model/widgets/templates/SurveyRunFieldset.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/SurveyRunFieldset.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/SurveyRunFieldset.html	(revision 443)
@@ -0,0 +1,26 @@
+<fieldset class="${baseClass} qedFieldset">
+
+    <div>
+    <label for="mode" class="qedLabel">Description</label>
+    <textarea name="description" class="qedField" data-dojo-type="dijit/form/Textarea"></textarea>
+    </div>
+
+    <div>
+    <label for="startDate" class="qedLabel">Start date</label>
+    <input type="text" name="startDate" class="qedField" data-dojo-type="dijit/form/DateTextBox" data-dojo-attach-point="startDateBox" />
+    </div>
+
+    <div>
+    <label for="endDate" class="qedLabel">End date</label>
+    <input type="text" name="endDate" class="qedField" data-dojo-type="dijit/form/DateTextBox" data-dojo-attach-point="endDateBox" />
+    </div>
+
+    <div>
+    <label for="mode" class="qedLabel">Mode</label>
+    <select name="mode" class="qedField" data-dojo-type="dijit/form/Select">
+        <option value="open" selected="selected">Open</option>
+        <option value="closed">Closed</option>
+    </select>
+    </div>
+
+</fieldset>
Index: Dev/trunk/src/qed-client/model/widgets/templates/SurveySummary.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/SurveySummary.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/SurveySummary.html	(revision 443)
@@ -0,0 +1,6 @@
+<fieldset class="qedFieldset">
+    <legend>Survey</legend>
+    <div><div class="qedLabel">Title</div><div class="qedField" data-dojo-attach-point="titleNode"></div></div>
+    <div><div class="qedLabel">Description</div><div class="qedField" data-dojo-attach-point="descriptionNode"></div></div>
+    <div><div class="qedLabel">Questions</div><div class="qedField" data-dojo-attach-point="questionsNode"></div></div>
+</fieldset>
Index: Dev/trunk/src/qed-client/model/widgets/templates/SurveyWidget.html
===================================================================
--- Dev/trunk/src/qed-client/model/widgets/templates/SurveyWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/model/widgets/templates/SurveyWidget.html	(revision 443)
@@ -0,0 +1,2 @@
+<div class="${baseClass}">
+</div>
Index: Dev/trunk/src/qed-client/package.json
===================================================================
--- Dev/trunk/src/qed-client/package.json	(revision 443)
+++ Dev/trunk/src/qed-client/package.json	(revision 443)
@@ -0,0 +1,17 @@
+{
+  "name": "qed-client",
+  "version": "0.0.1",
+  "description": "QED",
+  "dependencies": {
+    "dojo": "~1.8.0",
+    "dijit": "~1.8.0",
+    "dojox": "~1.8.0"
+  },
+  "dojoBuild": "qed.profile.js",
+  "devDependencies": {
+    "grunt": "~0.4.0",
+    "grunt-contrib-less": "~0.5.0",
+    "grunt-contrib-jshint": "~0.2.0",
+    "grunt-htmlhint": "~0.9.2"
+  }
+}
Index: Dev/trunk/src/qed-client/pages/index.js
===================================================================
--- Dev/trunk/src/qed-client/pages/index.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/index.js	(revision 443)
@@ -0,0 +1,22 @@
+define([
+    'dojo/_base/declare',
+    '../app/Router',
+    '../app/Page',
+    'dojo/text!./templates/index.html'
+],function(declare,Router,Page,template){
+    return declare([Page],{
+        templateString: template,
+        selectedObject: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this.btnContentCreate.on("click",function(){ Router.go("/sessions"); });
+            this.btnContentFacilitate.on("click",function(){ Router.go("/run"); });
+            this.btnSurveys.on("click",function(){ Router.go("/surveys"); });
+            this.btnQuestions.on("click",function(){ Router.go("/questions"); });
+            this.btnApplications.on("click",function(){ Router.go("/applications"); });
+            this.btnDashboards.on("click",function(){ Router.go("/dashboards"); });
+            this.btnResults.on("click",function(){ Router.go("/results"); });
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/previewSurvey.js
===================================================================
--- Dev/trunk/src/qed-client/pages/previewSurvey.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/previewSurvey.js	(revision 443)
@@ -0,0 +1,28 @@
+define([
+    "../app/Page",
+    "../store",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/when",
+    "require",
+    "dojo/text!./templates/previewSurvey.html"
+], function(Page, store, array, declare, lang, when, require, template) {
+    return declare([Page],{
+        contextRequire: require,
+        templateString: template,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            if ( this.surveyId ) {
+                when(store.get(this.surveyId))
+                .then(lang.hitch(this,function(survey){
+                    this.titleNode.innerHTML = survey.title;
+                    this.surveyWidget.set('survey',survey);
+                }));
+            } else {
+                throw new Error("No valid uid or survey passed!");
+            }
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/question.js
===================================================================
--- Dev/trunk/src/qed-client/pages/question.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/question.js	(revision 443)
@@ -0,0 +1,81 @@
+define([
+    "../app/Content",
+    "../app/Page",
+    "../app/Router",
+    "../model/classes/Question",
+    "../model/widgets/QuestionEditorPreview",
+    "../model/widgets/QuestionEditorToolkit",
+    "../store",
+    "../widgets/_ComplexValueMixin",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/when",
+    "dojo/text!./templates/question.html"
+], function(Content, Page, Router, Question, QuestionEditorPreview, QuestionEditorToolkit, store, _ComplexValueMixin, declare, event, lang, when, template) {
+    return declare([Page,_ComplexValueMixin], {
+        templateString: template,
+        _toolkit: null,
+        _preview: null,
+        value: null,
+        
+        buildRendering: function() {
+            this.inherited(arguments);
+
+            this._toolkit = new QuestionEditorToolkit({
+            },this.QuestionEditorToolkitNode);
+            this._toolkit.on('submit',lang.hitch(this,"_onSave"));
+            this._toolkit.startup();
+
+            this._preview = new QuestionEditorPreview({ 
+                name: 'content',
+                delay: 5,
+                region: 'center'
+            });
+            this._preview.startup();
+            this.addChild(this._preview);
+        },
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            if ( !this.questionId ) {
+                throw new Error("Error: no reference to object set!");
+            }
+            if (this.questionId === "new") {
+                this.set('value', Question.create());
+            } else {
+                when(store.get(this.questionId))
+                .then(lang.hitch(this, function(value) {
+                    this.set('value', value);
+                }));
+            }
+        },
+        _setValueAttr: function(value) {
+            this.value = value;
+            this.inherited(arguments);
+            this.titleNode.innerHTML = Question.DisplayTitle.get(value);
+        },
+        _getValueAttr: function() {
+            var value = this.inherited(arguments);
+            lang.mixin(this.value, value);
+            return this.value;
+        },
+        _onSave: function(evt) {
+            if ( this.validate() ) {
+                var value = this.get('value');
+                store.put(value)
+                .then(function() {
+                    Router.go('/questions');
+                },function(err){
+                    Content.notify(err,'error');
+                });
+            }
+            if ( evt ) { event.stop( evt ); }
+            return false;
+        },
+        _onDiscard: function() {
+            Router.go('/questions');
+            return true;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/questions.js
===================================================================
--- Dev/trunk/src/qed-client/pages/questions.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/questions.js	(revision 443)
@@ -0,0 +1,66 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/Deferred',
+    'dojo/_base/event',
+    'dojo/_base/lang',
+    '../store',
+    '../app/Content',
+    '../app/Router',
+    '../app/Page',
+    '../model/widgets/TabbedQuestionBrowser',
+    'dojo/text!./templates/questions.html'
+],function(declare,Deferred,event,lang,store,Content,Router,Page,TabbedQuestionBrowser,template) {
+    return declare([Page],{
+        templateString: template,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this.questionBrowser = new TabbedQuestionBrowser({
+                region: 'center',
+                'class': 'orange',
+                dndType: null,
+                itemActions: {
+                    Delete: {
+                        callback: lang.hitch(this,"onDeleteQuestion"),
+                        icon: 'Delete',
+                        description: 'Delete question'
+                    },
+                    Edit: {
+                        callback: lang.hitch(this,"onEditQuestion"),
+                        icon: 'Edit',
+                        description: 'Edit question'
+                    },
+                    Publish: {
+                        callback: lang.hitch(this,"onPublishQuestion"),
+                        icon: 'Publish',
+                        description: 'Publish question'
+                    }
+                }
+            },this.questionBrowser);
+            this.questionBrowser.startup();
+        },
+        onNewQuestion: function() {
+            Router.go("/question/new");
+        },
+        onDeleteQuestion: function(question) {
+            store.remove(store.getIdentity(question),store.getRevision(question))
+            .then(function(){
+                Content.notify("Question deleted.");
+            },function(err){
+                Content.notify(err,'error');
+            });
+        },
+        onEditQuestion: function(question) {
+            Router.go("/question/"+question._id);
+        },
+        onPublishQuestion: function(question) {
+            question.publicationDate = store.timestamp();
+            store.put(question)
+            .then(function(){
+                Content.notify("Question published.");
+            },function(err){
+                Content.notify(err,'error');
+            });
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/response.js
===================================================================
--- Dev/trunk/src/qed-client/pages/response.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/response.js	(revision 443)
@@ -0,0 +1,80 @@
+define([
+    "../app/Page",
+    "../lib/async",
+    "../model/classes/Response",
+    "../model/classes/Survey",
+    "../model/classes/SurveyRun",
+    "../store",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/promise/all",
+    "dojo/when",
+    "require",
+    "dojo/text!./templates/response.html"
+], function(Page, async, Response, Survey, SurveyRun, store, declare, event, lang, all, when, require, template) {
+    return declare([Page],{
+        contextRequire: require,
+        templateString: template,
+        response: null,
+        postCreate: function(){
+            this.options = this.options || {};
+        },
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this._disableButtons();
+            var surveyRunId = this.surveyRunId;
+            var responseId = this.options && this.options.id;
+            if ( surveyRunId && responseId ) {
+                this._loadSurveyAndResponse(surveyRunId,responseId)
+                .then(lang.hitch(this,"_enableButtons"));
+            } else {
+                throw new Error("No valid uid or survey passed!");
+            }
+        },
+        _loadSurveyAndResponse: function(surveyRunId,responseId){
+            return all([store.get(surveyRunId),store.get(responseId)])
+            .then(lang.hitch(this,function(surveyAndResponse){
+                var surveyRun = surveyAndResponse[0];
+                this.response = surveyAndResponse[1];
+                if ( this.response.surveyRunId !== surveyRunId ) {
+                    throw "Survey does not match the response...";
+                }
+                this.titleNode.innerHTML = Survey.DisplayTitle.get(surveyRun.survey);
+                this.surveyWidget.set('survey',surveyRun.survey);
+                this.responseForm.set('value',this.response.answers || {});
+            }));
+        },
+        _enableButtons: function() {
+            this.submitButton.set('disabled',false);
+            this.continueButton.set('disabled',false);
+        },
+        _disableButtons: function() {
+            this.submitButton.set('disabled',true);
+            this.continueButton.set('disabled',true);
+        },
+        _getAnswersAndSaveResponse: function() {
+            this.response.answers = this.responseForm.get('value');
+            console.log(this.response);
+            return store.put(this.response);
+        },
+        _onSubmit: function(e) {
+            this.response.publicationDate = store.timestamp();
+            this._getAnswersAndSaveResponse();
+            this.content.domNode.innerHTML = "<div>Thanks for filling in the survey.</div>";
+            if ( e ) { event.stop(e); }
+            return false;
+        },
+        _onContinueLater: function(e) {
+            this._getAnswersAndSaveResponse();
+            this.content.domNode.innerHTML = "<div>To continue with this survey later, just save the URL in the location bar and revisit it later. Your answers will still be there.</div>";
+            if ( e ) { event.stop(e); }
+            return false;
+        },
+        _ignoreEvent: function(e) {
+            if ( e ) { event.stop(e); }
+            return false;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/session.js
===================================================================
--- Dev/trunk/src/qed-client/pages/session.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/session.js	(revision 443)
@@ -0,0 +1,96 @@
+define([
+    'dojo/_base/array',
+    'dojo/_base/declare',
+    'dojo/_base/event',
+    'dojo/_base/lang',
+    'dojo/when',
+    '../search',
+    '../store',
+    '../app/Page',
+    '../app/Router',
+    '../widgets/ThresholdFilteringSelect',
+    '../model/classes/SessionTemplate',
+    '../model/widgets/AccountListView',
+    'dojo/text!./templates/session.html'
+],function(array,declare,event,lang,when,search,store,Page,Router,ThresholdFilteringSelect,SessionTemplate,AccountListView,template){
+    return declare([Page],{
+        templateString: template,
+        session: null,
+        _accountList: null,
+        _select: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            if ( this.sessionId ) {
+                this._loadSession();
+                this._setupAutoComplete();
+            } else {
+                throw "No valid uid or session passed!";
+            }
+        },
+        _loadSession: function() {
+            if ( this.sessionId === "new" ) {
+                this.session = SessionTemplate.create();
+            } else {
+                when(store.get(this.sessionId))
+                .then(lang.hitch(this,function(obj){
+                    this.session = obj;
+                    this._setupAccountList();
+                    this._refresh();
+                }));
+            }
+        },
+        _refresh: function() {
+            this.titleNode.innerHTML = SessionTemplate.DisplayTitle.get(this.session);
+            this.propertiesForm.set('value',this.session);
+        },
+        onInvite: function() {
+            this._addAccount(this._select.item.i);
+            this._select.reset();
+        },
+        onSave: function(evt) {
+            lang.mixin(this.session,this.propertiesForm.get('value'));
+            this.session.accounts = array.map(this._accountList.get('value'), function(item){
+                return store.getIdentity(item);
+            });
+            store.put(this.session)
+            .then(function(){
+                Router.go('/sessions');
+            });
+            event.stop(evt);
+            return false;
+        },
+        onDiscard: function(evt) {
+            this.propertiesForm.reset();
+            event.stop(evt);
+            Router.go('/sessions');
+            return false;
+        },
+        _addAccount: function(item) {
+            this._accountList.insertItem(item);
+        },
+        _setupAccountList: function() {
+            this._accountList = new AccountListView({
+                value: this.session.accounts
+            }).placeAt(this.accountListNode);
+            this._accountList.startup();
+        },
+        _setupAutoComplete: function() {
+            this._select = new ThresholdFilteringSelect({
+                store: search,
+                autoComplete: false,
+                required: false,
+                labelType: "text",
+                placeHolder: "Enter email address here...",
+                pageSize: 10,
+                hasDownArrow: false,
+                style: "width: 400",
+                searchAttr: "title"
+            }, this.accountSelector);
+            this._select.startup();
+        }
+
+
+    });
+});
+
Index: Dev/trunk/src/qed-client/pages/sessions.js
===================================================================
--- Dev/trunk/src/qed-client/pages/sessions.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/sessions.js	(revision 443)
@@ -0,0 +1,76 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/date/stamp',
+    '../store',
+    '../app/Router',
+    '../app/Page',
+    '../widgets/ObjectBox',
+    'dojo/text!./templates/sessions.html'
+],function(declare,lang,dateStamp,store,Router,Page,ObjectBox,template){
+    return declare([Page],{
+        templateString: template,
+        templateActions: null,
+        sessionActions: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this.templateActions = {
+                "Edit": function(obj){
+                    Router.go('/session/'+store.getIdentity(obj));
+                },
+                "Delete": lang.hitch(this,function(obj){
+                    store.remove(store.getIdentity(obj),store.getRevision(obj))
+                    .then(lang.hitch(this,function(){
+                        this._refresh();
+                    }));
+                }),
+                "Publish": lang.hitch(this,this._publishSession)
+            };
+            this.sessionActions = {
+                "Facilitate": function(obj){
+                    Router.go('run',{uid:store.getIdentity(obj)});
+                },
+                "Delete": lang.hitch(this,function(obj){
+                    store.remove(store.getIdentity(obj),store.getRevision(obj))
+                    .then(lang.hitch(this,function(){
+                        this._refresh();
+                    }));
+                })
+            };
+            this._refresh();
+        },
+        _refresh: function() {
+            this.containerTemplates.set('content','');
+            this.containerSessions.set('content','');
+            this._refreshByType('SessionTemplate',this.containerTemplates.domNode,this.templateActions);
+            this._refreshByType('SessionInstance',this.containerSessions.domNode,this.sessionActions);
+        },
+        _refreshByType: function(type,container,actions) {
+            store.query("_design/default/_view/by_type",{key:type})
+            .forEach(lang.hitch(this,function(obj){
+                var widget = new ObjectBox({
+                    actions: actions
+                }).placeAt(container, "last");
+                widget.startup();
+                widget.set('value',obj);
+            }));
+        },
+        onAddSessionTemplate: function(){
+            Router.go('/session/new');
+        },
+        _publishSession: function(sessionTemplate) {
+            var session = lang.clone(sessionTemplate);
+            delete session[store.idProperty];
+            delete session[store.revProperty];
+            session.type = "SessionInstance";
+            session.publicationDate = store.timestamp();
+            session.creator = "Igor Mayer";
+            store.add(session)
+            .then(lang.hitch(this,function(){
+                this._refresh();
+                this.tabContainer.selectChild(this.sessionsTab);
+            }));
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/pages/survey.js
===================================================================
--- Dev/trunk/src/qed-client/pages/survey.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/survey.js	(revision 443)
@@ -0,0 +1,119 @@
+define([
+    "../app/Page",
+    "../app/Router",
+    "../model/classes/Survey",
+    "../model/widgets/QuestionListView",
+    "../model/widgets/TabbedQuestionBrowser",
+    "../store",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/when",
+    "require",
+    "dojo/text!./templates/survey.html"
+], function(Page, Router, Survey, QuestionListView, TabbedQuestionBrowser, store, array, declare, event, lang, when, require, template) {
+    return declare([Page],{
+        contextRequire: require,
+        templateString: template,
+        survey: null,
+        questionList: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            if ( this.surveyId ) {
+                this._setupQuestionBrowser();
+                this._setupListView();
+                this._loadSurvey();
+            } else {
+                throw "No valid uid or survey passed!";
+            }
+        },
+        _setupQuestionBrowser: function() {
+            this.questionBrowser = new TabbedQuestionBrowser({
+                region: 'center',
+                'class': 'blue',
+                include: 'published',
+                selectedActions: {
+                    "Include": {
+                        callback: lang.hitch(this,this._includeQuestion),
+                        icon: "Accept",
+                        description: "Include in survey"
+                    }
+                },
+                itemActions: {
+                    "Info": {
+                        callback: function(item){
+                            if ( item.description ) { alert(item.description); }
+                        },
+                        icon: "Inspect",
+                        description: "Show item description"
+                    }
+                }
+            },this.questionBrowser);
+            this.questionBrowser.startup();
+        },
+        _setupListView: function() {
+            this.questionList = new QuestionListView({
+                region: 'center',
+                name: 'questions'
+            },this.surveyListViewNode);
+            this.questionList.startup();
+        },
+        _loadSurvey: function() {
+            if ( this.surveyId === "new" ) {
+                this.survey = Survey.create();
+                this.refresh();
+            } else {
+                when(store.get(this.surveyId))
+                .then(lang.hitch(this,function(survey){
+                    this.survey = survey;
+                    this.questionList.set('value',
+                                          Survey.Questions.get(this.survey));
+                    this.refresh();
+                }));
+            }
+        },
+        _includeQuestion: function(question) {
+            this.questionList.appendItem(question);
+        },
+        refresh: function() {
+            this.titleNode.innerHTML = Survey.DisplayTitle.get(this.survey) || "(set title in properties)";
+            this.propertiesDialog.set('value',this.survey);
+        },
+        _onShowProperties: function(evt) {
+            this.propertiesDialog.show();
+        },
+        _onPropertiesOk: function(evt) {
+            this.propertiesDialog.hide();
+            lang.mixin(this.survey, this.propertiesDialog.get('value'));
+            this.refresh();
+            event.stop(evt);
+            return false;
+        },
+        _onPropertiesCancel: function(evt) {
+            this.propertiesDialog.hide();
+            this.propertiesDialog.reset('value',this.survey);
+            event.stop(evt);
+            return false;
+        },
+        _onSave: function(evt) {
+            this.survey.questions = this.questionList.get('value');
+            store.put(this.survey)
+            .then(function() { 
+                Router.go('/surveys');
+            });
+            event.stop(evt);
+            return false;
+        },
+        _onDiscard: function(evt) {
+            Router.go('/surveys');
+        },
+        _onShowPreview: function() {
+            Router.go('/previewSurvey/'+store.getIdentity(this.survey),{
+                preview: true
+            });
+        }
+    });
+});
+
Index: Dev/trunk/src/qed-client/pages/surveyRun.js
===================================================================
--- Dev/trunk/src/qed-client/pages/surveyRun.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/surveyRun.js	(revision 443)
@@ -0,0 +1,107 @@
+define([
+    "../app/Content",
+    "../app/Page",
+    "../app/Router",
+    "../lib/func",
+    "../model/classes/SurveyRun",
+    "../store",
+    "../widgets/LineWithActionsWidget",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/when",
+    "require",
+    "dojo/text!./templates/surveyRun.html"
+], function(Content, Page, Router, func, SurveyRun, store, LineWithActionsWidget, declare, event, lang, when, require, template) {
+    return declare([Page],{
+        contextRequire: require,
+        templateString: template,
+        surveyRun: null,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this.propertiesForm.on("blur",lang.hitch(this,'_onPropChange'));
+            if ( this.surveyRunId ) {
+                this._loadSurveyRun();
+                this._loadResponses();
+            } else {
+                throw "No valid uid or survey passed!";
+            }
+        },
+        _loadSurveyRun: function() {
+            when(store.get(this.surveyRunId))
+            .then(lang.hitch(this,function(surveyRun){
+                this.surveyRun = surveyRun;
+                this.refreshSurveyRun();
+            }));
+        },
+        refreshSurveyRun: function() {
+            this.titleNode.innerHTML = SurveyRun.DisplayTitle.get(this.surveyRun);
+            this.surveyNode.set('value',SurveyRun.Survey.get(this.surveyRun));
+            this.propertiesForm.set('value',this.surveyRun);
+            this._onPropChange();
+        },
+        _loadResponses: function() {
+            when(store.query("_design/responses/_view/by_surveyrun",{key:this.surveyRunId}))
+            .forEach(lang.hitch(this,function(response){
+                var actions = {
+                    view: {
+                        callback: function(){},
+                        properties: {
+                            title: "View response"
+                        }
+                    }
+                };
+                if ( !response.publicationDate ) {
+                    actions.remove = {
+                        callback: function(){},
+                        properties: {
+                            title: "Remove response"
+                        }
+                    };
+                }
+                var w = new LineWithActionsWidget({
+                    actions: actions
+                });
+                var responseId = store.getIdentity(response);
+                w.set('title',this._link(this._getResponseURL(this.surveyRunId,responseId),responseId));
+                w.placeAt(this.responsesNode);
+            }));
+        },
+        _onPropChange: function(e) {
+            var surveyRun = this.propertiesForm.get('value');
+            if ( surveyRun.mode === "open" ) {
+                this.runURLNode.innerHTML = this._link(this._getGeneralURL(store.getIdentity(this.surveyRun)));
+            } else {
+                this.runURLNode.innerHTML = "No general URL. Add individual respondents below.";
+            }
+        },
+        _getGeneralURL: function(surveyRunId) {
+            return 'response.html#!/'+surveyRunId;
+        },
+        _getResponseURL: function(surveyRunId,responseId) {
+            return 'response.html#!/'+surveyRunId+'!id='+responseId;
+        },
+        _link: function(url,label) {
+            return '<a target="_black" href="'+url+'">'+(label || url)+'</a>';
+        },
+        _onSave: function(evt) {
+            lang.mixin(this.surveyRun,this.propertiesForm.get('value'));
+            var not = function(p){ return !p; };
+            func.modPropIf(this.surveyRun,"startDate",not.compose(lang.isString),store.formatDate);
+            func.modPropIf(this.surveyRun,"endDate",not.compose(lang.isString),store.formatDate);
+            store.put(this.surveyRun)
+            .then(function() { 
+                Router.go('/surveys');
+            },function(err){
+                Content.notify(err);
+            });
+            event.stop(evt);
+            return false;
+        },
+        _onDiscard: function(evt) {
+            Router.go('/surveys');
+        }
+    });
+});
+
Index: Dev/trunk/src/qed-client/pages/surveys.js
===================================================================
--- Dev/trunk/src/qed-client/pages/surveys.js	(revision 443)
+++ Dev/trunk/src/qed-client/pages/surveys.js	(revision 443)
@@ -0,0 +1,161 @@
+define([
+    'dojo/_base/array',
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/when',
+    '../store',
+    '../app/Content',
+    '../app/Page',
+    '../app/Router',
+    '../model/classes/Survey',
+    '../model/classes/SurveyRun',
+    '../widgets/LineWithActionsWidget',
+    'dojo/text!./templates/surveys.html'
+],function(array,declare,lang,when,store,Content,Page,Router,Survey,SurveyRun,LineWithActionsWidget,template){
+    return declare([Page],{
+        templateString: template,
+        startup: function() {
+            if ( this._started ) { return; }
+            this.inherited(arguments);
+            this.refresh();
+        },
+        _onNewSurvey: function(){
+            Router.go('/survey/new');
+        },
+        _onPublishSurvey:function(survey){
+            var self = this;
+            survey.publicationDate = store.timestamp();
+            store.put(survey).then(function(){
+                self.refreshDrafts();
+                self.refreshPublished();
+            },function(err){
+                Content.notify(err,'error');
+            });
+        },
+        _onDeleteSurvey:function(survey){
+            var self = this;
+            store.remove(store.getIdentity(survey),store.getRevision(survey))
+            .then(function(){
+                self.refreshDrafts();
+            },function(err){
+                Content.notify(err,'error');
+            });
+        },
+        _onEditSurvey:function(survey){
+            Router.go('/survey/'+store.getIdentity(survey));
+        },
+        _onPreviewSurvey:function(survey){
+            Router.go('/previewSurvey/'+store.getIdentity(survey));
+        },
+        _onRunSurvey:function(survey){
+            var surveyRun = SurveyRun.create();
+            SurveyRun.Survey.set(surveyRun,survey);
+            store.put(surveyRun)
+            .then(lang.hitch(this,function(surveyRun){
+                this._onRunDetails(surveyRun);
+            }),function(err){
+                Content.notify(err);
+            });
+        },
+        _onRunDetails: function(surveyRun) {
+            Router.go('/surveyRun/'+store.getIdentity(surveyRun));
+        },
+        refresh: function() {
+            this.refreshDrafts();
+            this.refreshPublished();
+            this.refreshRuns();
+        },
+        refreshDrafts: function() {
+            this.draftsContainer.set('content','');
+            when(store.query("_design/surveys/_view/drafts"),
+                    lang.hitch(this,function(surveys) {
+                this.draftsTab.set('title','Drafts ('+surveys.length+')');
+                array.forEach(surveys,function(survey){
+                    var w = new LineWithActionsWidget({
+                        title: Survey.DisplayTitle.get(survey) || '(unnamed)',
+                        actions: [{
+                            callback: lang.hitch(this,'_onPublishSurvey',survey),
+                            properties: {
+                                label: 'Publish',
+                                tooltip: 'Publish survey',
+                                icon: 'Publish'
+                            }
+                        },{
+                            callback: lang.hitch(this,'_onPreviewSurvey',survey),
+                            properties: {
+                                label: 'Preview',
+                                tooltip: 'Preview survey',
+                                icon: 'Preview'
+                            }
+                        },{
+                            callback: lang.hitch(this,'_onDeleteSurvey',survey),
+                            properties: {
+                                label: 'Delete',
+                                tooltip: 'Delete survey',
+                                icon: 'Delete'
+                            }
+                        },{
+                            callback: lang.hitch(this,'_onEditSurvey',survey),
+                            properties: {
+                                label: 'Edit',
+                                tooltip: 'Edit survey',
+                                icon: 'Edit'
+                            }
+                        }]
+                    });
+                    this.draftsContainer.addChild(w);
+                },this);
+            }));
+        },
+        refreshPublished: function() {
+            this.publishedContainer.set('content','');
+            when(store.query("_design/surveys/_view/published"),
+                    lang.hitch(this, function(surveys) {
+                this.publishedTab.set('title','Published ('+surveys.length+')');
+                array.forEach(surveys,function(survey){
+                    var w = new LineWithActionsWidget({
+                        title: Survey.DisplayTitle.get(survey),
+                        actions:[{
+                            callback: lang.hitch(this,'_onPreviewSurvey',survey),
+                            properties: {
+                                label: 'Preview',
+                                tooltip: 'Preview survey',
+                                icon: 'Preview'
+                            }
+                        },{
+                            callback: lang.hitch(this,'_onRunSurvey',survey),
+                            properties: {
+                                label: 'Run',
+                                tooltip: 'Run survey',
+                                icon: 'Run'
+                            }
+                        }]
+                    });
+                    this.publishedContainer.addChild(w);
+                },this);
+            }));
+        },
+        refreshRuns: function() {
+            this.runsContainer.set('content','');
+            when(store.query("_design/default/_view/by_type",{key:'SurveyRun'}),
+                    lang.hitch(this,function(surveyRuns){
+                this.runsTab.set('title','Runs ('+surveyRuns.length+')');
+                array.forEach(surveyRuns,function(surveyRun){
+                    var w = new LineWithActionsWidget({
+                        title: SurveyRun.DisplayTitle.get(surveyRun),
+                        actions:[{
+                            callback: lang.hitch(this,'_onRunDetails',surveyRun),
+                            properties: {
+                                label: 'Details',
+                                tooltip: 'Show details for this run',
+                                icon: 'Details'
+                            }
+                        }]
+                    });
+                    this.runsContainer.addChild(w);
+                },this);
+            }));
+        }
+    });
+});
+
Index: Dev/trunk/src/qed-client/pages/templates/index.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/index.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/index.html	(revision 443)
@@ -0,0 +1,37 @@
+<div>
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconUser"></span>
+            <span class="headerText">Main Menu</span>
+        </h2>
+    </div>
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
+
+        <div class="rftIndexMenuBlock" title="Sessions">
+            <div class="rftIndexMenuMask">
+                <span class="rftIcon rftIconSession"></span><span class="label">Sessions</span>
+            </div>
+            <button data-dojo-attach-point="btnContentCreate" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'green twoHeight', iconClass: 'rftIcon rftIconPlus'">Create and edit</button>
+            <button data-dojo-attach-point="btnContentFacilitate" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'green twoHeight', iconClass: 'rftIcon rftIconForward'">Facilitate</button>
+        </div>
+
+        <div class="rftIndexMenuBlock" title="Content">
+            <div class="rftIndexMenuMask">
+                <span class="rftIcon rftIconInspect"></span><span class="label">Content</span>
+            </div>
+            <button data-dojo-attach-point="btnSurveys" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'blue oneHeight', iconClass: 'rftIcon rftIconSurvey'">Surveys</button>
+            <button data-dojo-attach-point="btnQuestions" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'orange oneHeight', iconClass: 'rftIcon rftIconQuestion'">Questions</button>
+            <button data-dojo-attach-point="btnApplications" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'purple oneHeight', iconClass: 'rftIcon rftIconApplication'">Applications</button>
+            <button data-dojo-attach-point="btnDashboards" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'red oneHeight', iconClass: 'rftIcon rftIconDashboard'">Dashboards</button>
+        </div>
+
+        <div class="rftIndexMenuBlock" title="results">
+            <div class="rftIndexMenuMask">
+                <span class="rftIcon rftIconGameData"></span><span class="label">Results</span>
+            </div>
+            <button data-dojo-attach-point="btnResults" data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftIndexMenuButton', class: 'blue fourHeight', iconClass: 'rftIcon rftIconGameData'">Results</button>
+        </div>
+    </div>
+
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/previewSurvey.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/previewSurvey.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/previewSurvey.html	(revision 443)
@@ -0,0 +1,16 @@
+<div class="blue">
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText" data-dojo-attach-point="titleNode">Survey</span>
+        </h2>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" data-dojo-attach-point="questionsPane">
+        <form data-dojo-type="dijit/form/Form" data-dojo-attach-point="questionsForm" style="overflow: auto">
+            <div data-dojo-type="../model/widgets/SurveyWidget" data-dojo-attach-point="surveyWidget"></div>
+        </form>
+    </div>
+    
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/question.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/question.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/question.html	(revision 443)
@@ -0,0 +1,17 @@
+<div class="orange">
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText"><span data-dojo-attach-point="titleNode">Question title</span> [Editing]</span>
+        </h2>
+    </div>
+    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'left', design:'headline'" style="width: 300px;">
+        <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
+            <div data-dojo-attach-point="QuestionEditorToolkitNode"></div>
+        </div>
+        <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+            <button data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconCancel'" data-dojo-attach-event="onClick:_onDiscard">Discard</button>
+            <button data-dojo-type="dijit/form/Button" data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconAccept'" data-dojo-attach-event="onClick:_onSave">Save and exit</button>
+        </div>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/questions.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/questions.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/questions.html	(revision 443)
@@ -0,0 +1,18 @@
+<div class="blue page_questions">
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconQuestion"></span>
+            <span class="headerText">Questions</span>
+        </h2>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
+        <div data-dojo-attach-point="questionBrowser"></div>
+    </div>
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'bottom'">
+        <div data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onNewQuestion" data-dojo-props="baseClass: 'rftLargeButton', iconClass:'rftIcon rftIconQuestion'">New question</div>
+    </div>
+
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/response.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/response.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/response.html	(revision 443)
@@ -0,0 +1,31 @@
+<div class="blue">
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText" data-dojo-attach-point="titleNode">Survey</span>
+        </h2>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'" data-dojo-attach-point="content">
+        <form data-dojo-type="dijit/form/Form" data-dojo-attach-point="responseForm"
+              data-dojo-attach-event="onSubmit:_ignoreEvent" style="overflow: auto">
+            <div data-dojo-type="../model/widgets/SurveyWidget" data-dojo-attach-point="surveyWidget"></div>
+        </form>
+    </div>
+    
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'bottom'">
+        <button data-dojo-type="dijit/form/Button"
+                type="submit"
+                data-dojo-attach-point="submitButton"
+                data-dojo-attach-event="onClick:_onSubmit">
+            Submit</button>
+        <button data-dojo-type="dijit/form/Button"
+                type="button"
+                data-dojo-attach-point="continueButton"
+                data-dojo-attach-event="onClick:_onContinueLater">
+            Continue later</button>
+    </div>
+
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/session.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/session.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/session.html	(revision 443)
@@ -0,0 +1,55 @@
+<div>
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span data-dojo-attach-point="titleNode" class="headerText">Untitled</span><span class="headerText"> [editing]</span>
+        </h2>
+    </div>
+    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'">
+        <div data-dojo-type="dijit/layout/TabContainer" class="green" data-dojo-props="tabPosition:'left-h',region:'center'">
+            <div data-dojo-type="dijit/layout/ContentPane" title="Properties">
+                <div data-dojo-type="dijit/form/Form" data-dojo-attach-point="propertiesForm" data-dojo-attach-event="onSubmit:onSave">
+
+                    <h3>Basic</h3>
+                    <fieldset class="align">
+                        <label for="title">Title</label>
+                        <input type="text" name="title" data-dojo-type="dijit/form/TextBox" data-dojo-props="placeHolder: 'Enter title here'" />
+                        <br/>
+                        <label for="description">Description</label>
+                        <textarea name="description" rows="3" cols="54" data-dojo-type="dijit/form/SimpleTextarea" data-dojo-props="selectOnClick: true, placeHolder: 'Description shown in tooltips'"></textarea>
+                        <br/>
+                        <label for="plannedDate">Planned date</label>
+                        <input type="text" name="plannedDate" data-dojo-type="dijit/form/DateTextBox" required="required" />
+                    </fieldset>
+
+                    <h3>Accounts</h3>
+                    <fieldset class="align">
+                        <label for="accountSelector">Add new</label>
+                        <select data-dojo-attach-point="accountSelector"></select>
+                        <button data-dojo-attach-point="btnInvite" data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onInvite" data-dojo-props="baseClass: 'rftBlockButton', class: 'green', iconClass: 'rftIcon rftIconPlus'">Invite</button>
+                        <br/><br/>
+                        
+                        <div data-dojo-attach-point="accountListNode" class="rftAccountListView">
+                        </div>
+                    </fieldset>
+
+                    <button data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onDiscard" data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconCancel'">Discard changes</button>
+                    <button data-dojo-type="dijit/form/Button" data-dojo-attach-event="onClick:onSave" data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconAccept'">Save changes</button>
+
+                </div>
+
+            </div>
+            <div data-dojo-type="dijit/layout/ContentPane" title="Design">
+                <div class="rftSessionObject green">
+                    <div class="rftIcon rftIconSurvey"></div>
+                    <label>Survey name</label>
+                </div>
+                <div class="rftSessionObject green">
+                    <div class="rftIcon rftIconSurvey"></div>
+                    <label>Survey name, this one is really long.</label>
+                </div>
+
+            </div>
+        </div>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/sessions.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/sessions.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/sessions.html	(revision 443)
@@ -0,0 +1,26 @@
+<div class="page_sessions">
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSession"></span>
+            <span class="headerText">Sessions</span>
+        </h2>
+    </div>
+    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'">
+        <div data-dojo-attach-point="tabContainer" data-dojo-type="dijit/layout/TabContainer" class="green" data-dojo-props="tabPosition:'left-h',region:'center'">
+            <div data-dojo-type="dijit/layout/BorderContainer" title="Templates" data-dojo-attach-point="templatesTab">
+                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'" data-dojo-attach-point="containerTemplates">
+                </div>
+                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+                    <div data-dojo-type="dijit/form/Button" data-dojo-props="region: 'bottom', baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconSessionTemplate'" data-dojo-attach-event="onClick:onAddSessionTemplate">Create new template</div>
+                </div>
+            </div>
+            <div data-dojo-type="dijit/layout/ContentPane" title="Sessions" data-dojo-attach-point="sessionsTab">
+                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'" data-dojo-attach-point="containerSessions">
+                </div>
+                <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+                    <!-- Buttons? -->
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/survey.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/survey.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/survey.html	(revision 443)
@@ -0,0 +1,53 @@
+<div class="blue">
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText" data-dojo-attach-point="titleNode">Survey Editor</span>
+        </h2>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'">
+        <div data-dojo-attach-point="questionBrowser"></div>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'right'" style="width: 300px">
+        <div data-dojo-attach-point="surveyListViewNode" class="rftSurveyListView">
+        </div>
+
+        <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'">
+            <button data-dojo-type="dijit/form/Button"
+                    data-dojo-attach-event="onClick:_onShowProperties"
+                    data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconProperties'">
+                Properties</button>
+            <button data-dojo-type="dijit/form/Button"
+                    data-dojo-attach-event="onClick:_onSave"
+                    data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconAccept'">
+                Save Changes</button>
+            <button data-dojo-type="dijit/form/Button"
+                    data-dojo-attach-event="onClick:_onDiscard"
+                    data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconCancel'">
+                Discard changes</button>
+            <button data-dojo-type="dijit/form/Button"
+                    data-dojo-attach-event="onClick:_onShowPreview"
+                    data-dojo-props="baseClass: 'rftLargeButton', iconClass: 'rftIcon rftIconPreview'">
+                Preview</button>
+        </div>
+    </div>
+
+    <div data-dojo-type="dijit/Dialog"
+         title="Survey properties"
+         data-dojo-attach-point="propertiesDialog"
+         data-dojo-attach-event="onSubmit:_onPropertiesOk">
+        <fieldset data-dojo-type="../model/widgets/SurveyFieldset"></fieldset>
+        <button data-dojo-type="dijit/form/Button"
+                type="submit"
+                data-dojo-attach-event="onClick:_onPropertiesOk">
+            OK</button>
+        <button data-dojo-type="dijit/form/Button"
+                type="button"
+                data-dojo-attach-event="onClick:_onPropertiesCancel">
+            Cancel</button>
+    </div>
+
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/surveyRun.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/surveyRun.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/surveyRun.html	(revision 443)
@@ -0,0 +1,32 @@
+<div class="blue">
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText" data-dojo-attach-point="titleNode">SurveyRun Editor</span>
+        </h2>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'">
+        <div data-dojo-type="../model/widgets/SurveySummary" data-dojo-attach-point="surveyNode"></div>
+        <div data-dojo-type="dijit/form/Form"
+             data-dojo-attach-point="propertiesForm">
+            <fieldset data-dojo-type="../model/widgets/SurveyRunFieldset"></fieldset>
+        </div>
+        <fieldset class="qedFieldset">
+            <div><div class="qedLabel">General URL</div><div class="qedField" data-dojo-attach-point="runURLNode" style="overflow: ellipsis"></div></div>
+            <div><div class="qedLabel">Responses <span data-dojo-attach-point="responsesCountNode"></span></div><div class="qedField qedFill" data-dojo-attach-point="responsesNode"></div></div>
+        </fieldset>
+    </div>
+    
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+        <button data-dojo-type="dijit/form/Button"
+                class="blue"
+                data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconSave'"
+                data-dojo-attach-event="onClick:_onSave">Save &amp; Close</button>
+        <button data-dojo-type="dijit/form/Button"
+                class="blue"
+                data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconClose'"
+                data-dojo-attach-event="onClick:_onDiscard">Discard &amp; Close</button>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/pages/templates/surveys.html
===================================================================
--- Dev/trunk/src/qed-client/pages/templates/surveys.html	(revision 443)
+++ Dev/trunk/src/qed-client/pages/templates/surveys.html	(revision 443)
@@ -0,0 +1,38 @@
+<div>
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
+        <h2>
+            <span class="rftIcon rftIconSurvey"></span>
+            <span class="headerText">Surveys</span>
+        </h2>
+    </div>
+
+    <div data-dojo-attach-point="tabContainer" data-dojo-type="dijit/layout/TabContainer" class="blue" data-dojo-props="tabPosition:'left-h',region:'center'">
+
+        <div data-dojo-type="dijit/layout/BorderContainer" title="Drafts" data-dojo-attach-point="draftsTab">
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'" data-dojo-attach-point="draftsContainer">
+            </div>
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+            </div>
+        </div>
+
+        <div data-dojo-type="dijit/layout/BorderContainer" title="Published" data-dojo-attach-point="publishedTab">
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'" data-dojo-attach-point="publishedContainer">
+            </div>
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+            </div>
+        </div>
+
+        <div data-dojo-type="dijit/layout/BorderContainer" title="Runs" data-dojo-attach-point="runsTab">
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'" data-dojo-attach-point="runsContainer">
+            </div>
+            <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+            </div>
+        </div>
+    </div>
+
+    <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'bottom'" style="height: 40px;">
+        <button data-dojo-type="dijit/form/Button" class="blue" data-dojo-props="baseClass: 'rftBlockButton', iconClass: 'rftIcon rftIconNew'" data-dojo-attach-event="onClick:_onNewSurvey">New survey</button>
+    </div>
+
+</div>
Index: Dev/trunk/src/qed-client/qed.profile.js
===================================================================
--- Dev/trunk/src/qed-client/qed.profile.js	(revision 443)
+++ Dev/trunk/src/qed-client/qed.profile.js	(revision 443)
@@ -0,0 +1,15 @@
+var profile = (function(){
+    return {
+        resourceTags: {
+            amd: function (filename, mid) {
+                return (/\.js$/).test(filename);
+            },
+            declarative: function (filename, mid) {
+                return (/\.html$/).test(filename);
+            },
+            copyOnly: function(filename,mid) {
+                return false;
+            }
+        }
+    };
+})();
Index: Dev/trunk/src/qed-client/response.js
===================================================================
--- Dev/trunk/src/qed-client/response.js	(revision 443)
+++ Dev/trunk/src/qed-client/response.js	(revision 443)
@@ -0,0 +1,82 @@
+define([
+    'dojo/date',
+    'dojo/date/locale',
+    'dojo/hash',
+    'dojo/parser',
+    './store',
+    './app/Content',
+    './app/Page',
+    './app/Path',
+    './lib/async',
+    './model/classes/Response',
+    './model/classes/SurveyRun',
+    './pages/response',
+    'dojo/domReady!',
+    './stddeps'
+],function(date,locale,hash,parser,store,Content,Page,Path,async,Response,SurveyRun,ResponsePage) {
+    parser.parse();
+    Content.startup();
+
+    function error(msg) {
+        Content.set(new Page({
+            templateString: "<div>"+msg+"</div>"
+        }));
+    }
+
+    var path = new Path('/:surveyRunId');
+    var params = path.match(hash());
+    params.options = params.options || {};
+
+    if ( !params || !params.surveyRunId ) {
+        error("Something is wrong with the URL, don't know what survey to show you. Sorry.");
+        return;
+    }
+
+    var surveyRunId = params.surveyRunId;
+
+    function checkDates(surveyRun) {
+        var now = new Date();
+        var startDate = SurveyRun.StartDate.get(surveyRun);
+        var endDate = SurveyRun.EndDate.get(surveyRun);
+        if ( startDate && date.compare(startDate,now) > 0 ) {
+            error("This survey will start on "+locale.format(startDate,'date'));
+            throw false;
+        }
+        if ( endDate && date.compare(now,endDate) > 0 ) {
+            error("This survey ended on "+locale.format(endDate,'date'));
+            throw false;
+        }
+    }
+
+    store.get(surveyRunId)
+    .then(function(surveyRun){
+        checkDates(surveyRun);
+        if ( params.options.id ) {
+            return params.options.id;
+        } else {
+            if ( surveyRun.mode === "open") {
+                var response = Response.create();
+                response.surveyRunId = surveyRunId;
+                return store.put(response).then(function(res){
+                    return store.getIdentity(res);
+                });
+            } else {
+                error("Cannot respond to closed survey without response id. Sorry.");
+                throw false;
+            }
+        }
+        return surveyRun;
+    },function(){
+        error("No running survey found for the given id. Sorry.");
+        throw false;
+    })
+    .then(function(responseId){
+        hash(Path.format("/"+surveyRunId,{ id: responseId }));
+        Content.set(new ResponsePage({
+            surveyRunId: surveyRunId,
+            options: {
+                id: responseId
+            }
+        }));
+    });
+});
Index: Dev/trunk/src/qed-client/routes.js
===================================================================
--- Dev/trunk/src/qed-client/routes.js	(revision 443)
+++ Dev/trunk/src/qed-client/routes.js	(revision 443)
@@ -0,0 +1,26 @@
+define([
+    './pages/index',
+    './pages/questions',
+    './pages/question',
+    './pages/surveys',
+    './pages/survey',
+    './pages/surveyRun',
+    './pages/sessions',
+    './pages/session',
+    './pages/previewSurvey'
+],function(index,questions,question,surveys,survey,surveyRun,sessions,session,previewSurvey){
+
+    return [
+        { path: "/", redirect: "/index" },
+        { path: "/index", constructor: index },
+        { path: "/questions", constructor: questions },
+        { path: "/question/:questionId", constructor: question },
+        { path: "/surveys", constructor: surveys },
+        { path: "/survey/:surveyId", constructor: survey },
+        { path: "/surveyRun/:surveyRunId", constructor: surveyRun },
+        //{ path: "/sessions", constructor: sessions },
+        //{ path: "/session/:sessionId", constructor: session },
+        { path: "/previewSurvey/:surveyId", constructor: previewSurvey }
+    ];
+
+});
Index: Dev/trunk/src/qed-client/search.js
===================================================================
--- Dev/trunk/src/qed-client/search.js	(revision 443)
+++ Dev/trunk/src/qed-client/search.js	(revision 443)
@@ -0,0 +1,9 @@
+define([
+    './store/ElasticReadStore'
+],function(ElasticReadStore){
+    return new ElasticReadStore({
+        url: "data/elastic",
+        requestMethod: "POST"
+    });
+
+});
Index: Dev/trunk/src/qed-client/stddeps.js
===================================================================
--- Dev/trunk/src/qed-client/stddeps.js	(revision 443)
+++ Dev/trunk/src/qed-client/stddeps.js	(revision 443)
@@ -0,0 +1,43 @@
+define([
+    // dijit & rft widgets used declaratively in templates
+    'dijit/Dialog',
+    'dijit/DropDownMenu',
+    'dijit/InlineEditBox',
+    'dijit/MenuBar',
+    'dijit/MenuBarItem',
+    'dijit/PopupMenuBarItem',
+    'dijit/TitlePane',
+    'dijit/layout/AccordionContainer',
+    'dijit/layout/BorderContainer',
+    'dijit/layout/ContentPane',
+    'dijit/layout/TabContainer',
+    'dijit/form/Button',
+    'dijit/form/ComboBox',
+    'dijit/form/DateTextBox',
+    'dijit/form/Form',
+    'dijit/form/NumberSpinner',
+    'dijit/form/Select',
+    'dijit/form/SimpleTextarea',
+    'dijit/form/Textarea',
+    'dijit/form/TextBox',
+    'dijit/form/TimeTextBox',
+
+    'dojox/grid/DataGrid',
+
+    './app/Notifications',
+
+    './model/widgets/AccountListView',
+    './model/widgets/SurveyFieldset',
+    './model/widgets/SurveyRunFieldset',
+    './model/widgets/SurveySummary',
+    './model/widgets/SurveyWidget',
+
+    './ui/MainMenu',
+    './ui/MenuBarLink',
+    './ui/MenuLink',
+
+    './widgets/LineWithActionsWidget',
+    './widgets/ObjectBox',
+    './widgets/Selector',
+    './widgets/TitleGroup'
+],function(){});
Index: Dev/trunk/src/qed-client/store.js
===================================================================
--- Dev/trunk/src/qed-client/store.js	(revision 443)
+++ Dev/trunk/src/qed-client/store.js	(revision 443)
@@ -0,0 +1,45 @@
+define([
+    'dojo/date/stamp',
+    'dojo/store/Cache',
+    'dojo/store/Memory',
+    'dojox/json/schema',
+    './model/schema',
+    './store/CouchStore'
+],function(stamp,Cache,Memory,jsonSchema,schema,CouchStore){
+    
+    var couchStore = new CouchStore({
+        target: 'data/couch/' /*,
+        validate: function(object) {
+            var result = jsonSchema.validate(object,schema);
+            if ( result.valid ) {
+                return true;
+            } else {
+                console.log("Found error ",result," for invalid object ",object);
+                return false;
+            }
+        }*/
+    });
+    var memoryStore = new Memory({
+        idProperty: couchStore.idProperty
+    });
+    var cacheStore = new Cache(couchStore,memoryStore,{
+        isLoaded: function(object) {
+            // Unfortunately we cannot determine of the full documents were
+            // loaded or not. Therefore never cache query results.
+            return false;
+        }
+    });
+
+    var store = cacheStore;
+    store.formatDate = function(date){
+        return stamp.toISOString(date,{zulu:true});
+    };
+    store.parseDate = function(dateString){
+        return stamp.fromISOString(dateString);
+    };
+    store.timestamp = function() {
+        return this.formatDate(new Date());
+    };
+    return store;
+
+});
Index: Dev/trunk/src/qed-client/store/CouchStore.js
===================================================================
--- Dev/trunk/src/qed-client/store/CouchStore.js	(revision 443)
+++ Dev/trunk/src/qed-client/store/CouchStore.js	(revision 443)
@@ -0,0 +1,296 @@
+define([
+    'dojo/_base/array',
+    'dojo/_base/declare',
+    'dojo/_base/Deferred',
+    'dojo/_base/json',
+    'dojo/_base/lang',
+    'dojo/_base/xhr',
+    'dojo/store/util/QueryResults'
+],function(array,declare,Deferred,json,lang,xhr,QueryResults){
+    
+    function getCouchError(err){
+        var reason = err.response &&
+                     err.response.data &&
+                     json.fromJson(err.response.data).reason;
+        return reason || "Unknown error.";
+    }
+
+    var CouchStore = declare(null, {
+        /** dojo Store implementation for CouchDB
+         *
+         * See for details on the REST API, the wiki
+         * at http://wiki.apache.org/couchdb/HTTP_Document_API.
+         */
+        target: "",
+        accepts: "application/json", 
+        idProperty: "_id",
+        revProperty: "_rev",
+        _responseIdProperty: "id",
+        _responseRevProperty: "rev",
+        constructor: function(options){
+            declare.safeMixin(this, options);
+        },
+        getIdentity: function(object){
+            return object[this.idProperty];
+        },
+        getRevision: function(object){
+            return object[this.revProperty];
+        },
+        info: function(){
+            var dfd = new Deferred();
+            xhr("GET", {
+                url: this.target,
+                handleAs: "json",
+                headers: {
+                    Accept: this.accepts
+                }
+            }).then(function(result){
+                if ( result.error ) {
+                    dfd.reject(result.reason);
+                } else {
+                    dfd.resolve(result);
+                }
+            }, function(err){
+                dfd.reject(getCouchError(err));
+            });
+            return dfd.promise;
+        },
+        get: function(id){
+            var dfd = new Deferred();
+            xhr("GET", {
+                url: this.target + id,
+                handleAs: "json",
+                headers: {
+                    Accept: this.accepts
+                }
+            }).then(function(result){
+                if ( result.error ) {
+                    dfd.reject(result.reason);
+                } else {
+                    dfd.resolve(result);
+                }
+            }, function(err){
+                dfd.reject(getCouchError(err));
+            });
+            return dfd.promise;
+        },
+        validate: function(object) {
+            return true;
+        },
+        put: function(object, options){
+             // summary:
+             //     put an object in CouchDB
+             // object: Object
+             //     The object to put
+             // options: Object
+             //     Options object as
+             //         id: String
+             //
+
+            if ( !this.validate(object) ) {
+                var dfd = new Deferred();
+                dfd.reject("Invalid document.");
+                return dfd.promise;
+            }
+            return this._putValid(object, options);
+
+        },
+        _putValid: function(object,options) {
+            var dfd = new Deferred();
+            options = options || {};
+            var id = options.id ? options.id : this.getIdentity(object);
+            var hasId = typeof id !== "undefined";
+            xhr(hasId ? "PUT" : "POST", {
+                url: hasId ? this.target + id : this.target,
+                postData: json.toJson(object),
+                handleAs: "json",
+                headers:{
+                    "Content-Type": "application/json",
+                    Accept: this.accepts
+                }
+            }).then(lang.hitch(this,function(result){
+                if ( result.error ) {
+                    dfd.reject(result.reason);
+                } else {
+                    object[this.idProperty] = result[this._responseIdProperty];
+                    object[this.revProperty] = result[this._responseRevProperty];
+                    dfd.resolve(object);
+                }
+            }), function(err){
+                dfd.reject(getCouchError(err));
+            });
+            return dfd.promise;
+        },
+        add: function(object, options){
+            return this.put(object,options);
+        },
+        remove: function(id,rev){
+            var dfd = new Deferred();
+            xhr("DELETE",{
+                url: this.target + id,
+                headers: {
+                    'If-Match': rev
+                }
+            }).then(function(result){
+                if ( result.error ) {
+                    dfd.reject(result.reason);
+                } else {
+                    dfd.resolve();
+                }
+            },function(err){
+                dfd.reject(getCouchError(err));
+            });
+            return dfd.promise;
+        },
+        query: function(query, options){
+            // summary:
+            //    query a couchdb view
+            // query: String
+            //    name of a couchdb view you want to query, relative to the current database
+            // options: Object
+            //     options object as
+            //        start: Number
+            //            Start results at this item
+            //        count: Number
+            //            Number of items to return
+            //        sort: [{attribute:'key',descending:true|false}]
+            //            CouchDB only support sorting by key, so only 'key'
+            //            is allowed as attribute value. Multiple sort items
+            //            are ignored.
+            //        key: String|Array|Object
+            //            Return only values with this key.
+            //            Excludes start/endkey usage.
+            //        startkey: String|Array|Object
+            //            Return values starting from this key.
+            //        endkey: String|Array|Object
+            //            Return values with key lower than this key.
+            //        include_docs: true|false
+            //            Return the full documents instead of the view
+            //            values.
+            //        reduce: true|false
+            //            Execute reduce on the view or not. Default depends
+            //            on if a reduce function is defined on the view.
+            //        group: true|false
+            //            Should values be grouped per key or not? Default
+            //            is false.
+            //        group_level: Number
+            //            When group = true and the key is an array,
+            //            determines which elements starting from the first
+            //            are used for grouping. Default is 0.
+            //        get_keys: true|false
+            //            Instead of returning the values or documents,
+            //            return the array of keys as the result.
+            //            This does not affect the forPairs function.
+            options = options || {};
+
+            var dfd = new Deferred();
+            var queryOpts = {};
+            if ( !query ) {
+                query = '_all_docs';
+            }
+
+            if (!lang.isString(query)) {
+                console.warn("Query must be a view name");
+            }
+
+            // Standard options
+            if (options.start >= 0) {
+                queryOpts.skip = options.start;
+            }
+            if (options.count >= 0) {
+                queryOpts.limit = options.count;
+            }
+            if (options.sort) {
+                if (options.sort[0]) {
+                    if (options.sort[0].attribute && options.sort[0].attribute !== "key") {
+                        console.warn("Can only sort on key");
+                    }
+                    if (options.sort[0].descending) {
+                        queryOpts.descending = true;
+                    }
+                }
+                if (options.sort.length > 1) {
+                    console.warn("multiple sort fields not supported");
+                }
+            }
+
+            // Custom options
+            if (options.key !== undefined) {
+                queryOpts.key = options.key;
+            } else if (options.keys !== undefined) {
+                queryOpts.keys = options.keys;
+            } else if (options.startkey !== undefined || options.endkey !== undefined) {
+                queryOpts.startkey = options.startkey;
+                queryOpts.endkey = options.endkey;
+            }
+            if (options.include_docs !== undefined) {
+                queryOpts.include_docs = options.include_docs;
+            }
+            if (options.reduce !== undefined) {
+                queryOpts.reduce = options.reduce;
+            }
+            if (options.group !== undefined) {
+                queryOpts.group = options.group;
+                if (options.group_level !== undefined) {
+                    queryOpts.group_level = options.group_level;
+                }
+            }
+
+            for (var qp in queryOpts) {
+                queryOpts[qp] = json.toJson(queryOpts[qp]);
+            }
+            query += '?' + xhr.objectToQuery(queryOpts);
+
+            xhr("GET", {
+                url: this.target + query,
+                handleAs: "json",
+                headers: {
+                    Accept: this.accepts
+                }
+            }).then(function(result){
+                if (result.error) {
+                    dfd.reject(result.reason);
+                } else  {
+                    var results;
+                    var values = array.map(result.rows,function(result){
+                        return options.include_docs === true ? result.doc : result.value;
+                    });
+                    var keys = array.map(result.rows,function(result){
+                        return result.key;
+                    });
+                    if (options.get_keys === true) {
+                        results = keys;
+                        results.values = values;
+                    } else {
+                        results = values;
+                        results.keys = keys;
+                    }
+                    dfd.resolve(results);
+                }
+            },function(err){
+                dfd.reject(getCouchError(err));
+            });
+            return couchResults(dfd.promise);
+        }
+    });
+
+    var queryResults = QueryResults;
+
+    function couchResults(results) {
+        results = queryResults(results);
+        results.forPairs = function(callback,thisObject) {
+            callback = lang.hitch(thisObject,callback);
+            return Deferred.when(results,function(results) {
+                var values = results.values || results;
+                var keys = results.keys || results;
+                return array.forEach(values, function(value,index) {
+                    callback(value,keys[index],index);
+                });
+            });
+        };
+        return results;
+    }
+
+    return CouchStore;
+
+});
Index: Dev/trunk/src/qed-client/store/ElasticReadStore.js
===================================================================
--- Dev/trunk/src/qed-client/store/ElasticReadStore.js	(revision 443)
+++ Dev/trunk/src/qed-client/store/ElasticReadStore.js	(revision 443)
@@ -0,0 +1,52 @@
+define([
+    'dojo/_base/declare',
+    "dojo/_base/json",
+    'dojo/_base/lang',
+    'dojo/_base/xhr',
+    'dojox/data/QueryReadStore'
+],function(declare, json, lang, xhr, QueryReadStore) {
+    return declare(QueryReadStore, {
+        fetch:function(request){
+            var attr = Object.keys(request.query)[0];
+            if (request.query[attr].length === 0) {
+                return 0;
+            }
+            var q = request.query[attr];
+
+            request.serverQuery = json.toJson({ 
+                query: {
+                    query_string: {
+                        default_field: attr, 
+                        query: q
+                    }
+                }
+            });
+            return this.inherited(arguments);
+        },
+        _fetchItems: function(request, fetchHandler, errorHandler){
+            var serverQuery = request.serverQuery;
+            var xhrHandler = xhr.post({
+                url: this.url,
+                handleAs: "json",
+                postData: serverQuery
+            }).then(lang.hitch(this, function(data){
+                this._xhrFetchHandler(data, request, fetchHandler, errorHandler);
+            }),function(error){
+                errorHandler(error, request);
+            });
+            request.abort = function(){
+                xhrHandler.cancel();
+            };
+        },
+        _xhrFetchHandler: function(data, request, fetchHandler, errorHandler) {
+            data = this._filterResponse(data);
+            this._items = [];
+            var numHits = data.hits.total || -1;
+            if(numHits > 0) {
+                this._items.push({i:data.hits.hits[0]._source, r:this, n:0});
+            }
+            fetchHandler(this._items, request, data.hits.total);
+            this._numRows = data.hits.total;
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/tests/test_ScaleWidget.html
===================================================================
--- Dev/trunk/src/qed-client/tests/test_ScaleWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/tests/test_ScaleWidget.html	(revision 443)
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Test ScaleWidget</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <link rel="stylesheet" type="text/css" href="../css/qed.css" />
+  </head>
+  <body class="dijitReset claro" id="rft">
+    <script type="text/javascript" src="../../dojo/dojo.js" data-dojo-config="async: true, parseOnLoad: false, isDebug: true"></script>
+    <script>
+      require([
+          'dijit/registry',
+          'dojo/dom',
+          'dojo/when',
+          'dojo/parser',
+          'qed-client/model/widgets/questions/ScaleInputConfigWidget',
+          'qed-client/model/widgets/questions/ScaleInputWidget',
+          'dojo/domReady!'
+      ], function(registry,dom,when,parser,ScaleInputConfigWidget,ScaleInputWidget){
+        when(parser.parse()).then(function(){
+
+            var configWidget = registry.byId("configWidget");
+            var configNode = dom.byId("configNode");
+            var valueNode = dom.byId("valueNode");
+            var widgetNode = dom.byId("widgetNode");
+            var widget = null;
+
+            registry.byId("configButton").on("click",function(){
+              if ( configWidget.validate() ) {
+                var config = configWidget.get('value');
+                configNode.innerHTML = JSON.stringify(config);
+                widgetNode.innerHTML = '';
+                widget = new ScaleInputWidget(config)
+                widget.startup();
+                widget.placeAt(widgetNode);
+              }
+            });
+      
+            registry.byId("valueButton").on("click",function(){
+              if ( widget ) {
+                var value = widget.get('value');
+                valueNode.innerHTML = JSON.stringify(value);
+              }
+            });
+      
+            registry.byId("defaultConfigButton").on("click",function(){
+              configWidget.set('value',{
+                min: -2,
+                max: 2,
+                minLabel: "Bad",
+                maxLabel: "Good",
+                naLabel: "N/A",
+                items: [{
+                   text: "How were the lectures?",
+                   minLabel: "Boring",
+                   maxLabel: "Engaging"
+                },{
+                   text: "How was the lab organised? How was the lab organised? How was the lab organised?",
+                   minLabel: "Sloppy",
+                   maxLabel: "Stiff as a board"
+                }]
+              });
+            });
+
+        });
+      });
+    </script>
+
+    <h1>Test ScaleWidget</h1>
+
+    <h2>Config Widget</h2>
+    <div>
+      <div>
+        <div id="configWidget"
+             data-dojo-type="qed-client/model/widgets/questions/ScaleInputConfigWidget"></div>
+        <button id="defaultConfigButton"
+                data-dojo-type="dijit/form/Button">Set Example</button>
+        <button id="configButton"
+                data-dojo-type="dijit/form/Button">Create widget</button>
+      </div>
+      <div id="configNode"></div>
+    </div>
+
+    <h2>Widget</h2>
+    <div>
+      <div>
+        <div id="widgetNode"></div>
+        <button id="valueButton"
+                data-dojo-type="dijit/form/Button">Done</button>
+      </div>
+      <div id="valueNode"></div>
+    </div>
+
+  </body>
+</html>
Index: Dev/trunk/src/qed-client/ui/MainMenu.js
===================================================================
--- Dev/trunk/src/qed-client/ui/MainMenu.js	(revision 443)
+++ Dev/trunk/src/qed-client/ui/MainMenu.js	(revision 443)
@@ -0,0 +1,13 @@
+define([
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare",
+    "require",
+    "dojo/text!./templates/MainMenu.html"
+], function(_TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare, require, template) {
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin],{
+        contextRequire: require,
+        templateString: template
+    });
+});
Index: Dev/trunk/src/qed-client/ui/MenuBarLink.js
===================================================================
--- Dev/trunk/src/qed-client/ui/MenuBarLink.js	(revision 443)
+++ Dev/trunk/src/qed-client/ui/MenuBarLink.js	(revision 443)
@@ -0,0 +1,11 @@
+define(['dojo/_base/declare','dijit/MenuBarItem','../app/Router'
+], function(declare,MenuBarItem,Router) {
+    return declare([MenuBarItem], {
+        options:{
+            path: null
+        },
+        onClick: function(){
+            if ( this.path ) { Router.go(this.path); }
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/ui/MenuLink.js
===================================================================
--- Dev/trunk/src/qed-client/ui/MenuLink.js	(revision 443)
+++ Dev/trunk/src/qed-client/ui/MenuLink.js	(revision 443)
@@ -0,0 +1,11 @@
+define(['dojo/_base/declare','dijit/MenuItem','../app/Router'
+], function(declare,MenuItem,Router) {
+    return declare([MenuItem],{
+        options:{
+            path: null
+        },
+        onClick: function() {
+            if ( this.path ) { Router.go(this.path); }
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/ui/templates/MainMenu.html
===================================================================
--- Dev/trunk/src/qed-client/ui/templates/MainMenu.html	(revision 443)
+++ Dev/trunk/src/qed-client/ui/templates/MainMenu.html	(revision 443)
@@ -0,0 +1,16 @@
+<div class="mainMenu">
+    <div  data-dojo-type="dijit/MenuBar">
+        <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink" data-dojo-props="path:'/sessions'">Sessions</div>
+        <div class="rftMainMenuButton" data-dojo-type="dijit/PopupMenuBarItem">
+            <span>Content</span>
+            <div data-dojo-type="dijit/DropDownMenu">
+                <div data-dojo-type="./MenuLink" class="blue bgColorHover" data-dojo-props="path:'/surveys', iconClass:'rftIcon rftIconSurvey'">Surveys</div>
+                <div data-dojo-type="./MenuLink" class="orange bgColorHover" data-dojo-props="path:'/questions', iconClass:'rftIcon rftIconQuestion'">Questions</div>
+                <div data-dojo-type="./MenuLink" class="purple bgColorHover" data-dojo-props="path:'/applications', iconClass: 'rftIcon rftIconApplication'">Applications</div>
+                <div data-dojo-type="./MenuLink" class="red bgColorHover" data-dojo-props="path:'/dashboards', iconClass: 'rftIcon rftIconDashboard'">Dashboards</div>
+            </div>
+        </div>
+        <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink" data-dojo-props="path:'/results'">Results</div>
+        <div class="rftMainMenuButton" data-dojo-type="./MenuBarLink">Logout</div>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/ui/templates/SessionBar.html
===================================================================
--- Dev/trunk/src/qed-client/ui/templates/SessionBar.html	(revision 443)
+++ Dev/trunk/src/qed-client/ui/templates/SessionBar.html	(revision 443)
@@ -0,0 +1,5 @@
+<div class="${baseClass}">
+    <span class="rftIcon rftIconSession" data-dojo-attach-point="iconNode"></span>
+    <div data-dojo-type="../widgets/LineWithActionsWidget" data-dojo-attach-point="upperNode" data-dojo-props="actions: {'inspect':{callback: inspect, properties: {blockButton: true}}}"></div>
+    <div data-dojo-type="../widgets/LineWithActionsWidget" data-dojo-attach-point="lowerNode"></div>
+</div>
Index: Dev/trunk/src/qed-client/widgets/LineWithActionsWidget.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/LineWithActionsWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/LineWithActionsWidget.js	(revision 443)
@@ -0,0 +1,84 @@
+define(['dojo/_base/declare',
+    'dojo/_base/lang',
+    'dojo/on',
+    'dojo/dom',
+    'dojo/_base/event',
+    'dojo/dom-class',
+    'dijit/form/Button',
+    'dijit/_WidgetBase',
+    'dijit/_TemplatedMixin',
+    'dijit/_WidgetsInTemplateMixin',
+    'dojo/text!./templates/LineWithActionsWidget.html'
+],function(declare,lang,on,dom,event,domClass,Button,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,templateString){
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin],{
+        templateString: templateString,
+        baseClass: 'rftLineWithActions',
+        title: '',
+        selectable: false,
+        userObject: null,
+
+        actions: null,
+        postCreate: function() {
+            dom.setSelectable(this.domNode, false); // Text selection, has nothing to do with object selection!
+            on(this.domNode,'click',lang.hitch(this,'_onClick'));
+        },
+        startup: function() {
+            if ( this._started ){ return; }
+            this.inherited(arguments);
+            this._setupActions();
+            this.refresh();
+        },
+        _setupActions: function() {
+            if ( this.actions === null ) {
+                return;
+            }
+            for (var action in this.actions) {
+                var properties;
+                if (this.actions[action].properties.blockButton === true) {
+                    properties = lang.mixin({
+                        baseClass: 'rftBlockButton',
+                        label: "Default",
+                        iconClass: 'rftIcon rftIcon'+this.actions[action].properties.icon,
+                        title: this.actions[action].properties.tooltip,
+                        onClick: lang.hitch(this, function(action, e){
+                            if ( action.callback ) { action.callback(e); }
+                            event.stop(e);
+                            return false;
+                        }, this.actions[action])
+                    }, this.actions[action].properties);
+                    new Button(properties).placeAt(this.buttonsNode);
+                } else {
+                    properties = lang.mixin({
+                        baseClass: 'rftInlineButton',
+                        label: "Default",
+                        showLabel: false,
+                        iconClass: 'rftIcon rftIcon'+this.actions[action].properties.icon,
+                        title: this.actions[action].properties.tooltip,
+                        onClick: lang.hitch(this, function(action, e){
+                            if ( action.callback ) { action.callback(e); }
+                            event.stop(e);
+                            return false;
+                        }, this.actions[action])
+                    }, this.actions[action].properties);
+                    new Button(properties).placeAt(this.buttonsNode);
+                }
+            }
+        },
+        refresh: function() {
+            this.titleNode.innerHTML = this.title;
+        },
+        _onClick: function(e){
+            var preventDefault = this.onClick(e) === false;
+            if (preventDefault) {
+                event.stop(e);
+            }
+            return !preventDefault;
+        },
+        onClick: function(/*e*/) {
+        },
+        _setTitleAttr: function(value){
+            this.title = value;
+            this.refresh();
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/ListWidget.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/ListWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/ListWidget.js	(revision 443)
@@ -0,0 +1,153 @@
+define([
+    "dijit/_Container",
+    "dijit/_WidgetBase",
+    "dijit/registry",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/lang",
+    "dojo/dnd/Source",
+    "dojo/dnd/common",
+    "dojo/dom-construct"
+], function(_Container, _WidgetBase, registry, array, declare, lang, Source, dnd, domConstruct) {
+    return declare([_WidgetBase,_Container],{
+        name: "",
+        value: null,
+        multiple: true,
+        type: "text",
+        /* container : dojo/dnd/Container or subclass
+         * determine which container to use for the list
+         */
+        container: Source,
+        buildRendering: function() {
+            this.inherited(arguments);
+
+            var sourceParams = {};
+            var paramsToInherit = [
+                "singular",
+                "creator",
+                "skipForm",
+                "dropParent",
+                "isSource",
+                "autoSync",
+                "copyOnly",
+                "delay",
+                "horizontal",
+                "selfCopy",
+                "selfAccept",
+                "withHandles",
+                "generateText"
+            ];
+            array.forEach(paramsToInherit, function(param){
+                if ( typeof this[param] !== "undefined" ) {
+                    sourceParams[param] = this[param];
+                }
+            },this);
+            lang.mixin(sourceParams, {
+                accept: [this.type],
+                creator: lang.hitch(this, "creator"),
+                dropParent: this.containerNode
+            });
+            this.source = new this.container(this.domNode,sourceParams);
+        },
+        creator: function(item, hint) {
+            var id = dnd.getUniqueId();
+            var nodeOrWidget = null;
+            if ( hint === "avatar" ) {
+                if ( this.createAvatar ) {
+                    nodeOrWidget = this.createAvatar(id,item);
+                } else {
+                    return this.source.defaultCreator(item, hint);
+                }
+            } else {
+                if ( this.createListElement ) {
+                    nodeOrWidget = this.createListElement(id,item);
+                } else {
+                    return this.source.defaultCreator(item, hint);
+                }
+            }
+            var node = nodeOrWidget.domNode ? nodeOrWidget.domNode : nodeOrWidget;
+            if ( hint !== "avatar" && node.id !== id ) {
+                console.warn("Node id '%s' not equal to generated id '%s'. Is this intended?", node.id, id);
+            }
+            return {
+                data: item,
+                type: [this.type],
+                node: node
+            };
+        },
+        createAvatar: null, /*function(id,item){},*/
+        createListElement: null, /* function(id,item){},*/
+        _getValueAttr: function() {
+            return array.map(this.source.getAllNodes(),function(node){
+                var widget = registry.byNode(node);
+                if ( widget && "value" in widget ) {
+                    return widget.get('value');
+                } else {
+                    return this.source.getItem(node.id).data;
+                }
+            },this);
+        },
+        _setValueAttr: function(value) {
+            this.clear();
+            this.appendItems(value || []);
+        },
+        _setDisabledAttr: function(value) {
+            this._set("disabled", value);
+            array.forEach(this.getChildren(), function(child){
+                child.set("disabled", value);
+            });
+        },
+        _setReadOnlyAttr: function(value) {
+            this._set("readOnly", value);
+            array.forEach(this.getChildren(), function(child){
+                child.set("readOnly", value);
+            });
+        },
+        focus: function() {
+            var children = this.getChildren();
+            if ( children.length > 0 ) {
+                children[0].focus();
+            }
+        },
+        appendItems: function(items) {
+            this.source.insertNodes(false,items);
+        },
+        appendItem: function(item) {
+            this.source.insertNodes(false,[item]);
+        },
+        removeItem: function(key) {
+            array.forEach(array.filter(this.source.getAllNodes(), function(node){
+                return node.id === key;
+            }), lang.hitch(this, "_destroyNodeOrWidget"));
+            this.source.delItem(key);
+        },
+        getChildren: function() {
+            return array.filter(array.map(this.source.getAllNodes(), function(node){
+                return registry.byNode(node);
+            }),function(widget){ return widget !== null; });
+        },
+        clear: function() {
+            array.forEach(this.source.getAllNodes(),
+                          lang.hitch(this, "_destroyNodeOrWidget"));
+            this.source.clearItems();
+        },
+        _destroyNodeOrWidget: function(node) {
+            var widget = registry.byNode(node);
+            if ( widget ) {
+                widget.destroyRecursive();
+            } else {
+                domConstruct.destroy(node);
+            }
+        },
+        validate: function() {
+            return array.every(array.map(this.source.getAllNodes(),function(node){
+                var widget = registry.byNode(node);
+                return !widget || widget.disabled || !widget.validate || widget.validate();
+            }), function(item){ return item; });
+        },
+        destroy: function() {
+            this.source.destroy();
+            this.inherited(arguments);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/MultipleChoiceWidget.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/MultipleChoiceWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/MultipleChoiceWidget.js	(revision 443)
@@ -0,0 +1,88 @@
+define(['dojo/_base/declare','dojo/_base/array','dojo/_base/lang',
+    'dojo/dom-construct','dijit/registry','dijit/_WidgetBase',
+    'dijit/_TemplatedMixin','dijit/_WidgetsInTemplateMixin','dijit/_Container',
+    'dojo/text!./templates/MultipleChoiceWidget.html',
+    'dijit/form/RadioButton','dijit/form/CheckBox','dijit/form/TextBox','dijit/form/Button'
+], function(declare,array,lang,domConstruct,registry,_WidgetBase,_TemplatedMixin,
+    _WidgetsInTemplateMixin,_Container, templateString,RadioButton,CheckBox,TextBox,Button){
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: templateString,
+        multiple: true,
+        baseClass: 'rftMultipleChoiceWidget',
+        
+        allowMultiple: false,
+        name: '',
+        value: null,
+        
+        _widgetCache: null,
+        constuctor: function() {
+            this.inherited(arguments);
+            this.value = [];
+            this._widgetCache = {};
+        },
+        _setValueAttr: function(value) {
+            this.reset();
+            this.value = value;
+            array.forEach(this.value,lang.hitch(this,function(val){
+                this._addRow(val);
+            }));
+        },
+        _getValueAttr: function() {
+            var value = [];
+            registry.findWidgets(this.domNode).forEach(function(w){
+                if ( w.isInstanceOf(TextBox) ) { value.push(w.get('value')); }
+            });
+            this.value = value;
+            return value;
+        },
+        reset: function() {
+            this._removeWidgetsBelowNode(this.rows);
+            domConstruct.empty(this.rows);
+        },
+        _onAddRow: function() {
+            this._addRow();
+        },
+        _addRow: function(value,tagRow,pos) {
+            var row = domConstruct.create('div',{className:'row'});
+            if ( this.allowMultiple ) {
+                new CheckBox({
+                    name:this.name,
+                    className:'rowBox',
+                    disabled: this.mode === 'edit'
+                }).placeAt(row);
+            } else {
+                new RadioButton({
+                    name:this.name,
+                    className:'rowBox',
+                    disabled: this.mode === 'edit'
+                }).placeAt(row);
+            }
+            new TextBox({
+                name:this.name,
+                value:value || '',
+                className:'rowText'
+            }).placeAt(row);
+            new Button({
+                label:'-',
+                className:'rowBtn',
+                onClick:lang.hitch(this,'_removeNodeWithWidgets',row)
+            }).placeAt(row);
+            new Button({
+                label:'+',
+                className:'rowBtn',
+                onClick:lang.hitch(this,'_addRow','',row,'before')
+            }).placeAt(row);
+            domConstruct.place(row,tagRow || this.rows,pos||'last');
+        },
+        _removeNodeWithWidgets: function(node) {
+            this._removeWidgetsBelowNode(node);
+            domConstruct.destroy(node);
+        },
+        _removeWidgetsBelowNode: function(node) {
+            registry.findWidgets(node).forEach(function(w){
+                w.destroyRecursive();
+            });
+        },
+        _onRowChange: function(/*row*/) {}
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/ObjectBox.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/ObjectBox.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/ObjectBox.js	(revision 443)
@@ -0,0 +1,73 @@
+define([
+    'dojo/_base/declare',
+    'dojo/_base/lang',
+    'dijit/_WidgetBase',
+    'dijit/_TemplatedMixin',
+    'dijit/_WidgetsInTemplateMixin',
+    './LineWithActionsWidget',
+    'dojo/text!./templates/ObjectBox.html'
+], function(declare, lang, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, LineWithActionsWidget, template){
+    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
+        baseClass: "rftObjectBox",
+        templateString: template,
+        value: null,
+        actions: null,
+        startup: function() {
+            if ( this._started ){ return; }
+            this.inherited(arguments);
+            this.line1 = new LineWithActionsWidget({
+                actions: {
+                    "inspectIcon": {
+                        callback: lang.hitch(this, this._showInfoBox),
+                        properties: {
+                            blockButton: false,
+                            icon: "Inspect"
+                        }
+                    }
+                }
+            }).placeAt(this.line1Node);
+            this.line2 = new LineWithActionsWidget({
+            }).placeAt(this.line2Node);
+            var line3Actions = this._createLine3Actions();
+            this.line3 = new LineWithActionsWidget({
+                actions: line3Actions
+            }).placeAt(this.line3Node);
+            this.line1.startup();
+            this.line2.startup();
+            this.line3.startup();
+            this.inherited(arguments);
+        },
+        _createLine3Actions: function() {
+            var line3Actions = {};
+            for (var action in this.actions) {
+                line3Actions[action] = {
+                    callback: lang.hitch(this, function(callback){
+                        if ( this.value ) { callback(this.value); }
+                    }, this.actions[action]),
+                    properties: {
+                        blockButton: true,
+                        label: action,
+                        icon: action.charAt(0).toUpperCase()+action.slice(1)
+                    }
+                };
+            }
+            return line3Actions;
+        },
+        _showInfoBox: function() {},
+        _setValueAttr: function(value) {
+            this.value = value;
+            this._refresh();
+        },
+        _getValueAttr: function(value) {
+            this.value = value;
+        },
+        _refresh: function() {
+            if ( this.value !== null ) {
+                this.iconNode.className = "rftIcon typeIcon rftIcon"+(this.value.type || '');
+                this.line1.set('title', this.value.title || '');
+                this.line2.set('title', this.value.subTitle || '');
+                this.line3.set('title', this.value.lowerTitle || '');
+            }
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/Selector.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/Selector.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/Selector.js	(revision 443)
@@ -0,0 +1,205 @@
+define([
+    "./LineWithActionsWidget",
+    "dijit/_Container",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dijit/registry",
+    "dojo/_base/array",
+    "dojo/_base/declare",
+    "dojo/_base/event",
+    "dojo/_base/lang",
+    "dojo/dnd/Source",
+    "dojo/dom-class",
+    "dojo/dom-construct",
+    "dojo/fx",
+    "dojo/query",
+    "dojo/text!./templates/Selector.html"
+], function(LineWithActionsWidget, _Container, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, registry, baseArray, declare, event, lang, Source, domClass, domConstruct, fx, query, templateString) {
+
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_Container],{
+        templateString: templateString,
+        baseClass: 'rftSelector',
+
+        title: "",
+        selectedActions: null,
+        itemActions: null,
+        // main selector action: Object
+        //    title:
+        //    description:
+        //    icon:
+        dndType: null,
+
+        _source: null,
+        _folded: true,
+        _titleLine: null,
+        _selectorLine: null,
+        _selectedItem: null,
+
+        startup: function() {
+            if ( this._started ){ return; }
+            this.inherited(arguments);
+            domClass.add(this.selectedColorNode, "pending");
+
+            this._createTitleLine();
+            this._createSelectorLine();
+            if (this.dndType) {
+                this._createSource();
+            }
+
+            fx.wipeOut({
+                node: this.optionsNode
+            }).play();
+        },
+        _createTitleLine: function() {
+            var actions = {};
+            var action = null;
+            if ( this.selectedActions !== null ) {
+                for (var actionName in this.selectedActions) {
+                    action = this.selectedActions[actionName];
+                    actions[actionName] = {
+                        callback: action.callback &&
+                                lang.hitch(this,this._onSelectedAction,
+                                        action.callback),
+                        properties: {
+                            blockButton: true,
+                            label: action.title || actionName,
+                            icon: action.icon,
+                            tooltip: action.description
+                        }
+
+                    };
+                }
+            }
+
+            this._titleLine = new LineWithActionsWidget({
+                title: this.title,
+                actions: actions
+            },this.titleNode);
+            this._titleLine.startup();
+        },
+        _createSelectorLine: function() {
+            this._selectorLine = new LineWithActionsWidget({
+                title: 'None',
+                actions: {
+                    "Toggle dropdown" : {
+                        callback: lang.hitch(this, this.onToggle),
+                        properties: {
+                            blockButton: true,
+                            showLabel: false,
+                            icon: "HalfArrowDown"
+                        }
+                    }
+                }
+            },this.selectedItemNode);
+            this._selectorLine.startup();
+            this._selectorLine.on('click',lang.hitch(this, this.onToggle));
+        },
+        _createSource: function() {
+            this._source = new Source(this.optionsNode, {
+                singular: true,
+                delay: 5,
+                selfAccept: false,
+                copyOnly: true,
+                withHandles: this.withHandles,
+                creator: lang.hitch(this, "_createNode")
+            });
+        },
+        _onSelect: function(item, widget) {
+            this._selectedItem = item;
+            this.onToggle();
+            this._selectorLine.set("title", item.title);
+            baseArray.forEach(this.optionsNode.childNodes, function(node){
+                var line = registry.byNode(node);
+                if (line) {
+                    if (line === widget) {
+                        domClass.add(line.domNode, "inheritBgColor light");
+                    } else {
+                        domClass.remove(line.domNode, "inheritBgColor light");
+                    }
+                }
+            }, this);
+            this.onSelect(item);
+        },
+        _onSelectedAction: function(callback) {
+            if (this._selectedItem && callback) {
+                callback(this._selectedItem);
+            }
+        },
+
+        onToggle: function(evt) {
+            if (this._folded) {
+                var downArrowIcon = query(".rftBlockButton .rftIconHalfArrowDown", this._selectorLine.buttonsNode)[0];
+                if (downArrowIcon){
+                    domClass.replace(downArrowIcon, "rftIconHalfArrowUp", "rftIconHalfArrowDown");
+                }
+                fx.wipeIn({
+                    node: this.optionsNode
+                }).play();
+                this._folded = false;
+            } else {
+                var upArrowIcon = query(".rftBlockButton .rftIconHalfArrowUp", this._selectorLine.buttonsNode)[0];
+                if (upArrowIcon){
+                    domClass.replace(upArrowIcon, "rftIconHalfArrowDown", "rftIconHalfArrowUp");
+                }
+                fx.wipeOut({
+                    node: this.optionsNode
+                }).play();
+                this._folded = true;
+            }
+            if ( evt ) { event.stop(evt); }
+            return false;
+        },
+
+        addItem: function(item) {
+            if ( this._source ) {
+                this._source.insertNodes(false,[item]);
+            } else {
+                var node = this._createLineNode(item);
+                domConstruct.place(node, this.optionsNode, "last");
+            }
+        },
+        _createNode: function(item, hint) {
+            var node = hint === "avatar" ?
+                    this._createAvatarNode(item) : this._createLineNode(item);
+            return node && {
+                node: node,
+                data: lang.clone(item),
+                type: [this.dndType]
+            };
+        },
+        _createAvatarNode: function(item) {
+            return domConstruct.create("div",{
+                'class': 'dragAvatar',
+                innerHTML: item.title
+            });
+        },
+        _createLineNode: function(item) {
+            var actions = {};
+            var action;
+            if (this.itemActions) {
+                for (var actionName in this.itemActions) {
+                    action = this.itemActions[actionName];
+                    actions[actionName] = {
+                        callback: action.callback && lang.partial(action.callback,item),
+                        properties: {
+                            blockButton: false,
+                            showLabel: false,
+                            icon: action.icon + " black",
+                            tooltip: action.description
+                        }
+                    };
+                }
+            }
+            var w = new LineWithActionsWidget({
+                title: item.title,
+                actions: actions
+            });
+            w.startup();
+            w.on("click", lang.hitch(this, this._onSelect, item, w));
+            return w.domNode;
+        },
+
+        onSelect: function(/*item*/) {}
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/ThresholdFilteringSelect.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/ThresholdFilteringSelect.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/ThresholdFilteringSelect.js	(revision 443)
@@ -0,0 +1,18 @@
+define([
+    'dojo/_base/declare',
+    'dijit/form/FilteringSelect'
+], function(declare, FilteringSelect) {
+    return declare(FilteringSelect, {
+        // custom min input character count to trigger search
+        minKeyCount: 3,
+
+        // override search method, count the input length
+        _startSearch: function (/*String*/key) {
+            if (!key || key.length < this.minKeyCount) {
+                this.closeDropDown();
+                return;
+            }
+            this.inherited(arguments);
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/TitleGroup.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/TitleGroup.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/TitleGroup.js	(revision 443)
@@ -0,0 +1,15 @@
+define([
+    "dijit/registry",
+    "dojo/_base/declare",
+    "dojo/_base/query",
+    "dojox/widget/TitleGroup"
+], function(registry, declare, query, TitleGroup) {
+    return declare([TitleGroup],{
+        getChildren: function() {
+            return query("> .dijitTitlePane", this.domNode)
+            .map(function(node){
+                return registry.byNode(node);
+            });
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/_ComplexValueMixin.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/_ComplexValueMixin.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/_ComplexValueMixin.js	(revision 443)
@@ -0,0 +1,31 @@
+define([
+    "dijit/_Container",
+    "dijit/form/_FormMixin",
+    "dojo/_base/array",
+    "dojo/_base/declare"
+], function(_Container, _FormMixin, array, declare) {
+    return declare([_Container,_FormMixin],{
+        name: "",
+        value: null,
+        disabled: false,
+        readOnly: false,
+        _setDisabledAttr: function(value) {
+            this._set("disabled", value);
+            array.forEach(this._getDescendantFormWidgets(), function(child){
+                child.set("disabled", value);
+            });
+        },
+        _setReadOnlyAttr: function(value) {
+            this._set("readOnly", value);
+            array.forEach(this._getDescendantFormWidgets(), function(child){
+                child.set("readOnly", value);
+            });
+        },
+        focus: function() {
+            var children = this._getDescendantFormWidgets();
+            if ( children.length > 0 ) {
+                children[0].focus();
+            }
+        }
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/_ComplexValueWidget.js
===================================================================
--- Dev/trunk/src/qed-client/widgets/_ComplexValueWidget.js	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/_ComplexValueWidget.js	(revision 443)
@@ -0,0 +1,10 @@
+define([
+    "./_ComplexValueMixin",
+    "dijit/_TemplatedMixin",
+    "dijit/_WidgetBase",
+    "dijit/_WidgetsInTemplateMixin",
+    "dojo/_base/declare"
+], function(_ComplexValueMixin, _TemplatedMixin, _WidgetBase, _WidgetsInTemplateMixin, declare) {
+    return declare([_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin,_ComplexValueMixin],{
+    });
+});
Index: Dev/trunk/src/qed-client/widgets/templates/DateTimeTextBox.html
===================================================================
--- Dev/trunk/src/qed-client/widgets/templates/DateTimeTextBox.html	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/templates/DateTimeTextBox.html	(revision 443)
@@ -0,0 +1,4 @@
+<div class="${baseClass}">
+    <div data-dojo-type="dijit/form/DateTextBox" data-dojo-attach-point="dateBox"></div>
+    <div data-dojo-type="dijit/form/TimeTextBox" data-dojo-attach-point="timeBox"></div>
+</div>
Index: Dev/trunk/src/qed-client/widgets/templates/LineWithActionsWidget.html
===================================================================
--- Dev/trunk/src/qed-client/widgets/templates/LineWithActionsWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/templates/LineWithActionsWidget.html	(revision 443)
@@ -0,0 +1,4 @@
+<div class="${baseClass}">
+    <span class="${baseClass}Title" data-dojo-attach-point="titleNode"></span>
+    <span class="${baseClass}Buttons dijitReset" data-dojo-attach-point="buttonsNode"></span>
+</div>
Index: Dev/trunk/src/qed-client/widgets/templates/MultipleChoiceWidget.html
===================================================================
--- Dev/trunk/src/qed-client/widgets/templates/MultipleChoiceWidget.html	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/templates/MultipleChoiceWidget.html	(revision 443)
@@ -0,0 +1,7 @@
+<div class="${baseClass}">
+    <div data-dojo-attach-point="rows">
+    </div>
+    <div data-dojo-attach-point="buttons" class="row">
+        <div><span class="rowBox"/><span class="rowText"/><span class="rowBtn"/><button data-dojo-type="dijit/form/Button" type="button" data-dojo-attach-event="onClick:_onAddRow" class="rowBtn">+</button></div>
+    </div>
+</div>
Index: Dev/trunk/src/qed-client/widgets/templates/ObjectBox.html
===================================================================
--- Dev/trunk/src/qed-client/widgets/templates/ObjectBox.html	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/templates/ObjectBox.html	(revision 443)
@@ -0,0 +1,6 @@
+<div class="${baseClass}">
+    <div data-dojo-attach-point="iconNode"></div>
+    <div data-dojo-attach-point="line1Node"></div>
+    <div data-dojo-attach-point="line2Node"></div>
+    <div data-dojo-attach-point="line3Node"></div>
+</div>
Index: Dev/trunk/src/qed-client/widgets/templates/Selector.html
===================================================================
--- Dev/trunk/src/qed-client/widgets/templates/Selector.html	(revision 443)
+++ Dev/trunk/src/qed-client/widgets/templates/Selector.html	(revision 443)
@@ -0,0 +1,10 @@
+<div>
+    <div class="${baseClass}Category">
+        <div class="${baseClass}Title" data-dojo-attach-point="titleNode"></div>
+    </div>
+    <div class="${baseClass}Selected">
+        <div class="${baseClass}Indicator" data-dojo-attach-point="selectedColorNode"></div>
+        <div class="${baseClass}Item" data-dojo-attach-point="selectedItemNode"></div>
+    </div>
+    <div class="${baseClass}Options" data-dojo-attach-point="optionsNode"></div>
+</div>
Index: Dev/trunk/src/qed-server/config/couchdb/bootstrap.js
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/bootstrap.js	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/bootstrap.js	(revision 443)
@@ -0,0 +1,15 @@
+dojoConfig = {
+    packagePaths:{
+        '../../client':[
+            'dojo',
+            'dijit',
+            'dojox',
+            'qed'
+        ],
+        '.':[
+            'config',
+            'check'
+        ]
+    }
+};
+require('../../client/dojo/dojo');
Index: Dev/trunk/src/qed-server/config/couchdb/config/check.js
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/config/check.js	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/config/check.js	(revision 443)
@@ -0,0 +1,42 @@
+define([
+     'dojo/_base/array',
+     'dojo/_base/lang',
+     'dojox/json/schema',
+     'qed/lib/async',
+     './util/db',
+     'qed/model/schema'
+],function(array,lang,jsonSchema,async,db,schema){
+
+    async.seq([
+        function(){
+            console.log("Validating documents for QED:");
+            console.log("NOTE: referential integrity is not checked.");
+        },
+        function(){
+            console.log("Getting list of documents.");
+            return db.req('get','qed/_all_docs')
+            .then(function(docs){
+                return array.filter(docs.rows,function(doc){
+                    return doc.id.indexOf('_design/') !== 0;
+                });
+            });
+        },
+        function(docs){
+            console.log("Validating documents.");
+            return async.map(docs,function(doc){
+                var id = doc.id;
+                return db.req('get','qed/'+id)
+                .then(function(actualDoc){
+                    var result = jsonSchema.validate(actualDoc,schema);
+                    console.log("Document '"+id+"' is "+(result.valid ? "valid" : "invalid")+".");
+                });
+            });
+        }
+    ]).then(function() {
+        console.log("Done!");
+    },function(err){
+        console.log("Fail!",err.stack);
+    });
+
+
+});
Index: Dev/trunk/src/qed-server/config/couchdb/config/config.js
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/config/config.js	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/config/config.js	(revision 443)
@@ -0,0 +1,90 @@
+define([
+     'dojo/_base/json',
+     'dojo/_base/lang',
+     'dojox/lang/functional',
+     'qed/lib/async',
+     './util/db',
+     './data/design-docs'
+],function(json,lang,func,async,db,docs){
+
+    function serializeFunctions(value) {
+        if ( value === null ) {
+            return null;
+        } else if ( lang.isArray(value) ) {
+            return value;
+        } else if ( lang.isFunction(value) ) {
+            return value.toString();
+        } else if ( lang.isObject(value) ) {
+            return func.mapIn(value,serializeFunctions);
+        } else {
+            return value;
+        }
+    }
+
+    async.seq([
+        function(){
+            console.log("Configuring CouchDB for QED:");
+        },
+        function(){
+            console.log("Checking CouchDB version");
+            return db.req('get','')
+            .then(function(res){
+                if (res.version !== "1.2.0" ) {
+                    console.log("Found "+res.version+", only tested with CouchDB 1.2.0")
+                } else {
+                    console.log("CouchDB 1.2.0 found");
+                }
+            });
+        },function(){
+            console.log("Checking database 'qed'");
+            return db.req('get','qed')
+            .then(function(res){
+                if (res.error) {
+                    console.log("Creating database 'qed'");
+                    return db.req('put','/qed');
+                } else {
+                    console.log("Database 'qed' found.");
+                }
+            },function(res){
+                console.log("Creating database 'qed'");
+                return db.req('put','/qed');
+            });
+        },function(){
+            return serializeFunctions(docs);
+        },function(docs){
+            console.log("Putting documents in database.");
+            return async.forEach(func.keys(docs),function(docUrl){
+                var doc = docs[docUrl];
+                var configAction = doc.__configAction;
+                delete doc.__configAction;
+                switch (configAction) {
+                    case "ignore":
+                        console.log(docUrl+" ignored.");
+                    case "update":
+                        console.log(docUrl+" updating.");
+                        return db.req('get',docUrl)
+                        .then(function(oldDoc){
+                            lang.mixin(oldDoc,doc);
+                            return db.req('put',docUrl,oldDoc);
+                        },function(){
+                            return db.req('put',docUrl,doc);
+                        });
+                    case "replace":
+                    default:
+                        console.log(docUrl+" replacing.");
+                        return db.req('get',docUrl)
+                        .then(function(oldDoc){
+                            doc['_rev'] = oldDoc['_rev'];
+                            return db.req('put',docUrl,doc);
+                        },function(){
+                            return db.req('put',docUrl,doc);
+                        });
+                }
+            });
+        },function(){
+            console.log("Done!");
+        }
+    ]);
+
+
+});
Index: Dev/trunk/src/qed-server/config/couchdb/config/data/design-docs.js
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/config/data/design-docs.js	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/config/data/design-docs.js	(revision 443)
@@ -0,0 +1,117 @@
+define([],function(){
+    return {
+        "_users/qed_admin": {
+            __configAction: "ignore",
+            _id: "org.couchdb.user:qed_admin",
+            name: "qed_admin",
+            password: "Welkom01",
+            roles: [ "qed_admin" ],
+            type: "user"
+        },
+        "qed/_security": {
+            __configAction: "ignore",
+            admins: {
+                names: [],
+                roles: ["qed_admin"]
+            },
+            readers: {
+                names: [],
+                roles: ["qed_user"]
+            }
+        },
+        "qed/_design/default": {
+            __configAction: "replace",
+            _id: "_design/default",
+            language: "javascript",
+            validate_doc_update: function(newDoc, oldDoc, userCtx, secObj) {
+                if ( oldDoc && oldDoc.publicationDate ) { throw({forbidden:'Published documents cannot be modified.'}); }
+            },
+            views: {
+                by_type: {
+                    map: function(doc){
+                        emit(doc.type, doc);
+                    }
+                }
+            }
+        },
+        "qed/_design/questions": {
+            __configAction: "replace",
+            _id: "_design/questions",
+            language: "javascript",
+            views: {
+                all: {
+                    map: function(doc){
+                        if ( doc.type !== 'Question' ) { return; }
+                        if ( doc.categories && doc.categories.length > 0 ) {
+                            for ( var i = 0; i < doc.categories.length; i++ ) { 
+                                emit([doc.categories[i],doc.topic||null],1);
+                            } 
+                        } else { 
+                            emit([null,null],1); 
+                        } 
+                    },
+                    reduce: function(keys,values){ return sum(values); }
+                },
+                published: {
+                    map: function(doc){
+                        if ( doc.type!=='Question' || !doc.publicationDate ) { return; }
+                        if ( doc.categories && doc.categories.length > 0 ) {
+                            for ( var i = 0; i < doc.categories.length; i++ ) {
+                                emit([doc.categories[i],doc.topic||null],1);
+                            }
+                        } else {
+                            emit([null,null],1);
+                        }
+                    },
+                    reduce: function(keys,values){ return sum(values); }
+                },
+                all_topics: {
+                    map: function(doc){
+                        if( doc.type !== 'Question' ){ return; }
+                        emit(doc.topic);
+                    },
+                    reduce: function(key, values, rereduce) { return null; }
+                },
+                published_topics: {
+                    map: function(doc){
+                        if ( doc.type !== 'Question' || !doc.publicationDate ) { return; }
+                        emit(doc.topic);
+                    },
+                    reduce: function(key, values, rereduce) { return null; }
+                }
+            }
+        },
+        "qed/_design/surveys": {
+            __configAction: "replace",
+            _id: "_design/surveys",
+            language: "javascript",
+            views: {
+                drafts: {
+                    map: function(doc){
+                        if ( doc.type !== 'Survey' || doc.publicationDate ) { return; }
+                        emit(doc._id,doc);
+                    }
+                },
+                published: {
+                    map: function(doc){
+                        if ( doc.type !== 'Survey' || !doc.publicationDate ) { return; }
+                        emit(doc._id,doc);
+                    }
+                }
+            }
+        },
+        "qed/_design/responses": {
+            __configAction: "replace",
+            _id: "_design/responses",
+            language: "javascript",
+            views: {
+                by_surveyrun: {
+                    map: function(doc){
+                        if ( doc.type !== 'Response' ) { return; }
+                        emit(doc.surveyRunId, doc);
+                    }
+                }
+            }
+        }
+    };
+});
Index: Dev/trunk/src/qed-server/config/couchdb/config/util/db.js
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/config/util/db.js	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/config/util/db.js	(revision 443)
@@ -0,0 +1,20 @@
+define([
+     'dojo/_base/json',
+     'dojo/request'
+],function(json,request){
+    var dbUrl = "http://localhost:5984/";
+
+    function req(method,path,body) {
+        var args = {
+            contentType: 'application/json',
+            handleAs: 'json',
+            data: json.toJson(body || {})
+        };
+        return request[method](dbUrl+path,args);
+    }
+
+    return {
+        req:req
+    };
+
+});
Index: Dev/trunk/src/qed-server/config/couchdb/run.bat
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/run.bat	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/run.bat	(revision 443)
@@ -0,0 +1,1 @@
+"C:\\Program Files\\nodejs\\node" bootstrap.js load=%1%
Index: Dev/trunk/src/qed-server/config/couchdb/run.sh
===================================================================
--- Dev/trunk/src/qed-server/config/couchdb/run.sh	(revision 443)
+++ Dev/trunk/src/qed-server/config/couchdb/run.sh	(revision 443)
@@ -0,0 +1,2 @@
+#!/bin/sh
+nodejs bootstrap.js load=$1
Index: Dev/trunk/src/qed-server/server.js
===================================================================
--- Dev/trunk/src/qed-server/server.js	(revision 443)
+++ Dev/trunk/src/qed-server/server.js	(revision 443)
@@ -0,0 +1,37 @@
+define([
+    "dojo/_base/array",
+    "dojo/node!express",
+    "dojo/node!fs",
+    "dojo/node!https",
+    "dojo/node!path",
+    "dojo/node!simple-http-proxy"
+], function(array, express, fs, https, path, proxy) {
+
+    function staticFile(request, response) {
+        response.sendfile(__dirname+request.path);
+    }
+
+    var __dirname = path.resolve('.');
+    
+    var httpsOptions = {
+        key: fs.readFileSync('qed.key'),
+        cert: fs.readFileSync('qed.pem')
+    };
+    
+    var app = express();
+    app.use(express.logger());
+    app.use(express.compress());
+    app.use(express.favicon());
+    app.get('/', function(request, response){
+        response.sendfile(__dirname+'/index.html');
+    });
+    app.get('/*.html', staticFile);
+    array.forEach(['/dojo', '/dijit', '/dojox', '/qed', '/qed-client'], function(dir){
+        app.use(dir, express.static(__dirname+dir));
+    });
+    app.use('/data/couch', proxy('http://localhost:5984/qed'));
+
+    var server = https.createServer(httpsOptions, app).listen(8443);
+    
+    console.log("Listening on https://localhost:8443/");
+});
Index: Dev/trunk/src/qed/package.json
===================================================================
--- Dev/trunk/src/qed/package.json	(revision 443)
+++ Dev/trunk/src/qed/package.json	(revision 443)
@@ -0,0 +1,17 @@
+{
+  "name": "qed",
+  "version": "0.0.1",
+  "description": "QED",
+  "dependencies": {
+    "dojo": "~1.8.0",
+    "dijit": "~1.8.0",
+    "dojox": "~1.8.0"
+  },
+  "dojoBuild": "qed.profile.js",
+  "devDependencies": {
+    "grunt": "~0.4.0",
+    "grunt-contrib-less": "~0.5.0",
+    "grunt-contrib-jshint": "~0.2.0",
+    "grunt-htmlhint": "~0.9.2"
+  }
+}
Index: Dev/trunk/src/response.html
===================================================================
--- Dev/trunk/src/response.html	(revision 443)
+++ Dev/trunk/src/response.html	(revision 443)
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>QED - Respondent</title>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <link rel="stylesheet" type="text/css" href="qed-client/css/qed.css" />
+    </head>
+    <body id="rft" class="dijitReset claro">
+        <script type="text/javascript">
+            var dojoConfig = {
+                baseUrl: ".",
+                async: true,
+                parseOnLoad: false,
+                isDebug: true,
+                packages: [
+                    { name: "dojo", location: "dojo" },
+                    { name: "dijit", location: "dijit" },
+                    { name: "dojox", location: "dojox" },
+                    { name: "qed", location: "qed" },
+                    { name: "qed-client", location: "qed-client" }
+                ],
+                deps: [ "qed-client/response" ]
+            };
+        </script>
+        <script type="text/javascript" src="dojo/dojo.js"></script>
+        <div id="content" class="page" data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="region:'center'" style="width: 100%; height: 100%;">
+        </div>
+        <div id="toaster" data-dojo-type="qed-client/app/Notifications">
+        </div>
+    </body>
+</html>
Index: Dev/trunk/src/server.js
===================================================================
--- Dev/trunk/src/server.js	(revision 443)
+++ Dev/trunk/src/server.js	(revision 443)
@@ -0,0 +1,16 @@
+dojoConfig = {
+    baseUrl: ".",
+    async: true,
+    hasCache: {
+        "host-node": true,
+        "dom": false
+    },
+    packages: [
+        {name: "dojo", location: "dojo"},
+        {name: "qed", location: "qed"},
+        {name: "qed-server", location: "qed-server"}
+    ],
+    deps: [ "qed-server/server" ]
+};
+
+require("./dojo/dojo.js");
