[Testbot] Plone 5.0 - Python 2.7 - Build # 1874 - Fixed! - 0 failure(s)

jenkins at plone.org jenkins at plone.org
Fri Mar 7 00:37:35 UTC 2014


-------------------------------------------------------------------------------
Plone 5.0 - Python 2.7 - Build # 1874 - Fixed!
-------------------------------------------------------------------------------

http://jenkins.plone.org/job/plone-5.0-python-2.7/1874/


-------------------------------------------------------------------------------
CHANGES
-------------------------------------------------------------------------------

Repository: mockup
Branch: refs/heads/master
Date: 2014-03-06T15:28:59-08:00
Author: Rok Garbas (garbas) <rok at garbas.si>
Commit: https://github.com/plone/mockup/commit/815be1e9b7d550cd831160373ef11e3758f0faf4

add JavaScript Code Style checker

- enable .jshintrc to be actually used by "make jshint"
- lint all files (~3500 style errors)
- .jshintignore file remove (not needed anymore)

Files changed:
A .jscs.json
M .jshintrc
M Gruntfile.js
M Makefile
M bower.json
M default.nix
M js/bundles/barceloneta.js
M js/bundles/docs.js
M js/bundles/plone.js
M js/bundles/plone_develop.js
M js/bundles/structure.js
M js/bundles/structure_develop.js
M js/bundles/tiles.js
M js/bundles/toolbar.js
M js/bundles/toolbar_develop.js
M js/bundles/widgets.js
M js/bundles/widgets_develop.js
M js/config.js
M js/grunt.js
M js/iframe.js
M js/iframe_init.js
M js/patterns/accessibility.js
M js/patterns/ace.js
M js/patterns/autotoc.js
M js/patterns/backdrop.js
M js/patterns/cookiedirective.js
M js/patterns/dropzone.js
M js/patterns/expose.js
M js/patterns/filemanager/pattern.js
M js/patterns/filemanager/views/app.js
M js/patterns/formautofocus.js
M js/patterns/formunloadalert.js
M js/patterns/livesearch.js
M js/patterns/modal.js
M js/patterns/moment.js
M js/patterns/pickadate.js
M js/patterns/picture.js
M js/patterns/preventdoublesubmit.js
M js/patterns/querystring.js
M js/patterns/relateditems.js
M js/patterns/select2.js
M js/patterns/sortable.js
M js/patterns/structure/collections/result.js
M js/patterns/structure/collections/selected.js
M js/patterns/structure/models/result.js
M js/patterns/structure/pattern.js
M js/patterns/structure/views/addmenu.js
M js/patterns/structure/views/app.js
M js/patterns/structure/views/columns.js
M js/patterns/structure/views/delete.js
M js/patterns/structure/views/paging.js
M js/patterns/structure/views/properties.js
M js/patterns/structure/views/rearrange.js
M js/patterns/structure/views/rename.js
M js/patterns/structure/views/selectionbutton.js
M js/patterns/structure/views/selectionwell.js
M js/patterns/structure/views/table.js
M js/patterns/structure/views/tablerow.js
M js/patterns/structure/views/tags.js
M js/patterns/structure/views/textfilter.js
M js/patterns/structure/views/workflow.js
M js/patterns/tablesorter.js
M js/patterns/tiles/texttile.js
M js/patterns/tiles/tile.js
M js/patterns/tiles/tiletype.js
M js/patterns/tinymce/links.js
M js/patterns/tinymce/pattern.js
M js/patterns/tinymce/upload.js
M js/patterns/toggle.js
M js/patterns/tooltip.js
M js/patterns/tree.js
M js/router.js
M js/ui/views/base.js
M js/ui/views/button.js
M js/ui/views/buttongroup.js
M js/ui/views/container.js
M js/ui/views/popover.js
M js/ui/views/toolbar.js
M js/utils.js
M package.json
M package.nix
M tests/config.js
M tests/fakeserver.js
M tests/iframe-test.js
M tests/iframe_init-test.js
M tests/pattern-accessibility-test.js
M tests/pattern-autotoc-test.js
M tests/pattern-backdrop-test.js
M tests/pattern-cookiedirective-test.js
M tests/pattern-dropzone-test.js
M tests/pattern-expose-test.js
M tests/pattern-formautofocus-test.js
M tests/pattern-formunloadalert-test.js
M tests/pattern-livesearch-test.js
M tests/pattern-modal-test.js
M tests/pattern-moment-test.js
M tests/pattern-pickadate-test.js
M tests/pattern-picture-test.js
M tests/pattern-preventdoublesubmit-test.js
M tests/pattern-relateditems-test.js
M tests/pattern-select2-test.js
M tests/pattern-sortable-test.js
M tests/pattern-structure-test.js
M tests/pattern-tablesorter-test.js
M tests/pattern-tinymce-test.js
M tests/pattern-toggle-test.js
M tests/pattern-tooltip-test.js
M tests/pattern-tree-test.js
M tests/router-test.js
M tests/utils-test.js
D .jshintignore

diff --git a/.jscs.json b/.jscs.json
new file mode 100644
index 0000000..2da777a
--- /dev/null
+++ b/.jscs.json
@@ -0,0 +1,22 @@
+{
+  "disallowEmptyBlocks": true,
+  "disallowKeywords": ["with"],
+  "disallowLeftStickedOperators": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
+  "disallowMixedSpacesAndTabs": true,
+  "disallowMultipleLineStrings": true,
+  "disallowRightStickedOperators": ["?", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
+  "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
+  "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+  "disallowTrailingWhitespace": true,
+  "requireCamelCaseOrUpperCaseIdentifiers": true,
+  "requireLeftStickedOperators": [","],
+  "requireLineFeedAtFileEnd": true,
+  "requireRightStickedOperators": ["!"],
+  "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
+  "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true },
+  "validateIndentation": 2,
+  "validateLineBreaks": "LF",
+  "validateQuoteMarks": "'"
+}
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644
index bace015..0000000
--- a/.jshintignore
+++ /dev/null
@@ -1 +0,0 @@
-tests/karma.conf.js
diff --git a/.jshintrc b/.jshintrc
index 6b50f8c..b45618a 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -16,7 +16,12 @@
    "evil": true,
    "globals": {
       "console": true,
+      "it": true,
+      "describe": true,
+      "afterEach": true,
+      "beforeEach": true,
       "define": false,
+      "requirejs": true,
       "require": false,
       "tinymce": true,
       "document": false,
diff --git a/Gruntfile.js b/Gruntfile.js
index 5b57fc5..e5c2f47 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,4 +1,7 @@
+/* globals module:true */
+
 module.exports = function(grunt) {
+  'use strict';
 
   var MockupGrunt = require('./js/grunt'),
       requirejsOptions = require('./js/config'),
@@ -6,7 +9,7 @@ module.exports = function(grunt) {
       docsExtraIncludes = [];
 
 
-  for (var i = 0; i < mockup.patterns.length; i++) {
+  for (var i = 0; i < mockup.patterns.length; i = i + 1) {
     docsExtraIncludes.push(mockup.patterns[i]);
     docsExtraIncludes.push('text!' + requirejsOptions.paths[mockup.patterns[i]] + '.js');
   }
@@ -44,7 +47,7 @@ module.exports = function(grunt) {
   }, {
     path: 'docs/dev/',
     url: 'docs',
-    extraInclude: docsExtraIncludes, 
+    extraInclude: docsExtraIncludes,
   }, ['requirejs', 'less', 'copy', 'sed']);
 
   mockup.registerBundle('structure', {}, {
@@ -78,7 +81,7 @@ module.exports = function(grunt) {
             'bower_components/html5shiv/dist/html5shiv.js',
             'bower_components/respond/dest/respond.matchmedia.addListener.src.js',
             'bower_components/respond/dest/respond.src.js'
-           ]
+          ]
         }
       }
     },
@@ -105,10 +108,9 @@ module.exports = function(grunt) {
   }, {
     url: '++resource++plonetheme.barceloneta',
     exclude: ['jquery', 'mockup-registry', 'mockup-patterns-base']
-  },
+
   // skip the uglify section; barceloneta has a custom dev loader, since it assumed the presence of the plone bundle
-  ['requirejs', 'less', 'copy', 'sed']
-  );
+  }, ['requirejs', 'less', 'copy', 'sed']);
 
   mockup.registerBundle('widgets');
 
diff --git a/Makefile b/Makefile
index a273517..7153e87 100644
--- a/Makefile
+++ b/Makefile
@@ -50,11 +50,11 @@ bootstrap: clean bootstrap-common
 
 bootstrap-nix: clean bootstrap-common
 	nix-build default.nix -A build -o nixenv
-	ln -s nixenv/lib/node_modules/plone-mockup/node_modules
+	ln -s nixenv/lib/node_modules/mockup/node_modules
 	ln -s nixenv/bower_components
 
 jshint:
-	NODE_PATH=$(NODE_PATH) $(GRUNT) jshint
+	NODE_PATH=$(NODE_PATH) $(GRUNT) jshint jscs
 
 test:
 	NODE_PATH=$(NODE_PATH) $(GRUNT) test --pattern=$(pattern)
diff --git a/bower.json b/bower.json
index ba043d3..8c2a5f7 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "mockup",
-  "version": "1.5.0",
+  "version": "1.6.0",
   "description": "Plone core patterns",
   "dependencies": {
     "ace-builds": "1.1.1",
diff --git a/default.nix b/default.nix
index 58248f7..3604745 100644
--- a/default.nix
+++ b/default.nix
@@ -1,4 +1,4 @@
-{ plone-mockup ? { outPath = ./.; name = "plone-mockup"; }
+{ mockup ? { outPath = ./.; name = "mockup"; }
 }:
 let
   pkgs = import <nixpkgs> {};
@@ -11,11 +11,11 @@ let
     generated = ./package.nix;
   };
 in rec {
-  tarball = pkgs.runCommand "plone-mockup-1.4.0.tgz" { buildInputs = [ pkgs.nodejs ]; } ''
-    mv `HOME=$PWD npm pack ${plone-mockup}` $out
+  tarball = pkgs.runCommand "mockup-1.6.0.tgz" { buildInputs = [ pkgs.nodejs ]; } ''
+    mv `HOME=$PWD npm pack ${mockup}` $out
   '';
   build = nodePackages.buildNodePackage {
-    name = "plone-mockup-1.4.0";
+    name = "mockup-1.6.0";
     src = [ tarball ];
     buildInputs = [ ];
     deps = with nodePackages; [
@@ -29,6 +29,7 @@ in rec {
       grunt-contrib-less
       grunt-contrib-requirejs
       grunt-contrib-uglify
+      grunt-jscs-checker
       grunt-karma
       grunt-sed
       karma
@@ -52,6 +53,6 @@ in rec {
     '';
 
     peerDependencies = [];
-    passthru.names = [ "plone-mockup" ];
+    passthru.names = [ "mockup" ];
   };
 }
diff --git a/js/bundles/barceloneta.js b/js/bundles/barceloneta.js
index 989ee87..a45c5ba 100644
--- a/js/bundles/barceloneta.js
+++ b/js/bundles/barceloneta.js
@@ -26,11 +26,11 @@ define([
   'mockup-registry',
   'mockup-patterns-base'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var PloneBarceloneta = Base.extend({
-    name: "plone-barceloneta",
+    name: 'plone-barceloneta',
     init: function() {
       var self = this;
 
diff --git a/js/bundles/docs.js b/js/bundles/docs.js
index fe70498..eeea946 100644
--- a/js/bundles/docs.js
+++ b/js/bundles/docs.js
@@ -6,7 +6,9 @@ require([
   'bootstrap-collapse',
   'mockup-fakeserver'
 ], function(Docs, GETTING_STARTED, TUTORIAL, CONTRIBUTE) {
-  new Docs({
+  'use strict';
+
+  var docs = new Docs({
     pages: [
       { id: 'index',
         title: 'Mockup',
@@ -172,5 +174,6 @@ require([
     ]
   });
 
+  return docs;
 });
 
diff --git a/js/bundles/plone.js b/js/bundles/plone.js
index 007c100..835d51a 100644
--- a/js/bundles/plone.js
+++ b/js/bundles/plone.js
@@ -44,11 +44,11 @@ define([
   'bootstrap-collapse',
   'bootstrap-tooltip'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var Plone = Base.extend({
-    name: "plone",
+    name: 'plone',
     init: function() {
       var self = this;
 
diff --git a/js/bundles/plone_develop.js b/js/bundles/plone_develop.js
index 023d839..2ab680d 100644
--- a/js/bundles/plone_develop.js
+++ b/js/bundles/plone_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,15 +9,15 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-plone', 'mockup-bundles-barceloneta']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/plone.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
diff --git a/js/bundles/structure.js b/js/bundles/structure.js
index 46de768..fc44ab0 100644
--- a/js/bundles/structure.js
+++ b/js/bundles/structure.js
@@ -22,8 +22,8 @@
 
 
 if (window.jQuery) {
-  define( "jquery", [], function () {
-    "use strict";
+  define( 'jquery', [], function () {
+    'use strict';
     return window.jQuery;
   } );
 }
@@ -35,13 +35,13 @@ define([
   'mockup-patterns-modal',
   'mockup-patterns-structure'
 ], function($, registry, Base, Modal, Structure) {
-  "use strict";
+  'use strict';
 
-  $(document).ready(function(){
+  $(document).ready(function() {
     var $structure = $('.pat-structure');
-    if($structure.length === 1){
+    if ($structure.length === 1) {
       var $container = $structure.parents('#content');
-      if($container.length === 0){
+      if ($container.length === 0) {
         // uh oh, no content id, let's go up a few levels and use that as parent
         $container = $structure.parent().parent();
       }
@@ -56,12 +56,12 @@ define([
       });
       var modal = $modal.data('pattern-modal');
       modal.show();
-      modal.$modal.find('a.close').on('destroy.modal.patterns', function(){
+      modal.$modal.find('a.close').on('destroy.modal.patterns', function() {
         var $base = $('base');
         var url;
-        if($base.length === 0){
+        if ($base.length === 0) {
           url = window.location.href.replace('@@folder_contents', '').replace('folder_contents', '');
-        }else{
+        } else {
           url = $base.attr('href');
         }
         window.location = url;
diff --git a/js/bundles/structure_develop.js b/js/bundles/structure_develop.js
index 9d9254c..c8ded52 100644
--- a/js/bundles/structure_develop.js
+++ b/js/bundles/structure_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,15 +9,15 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-structure']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/structure.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
diff --git a/js/bundles/tiles.js b/js/bundles/tiles.js
index 4a7be49..03e8b9e 100644
--- a/js/bundles/tiles.js
+++ b/js/bundles/tiles.js
@@ -3,7 +3,7 @@ define([
   './../registry.js',
   './../patterns/tiles/tile.js'
 ], function($, registry) {
-  "use strict";
+  'use strict';
 
 
 
diff --git a/js/bundles/toolbar.js b/js/bundles/toolbar.js
index 15284d0..b5cc8c2 100644
--- a/js/bundles/toolbar.js
+++ b/js/bundles/toolbar.js
@@ -45,11 +45,11 @@ define([
 ], function($, Router, iframe, registry, Base, Toggle, Modal, TinyMCE,
             Structure, AutoTOC, Accessibility, FormUnloadAlert, LiveSearch,
             PloneWidgets) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var Toolbar = Base.extend({
-    name: "plone-toolbar",
+    name: 'plone-toolbar',
     init: function() {
       var self = this;
 
@@ -82,16 +82,16 @@ define([
       $match.addClass('pat-formunloadalert');
       // TODO: need to get form_modified_message into body data attributes
       //$match.attr({
-      //  'data-pat-formunloadalert':'message: '+window.form_modified_message
+      //  'data-pat-formunloadalert':'message: ' +window.form_modified_message
       //});
 
-      // Use toggle to replace the toggleSelect from the select_all.js {{{
+      // Use toggle to replace the toggleSelect from the selectAll.js {{{
       // First, remove the previous onclick
-      $("[onclick^='toggleSelect']", self.$el).attr('onclick', null);
+      $('[onclick^="toggleSelect"]', self.$el).attr('onclick', null);
 
       // Assign the class and data attributes for the "select all of the content_status_history template
-      var select_all = $('form[action$=content_status_history] table.listing > thead tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      var selectAll = $('form[action$=content_status_history] table.listing > thead tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'table.listing input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -100,8 +100,8 @@ define([
       });
 
       // Assign the class and data attributes for the "select all of the usergroup-groupmembership view
-      select_all = $('form[action*=usergroup-groupmembership] table.listing tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('form[action*=usergroup-groupmembership] table.listing tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'table.listing input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -110,8 +110,8 @@ define([
       });
 
       // Assign the class and data attributes for the "select all of the usergroup-usermembership view
-      select_all = $('form[action*=usergroup-usermembership] table.listing tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('form[action*=usergroup-usermembership] table.listing tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'form[action*=usergroup-usermembership] table.listing:last input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -120,8 +120,8 @@ define([
       });
 
       // plone/app/search/search.pt
-      select_all = $("[onchange*='toggleSelect']", self.$el).attr('onchange', null);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('[onchange*="toggleSelect"]', self.$el).attr('onchange', null);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'form[name=searchform] dd.actionMenuContent input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -136,14 +136,14 @@ define([
         .not('[action$="@@new-user"]')
         .not('[action$="@@usergroup-groupdetails"]')
         .patternPreventdoublesubmit({
-          message: window.form_resubmit_message
+          message: window['form_resubmit_message'] || '' // jshint ignore:line
         });
 
       // Add the form auto focus for the add or edit forms
-      var add_form = $('form[action*="++add++"]', self.$el);
-      add_form.addClass('pat-formautofocus');
-      var edit_form = $('form[action*="@@edit"]', self.$el);
-      edit_form.addClass('pat-formautofocus');
+      var addForm = $('form[action*="++add++"]', self.$el);
+      addForm.addClass('pat-formautofocus');
+      var editForm = $('form[action*="@@edit"]', self.$el);
+      editForm.addClass('pat-formautofocus');
 
       /*** Login ***/
       var loginOptions = {
@@ -197,10 +197,10 @@ define([
         .patternModal(defaultPage);
 
       /*** Add user form ***/
-      var users_add = $('form[name="users_add"]', self.$el);
-      if ( users_add.length > 0) {
+      var usersAdd = $('form[name="usersAdd"]', self.$el);
+      if ( usersAdd.length > 0) {
         var addUserOptions = {
-          ajaxUrl: users_add[0].action,
+          ajaxUrl: usersAdd[0].action,
           triggers: ['click input[name="form.button.AddUser"]'],
           buttons: 'input[name="form.actions.register"]',
           content: '#content',
@@ -212,10 +212,10 @@ define([
       }
 
       /*** Add group form ***/
-      var groups_add = $('form[name="groups_add"]', self.$el);
-      if ( groups_add.length > 0) {
+      var groupsAdd = $('form[name="groupsAdd"]', self.$el);
+      if ( groupsAdd.length > 0) {
         var addGroupOptions = {
-          ajaxUrl: groups_add[0].action,
+          ajaxUrl: groupsAdd[0].action,
           triggers: ['click input[name="form.button.AddGroup"]'],
           buttons: 'input[name="form.button.Save"]',
           content: '#content',
@@ -234,41 +234,41 @@ define([
         actionOptions: {
           displayInModal: false
         }
-      }).on('shown.modal.patterns', function(modal){
+      }).on('shown.modal.patterns', function(modal) {
         var $modal = modal.$modal;
-        var prefered = $(".current_prefer_form", $modal),
-            allowed = $(".current_allow_form", $modal),
-            constrain_mode = $(".constrain_types_mode_form", $modal),
-            prefered_field = prefered.parents('.field'),
-            allowed_field = allowed.parents('.field'),
+        var prefered = $('.current_prefer_form', $modal),
+            allowed = $('.current_allow_form', $modal),
+            constrainMode = $('.constrain_types_mode_form', $modal),
+            preferedField = prefered.parents('.field'),
+            allowedField = allowed.parents('.field'),
             ACQUIRE = -1,
             DISABLED = 0,
             ENABLED = 1;
-        function updateVisibility(){
-          var mode = parseInt(constrain_mode.val(), 10);
-          if(mode === ENABLED){
-            prefered_field.show();
-            allowed_field.show();
-          }else{
-            prefered_field.hide();
-            allowed_field.hide();
+        function updateVisibility() {
+          var mode = parseInt(constrainMode.val(), 10);
+          if (mode === ENABLED) {
+            preferedField.show();
+            allowedField.show();
+          } else {
+            preferedField.hide();
+            allowedField.hide();
           }
         }
-        function updateSelectable(){
-          prefered.each(function(){
-            var allowed_id = this.id.replace('prefer', 'allow'),
-                allowed_item = allowed_field.find("#" + allowed_id);
-            if (this.checked){
-              allowed_item[0].disabled = false;
-            }else{
-              allowed_item[0].disabled = true;
-              allowed_item[0].checked = false;
+        function updateSelectable() {
+          prefered.each(function() {
+            var allowedId = this.id.replace('prefer', 'allow'),
+                allowedItem = allowedField.find('#' + allowedId);
+            if (this.checked) {
+              allowedItem[0].disabled = false;
+            } else {
+              allowedItem[0].disabled = true;
+              allowedItem[0].checked = false;
             }
           });
         }
-        constrain_mode.change(updateVisibility);
+        constrainMode.change(updateVisibility);
         updateVisibility();
-        prefered_field.change(updateSelectable);
+        preferedField.change(updateSelectable);
         updateSelectable();
       });
 
@@ -305,16 +305,16 @@ define([
         .patternModal(renameOptions);
 
       /*** Delete action ***/
-      var delete_action = $('#plone-contentmenu-actions-delete > a, #plone-contentmenu-actions-delete', self.$el);
-      delete_action
+      var deleteAction = $('#plone-contentmenu-actions-delete > a, #plone-contentmenu-actions-delete', self.$el);
+      deleteAction
         .addClass('pat-modal')
         .patternModal({
           actionOptions: {
             onSuccess: function(modal, responseBody, state, xhr, form) {
-              modal.$el.on('afterDraw.modal.patterns', function(e){
+              modal.$el.on('afterDraw.modal.patterns', function(e) {
                 // cleanup modal here, we only want to show the status
                 var $info = $('.portalMessage.info', modal.$modal);
-                if($info.length > 0){
+                if ($info.length > 0) {
                   var $modalBody = $('.modal-body', modal.$modal);
                   $modalBody.empty();
                   $modalBody.append($info);
@@ -343,7 +343,7 @@ define([
 
       // make sure clicking on anything in the menu closes the toggled element
       $('.toolbar-dropdown .toolbar-dropdown-menu a', self.$el).click(function(e) {
-          $(this).parents('.toolbar-dropdown').children('a').trigger('click');
+        $(this).parents('.toolbar-dropdown').children('a').trigger('click');
       });
 
       // at opening toolbar dropdown:
@@ -411,7 +411,7 @@ define([
         width: '96%',
         position: 'middle top',
         actionOptions: {
-          onSuccess: function(modal, response, state, xhr, form){
+          onSuccess: function(modal, response, state, xhr, form) {
           }
         }
       });
@@ -424,14 +424,14 @@ define([
           displayInModal: false
         }
       }).on('show.modal.patterns', function(evt, modal) {
-        $('a[href]', modal.$modal).each(function(){
+        $('a[href]', modal.$modal).each(function() {
           var href = this.href;
           var parts = href.split('/');
-          parts.splice(parts.length-1, 0, '++nodiazo++');
+          parts.splice(parts.length - 1, 0, ' ++nodiazo++');
           href = parts.join('/');
 
           $(this).attr('href', href);
-          $(this).click(function(){
+          $(this).click(function() {
             window.open(href);
           });
         });
@@ -456,38 +456,37 @@ define([
         // Kill the onchange method so we can wire up our own
         $('.section select', modal.$raw).removeAttr('onchange');
         modal.options.actions = {
-            // Handle adding portlets via the select
-            '.section select': {
-              eventType: 'change',
-              onSuccess: function(modal, response, state, xhr, form) {
-                  if (modal.$modal.find('.pattern-modal-buttons input').length === 0) {
-                      // The portlet didn't have an edit form (e.g. calendar)
-                      modal.reloadWindow();
-                  }
-              },
-              ajaxUrl: function($action, options) {
-                var portlet = $action.val();
-                var form_action = $action.parents('form').attr('action');
-                return form_action + portlet;
-              }
-            },
-            '.actionButtons input': {
-              // Handle errors on portlet submission
-              error: '.fieldErrorBox',
-              onSuccess: function(modal, response, state, xhr, form) {
+          // Handle adding portlets via the select
+          '.section select': {
+            eventType: 'change',
+            onSuccess: function(modal, response, state, xhr, form) {
+              if (modal.$modal.find('.pattern-modal-buttons input').length === 0) {
+                // The portlet didn't have an edit form (e.g. calendar)
                 modal.reloadWindow();
               }
             },
-            // Handle moving and hiding portlets
-            '.portlet-action': {
-              isForm: true
+            ajaxUrl: function($action, options) {
+              var portlet = $action.val();
+              var formAction = $action.parents('form').attr('action');
+              return formAction + portlet;
             }
-          };
+          },
+          '.actionButtons input': {
+            // Handle errors on portlet submission
+            error: '.fieldErrorBox',
+            onSuccess: function(modal, response, state, xhr, form) {
+              modal.reloadWindow();
+            }
+          },
+          // Handle moving and hiding portlets
+          '.portlet-action': {
+            isForm: true
+          }
+        };
       })
       .on('hidden.modal.patterns', function(e) {
-          $(this).data('pattern-modal').reloadWindow();
-        }
-      );
+        $(this).data('pattern-modal').reloadWindow();
+      });
 
       // Edit/Add
       $('#plone-contentmenu-factories ul li', self.$el).addClass('is-content');
@@ -498,7 +497,7 @@ define([
         backdropOptions: {
           closeOnClick: false
         },
-        position: "center top",
+        position: 'center top',
         content: '#content',
         automaticallyAddButtonActions: false,
         actionOptions: {
@@ -547,7 +546,7 @@ define([
           $(this).data('pattern-modal').options.actions = {
             'table.listing a': {
               ajaxUrl: function($action, options) {
-                return $action.attr('href').replace(/@@/g, "++nodiazo++/@@");
+                return $action.attr('href').replace(/@@/g, '++nodiazo++/@@');
               },
               displayInModal: false
             },
@@ -582,20 +581,20 @@ define([
         }
       });
 
-      self.$el.find('.mce_editable').addClass('pat-tinymce').each(function(){
+      self.$el.find('.mce_editable').addClass('pat-tinymce').each(function() {
         var $tiny = $(this);
         var config = $.parseJSON($tiny.attr('data-mce-config'));
-        config.content_css = config.portal_url + '/base.css';
+        config['content_css'] = config['portal_url'] + '/base.css'; // jshint ignore:line
         delete config.customplugins;
         delete config.plugins;
         delete config.theme;
         $tiny.attr({
           'data-pat-tinymce': JSON.stringify({
             relatedItems: {
-              vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog'
+              vocabularyUrl: config['portal_url'] + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' // jshint ignore:line
             },
-            rel_upload_path: '@@fileUpload',
-            folder_url: config.document_base_url,
+            'rel_upload_path': '@@fileUpload', // jshint ignore:line
+            'folder_url': config['document_base_url'], // jshint ignore:line
             tiny: config,
             prependToUrl: 'resolveuid/',
             linkAttribute: 'UID',
@@ -606,8 +605,8 @@ define([
 
 
       // XXX important, run pattern mods against overlays
-      $('body').on('rendered.modal.patterns', function(){
-        (new Toolbar($(this))); // just run init again...
+      $('body').on('rendered.modal.patterns', function() {
+        var toolbar = new Toolbar($(this)); // just run init again...
       });
 
     }
@@ -617,34 +616,34 @@ define([
 
   /* maybe hackish fix here, but.....  let's get these in and out widgets working in overlays
    * TODO: Override all in and out widgets in python to use select2 */
-  var updateValues = function(id, $to){
+  var updateValues = function(id, $to) {
     var $container = $('#' + id + '-toDataContainer');
     $container.empty();
     var name = id.replace('-', '.').replace('-', '.') + ':list';
-    $to.find('option').each(function(){
+    $to.find('option').each(function() {
       $container.append('<input name="' + name + '" type="hidden" value="' + $(this).val() + '" />');
     });
   };
 
-  window.from2to = function(id){
+  window.from2to = function(id) {
     var $el = $('#' + id);
     var $selects = $el.find('select');
     var $from = $selects.eq(0);
     var $to = $selects.eq(1);
-    $from.find('option').each(function(){
-      if(this.selected){
+    $from.find('option').each(function() {
+      if (this.selected) {
         $to.append($(this));
       }
     });
     updateValues(id, $to);
   };
-  window.to2from = function(id){
+  window.to2from = function(id) {
     var $el = $('#' + id);
     var $selects = $el.find('select');
     var $from = $selects.eq(0);
     var $to = $selects.eq(1);
-    $to.find('option').each(function(){
-      if(this.selected){
+    $to.find('option').each(function() {
+      if (this.selected) {
         $from.append($(this));
       }
     });
diff --git a/js/bundles/toolbar_develop.js b/js/bundles/toolbar_develop.js
index 1188ea6..e9bae5b 100644
--- a/js/bundles/toolbar_develop.js
+++ b/js/bundles/toolbar_develop.js
@@ -1,5 +1,7 @@
-(function($) {
-  "use strict";
+/* globals less:true, domready:true */
+
+(function() {
+  'use strict';
 
   domready(function() {
 
@@ -7,18 +9,18 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-toolbar']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/toolbar.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
   });
 
-}(jQuery));
+}());
diff --git a/js/bundles/widgets.js b/js/bundles/widgets.js
index 9b46820..35a18ba 100644
--- a/js/bundles/widgets.js
+++ b/js/bundles/widgets.js
@@ -32,10 +32,10 @@ define([
   'mockup-patterns-querystring',
   'mockup-patterns-tinymce'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   var PloneWidgets = Base.extend({
-    name: "plone-widgets",
+    name: 'plone-widgets',
     init: function() {
       var self = this;
     }
diff --git a/js/bundles/widgets_develop.js b/js/bundles/widgets_develop.js
index 0ccb272..662c149 100644
--- a/js/bundles/widgets_develop.js
+++ b/js/bundles/widgets_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,25 +9,25 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
-      if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0){
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
+      if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0) {
         require(['mockup-bundles-widgets']);
       } else {
         require(['mockup-bundles-widgets', 'mockup-iframe_init']);
       }
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/widgets.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0) {
       var style2 = document.createElement('style');
       style2.setAttribute('type', 'text/less');
       style2.innerHTML = '@import (less) "/++resource++mockup/less/iframe_init.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-      document.getElementsByTagName("head")[0].appendChild(style2);
+      document.getElementsByTagName('head')[0].appendChild(style2);
     }
 
     less.refresh();
diff --git a/js/config.js b/js/config.js
index dbb3592..956e6fb 100644
--- a/js/config.js
+++ b/js/config.js
@@ -1,121 +1,123 @@
+/* globals module:true */
+
 (function() {
+  'use strict';
 
-var requirejsOptions = {
-  baseUrl: './',
-  optimize: 'uglify',
-  paths: {
-    'JSXTransformer': 'bower_components/react/JSXTransformer',
-    'ace': "bower_components/ace-builds/src/ace",
-    'ace-theme-monokai': "bower_components/ace-builds/src/theme-monokai",
-    'ace-mode-text': "bower_components/ace-builds/src/mode-text",
-    'backbone': 'bower_components/backbone/backbone',
-    'backbone.paginator': 'bower_components/backbone.paginator/lib/backbone.paginator',
-    'bootstrap-alert': 'bower_components/bootstrap/js/alert',
-    'bootstrap-collapse': 'bower_components/bootstrap/js/collapse',
-    'bootstrap-dropdown': 'bower_components/bootstrap/js/dropdown',
-    'bootstrap-tooltip': 'bower_components/bootstrap/js/tooltip',
-    'bootstrap-transition': 'bower_components/bootstrap/js/transition',
-    'docs-getting-started': 'GETTING_STARTED.md',
-    'docs-tutorial': 'TUTORIAL.md',
-    'docs-contribute': 'CONTRIBUTE.md',
-    'domready': 'bower_components/domready/ready',
-    'dropzone': "bower_components/dropzone/downloads/dropzone-amd-module",
-    'expect': 'bower_components/expect/expect',
-    'jqtree': "bower_components/jqtree/tree.jquery",
-    'jquery': 'bower_components/jquery/jquery',
-    'jquery.cookie': 'bower_components/jquery.cookie/jquery.cookie',
-    'jquery.event.drag': 'lib/jquery.event.drag',
-    'jquery.event.drop': 'lib/jquery.event.drop',
-    'jquery.form': 'bower_components/jquery-form/jquery.form',
-    'marked': 'bower_components/marked/lib/marked',
-    'mockup-bundles-barceloneta': 'js/bundles/barceloneta',
-    'mockup-bundles-docs': 'js/bundles/docs',
-    'mockup-bundles-plone': 'js/bundles/plone',
-    'mockup-bundles-structure': 'js/bundles/structure',
-    'mockup-bundles-tiles': 'js/bundles/widgets',
-    'mockup-bundles-toolbar': 'js/bundles/toolbar',
-    'mockup-bundles-widgets': 'js/bundles/widgets',
-    'mockup-docs': 'bower_components/mockup-core/js/docs/app',
-    'mockup-docs-navigation': 'bower_components/mockup-core/js/docs/navigation',
-    'mockup-docs-page': 'bower_components/mockup-core/js/docs/page',
-    'mockup-docs-pattern': 'bower_components/mockup-core/js/docs/pattern',
-    'mockup-docs-view': 'bower_components/mockup-core/js/docs/view',
-    'mockup-fakeserver': 'tests/fakeserver',
-    'mockup-iframe': 'js/iframe',
-    'mockup-iframe_init': 'js/iframe_init',
-    'mockup-patterns-accessibility': 'js/patterns/accessibility',
-    'mockup-patterns-ace': 'js/patterns/ace',
-    'mockup-patterns-autotoc': 'js/patterns/autotoc',
-    'mockup-patterns-backdrop': 'js/patterns/backdrop',
-    'mockup-patterns-base': 'bower_components/mockup-core/js/pattern',
-    'mockup-patterns-cookiedirective': 'js/patterns/cookiedirective',
-    'mockup-patterns-sortable': 'js/patterns/sortable',
-    'mockup-patterns-dropzone': 'js/patterns/dropzone',
-    'mockup-patterns-expose': 'js/patterns/expose',
-    'mockup-patterns-filemanager': 'js/patterns/filemanager/pattern',
-    'mockup-patterns-formautofocus': 'js/patterns/formautofocus',
-    'mockup-patterns-formunloadalert': 'js/patterns/formunloadalert',
-    'mockup-patterns-livesearch': 'js/patterns/livesearch',
-    'mockup-patterns-modal': 'js/patterns/modal',
-    'mockup-patterns-moment': 'js/patterns/moment',
-    'mockup-patterns-pickadate': 'js/patterns/pickadate',
-    'mockup-patterns-picture': 'js/patterns/picture',
-    'mockup-patterns-preventdoublesubmit': 'js/patterns/preventdoublesubmit',
-    'mockup-patterns-querystring': 'js/patterns/querystring',
-    'mockup-patterns-relateditems': 'js/patterns/relateditems',
-    'mockup-patterns-select2': 'js/patterns/select2',
-    'mockup-patterns-structure': 'js/patterns/structure/pattern',
-    'mockup-patterns-tablesorter': 'js/patterns/tablesorter',
-    'mockup-patterns-tinymce': 'js/patterns/tinymce/pattern',
-    'mockup-patterns-toggle': 'js/patterns/toggle',
-    'mockup-patterns-tooltip': 'js/patterns/tooltip',
-    'mockup-patterns-tree': 'js/patterns/tree',
-    'mockup-registry': 'bower_components/mockup-core/js/registry',
-    'mockup-router': 'js/router',
-    'mockup-utils': 'js/utils',
-    'moment': 'bower_components/moment/moment',
-    'picker': 'bower_components/pickadate/lib/picker',
-    'picker.date': 'bower_components/pickadate/lib/picker.date',
-    'picker.time': 'bower_components/pickadate/lib/picker.time',
-    'react': 'bower_components/react/react',
-    'select2': 'bower_components/select2/select2',
-    'sinon': 'bower_components/sinonjs/sinon',
-    'text': 'bower_components/requirejs-text/text',
-    'tinymce': 'lib/tinymce/tinymce.min',
-    'underscore': 'bower_components/lodash/dist/lodash.underscore'
-  },
-  shim: {
-    'JSXTransformer': { exports: 'window.JSXTransformer' },
-    'backbone': { exports: 'window.Backbone', deps: ['underscore', 'jquery'] },
-    'backbone.paginator': { exports: 'window.Backbone.Paginator', deps: ['backbone'] },
-    'bootstrap-alert': { deps: ['jquery'] },
-    'bootstrap-collapse': {exports: 'window.jQuery.fn.collapse.Constructor', deps: ['jquery']},
-    'bootstrap-dropdown': { deps: ['jquery'] },
-    'bootstrap-tooltip': { deps: ['jquery'] },
-    'bootstrap-transition': {exports: 'window.jQuery.support.transition', deps: ['jquery']},
-    'expect': {exports: 'window.expect'},
-    'jqtree': { deps: ['jquery'] },
-    'jquery.cookie': { deps: ['jquery'] },
-    'jquery.event.drag': { deps: ['jquery'] },
-    'jquery.event.drop': {
-      deps: ['jquery'],
-      exports: '$.drop'
+  var requirejsOptions = {
+    baseUrl: './',
+    optimize: 'uglify',
+    paths: {
+      'JSXTransformer': 'bower_components/react/JSXTransformer',
+      'ace': 'bower_components/ace-builds/src/ace',
+      'ace-theme-monokai': 'bower_components/ace-builds/src/theme-monokai',
+      'ace-mode-text': 'bower_components/ace-builds/src/mode-text',
+      'backbone': 'bower_components/backbone/backbone',
+      'backbone.paginator': 'bower_components/backbone.paginator/lib/backbone.paginator',
+      'bootstrap-alert': 'bower_components/bootstrap/js/alert',
+      'bootstrap-collapse': 'bower_components/bootstrap/js/collapse',
+      'bootstrap-dropdown': 'bower_components/bootstrap/js/dropdown',
+      'bootstrap-tooltip': 'bower_components/bootstrap/js/tooltip',
+      'bootstrap-transition': 'bower_components/bootstrap/js/transition',
+      'docs-getting-started': 'GETTING_STARTED.md',
+      'docs-tutorial': 'TUTORIAL.md',
+      'docs-contribute': 'CONTRIBUTE.md',
+      'domready': 'bower_components/domready/ready',
+      'dropzone': 'bower_components/dropzone/downloads/dropzone-amd-module',
+      'expect': 'bower_components/expect/expect',
+      'jqtree': 'bower_components/jqtree/tree.jquery',
+      'jquery': 'bower_components/jquery/jquery',
+      'jquery.cookie': 'bower_components/jquery.cookie/jquery.cookie',
+      'jquery.event.drag': 'lib/jquery.event.drag',
+      'jquery.event.drop': 'lib/jquery.event.drop',
+      'jquery.form': 'bower_components/jquery-form/jquery.form',
+      'marked': 'bower_components/marked/lib/marked',
+      'mockup-bundles-barceloneta': 'js/bundles/barceloneta',
+      'mockup-bundles-docs': 'js/bundles/docs',
+      'mockup-bundles-plone': 'js/bundles/plone',
+      'mockup-bundles-structure': 'js/bundles/structure',
+      'mockup-bundles-tiles': 'js/bundles/widgets',
+      'mockup-bundles-toolbar': 'js/bundles/toolbar',
+      'mockup-bundles-widgets': 'js/bundles/widgets',
+      'mockup-docs': 'bower_components/mockup-core/js/docs/app',
+      'mockup-docs-navigation': 'bower_components/mockup-core/js/docs/navigation',
+      'mockup-docs-page': 'bower_components/mockup-core/js/docs/page',
+      'mockup-docs-pattern': 'bower_components/mockup-core/js/docs/pattern',
+      'mockup-docs-view': 'bower_components/mockup-core/js/docs/view',
+      'mockup-fakeserver': 'tests/fakeserver',
+      'mockup-iframe': 'js/iframe',
+      'mockup-iframe_init': 'js/iframe_init',
+      'mockup-patterns-accessibility': 'js/patterns/accessibility',
+      'mockup-patterns-ace': 'js/patterns/ace',
+      'mockup-patterns-autotoc': 'js/patterns/autotoc',
+      'mockup-patterns-backdrop': 'js/patterns/backdrop',
+      'mockup-patterns-base': 'bower_components/mockup-core/js/pattern',
+      'mockup-patterns-cookiedirective': 'js/patterns/cookiedirective',
+      'mockup-patterns-sortable': 'js/patterns/sortable',
+      'mockup-patterns-dropzone': 'js/patterns/dropzone',
+      'mockup-patterns-expose': 'js/patterns/expose',
+      'mockup-patterns-filemanager': 'js/patterns/filemanager/pattern',
+      'mockup-patterns-formautofocus': 'js/patterns/formautofocus',
+      'mockup-patterns-formunloadalert': 'js/patterns/formunloadalert',
+      'mockup-patterns-livesearch': 'js/patterns/livesearch',
+      'mockup-patterns-modal': 'js/patterns/modal',
+      'mockup-patterns-moment': 'js/patterns/moment',
+      'mockup-patterns-pickadate': 'js/patterns/pickadate',
+      'mockup-patterns-picture': 'js/patterns/picture',
+      'mockup-patterns-preventdoublesubmit': 'js/patterns/preventdoublesubmit',
+      'mockup-patterns-querystring': 'js/patterns/querystring',
+      'mockup-patterns-relateditems': 'js/patterns/relateditems',
+      'mockup-patterns-select2': 'js/patterns/select2',
+      'mockup-patterns-structure': 'js/patterns/structure/pattern',
+      'mockup-patterns-tablesorter': 'js/patterns/tablesorter',
+      'mockup-patterns-tinymce': 'js/patterns/tinymce/pattern',
+      'mockup-patterns-toggle': 'js/patterns/toggle',
+      'mockup-patterns-tooltip': 'js/patterns/tooltip',
+      'mockup-patterns-tree': 'js/patterns/tree',
+      'mockup-registry': 'bower_components/mockup-core/js/registry',
+      'mockup-router': 'js/router',
+      'mockup-utils': 'js/utils',
+      'moment': 'bower_components/moment/moment',
+      'picker': 'bower_components/pickadate/lib/picker',
+      'picker.date': 'bower_components/pickadate/lib/picker.date',
+      'picker.time': 'bower_components/pickadate/lib/picker.time',
+      'react': 'bower_components/react/react',
+      'select2': 'bower_components/select2/select2',
+      'sinon': 'bower_components/sinonjs/sinon',
+      'text': 'bower_components/requirejs-text/text',
+      'tinymce': 'lib/tinymce/tinymce.min',
+      'underscore': 'bower_components/lodash/dist/lodash.underscore'
     },
-    'mockup-iframe_init': { deps: ['domready'] },
-    'picker.date': { deps: [ 'picker' ] },
-    'picker.time': { deps: [ 'picker' ] },
-    'sinon': {exports: 'window.sinon'},
-    'tinymce': { exports: 'window.tinyMCE', init: function () { this.tinyMCE.DOM.events.domLoaded = true; return this.tinyMCE; },
-    'underscore': { exports: 'window._' }
+    shim: {
+      'JSXTransformer': { exports: 'window.JSXTransformer' },
+      'backbone': { exports: 'window.Backbone', deps: ['underscore', 'jquery'] },
+      'backbone.paginator': { exports: 'window.Backbone.Paginator', deps: ['backbone'] },
+      'bootstrap-alert': { deps: ['jquery'] },
+      'bootstrap-collapse': {exports: 'window.jQuery.fn.collapse.Constructor', deps: ['jquery']},
+      'bootstrap-dropdown': { deps: ['jquery'] },
+      'bootstrap-tooltip': { deps: ['jquery'] },
+      'bootstrap-transition': {exports: 'window.jQuery.support.transition', deps: ['jquery']},
+      'expect': {exports: 'window.expect'},
+      'jqtree': { deps: ['jquery'] },
+      'jquery.cookie': { deps: ['jquery'] },
+      'jquery.event.drag': { deps: ['jquery'] },
+      'jquery.event.drop': {
+        deps: ['jquery'],
+        exports: '$.drop'
+      },
+      'mockup-iframe_init': { deps: ['domready'] },
+      'picker.date': { deps: [ 'picker' ] },
+      'picker.time': { deps: [ 'picker' ] },
+      'sinon': {exports: 'window.sinon'},
+      'tinymce': { exports: 'window.tinyMCE', init: function () { this.tinyMCE.DOM.events.domLoaded = true; return this.tinyMCE; }},
+      'underscore': { exports: 'window._' }
     }
-  }
-};
+  };
 
-if (typeof exports !== "undefined" && typeof module !== "undefined") {
-  module.exports = requirejsOptions;
-}
-if (typeof requirejs !== "undefined" && requirejs.config) {
-  requirejs.config(requirejsOptions);
-}
+  if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
+    module.exports = requirejsOptions;
+  }
+  if (typeof requirejs !== 'undefined' && requirejs.config) {
+    requirejs.config(requirejsOptions);
+  }
 
 }());
diff --git a/js/grunt.js b/js/grunt.js
index f5df5d2..f4495fb 100644
--- a/js/grunt.js
+++ b/js/grunt.js
@@ -1,351 +1,370 @@
-var extend = require('extend'),
-    karmaConfig = require('../node_modules/karma/lib/config'),
-    MockupGrunt = function (requirejsOptions) { this.init(requirejsOptions); };
+/* globals module:true */
 
-MockupGrunt.prototype = {
+(function() {
+  'use strict';
 
-  sections: {
-    requirejs: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.requirejs = this.gruntConfig.requirejs || {};
-        this.gruntConfig.requirejs[name] = this.gruntConfig.requirejs[name] || {};
-        this.gruntConfig.requirejs[name].options = this.gruntConfig.requirejs[name].options || {};
-        this.gruntConfig.requirejs[name].options = {
-          name: 'node_modules/requirejs/require.js',
-          include: ['mockup-bundles-' + name].concat(bundleOptions.extraInclude || []),
-          exclude: bundleOptions.exclude || [],
-          insertRequire: ['mockup-bundles-' + name],
-          out: bundleOptions.path + name + '.min.js'
-        };
-      }
-    },
-    uglify: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.uglify = this.gruntConfig.uglify || {};
-        this.gruntConfig.uglify[name] = this.gruntConfig.uglify[name] || {};
-        this.gruntConfig.uglify[name].files = this.gruntConfig.uglify[name].files || {};
-        this.gruntConfig.uglify[name].files[bundleOptions.path + name + '.js'] = [
-          'node_modules/grunt-contrib-less/node_modules/less/dist/less-1.6.1.js',
-          'bower_components/domready/ready.js',
-          'node_modules/requirejs/require.js',
-          'bower_components/jquery/jquery.js',
-          'js/bundles/' + name + '_develop.js'
-        ];
-      }
-    },
-    less: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.less = this.gruntConfig.less || {};
-        this.gruntConfig.less[name] = this.gruntConfig.less[name] || {};
-        this.gruntConfig.less[name].files = this.gruntConfig.less[name].files || {};
-        this.gruntConfig.less[name].files[bundleOptions.path+ name + '.min.css'] = 'less/' + name + '.less';
-      }
-    },
-    copy: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.copy = this.gruntConfig.copy || {};
-        this.gruntConfig.copy[name] = this.gruntConfig.copy[name] || {};
-        this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files || [];
-        this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files.concat([
-          { expand: true, cwd: 'bower_components/bootstrap/dist/fonts/', src: 'glyphicons-halflings-regular.*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-bootstrap-' + src; }},
-          { expand: true, cwd: 'lib/tinymce/skins/lightgray/fonts/', src: 'icomoon.*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-tinymce-' + src; }},
-          { expand: true, cwd: 'lib/tinymce/skins/lightgray/img/', src: 'loader.gif', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-tinymce-' + src; }},
-          { expand: true, cwd: 'bower_components/jqtree/', src: 'jqtree-circle.png', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-jqtree-' + src; }},
-          { expand: true, cwd: 'bower_components/select2/', src: 'select2*.png', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-select2-' + src; }},
-          { expand: true, cwd: 'bower_components/select2/', src: 'select2*.gif', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-select2-' + src; }},
-          { expand: true, cwd: 'bower_components/dropzone/downloads/images/', src: 'spritemap*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-dropzone-' + src; }}
-        ]);
+  var extend = require('extend'),
+      karmaConfig = require('../node_modules/karma/lib/config'),
+      MockupGrunt = function (requirejsOptions) { this.init(requirejsOptions); };
+
+  MockupGrunt.prototype = {
+
+    sections: {
+      requirejs: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.requirejs = this.gruntConfig.requirejs || {};
+          this.gruntConfig.requirejs[name] = this.gruntConfig.requirejs[name] || {};
+          this.gruntConfig.requirejs[name].options = this.gruntConfig.requirejs[name].options || {};
+          this.gruntConfig.requirejs[name].options = {
+            name: 'node_modules/requirejs/require.js',
+            include: ['mockup-bundles-' + name].concat(bundleOptions.extraInclude || []),
+            exclude: bundleOptions.exclude || [],
+            insertRequire: ['mockup-bundles-' + name],
+            out: bundleOptions.path + name + '.min.js'
+          };
+        }
+      },
+      uglify: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.uglify = this.gruntConfig.uglify || {};
+          this.gruntConfig.uglify[name] = this.gruntConfig.uglify[name] || {};
+          this.gruntConfig.uglify[name].files = this.gruntConfig.uglify[name].files || {};
+          this.gruntConfig.uglify[name].files[bundleOptions.path + name + '.js'] = [
+            'node_modules/grunt-contrib-less/node_modules/less/dist/less-1.6.1.js',
+            'bower_components/domready/ready.js',
+            'node_modules/requirejs/require.js',
+            'bower_components/jquery/jquery.js',
+            'js/bundles/' + name + '_develop.js'
+          ];
+        }
+      },
+      less: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.less = this.gruntConfig.less || {};
+          this.gruntConfig.less[name] = this.gruntConfig.less[name] || {};
+          this.gruntConfig.less[name].files = this.gruntConfig.less[name].files || {};
+          this.gruntConfig.less[name].files[bundleOptions.path + name + '.min.css'] = 'less/' + name + '.less';
+        }
+      },
+      copy: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.copy = this.gruntConfig.copy || {};
+          this.gruntConfig.copy[name] = this.gruntConfig.copy[name] || {};
+          this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files || [];
+          this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files.concat([
+            {
+              expand: true, cwd: 'bower_components/bootstrap/dist/fonts/', src: 'glyphicons-halflings-regular.*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-bootstrap-' + src; }
+            }, {
+              expand: true, cwd: 'lib/tinymce/skins/lightgray/fonts/', src: 'icomoon.*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-tinymce-' + src; }
+            }, {
+              expand: true, cwd: 'lib/tinymce/skins/lightgray/img/', src: 'loader.gif', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-tinymce-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/jqtree/', src: 'jqtree-circle.png', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-jqtree-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/select2/', src: 'select2*.png', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-select2-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/select2/', src: 'select2*.gif', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-select2-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/dropzone/downloads/images/', src: 'spritemap*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-dropzone-' + src; }
+            }
+          ]);
+        }
+      },
+      sed: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.sed = this.gruntConfig.sed || {};
+          this.gruntConfig.sed[name + '-bootstrap-glyphicons'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'../bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular',
+            replacement: 'url(\'' + bundleOptions.url + '-bootstrap-glyphicons-halflings-regular'
+          };
+          this.gruntConfig.sed[name + '-dropzone-spritemap'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\("../images/spritemap',
+            replacement: 'url(\'' + bundleOptions.url + '-dropzone-spritemap'
+          };
+          this.gruntConfig.sed[name + '-select2-images'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'select2',
+            replacement: 'url(\'' + bundleOptions.url + '-select2-select2'
+          };
+          this.gruntConfig.sed[name + '-tinymce-icomoon'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'fonts/icomoon',
+            replacement: 'url(\'' + bundleOptions.url + '-tinymce-icomoon'
+          };
+          this.gruntConfig.sed[name + '-tinymce-loader'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'img/loader.gif',
+            replacement: 'url(\'' + bundleOptions.url + '-tinymce-loader.gif'
+          };
+          this.gruntConfig.sed[name + '-jqtree-circle'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(jqtree-circle.png',
+            replacement: 'url(\'' + bundleOptions.url + '-jqtree-jqtree-circle.png\''
+          };
+        }
       }
+
     },
-    sed: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.sed = this.gruntConfig.sed || {};
-        this.gruntConfig.sed[name + '-bootstrap-glyphicons'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'../bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular',
-          replacement: 'url(\'' + bundleOptions.url + '-bootstrap-glyphicons-halflings-regular'
-        };
-        this.gruntConfig.sed[name + '-dropzone-spritemap'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\("../images/spritemap',
-          replacement: 'url(\'' + bundleOptions.url + '-dropzone-spritemap'
-        };
-        this.gruntConfig.sed[name + '-select2-images'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'select2',
-          replacement: 'url(\'' + bundleOptions.url + '-select2-select2'
-        };
-        this.gruntConfig.sed[name + '-tinymce-icomoon'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'fonts/icomoon',
-          replacement: 'url(\'' + bundleOptions.url + '-tinymce-icomoon'
-        };
-        this.gruntConfig.sed[name + '-tinymce-loader'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'img/loader.gif',
-          replacement: 'url(\'' + bundleOptions.url + '-tinymce-loader.gif'
-        };
-        this.gruntConfig.sed[name + '-jqtree-circle'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(jqtree-circle.png',
-          replacement: 'url(\'' + bundleOptions.url + '-jqtree-jqtree-circle.png\''
-        };
-      }
-    }
+    init: function(requirejsOptions) {
+      this.requirejsOptions = requirejsOptions;
+      this.patterns = [];
+      this.bundles = {};
+      this.gruntConfig = {};
+      this.files = [
+        /*
+        * include initial framework (mocha and requirejs) with html5
+        * shims/shams/polyfills
+        */
+        'bower_components/es5-shim/es5-shim.js',
+        'bower_components/es5-shim/es5-sham.js',
+        'bower_components/console-polyfill/index.js',
+        'node_modules/mocha/mocha.js',
+        'node_modules/karma-mocha/lib/adapter.js',
+        'node_modules/requirejs/require.js',
+        'node_modules/karma-requirejs/lib/adapter.js',
+        /*
+        * include requirejs configuration
+        */
+        'js/config.js',
 
-  },
-  init: function(requirejsOptions) {
-    this.requirejsOptions = requirejsOptions;
-    this.patterns = [];
-    this.bundles = {};
-    this.gruntConfig = {};
-    this.files = [
-      /*
-      * include initial framework (mocha and requirejs) with html5
-      * shims/shams/polyfills
-      */
-      'bower_components/es5-shim/es5-shim.js',
-      'bower_components/es5-shim/es5-sham.js',
-      'bower_components/console-polyfill/index.js',
-      'node_modules/mocha/mocha.js',
-      'node_modules/karma-mocha/lib/adapter.js',
-      'node_modules/requirejs/require.js',
-      'node_modules/karma-requirejs/lib/adapter.js',
-      /*
-      * include requirejs configuration
-      */
-      'js/config.js',
+        /*
+        * include karma requirejs configuration
+        */
+        'tests/config.js',
+      ];
 
       /*
-      * include karma requirejs configuration
+      * provide (but not include) all scripts defined in requirejs's
+      * configuration
+      *
+      * also at the same time create a list of all patterns to be loaded with
+      * docs bundle
       */
-      'tests/config.js',
-    ];
-
-    /*
-    * provide (but not include) all scripts defined in requirejs's
-    * configuration
-    *
-    * also at the same time create a list of all patterns to be loaded with
-    * docs bundle
-    */
-    var path;
-    for (var key in this.requirejsOptions.paths) {
-      path = this.requirejsOptions.paths[key];
-      if (path.indexOf('.md') !== path.length - 3) {
-        this.files.push({ pattern: path + '.js', included: false });
-      }
-      if (key.indexOf('mockup-patterns-') === 0) {
-        this.patterns.push(key);
+      var path;
+      for (var key in this.requirejsOptions.paths) {
+        path = this.requirejsOptions.paths[key];
+        if (path.indexOf('.md') !== path.length - 3) {
+          this.files.push({ pattern: path + '.js', included: false });
+        }
+        if (key.indexOf('mockup-patterns-') === 0) {
+          this.patterns.push(key);
+        }
       }
-    }
 
-    /*
-    * provide (but not include) all files in "tests/" and "js/" folder
-    * those files will be loaded by requirejs at later points
-    */
-    this.files = this.files.concat([
-      {pattern: 'tests/example-resource*', included: false},
-      {pattern: 'tests/json/*.json', included: false},
-      {pattern: 'tests/fakeserver*', included: false},
-      {pattern: 'tests/*-test.js', included: false},
-      {pattern: 'tests/**/*-test.js', included: false},
-      {pattern: 'js/ui/**/*.js', included: false},
-      {pattern: 'js/ui/**/*.xml', included: false},
-      {pattern: 'js/patterns/structure/**/*.js', included: false},
-      {pattern: 'js/patterns/structure/**/*.xml', included: false},
-      {pattern: 'js/patterns/filemanager/**/*.xml', included: false},
-      {pattern: 'js/patterns/filemanager/**/*.js', included: false},
-      {pattern: 'js/patterns/tinymce/**/*.xml', included: false},
-      {pattern: 'js/patterns/tinymce/**/*.js', included: false},
-    ]);
+      /*
+      * provide (but not include) all files in "tests/" and "js/" folder
+      * those files will be loaded by requirejs at later points
+      */
+      this.files = this.files.concat([
+        {pattern: 'tests/example-resource*', included: false},
+        {pattern: 'tests/json/*.json', included: false},
+        {pattern: 'tests/fakeserver*', included: false},
+        {pattern: 'tests/*-test.js', included: false},
+        {pattern: 'tests/**/*-test.js', included: false},
+        {pattern: 'js/ui/**/*.js', included: false},
+        {pattern: 'js/ui/**/*.xml', included: false},
+        {pattern: 'js/patterns/structure/**/*.js', included: false},
+        {pattern: 'js/patterns/structure/**/*.xml', included: false},
+        {pattern: 'js/patterns/filemanager/**/*.xml', included: false},
+        {pattern: 'js/patterns/filemanager/**/*.js', included: false},
+        {pattern: 'js/patterns/tinymce/**/*.xml', included: false},
+        {pattern: 'js/patterns/tinymce/**/*.js', included: false},
+      ]);
 
 
-  },
-  registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+    },
+    registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
 
-    /*
-     * TODO: add description
-     */
-    extend(true, this.gruntConfig, customGruntConfig || {});
+      /*
+       * TODO: add description
+       */
+      extend(true, this.gruntConfig, customGruntConfig || {});
 
-    /*
-     * TODO: add description
-     */
-    bundleOptions = extend(true, {
-      path: 'build/',
-      url: '++resource++plone.app.' + name,
-      insertExtraRequires: []
-    }, bundleOptions || {});
+      /*
+       * TODO: add description
+       */
+      bundleOptions = extend(true, {
+        path: 'build/',
+        url: ' ++resource++plone.app.' + name,
+        insertExtraRequires: []
+      }, bundleOptions || {});
 
-    /*
-     * TODO: add description
-     */
-    sections = sections || ['requirejs', 'uglify', 'less', 'copy', 'sed'];
+      /*
+       * TODO: add description
+       */
+      sections = sections || ['requirejs', 'uglify', 'less', 'copy', 'sed'];
 
-    /*
-     * TODO: add description
-     */
-    for (var i = 0; i < sections.length; i++) {
-      if (this.sections[sections[i]]) {
-        this.sections[sections[i]].registerBundle.apply(this, [
-          name, customGruntConfig, bundleOptions, sections ]);
+      /*
+       * TODO: add description
+       */
+      for (var i = 0; i < sections.length; i = i + 1) {
+        if (this.sections[sections[i]]) {
+          this.sections[sections[i]].registerBundle.apply(
+            this,
+            [ name, customGruntConfig, bundleOptions, sections ]
+          );
+        }
       }
-    }
 
-    /*
-     * TODO: add description
-     */
-    var bundleTasks = [];
-    for (var j = 0; j < sections.length; j++) {
-      if (this.gruntConfig[sections[j]][name] !== {} && sections[j] !== 'sed') {
-        bundleTasks.push(sections[j] + ':' + name);
-      } else if (sections[j] === 'sed') {
-        for (var sedSection in this.gruntConfig.sed) {
-          if(this.gruntConfig.sed.hasOwnProperty(sedSection) && sedSection.indexOf(name) === 0){
-            bundleTasks.push('sed:' + sedSection);
+      /*
+       * TODO: add description
+       */
+      var bundleTasks = [];
+      for (var j = 0; j < sections.length; j = j + 1) {
+        if (this.gruntConfig[sections[j]][name] !== {} && sections[j] !== 'sed') {
+          bundleTasks.push(sections[j] + ':' + name);
+        } else if (sections[j] === 'sed') {
+          for (var sedSection in this.gruntConfig.sed) {
+            if (this.gruntConfig.sed.hasOwnProperty(sedSection) && sedSection.indexOf(name) === 0) {
+              bundleTasks.push('sed:' + sedSection);
+            }
           }
         }
       }
-    }
-    this.bundles[name] = bundleTasks;
-  },
-  initGrunt: function(grunt, customGruntConfig) {
-    extend(true, this.gruntConfig, customGruntConfig || {});
+      this.bundles[name] = bundleTasks;
+    },
+    initGrunt: function(grunt, customGruntConfig) {
+      extend(true, this.gruntConfig, customGruntConfig || {});
 
-    /*
-     * TODO: add description
-     */
-    var bundles = [];
-    for (var name in this.bundles) {
-      bundles.push('bundle-' + name);
-      grunt.registerTask('bundle-' + name, this.bundles[name]);
-    }
-    grunt.registerTask('test', [ 'jshint', 'karma:test' ]);
-    grunt.registerTask('test_once', [ 'jshint', 'karma:test_once' ]);
-    grunt.registerTask('test_dev', [ 'karma:test_dev' ]);
-    grunt.registerTask('test_ci', [ 'jshint', 'karma:test_ci'].concat(bundles));
+      /*
+       * TODO: add description
+       */
+      var bundles = [];
+      for (var name in this.bundles) {
+        bundles.push('bundle-' + name);
+        grunt.registerTask('bundle-' + name, this.bundles[name]);
+      }
+      grunt.registerTask('test', [ 'jshint', 'jscs', 'karma:test' ]);
+      grunt.registerTask('test_once', [ 'jshint', 'jscs', 'karma:testOnce' ]);
+      grunt.registerTask('test_dev', [ 'karma:testDev' ]);
+      grunt.registerTask('test_ci', [ 'jshint', 'jscs', 'karma:testCI'].concat(bundles));
 
-    /*
-     * TODO: add description
-     */
-    grunt.initConfig(extend(true, {
-      jshint: { all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
-      karma: {
-        options: {
-          basePath: './',
-          frameworks: [],
-          files: this.files,
-          preprocessors: { 'js/**/*.js': 'coverage' },
-          reporters: ['dots', 'progress', 'coverage'],
-          coverageReporter: { type : 'lcov', dir : 'coverage/' },
-          port: 9876,
-          colors: true,
-          logLevel: karmaConfig.DEBUG_INFO,
-          browserNoActivityTimeout: 200000,
-          autoWatch: true,
-          captureTimeout: 60000,
-          plugins: [
-            'karma-mocha',
-            'karma-coverage',
-            'karma-requirejs',
-            'karma-sauce-launcher',
-            'karma-chrome-launcher',
-            'karma-phantomjs-launcher',
-            'karma-junit-reporter'
-          ]
-        },
-        test: {
-          browsers: ['PhantomJS']
+      /*
+       * TODO: add description
+       */
+      grunt.initConfig(extend(true, {
+        jshint: { options: { jshintrc: '.jshintrc' }, all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
+        jscs: { options: { config: '.jscs.json' }, all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
+        karma: {
+          options: {
+            basePath: './',
+            frameworks: [],
+            files: this.files,
+            preprocessors: { 'js/**/*.js': 'coverage' },
+            reporters: ['dots', 'progress', 'coverage'],
+            coverageReporter: { type : 'lcov', dir : 'coverage/' },
+            port: 9876,
+            colors: true,
+            logLevel: karmaConfig.DEBUG_INFO,
+            browserNoActivityTimeout: 200000,
+            autoWatch: true,
+            captureTimeout: 60000,
+            plugins: [
+              'karma-mocha',
+              'karma-coverage',
+              'karma-requirejs',
+              'karma-sauce-launcher',
+              'karma-chrome-launcher',
+              'karma-phantomjs-launcher',
+              'karma-junit-reporter'
+            ]
+          },
+          test: {
+            browsers: ['PhantomJS']
+          },
+          testOnce: {
+            singleRun: true,
+            browsers: ['PhantomJS']
+          },
+          testDev: {
+            browsers: ['Chrome'],
+            preprocessors: {},
+            reporters: ['dots', 'progress'],
+            plugins: [
+              'karma-mocha',
+              'karma-requirejs',
+              'karma-chrome-launcher',
+            ]
+          },
+          testCI: {
+            singleRun: true,
+            port: 8080,
+            recordVideo: true,
+            reporters: ['junit', 'coverage', 'saucelabs'],
+            junitReporter: { outputFile: 'test-results.xml' },
+            sauceLabs: { testName: 'Mockup', startConnect: true },
+            browsers: [
+              'SL_Chrome',
+              //'SL_Firefox',
+              //'SL_Opera',
+              //'SL_Safari',
+              //'SL_IE_8',
+              //'SL_IE_9',
+              //'SL_IE_10',
+              //'SL_IE_11'
+              //'SL_IPhone',
+              //'SL_IPad',
+              //'SL_Android'
+            ],
+            customLaunchers: {
+              'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', platform: 'Windows 8', version: '31' },
+              'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', platform: 'Windows 8', version: '26' },
+              'SL_Opera': { base: 'SauceLabs', browserName: 'opera', platform: 'Windows 7', version: '12' },
+              'SL_Safari': { base: 'SauceLabs', browserName: 'safari', platform: 'Mac 10.8', version: '6' },
+              'SL_IE_8': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '8' },
+              'SL_IE_9': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2008', version: '9' },
+              'SL_IE_10': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2012', version: '10' },
+              'SL_IE_11': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' },
+              'SL_IPhone': { base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.8', version: '6.1' },
+              'SL_IPad': { base: 'SauceLabs', browserName: 'ipad', platform: 'OS X 10.8', version: '6.1' },
+              'SL_Android': { base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '4.0' }
+            }
+          }
         },
-        test_once: {
-          singleRun: true,
-          browsers: ['PhantomJS']
+        requirejs: {
+          options: this.requirejsOptions
         },
-        test_dev: {
-          browsers: ['Chrome'],
-          preprocessors: {},
-          reporters: ['dots', 'progress'],
-          plugins: [
-            'karma-mocha',
-            'karma-requirejs',
-            'karma-chrome-launcher',
-          ]
+        less: {
+          options: {
+            compress: true,
+            cleancss: false,
+            ieCompat: true,
+            paths: ['less']
+          }
         },
-        test_ci: {
-          singleRun: true,
-          port: 8080,
-          recordVideo: true,
-          reporters: ['junit', 'coverage', 'saucelabs'],
-          junitReporter: { outputFile: 'test-results.xml' },
-          sauceLabs: { testName: 'Mockup', startConnect: true },
-          browsers: [
-            'SL_Chrome',
-            //'SL_Firefox',
-            //'SL_Opera',
-            //'SL_Safari',
-            //'SL_IE_8',
-            //'SL_IE_9',
-            //'SL_IE_10',
-            //'SL_IE_11'
-            //'SL_IPhone',
-            //'SL_IPad',
-            //'SL_Android'
-          ],
-          customLaunchers: {
-            'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', platform: 'Windows 8', version: '31' },
-            'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', platform: 'Windows 8', version: '26' },
-            'SL_Opera': { base: 'SauceLabs', browserName: 'opera', platform: 'Windows 7', version: '12' },
-            'SL_Safari': { base: 'SauceLabs', browserName: 'safari', platform: 'Mac 10.8', version: '6' },
-            'SL_IE_8': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '8' },
-            'SL_IE_9': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2008', version: '9' },
-            'SL_IE_10': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2012', version: '10' },
-            'SL_IE_11': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' },
-            'SL_IPhone': { base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.8', version: '6.1' },
-            'SL_IPad': { base: 'SauceLabs', browserName: 'ipad', platform: 'OS X 10.8', version: '6.1' },
-            'SL_Android': { base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '4.0' }
+        sed: {
+          'bootstrap': {
+            path: 'node_modules/lcov-result-merger/index.js',
+            pattern: 'throw new Error\\(\'Unknown Prefix ',
+            replacement: '//throw// new Error(\'Unknown Prefix '
           }
         }
-      },
-      requirejs: {
-        options: this.requirejsOptions
-      },
-      less: {
-        options: {
-          compress: true,
-          cleancss: false,
-          ieCompat: true,
-          paths: ['less']
-        }
-      },
-      sed: {
-        'bootstrap': {
-          path: 'node_modules/lcov-result-merger/index.js',
-          pattern: 'throw new Error\\(\'Unknown Prefix ',
-          replacement: '//throw// new Error(\'Unknown Prefix '
-        }
-      }
-    }, this.gruntConfig));
+      }, this.gruntConfig));
 
-    /*
-     * TODO: add description
-     */
-    grunt.loadNpmTasks('grunt-contrib-copy');
-    grunt.loadNpmTasks('grunt-contrib-jshint');
-    grunt.loadNpmTasks('grunt-contrib-less');
-    grunt.loadNpmTasks('grunt-contrib-requirejs');
-    grunt.loadNpmTasks('grunt-contrib-uglify');
-    grunt.loadNpmTasks('grunt-karma');
-    grunt.loadNpmTasks('grunt-sed');
+      /*
+       * TODO: add description
+       */
+      grunt.loadNpmTasks('grunt-contrib-copy');
+      grunt.loadNpmTasks('grunt-contrib-jshint');
+      grunt.loadNpmTasks('grunt-contrib-less');
+      grunt.loadNpmTasks('grunt-contrib-requirejs');
+      grunt.loadNpmTasks('grunt-contrib-uglify');
+      grunt.loadNpmTasks('grunt-jscs-checker');
+      grunt.loadNpmTasks('grunt-karma');
+      grunt.loadNpmTasks('grunt-sed');
+
+    }
+  };
 
-  }
-};
+  module.exports = MockupGrunt;
 
-module.exports = MockupGrunt;
+})();
diff --git a/js/iframe.js b/js/iframe.js
index 1a5dc93..0fd8330 100644
--- a/js/iframe.js
+++ b/js/iframe.js
@@ -28,7 +28,7 @@
 define([
   'jquery'
 ], function($, undefined) {
-  "use strict";
+  'use strict';
 
   $.IFrame = function(iframe) { this._init(iframe); };
   $.IFrame.prototype = {
@@ -41,7 +41,7 @@ define([
       self.$el = $(iframe.el);
       self.window = window.parent;
       self.document = window.parent.document;
-      self.is_stretched = false;
+      self.isStretched = false;
 
       // # Handle clicks inside iframe
       $(document).on('click', function(e) {
@@ -60,9 +60,9 @@ define([
           }
 
           if (e.which === 1) {
-            self._same_window(url);
+            self._sameWindow(url);
           } else if (e.which === 2) {
-            self._new_window(url);
+            self._neWindow(url);
           }
 
         // if we click on empty part of iframe then shrink it
@@ -83,10 +83,10 @@ define([
     },
 
     // Abstract calls to window.parent so its easier to stub/mock in tests
-    _same_window: function(url) {
+    _sameWindow: function(url) {
       this.window.location.href = url;
     },
-    _new_window: function(url) {
+    _neWindow: function(url) {
       this.window.open(url);
     },
 
@@ -95,9 +95,9 @@ define([
     // Shrink current frame to the size that was before stretching it.
     shrink: function() {
       var self = this;
-      if (self.is_stretched) {
+      if (self.isStretched) {
         self.$el.trigger('shrink.iframe');
-        self.is_stretched = false;
+        self.isStretched = false;
         self.fit();
         self.$el.trigger('shrinked.iframe');
       }
@@ -109,9 +109,9 @@ define([
     // iframe object trasparent
     stretch: function() {
       var self = this;
-      if (!self.is_stretched) {
+      if (!self.isStretched) {
         self.$el.trigger('stretch.iframe');
-        self.is_stretched = true;
+        self.isStretched = true;
         self.$el.css({ height: $(self.document).height() });
         self.$el.trigger('stretched.iframe');
       }
@@ -123,13 +123,16 @@ define([
     // action (stretch or shrink)
     toggle: function() {
       var self = this;
-      if (!self.is_stretched) { self.stretch(); }
-      else { self.shrink(); }
+      if (!self.isStretched) {
+        self.stretch();
+      } else {
+        self.shrink();
+      }
     },
 
     fit: function() {
       var self = this;
-      if (!self.is_stretched) {
+      if (!self.isStretched) {
         self.$el.css({ height: $('body', document).height() });
         $('body', self.document).css('margin-top', $('body', document).height());
       } else {
diff --git a/js/iframe_init.js b/js/iframe_init.js
index 4e83433..d89dba9 100644
--- a/js/iframe_init.js
+++ b/js/iframe_init.js
@@ -27,228 +27,231 @@
 /*jshint scripturl:true */
 
 (function (definition) {
-"use strict";
+  'use strict';
+
   if (typeof define === 'function' && typeof define.amd === 'object') {
     define(['domready'], definition);
   } else {
     this.IFrame = definition(window.domready);
   }
+
 }(function(domready, undefined) {
-"use strict";
-
-// # IFrame Object
-window.IFrame = function(el) { this.init(el); };
-window.IFrame.prototype = {
-  add: function(el) {
-    var self = this, attr;
-
-    // make sure original element is hidden
-    el.setAttribute("style", "display:none;");
-
-    //
-    self.content += el.innerHTML;
-
-    // get options from original element
-    self.updateOption(el, 'name', 'noname_frame');
-    self.updateOption(el, 'title', '');
-    self.updateOption(el, 'doctype', '<!doctype html>');
-    self.updateOption(el, 'style', '');
-    self.updateOption(el, 'position', 'top');
-    self.updateOption(el, 'resources', '');
-    self.updateOption(el, 'styles', '');
-    self.updateOption(el, 'zindex', '500');
-
-  },
-  updateOption: function(el, name, _default) {
-    var self = this,
-        option_name = 'data-iframe-' + name;
-    if (name === 'name') {
-      option_name = 'data-iframe';
-    }
-    var value = el.getAttribute(option_name);
-    if (name === 'resources') {
-      if (value) {
-        value = value.split(';');
-        for (var i = 0; i < value.length; i += 1) {
-          var url = value[i].replace(/^\s+|\s+$/g, ''),
-              resource = '', attrs = {}, attr;
-
-          if (url.indexOf('?') !== -1) {
-            var url2 = url.slice(url.indexOf('?') + 1, url.length).split('&');
-            for (var j = 0; j < url2.length; j += 1) {
-              attr = url2[j].split('=');
-              if (attr[1][0] === "\"" || attr[1][0] === "'") {
-                attr[1] = attr[1].slice(1, attr[1].length - 1);
+  'use strict';
+
+  // # IFrame Object
+  window.IFrame = function(el) { this.init(el); };
+  window.IFrame.prototype = {
+    add: function(el) {
+      var self = this, attr;
+
+      // make sure original element is hidden
+      el.setAttribute('style', 'display:none;');
+
+      //
+      self.content += el.innerHTML;
+
+      // get options from original element
+      self.updateOption(el, 'name', 'noname_frame');
+      self.updateOption(el, 'title', '');
+      self.updateOption(el, 'doctype', '<!doctype html>');
+      self.updateOption(el, 'style', '');
+      self.updateOption(el, 'position', 'top');
+      self.updateOption(el, 'resources', '');
+      self.updateOption(el, 'styles', '');
+      self.updateOption(el, 'zindex', '500');
+
+    },
+    updateOption: function(el, name, _default) {
+      var self = this,
+          optionName = 'data-iframe-' + name;
+      if (name === 'name') {
+        optionName = 'data-iframe';
+      }
+      var value = el.getAttribute(optionName);
+      if (name === 'resources') {
+        if (value) {
+          value = value.split(';');
+          for (var i = 0; i < value.length; i += 1) {
+            var url = value[i].replace(/^\s+|\s+$/g, ''),
+                resource = '', attrs = {}, attr;
+
+            if (url.indexOf('?') !== -1) {
+              var url2 = url.slice(url.indexOf('?') + 1, url.length).split('&');
+              for (var j = 0; j < url2.length; j += 1) {
+                attr = url2[j].split('=');
+                if (attr[1][0] === '"' || attr[1][0] === '\'') {
+                  attr[1] = attr[1].slice(1, attr[1].length - 1);
+                }
+                attrs[attr[0]] = attr[1];
               }
-              attrs[attr[0]] = attr[1];
+              url = url.slice(0, url.indexOf('?'));
             }
-            url = url.slice(0, url.indexOf('?'));
-          }
 
-          if (url.slice(-3) === '.js') {
-            resource = window.document.createElement('script');
-            resource.src = url;
-            resource.type = 'text/javascript';
-            resource.async = false;
-          } else if (url.slice(-4) === '.css') {
-            resource = window.document.createElement('link');
-            resource.href = url;
-            resource.type = 'text/css';
-            resource.rel = 'stylesheet';
-          } else if (url.slice(-5) === '.less') {
-            resource = window.document.createElement('link');
-            resource.href = url;
-            resource.type = 'text/css';
-            resource.rel = 'stylesheet/less';
-          }
+            if (url.slice( -3 ) === '.js') {
+              resource = window.document.createElement('script');
+              resource.src = url;
+              resource.type = 'text/javascript';
+              resource.async = false;
+            } else if (url.slice( -4 ) === '.css') {
+              resource = window.document.createElement('link');
+              resource.href = url;
+              resource.type = 'text/css';
+              resource.rel = 'stylesheet';
+            } else if (url.slice( -5 ) === '.less') {
+              resource = window.document.createElement('link');
+              resource.href = url;
+              resource.type = 'text/css';
+              resource.rel = 'stylesheet/less';
+            }
 
-          if (resource !== '') {
-            for (attr in attrs) {
-              resource.setAttribute(attr, attrs[attr]);
+            if (resource !== '') {
+              for (attr in attrs) {
+                resource.setAttribute(attr, attrs[attr]);
+              }
+              self.resources += resource.outerHTML;
             }
-            self.resources += resource.outerHTML;
           }
         }
+      } else if (name === 'styles') {
+        if (value) {
+          var styleNode = window.document.createElement('style');
+          styleNode.type = 'text/css';
+          styleNode.textContent = value;
+          self.resources += styleNode.outerHTML;
+        }
       }
-    } else if (name === 'styles') {
       if (value) {
-        var style_node = window.document.createElement('style');
-        style_node.type = "text/css";
-        style_node.textContent = value;
-        self.resources += style_node.outerHTML;
+        self.options[name] = value;
+      } else if (self.options[name] === undefined) {
+        self.options[name] = _default;
       }
-    }
-    if (value) {
-      self.options[name] = value;
-    } else if (self.options[name] === undefined) {
-      self.options[name] = _default;
-    }
-  },
-  init: function(el) {
-    var self = this;
-
-    self.options = {};
-    self.content = '';
-    self.resources = '';
-    self.loaded = false;
-
-    self.add(el);
-
-    // Create iframe
-    var iframe = window.document.createElement('iframe');
-
-    iframe.setAttribute('frameBorder', '0');
-    iframe.setAttribute('border', '0');
-    iframe.setAttribute('allowTransparency', 'true');
-    iframe.setAttribute('scrolling', 'no');
-    iframe.setAttribute('id', self.options.name);
-    iframe.setAttribute('name', self.options.name);
-    iframe.setAttribute('style', 'display:none;');
-    iframe.setAttribute('src', 'javascript:false');
-
-    window.document.body.appendChild(iframe);
-
-    self.el = iframe;
-    self.window = iframe.contentWindow;
-    self.document = self.window.document;
-  },
-  open: function() {
-    var self = this;
-    self.document.open();
-    self.document.write(
-        self.options.doctype +
-        '<html>' +
-          '<head>' +
-            '<title>' + self.options.title + '</title>' +
-            '<meta http-equiv="X-UA-Compatible" content="IE=edge">' +
-          '</head>' +
-          '<body onload="parent.window.iframe[\'' +
-              self.options.name + '\'].load()">' +
-            self.content + self.resources +
-          '</body>' +
-        '</html>');
-    self.document.close();
-  },
-  load: function() {
-    var self = this;
-
-    // check if already loaded
-    if ( self.loaded === true ) {
-      return;
-    }
+    },
+    init: function(el) {
+      var self = this;
+
+      self.options = {};
+      self.content = '';
+      self.resources = '';
+      self.loaded = false;
+
+      self.add(el);
 
-    // mark iframe as loaded
-    self.loaded = true;
+      // Create iframe
+      var iframe = window.document.createElement('iframe');
 
-    self.document.body.setAttribute('style',
-        (self.document.body.getAttribute('style') || '') +
-        'background:transparent;');
+      iframe.setAttribute('frameBorder', '0');
+      iframe.setAttribute('border', '0');
+      iframe.setAttribute('allowTransparency', 'true');
+      iframe.setAttribute('scrolling', 'no');
+      iframe.setAttribute('id', self.options.name);
+      iframe.setAttribute('name', self.options.name);
+      iframe.setAttribute('style', 'display:none;');
+      iframe.setAttribute('src', 'javascript:false');
 
-    self.el.setAttribute('style', 'border:0;overflow:hidden;' +
+      window.document.body.appendChild(iframe);
+
+      self.el = iframe;
+      self.window = iframe.contentWindow;
+      self.document = self.window.document;
+    },
+    open: function() {
+      var self = this;
+      self.document.open();
+      self.document.write(
+          self.options.doctype +
+          '<html>' +
+            '<head>' +
+              '<title>' + self.options.title + '</title>' +
+              '<meta http-equiv="X-UA-Compatible" content="IE=edge">' +
+            '</head>' +
+            '<body onload="parent.window.iframe[\'' +
+                self.options.name + '\'].load()">' +
+              self.content + self.resources +
+            '</body>' +
+          '</html>'
+      );
+      self.document.close();
+    },
+    load: function() {
+      var self = this;
+
+      // check if already loaded
+      if ( self.loaded === true ) {
+        return;
+      }
+
+      // mark iframe as loaded
+      self.loaded = true;
+
+      self.document.body.setAttribute('style',
+        (self.document.body.getAttribute('style') || '') + 'background:transparent;'
+      );
+
+      self.el.setAttribute('style', 'border:0;overflow:hidden;' +
         'position:absolute;left:0px;position:fixed;overflow:hidden;' +
-        'width:100%;background-color:transparent;z-index:'+
-        self.options.zindex + ';' +self.options.style);
+        'width:100%;background-color:transparent;z-index:' +
+        self.options.zindex + ';' + self.options.style
+      );
 
-    self.el.setAttribute('style', self.el.getAttribute('style') +
-        'height:' + self.document.body.offsetHeight + 'px;');
+      self.el.setAttribute('style', self.el.getAttribute('style') +
+        'height:' + self.document.body.offsetHeight + 'px;'
+      );
 
-    if (self.options.position === 'top') {
-        self.el.setAttribute('style', self.el.getAttribute('style') +
-            'top:0px;');
+      if (self.options.position === 'top') {
+        self.el.setAttribute('style', self.el.getAttribute('style') + 'top:0px;');
         window.document.body.setAttribute('style',
-            (window.document.body.getAttribute('style') || '') +
-            ';border-top:0' +
-            ';margin-top:' + self.el.offsetHeight + 'px;');
+          (window.document.body.getAttribute('style') || '') +
+          ';border-top:0;margin-top:' + self.el.offsetHeight + 'px;'
+        );
 
-    } else if(self.options.position === 'bottom') {
-        self.el.setAttribute('style', self.el.getAttribute('style') +
-            'bottom:0px;');
+      } else if (self.options.position === 'bottom') {
+        self.el.setAttribute('style', self.el.getAttribute('style') + 'bottom:0px;');
         window.document.body.setAttribute('style',
-            (window.document.body.getAttribute('style') || '') +
-            ';border-bottom:0' +
-            ';margin-bottom:' + self.el.offsetHeight + 'px;');
-    }
+          (window.document.body.getAttribute('style') || '') +
+          ';border-bottom:0;margin-bottom:' + self.el.offsetHeight + 'px;'
+        );
+      }
 
-  }
-};
+    }
+  };
 
-// # Initialize
-window.iframe_initialize = function() {
-  var i,j, body, matching, iframe;
+  // # Initialize
+  window.iframeInitialize = function() {
+    var i,j, body, matching, iframe;
 
-  // find [data-iframe] elements in context
-  matching = [];
-  if (window.document.querySelectorAll !== undefined) {
-    matching = window.document.querySelectorAll('[data-iframe]');
-  } else {
-    var all = window.document.getElementsByTagName('*');
-    for (i = 0; i < all.length; i += 1) {
-      if (all[i].getAttribute('data-iframe')) {
-        matching.push(all[i]);
+    // find [data-iframe] elements in context
+    matching = [];
+    if (window.document.querySelectorAll !== undefined) {
+      matching = window.document.querySelectorAll('[data-iframe]');
+    } else {
+      var all = window.document.getElementsByTagName('*');
+      for (i = 0; i < all.length; i += 1) {
+        if (all[i].getAttribute('data-iframe')) {
+          matching.push(all[i]);
+        }
       }
     }
-  }
 
-  // initialize IFrame object for each of them
-  window.iframe = {};
-  for (j = 0; j < matching.length; j += 1) {
-    var name = matching[j].getAttribute('data-iframe');
-    if (window.iframe[name] === undefined) {
-      window.iframe[name] = new window.IFrame(matching[j]);
-    } else {
-      window.iframe[name].add(matching[j]);
+    // initialize IFrame object for each of them
+    window.iframe = {};
+    for (j = 0; j < matching.length; j += 1) {
+      var name = matching[j].getAttribute('data-iframe');
+      if (window.iframe[name] === undefined) {
+        window.iframe[name] = new window.IFrame(matching[j]);
+      } else {
+        window.iframe[name].add(matching[j]);
+      }
     }
-  }
-  for (iframe in window.iframe) {
-    if (window.iframe.hasOwnProperty(iframe)) {
-      window.iframe[iframe].open();
+    for (iframe in window.iframe) {
+      if (window.iframe.hasOwnProperty(iframe)) {
+        window.iframe[iframe].open();
+      }
     }
-  }
-};
+  };
 
-if (window.iframe_initialized !== true) {
-  window.iframe_initialized = true;
-  domready(window.iframe_initialize);
-}
+  if (window.iframeInitialized !== true) {
+    window.iframeInitialized = true;
+    domready(window.iframeInitialize);
+  }
 
 }));
diff --git a/js/patterns/accessibility.js b/js/patterns/accessibility.js
index e31a301..55fab53 100644
--- a/js/patterns/accessibility.js
+++ b/js/patterns/accessibility.js
@@ -59,10 +59,10 @@ define([
   'mockup-patterns-base',
   'jquery.cookie'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Accessibility = Base.extend({
-    name: "accessibility",
+    name: 'accessibility',
     defaults: {
       'smallbtn': null,
       'normalbtn': null,
@@ -72,13 +72,13 @@ define([
       if ($reset) {
         this.$el.removeClass('smallText').removeClass('largeText').
             removeClass('mediumText');
-        $.cookie('fontsize', $fontsize, { expires: 365, path:"/" });
+        $.cookie('fontsize', $fontsize, { expires: 365, path: '/' });
       }
       this.$el.addClass($fontsize);
     },
-    initBtn: function(btn){
+    initBtn: function(btn) {
       var self = this;
-      btn.el.click(function(e){
+      btn.el.click(function(e) {
         e.preventDefault();
         self.setBaseFontSize(btn.name + 'Text', 1);
       });
@@ -87,15 +87,15 @@ define([
       var self = this;
       var $fontsize = $.cookie('fontsize');
       if ($fontsize) {
-          self.setBaseFontSize($fontsize, 0);
+        self.setBaseFontSize($fontsize, 0);
       }
       var btns = ['smallbtn', 'normalbtn', 'largebtn'];
-      $.each(btns, function(idx, btn){
+      $.each(btns, function(idx, btn) {
         var btnName = btn.replace('btn', '');
         var btnSelector = self.options[btn];
-        if(btnSelector !== null){
+        if (btnSelector !== null) {
           var el = $(btnSelector, self.$el);
-          if(el){
+          if (el) {
             btn = {
               name: btnName,
               el: el
diff --git a/js/patterns/ace.js b/js/patterns/ace.js
index 110be64..8de1082 100644
--- a/js/patterns/ace.js
+++ b/js/patterns/ace.js
@@ -13,7 +13,7 @@
  *    readOnly(boolean): Read only editor. (false)
  *
  * Documentation:
- *    # Default 
+ *    # Default
  *
  *    {{ example-1 }}
  *
@@ -33,7 +33,7 @@
  * Example: example-2
  *    <pre class="pat-ace" data-pat-ace="mode:javascript;theme:dawn;">
  *    var foo = 'bar';
- *    function foobar(){
+ *    function foobar() {
  *      return foo;
  *    }
  *    </pre>
@@ -46,7 +46,7 @@
  *                       showGutter:false;
  *                       showPrintMargin:true;">
  *    var foo = 'bar';
- *    function foobar(){
+ *    function foobar() {
  *      return foo;
  *    }
  *    </pre>
@@ -77,10 +77,10 @@ define([
   'ace-theme-monokai',
   'ace-mode-text'
 ], function($, Base, utils, ace) {
-  "use strict";
+  'use strict';
 
   var AcePattern = Base.extend({
-    name: "ace",
+    name: 'ace',
     defaults: {
       theme: null,
       mode: 'text',
@@ -110,10 +110,10 @@ define([
       });
 
       self.editor = ace.edit(id);
-      if(self.options.theme){
+      if (self.options.theme) {
         self.setTheme(self.options.theme);
       }
-      self.editor.getSession().setMode("ace/mode/" + self.options.mode);
+      self.editor.getSession().setMode('ace/mode/' + self.options.mode);
       self.editor.getSession().setTabSize(parseInt(self.options.tabSize, 10));
       self.editor.getSession().setUseSoftTabs(utils.bool(self.options.softTabs));
       self.editor.getSession().setUseWrapMode(utils.bool(self.options.wrapMode));
@@ -121,9 +121,9 @@ define([
       self.editor.setShowPrintMargin(utils.bool(self.options.showPrintMargin));
       self.editor.setReadOnly(utils.bool(self.options.readOnly));
     },
-    setTheme: function(theme){
+    setTheme: function(theme) {
       var self = this;
-      self.editor.setTheme("ace/theme/" + theme);
+      self.editor.setTheme('ace/theme/' + theme);
     }
   });
 
diff --git a/js/patterns/autotoc.js b/js/patterns/autotoc.js
index 4700ee3..7659c1a 100644
--- a/js/patterns/autotoc.js
+++ b/js/patterns/autotoc.js
@@ -110,11 +110,9 @@ define([
 
       if (self.options.prependTo) {
         self.$toc.prependTo(self.options.prependTo);
-      }
-      else if (self.options.appendTo) {
+      } else if (self.options.appendTo) {
         self.$toc.appendTo(self.options.appendTo);
-      }
-      else{
+      } else {
         self.$toc.prependTo(self.$el);
       }
 
@@ -124,7 +122,7 @@ define([
 
       $(self.options.section, self.$el).addClass(self.options.classSectionName);
 
-      var as_tabs = self.$el.hasClass('autotabs');
+      var asTabs = self.$el.hasClass('autotabs');
 
       $(self.options.levels, self.$el).each(function(i) {
         var $level = $(this),
@@ -142,17 +140,14 @@ define([
           .on('click', function(e, doScroll) {
             e.stopPropagation();
             e.preventDefault();
-            self.$toc.children('.' + self.options.classActiveName).removeClass(
-              self.options.classActiveName);
-            self.$el.children('.' + self.options.classActiveName).removeClass(
-              self.options.classActiveName);
+            self.$toc.children('.' + self.options.classActiveName).removeClass(self.options.classActiveName);
+            self.$el.children('.' + self.options.classActiveName).removeClass(self.options.classActiveName);
             $(e.target).addClass(self.options.classActiveName);
-            $level.parents(self.options.section)
-                .addClass(self.options.classActiveName);
+            $level.parents(self.options.section).addClass(self.options.classActiveName);
             if (doScroll !== false &&
                 self.options.scrollDuration &&
                 $level &&
-                !as_tabs) {
+                !asTabs) {
               $('body,html').animate({
                 scrollTop: $level.offset().top
               }, self.options.scrollDuration, self.options.scrollEasing);
diff --git a/js/patterns/backdrop.js b/js/patterns/backdrop.js
index e961ced..969e993 100644
--- a/js/patterns/backdrop.js
+++ b/js/patterns/backdrop.js
@@ -35,14 +35,14 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Backdrop = Base.extend({
-    name: "backdrop",
+    name: 'backdrop',
     defaults: {
       zIndex: null,
       opacity: 0.8,
-      className: "backdrop",
+      className: 'backdrop',
       classActiveName: 'backdrop-active',
       closeOnEsc: true,
       closeOnClick: true
diff --git a/js/patterns/cookiedirective.js b/js/patterns/cookiedirective.js
index fda2be9..5562419 100644
--- a/js/patterns/cookiedirective.js
+++ b/js/patterns/cookiedirective.js
@@ -44,38 +44,37 @@ define([
   'mockup-patterns-base',
   'jquery.cookie'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var CookieDirective = Base.extend({
-    name: "cookiedirective",
+    name: 'cookiedirective',
     defaults: {
       'shouldEnable': true,
-      'shouldEnableMsg': "You should enable cookies to be able to login.",
-      'shouldEnableSelector': ".login",
+      'shouldEnableMsg': 'You should enable cookies to be able to login.',
+      'shouldEnableSelector': '.login',
       'shouldAsk': true,
-      'askPermissionMsg': "This site uses cookies to provide additional functionality, do you accept?",
-      'allowMsg': "Allow",
-      'denyMsg': "Deny",
-      'cookieName': "Allow_Cookies_For_Site"
+      'askPermissionMsg': 'This site uses cookies to provide additional functionality, do you accept?',
+      'allowMsg': 'Allow',
+      'denyMsg': 'Deny',
+      'cookieName': 'Allow_Cookies_For_Site'
     },
     cookiesEnabled: function() {
-      $.cookie("_cookiesEnabled", 1);
-      if (!$.cookie("_cookiesEnabled")) {
+      $.cookie('_cookiesEnabled', 1);
+      if (!$.cookie('_cookiesEnabled')) {
         return false;
       }
-      $.removeCookie("_cookiesEnabled");
+      $.removeCookie('_cookiesEnabled');
       return true;
     },
     acceptedCookies: function() {
       /*jshint eqeqeq:false */
       var cookie = $.cookie(this.options.cookieName);
-      if (cookie === undefined || cookie === null){
+      if (cookie === undefined || cookie === null) {
         return undefined;
       }
-      if (cookie == 1) {
+      if (cookie === 1) {
         return true;
-      }
-      else{
+      } else {
         return false;
       }
     },
@@ -100,39 +99,39 @@ define([
       self.options.shouldAsk = self.ensureBool(self.options.shouldAsk);
       if (self.options.shouldAsk) {
         var accepted = self.acceptedCookies();
-        if (accepted === undefined){
+        if (accepted === undefined) {
           var div = $('<div></div>')
             .addClass('cookiedirective');
-          var msg = $('<div><span>'+self.options.askPermissionMsg+'</span></div>')
+          var msg = $('<div><span>' + self.options.askPermissionMsg + '</span></div>')
             .addClass('cookiemsg');
-          var button_allow = $('<div><span>'+self.options.allowMsg+'</span></div>')
+          var buttonAllow = $('<div><span>' + self.options.allowMsg + '</span></div>')
             .addClass('cookieallowbutton')
             .addClass('btn')
             .on('click', function(e) {
-                self.acceptCookies();
-                self.$el.find('.cookiedirective').hide('slow');
-              });
-          var button_deny = $('<div><span>'+self.options.denyMsg+'</span></div>')
+              self.acceptCookies();
+              self.$el.find('.cookiedirective').hide('slow');
+            });
+          var buttonDeny = $('<div><span>' + self.options.denyMsg + '</span></div>')
             .addClass('cookiedenybutton')
             .addClass('btn')
             .on('click', function(e) {
-                self.denyCookies();
-                self.$el.find('.cookiedirective').hide('slow');
-              });
-          div.append(msg).append(button_allow).append(button_deny);
+              self.denyCookies();
+              self.$el.find('.cookiedirective').hide('slow');
+            });
+          div.append(msg).append(buttonAllow).append(buttonDeny);
           self.$el.prepend(div);
         }
       }
       self.options.shouldEnable = self.ensureBool(self.options.shouldEnable);
       if (self.options.shouldEnable) {
-        if (self.$el.find(self.options.shouldEnableSelector).size() > 0){
-          if (!self.cookiesEnabled()){
-            var new_div = $('<div></div>')
+        if (self.$el.find(self.options.shouldEnableSelector).size() > 0) {
+          if (!self.cookiesEnabled()) {
+            var newDiv = $('<div></div>')
               .addClass('shouldenablecookies');
-            var new_msg = $('<div><span>'+self.options.shouldEnableMsg+'</span></div>')
+            var newMsg = $('<div><span>' + self.options.shouldEnableMsg + '</span></div>')
               .addClass('shouldenablecookiesmsg');
-            new_div.append(new_msg).append(new_msg);
-            self.$el.prepend(new_div);
+            newDiv.append(newMsg).append(newMsg);
+            self.$el.prepend(newDiv);
           }
         }
       }
diff --git a/js/patterns/dropzone.js b/js/patterns/dropzone.js
index a485c5d..c2bdf58 100644
--- a/js/patterns/dropzone.js
+++ b/js/patterns/dropzone.js
@@ -7,7 +7,7 @@
  *    paramName(string): value for name attribute in the file input element ('file')
  *    uploadMultiple(boolean): condition value for multiple attribute in the file input element. If the value is 'true' and paramName is file, 'multiple=multiple' and 'name=file[]' will be added in the file input. (false)
  *    wrap(boolean): true or false for wrapping this element using the value of wrapperTemplate. If the value is 'inner', this element will wrap the wrapperTemplate value. (false)
- *    wrapperTemplate(string): HTML template for wrapping around with this element. ('<div class="dropzone-container"/>')
+ *    wrapperTemplate(string): HTML template for wrapping around with this element. ('<div class='dropzone-container"/>')
  *    resultTemplate(string): HTML template for the element that will contain file information. ('<div class="dz-notice"><p>Drop files here...</p></div><div class="dropzone-previews"/>')
  *    autoCleanResults(boolean): condition value for the file preview in div element to fadeout after file upload is completed. (false)
  *    previewsContainer(selector): JavaScript selector for file preview in div element. (.dropzone-previews)
@@ -72,6 +72,7 @@
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+ /* globals alert:true */
 
 define([
   'jquery',
@@ -79,17 +80,17 @@ define([
   'dropzone',
   'underscore'
 ], function($, Base, Dropzone, _) {
-  "use strict";
+  'use strict';
 
   /* we do not want this plugin to auto discover */
   Dropzone.autoDiscover = false;
 
   var DropzonePattern = Base.extend({
-    name: "dropzone",
+    name: 'dropzone',
     defaults: {
       url: null, // XXX MUST provide url to submit to OR be in a form
       className: 'dropzone',
-      paramName: "file",
+      paramName: 'file',
       uploadMultiple: false,
       clickable: false,
       wrap: false,
@@ -104,24 +105,24 @@ define([
     },
     init: function() {
       var self = this;
-      if(typeof(self.options.clickable) === "string"){
-        if(self.options.clickable === 'true'){
+      if (typeof(self.options.clickable) === 'string') {
+        if (self.options.clickable === 'true') {
           self.options.clickable = true;
         } else {
           self.options.clickable = false;
         }
       }
-      if(!self.options.url && self.$el[0].tagName === 'FORM'){
+      if (!self.options.url && self.$el[0].tagName === 'FORM') {
         var url = self.$el.attr('action');
-        if(!url){
+        if (!url) {
           // form without action, defaults to current url
           url = window.location.href;
         }
         self.options.url = url;
       }
       var $el = self.$el;
-      if(self.options.wrap){
-        if(self.options.wrap === 'inner'){
+      if (self.options.wrap) {
+        if (self.options.wrap === 'inner') {
           $el.wrapInner(self.options.wrapperTemplate);
           $el = $el.children().eq(0);
         } else {
@@ -130,7 +131,7 @@ define([
         }
       }
       $el.append('<div class="dz-notice"><p>Drop files here...</p></div>');
-      if(self.options.previewsContainer === '.dropzone-previews'){
+      if (self.options.previewsContainer === '.dropzone-previews') {
         $el.append(self.options.previewsTemplate);
       }
 
@@ -149,13 +150,13 @@ define([
       delete options.fileaddedClassName;
       delete options.useTus;
 
-      if(self.options.previewsContainer){
+      if (self.options.previewsContainer) {
         /*
          * if they have a select but it's not an id, let's make an id selector
          * so we can target the correct container. dropzone is weird here...
          */
         var $preview = $el.find(self.options.previewsContainer);
-        if($preview.length > 0){
+        if ($preview.length > 0) {
           options.previewsContainer = $preview[0];
         }
       }
@@ -165,9 +166,9 @@ define([
       self.$dropzone = $el;
 
 
-      if(autoClean){
-        self.dropzone.on('complete', function(file){
-          setTimeout(function(){
+      if (autoClean) {
+        self.dropzone.on('complete', function(file) {
+          setTimeout(function() {
             $(file.previewElement).fadeOut();
           }, 3000);
         });
@@ -175,25 +176,24 @@ define([
 
       /* customize file processing */
       var processing = false;
-      function process(){
+      function process() {
         processing = true;
-        if(self.dropzone.files.length === 0){
+        if (self.dropzone.files.length === 0) {
           processing = false;
           self.$dropzone.removeClass(fileaddedClassName);
           return;
         }
         var file = self.dropzone.files[0];
         var $preview = $(file.previewElement);
-        if([Dropzone.SUCCESS, Dropzone.ERROR,
-                              Dropzone.CANCELED].indexOf(file.status) !== -1){
+        if ([Dropzone.SUCCESS, Dropzone.ERROR, Dropzone.CANCELED].indexOf(file.status) !== -1) {
           // remove it
           self.dropzone.removeFile(file);
           process();
-        }else if(file.status !== Dropzone.UPLOADING){
+        } else if (file.status !== Dropzone.UPLOADING) {
           // start processing file
-          if(useTus && window.tus){
+          if (useTus && window.tus) {
             // use tus upload if installed
-            var $progress = $preview.find("[data-dz-uploadprogress]");
+            var $progress = $preview.find('[data-dz-uploadprogress]');
             file.status = Dropzone.UPLOADING;
             window.tus.upload(file, {
               endpoint: self.options.url,
@@ -201,46 +201,46 @@ define([
                 'FILENAME': file.name
               },
               chunkSize: 1024 * 1024 * 5 // 5mb chunk size
-            }).fail(function(){
+            }).fail(function() {
               alert('Error uploading with TUS resumable uploads');
               file.status = Dropzone.ERROR;
-            }).progress(function(e, bytesUploaded, bytesTotal){
+            }).progress(function(e, bytesUploaded, bytesTotal) {
               var percentage = (bytesUploaded / bytesTotal * 100);
               $progress.css('width', percentage + '%');
               $progress.parent().css('display', 'block');
               var $size = $preview.find('.dz-size');
               $size.html('uploading...<br />' + self.formatBytes(bytesUploaded) + ' / ' + self.formatBytes(bytesTotal));
-            }).done(function(url, file){
+            }).done(function(url, file) {
               file.status = Dropzone.SUCCESS;
               self.dropzone.emit('success', file);
               self.dropzone.emit('complete', file);
             });
-          }else{
+          } else {
             // otherwise, just use dropzone to process
             self.dropzone.processFile(file);
           }
           setTimeout(process, 100);
-        }else{
+        } else {
           // currently processing
           setTimeout(process, 100);
         }
       }
-      self.dropzone.on('addedfile', function(){
+      self.dropzone.on('addedfile', function() {
         self.$dropzone.addClass(fileaddedClassName);
-        setTimeout(function(){
-          if(!processing){
+        setTimeout(function() {
+          if (!processing) {
             process();
           }
         }, 100);
       });
     },
-    formatBytes: function(bytes){
+    formatBytes: function(bytes) {
       var kb = Math.round(bytes / 1024);
-      if(kb < 1024){
+      if (kb < 1024) {
         return kb + ' KiB';
       }
       var mb = Math.round(kb / 1024);
-      if(mb < 1024){
+      if (mb < 1024) {
         return mb + ' MB';
       }
       return Math.round(mb / 1024) + ' GB';
diff --git a/js/patterns/expose.js b/js/patterns/expose.js
index 4708b2a..401aaba 100644
--- a/js/patterns/expose.js
+++ b/js/patterns/expose.js
@@ -71,17 +71,17 @@ define([
   'mockup-patterns-base',
   'mockup-patterns-backdrop'
 ], function($, Base, Backdrop) {
-  "use strict";
+  'use strict';
 
   var Expose = Base.extend({
-    name: "expose",
+    name: 'expose',
     defaults: {
-      triggers: "focusin",
-      classActiveName: "active",
-      backdrop: "body",
+      triggers: 'focusin',
+      classActiveName: 'active',
+      backdrop: 'body',
       backdropZIndex: null,
-      backdropOpacity: "0.8",
-      backdropClassName: "backdrop",
+      backdropOpacity: '0.8',
+      backdropClassName: 'backdrop',
       backdropClassActiveName: 'backdrop-active',
       backdropCloseOnEsc: true,
       backdropCloseOnClick: true
diff --git a/js/patterns/filemanager/pattern.js b/js/patterns/filemanager/pattern.js
index 20b8c54..69779fc 100644
--- a/js/patterns/filemanager/pattern.js
+++ b/js/patterns/filemanager/pattern.js
@@ -33,10 +33,10 @@ define([
   'mockup-patterns-base',
   'js/patterns/filemanager/views/app'
 ], function($, Base, AppView) {
-  "use strict";
+  'use strict';
 
   var FileManager = Base.extend({
-    name: "filemanager",
+    name: 'filemanager',
     defaults: {
       aceConfig: {},
       dataTreeUrl: null,
@@ -47,13 +47,13 @@ define([
     },
     init: function() {
       var self = this;
-      if(self.options.dataTreeUrl !== null){
+      if (self.options.dataTreeUrl !== null) {
         self.options.treeConfig = $.extend(true, {}, self.treeConfig, {
           dataUrl: self.options.dataTreeUrl
         });
         self.appView = new AppView(self.options);
         self.$el.append(self.appView.render().el);
-      }else{
+      } else {
         self.$el.html('Must specify dataTreeUrl setting for pattern');
       }
     }
diff --git a/js/patterns/filemanager/views/app.js b/js/patterns/filemanager/views/app.js
index 42acbfa..c47eaf2 100644
--- a/js/patterns/filemanager/views/app.js
+++ b/js/patterns/filemanager/views/app.js
@@ -33,31 +33,31 @@ define([
   'mockup-patterns-ace',
   'text!js/patterns/filemanager/templates/app.xml'
 ], function($, _, Backbone, BaseView, DropZone, Tree, Ace, AppTemplate) {
-  "use strict";
+  'use strict';
 
   var AppView = BaseView.extend({
     tagName: 'div',
     className: 'filemanager',
     template: AppTemplate,
-    afterRender: function(){
+    afterRender: function() {
       var self = this;
       self.$tree = self.$('.tree');
       self.tree = new Tree(self.$tree, self.treeConfig);
 
-      if(self.uploadUrl){
+      if (self.uploadUrl) {
         self.dropzone = new DropZone(self.$el, {
           className: 'filemanager-dropzone',
           clickable: false,
           url: self.options.uploadUrl,
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             // XXX fill in here
           }
         }).dropzone;
-        self.dropzone.on('sending', function(){
+        self.dropzone.on('sending', function() {
           self.$el.addClass('dropping');
         });
-        self.dropzone.on('complete', function(){
+        self.dropzone.on('complete', function() {
           self.$el.removeClass('dropping');
         });
       }
diff --git a/js/patterns/formautofocus.js b/js/patterns/formautofocus.js
index 4483cbb..52d45c3 100644
--- a/js/patterns/formautofocus.js
+++ b/js/patterns/formautofocus.js
@@ -32,21 +32,20 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base, undefined) {
-  "use strict";
+  'use strict';
 
   var FormAutoFocus = Base.extend({
     name: 'formautofocus',
     defaults: {
-      condition: "div.error",
-      target: "div.error :input:not(.formTabs):visible:first",
-      always: ":input:not(.formTabs):visible:first"
+      condition: 'div.error',
+      target: 'div.error :input:not(.formTabs):visible:first',
+      always: ':input:not(.formTabs):visible:first'
     },
     init: function() {
       var self = this;
       if ($(self.options.condition, self.$el).size() !== 0) {
         $(self.options.target, self.$el).focus();
-      }
-      else{
+      } else {
         $(self.options.always, self.$el).focus();
       }
 
diff --git a/js/patterns/formunloadalert.js b/js/patterns/formunloadalert.js
index 29b7380..686c9c3 100644
--- a/js/patterns/formunloadalert.js
+++ b/js/patterns/formunloadalert.js
@@ -6,7 +6,7 @@
  *    message(string): Confirmation message to display when dirty form is being unloaded. (Discard changes? If you click OK, any changes you have made will be lost.)
  *
  * Documentation:
- *    # Example 
+ *    # Example
  *
  *    {{ example-1 }}
  *
@@ -46,15 +46,15 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function ($, Base) {
-  "use strict";
+  'use strict';
 
   var FormUnloadAlert = Base.extend({
-    name: "formunloadalert",
+    name: 'formunloadalert',
     _changed : false,       // Stores a listing of raised changes by their key
     _suppressed : false,     // whether or not warning should be suppressed
     defaults: {
-      message :  "Discard changes? If you click OK, " +
-                 "any changes you have made will be lost.",
+      message :  'Discard changes? If you click OK, ' +
+                 'any changes you have made will be lost.',
       // events on which to check for changes
       changingEvents: 'change keyup paste',
       // fields on which to check for changes
@@ -76,22 +76,22 @@ define([
       if ($modal.size() !== 0) {
         $modal.data('pattern-modal').on('hide', function(e) {
           var modal = $modal.data('pattern-modal');
-          if(modal){
-            modal._suppressHide = self._handle_unload.apply(self, e);
+          if (modal) {
+            modal._suppressHide = self._handleUnload.apply(self, e);
           }
         });
       } else {
-        $(window).on('beforeunload', function(e){
-          return self._handle_unload(e);
+        $(window).on('beforeunload', function(e) {
+          return self._handleUnload(e);
         });
       }
 
-      self.$el.on('submit', function(e){
+      self.$el.on('submit', function(e) {
         self._suppressed = true;
       });
 
     },
-    _handle_unload : function (e) {
+    _handleUnload : function (e) {
       var self = this;
       if (self._suppressed) {
         self._suppressed = false;
@@ -99,12 +99,12 @@ define([
       }
       if (self._changed) {
         var msg = self.options.message;
-        self._handle_msg(e,msg);
+        self._handleMsg(e,msg);
         $(window).trigger('messageset');
         return msg;
       }
     },
-    _handle_msg:  function(e,msg) {
+    _handleMsg:  function(e,msg) {
       (e || window.event).returnValue = msg;
     }
   });
diff --git a/js/patterns/livesearch.js b/js/patterns/livesearch.js
index 8684e35..4883355 100644
--- a/js/patterns/livesearch.js
+++ b/js/patterns/livesearch.js
@@ -66,10 +66,10 @@ define([
   'mockup-patterns-select2', // TODO: is this still a dependency
   'mockup-utils'
 ], function($, _, Base, Toggle, Select2, utils) {
-  "use strict";
+  'use strict';
 
   var Livesearch = Base.extend({
-    name: "livesearch",
+    name: 'livesearch',
     timeout: null,
     blurTimout: null,
     $results: null,
@@ -117,7 +117,7 @@ define([
         var self = this;
         if (self.options.positionToggleWithInput) {
           var top = self.$input.position().top + self.$input.outerHeight();
-          self.$toggle.css({'top': top+'px'});
+          self.$toggle.css({'top': top + 'px'});
         }
       }
     },
@@ -133,7 +133,7 @@ define([
         $.error('No url provided for livesearch results ' + self.$el);
       }
 
-      if(self.query.valid){
+      if (self.query.valid) {
         self.options.ajax = self.query.selectAjax();
       }
       else {
@@ -152,7 +152,7 @@ define([
       });
 
       self.$input.on('blur.livesearch.patterns', function(e) {
-        self.blurTimeout = window.setInterval(function(){
+        self.blurTimeout = window.setInterval(function() {
           self.hide();
           window.clearInterval(self.blurTimeout);
         }, self.options.blurDelay);
@@ -213,9 +213,9 @@ define([
         self.options.ajax.url,
         $.param(params),
         function(data) {
-          if(data.results !== undefined){
+          if (data.results !== undefined) {
             self.cache[term] = data.results;
-          }else{
+          } else {
             console.log('error from server returning result');
           }
 
@@ -227,13 +227,13 @@ define([
     applyTemplate: function(tpl, item) {
       var self = this;
       var template;
-      if (self.options[tpl+'TemplateSelector']) {
-        template = $(self.options[tpl+'TemplateSelector']).html();
+      if (self.options[tpl + 'TemplateSelector']) {
+        template = $(self.options[tpl + 'TemplateSelector']).html();
         if (!template) {
-          template = self.options[tpl+'Template'];
+          template = self.options[tpl + 'Template'];
         }
       } else {
-        template = self.options[tpl+'Template'];
+        template = self.options[tpl + 'Template'];
       }
       return _.template(template, item);
     },
@@ -259,7 +259,7 @@ define([
       var self = this;
       var html = '';
       if (data.length > 0) {
-        $.each(data, function(index, value){
+        $.each(data, function(index, value) {
           html += self.applyTemplate('result', value);
         });
       } else {
@@ -321,7 +321,7 @@ define([
       if (self.$toggle) {
         self.$toggle.removeClass(self.options.toggleClass);
       }
-      $('.'+className, self.$results).removeClass(className);
+      $('.' + className, self.$results).removeClass(className);
       self.trigger('hidden');
     },
 
@@ -332,7 +332,7 @@ define([
     _keyUp: function() {
       var self = this;
       var className = self.options.highlight;
-      var selected = $('.'+className, self.$results);
+      var selected = $('.' + className, self.$results);
 
       if (selected.length > 0) {
         if (selected.prev().length > 0) {
@@ -345,7 +345,7 @@ define([
     _keyDown: function() {
       var self = this;
       var className = self.options.highlight;
-      var selected = $('.'+className, self.$results);
+      var selected = $('.' + className, self.$results);
 
       if (selected.length === 0) {
         selected = self.items().first().addClass(className);
@@ -364,7 +364,7 @@ define([
     _keyEnter: function() {
       var self = this;
       var hl = self.options.highlight;
-      var target = self.$results.find('.'+hl)
+      var target = self.$results.find('.' + hl)
         .find('a').attr('href');
       if (self.options.isTest) {
         self.testTarget = target;
@@ -391,10 +391,10 @@ define([
           default:
             self.currentTerm = self.$input.val();
             if (self.$input.val().length >= self.options.minimumInputLength) {
-              self.timeout = window.setInterval(function(){
-                try{
+              self.timeout = window.setInterval(function() {
+                try {
                   self.search();
-                }catch(e){
+                } catch (e) {
                   console.log('error trying to search');
                   window.clearInterval(self.timeout);
                 }
diff --git a/js/patterns/modal.js b/js/patterns/modal.js
index db41063..48f2ae1 100644
--- a/js/patterns/modal.js
+++ b/js/patterns/modal.js
@@ -9,7 +9,7 @@
  *    title(string): A string to place in the modal header. If title is provided, titleSelector is not used. (null)
  *    titleSelector(string): Selector for an element to extract from the content provided to the modal and place in the modal header. ('h1:first')
  *    content(string): Selector for an element within the content provided to the modal to use as the modal body. ('#content')
- *    prependContent(string): Selector for elements within the content provided to the modal which will be collected and inserted, by default above, the modal content. This is useful for extracting things like alerts or status messages on forms and displaying them to the user after an AJAX response. ('.portalMessage') 
+ *    prependContent(string): Selector for elements within the content provided to the modal which will be collected and inserted, by default above, the modal content. This is useful for extracting things like alerts or status messages on forms and displaying them to the user after an AJAX response. ('.portalMessage')
  *    backdrop(string): Selector for the element upon which the Backdrop pattern should be initiated. The Backdrop is a full width mask that will be apply above the content behind the modal which is useful for highlighting the modal dialog to the user. ('body')
  *    backdropOptions(object): Look at options at backdrop pattern. ({ zIndex: "1040", opacity: "0.8", className: "backdrop", classActiveName: "backdrop-active", closeOnEsc: true, closeOnClick: true })
  *    buttons(string): Selector for matching elements, usually buttons, inputs or links, from the modal content to place in the modal footer. The original elements in the content will be hidden. ('.formControls > input[type="submit"]')
@@ -82,6 +82,7 @@
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+ /* globals confirm:true */
 
 define([
   'jquery',
@@ -93,24 +94,24 @@ define([
   'mockup-utils',
   'jquery.form'
 ], function($, _, Base, Backdrop, registry, Router, utils) {
-  "use strict";
+  'use strict';
 
   var Modal = Base.extend({
-    name: "modal",
+    name: 'modal',
     createModal: null,
     $model: null,
     defaults: {
-      width: "",
-      height: "",
+      width: '',
+      height: '',
       margin: 20,
-      position: "center middle", // format: "<horizontal> <vertical>" -- allowed values: top, bottom, left, right, center, middle
+      position: 'center middle', // format: '<horizontal> <vertical>' -- allowed values: top, bottom, left, right, center, middle
       triggers: [],
-      backdrop: "body", // Element to initiate the Backdrop on.
+      backdrop: 'body', // Element to initiate the Backdrop on.
       backdropOptions: {
-        zIndex: "1040",
-        opacity: "0.8",
-        className: "backdrop",
-        classActiveName: "backdrop-active",
+        zIndex: '1040',
+        opacity: '0.8',
+        className: 'backdrop',
+        classActiveName: 'backdrop-active',
         closeOnEsc: true,
         closeOnClick: true
       },
@@ -122,16 +123,16 @@ define([
       loadLinksWithinModal: true,
       prependContent: '.portalMessage',
       templateOptions: {
-        className: "modal fade",
-        classDialog: "modal-dialog",
-        classModal: "modal-content",
-        classHeaderName: "modal-header",
-        classBodyName: "modal-body",
-        classFooterName: "modal-footer",
-        classWrapperName: "modal-wrapper",
-        classWrapperInnerName: "modal-wrapper-inner",
-        classActiveName: "in",
-        classPrependName: "", // String, css class to be applied to the wrapper of the prepended content
+        className: 'modal fade',
+        classDialog: 'modal-dialog',
+        classModal: 'modal-content',
+        classHeaderName: 'modal-header',
+        classBodyName: 'modal-body',
+        classFooterName: 'modal-footer',
+        classWrapperName: 'modal-wrapper',
+        classWrapperInnerName: 'modal-wrapper-inner',
+        classActiveName: 'in',
+        classPrependName: '', // String, css class to be applied to the wrapper of the prepended content
         classContentName: '',  // String, class name to be applied to the content of the modal, useful for modal specific styling
         template: '' +
           '<div class="<%= options.className %>">' +
@@ -171,7 +172,7 @@ define([
         onTimeout: null,
         redirectOnResponse: false,
         redirectToUrl: function($action, response, options) {
-            var $base = $(/<base.*?(\/>|<\/base>)/im.exec(response)[0]);
+          var $base = $(/<base.*?(\/>|<\/base>)/im.exec(response)[0]);
           return $base.attr('href');
         }
       },
@@ -199,7 +200,7 @@ define([
           var patternKeys = _.union(_.keys(self.options.actionOptions), ['actions', 'actionOptions']);
           var patternOptions = $.extend(true, _.omit(options, patternKeys), self.options);
 
-          $(action, $('.'+options.templateOptions.classBodyName, $modal)).each(function(action) {
+          $(action, $('.' + options.templateOptions.classBodyName, $modal)).each(function(action) {
             var $action = $(this);
             $action.on(actionOptions.eventType, function(e) {
               e.stopPropagation();
@@ -248,7 +249,7 @@ define([
         }
 
         // We want to trigger the form submit event but NOT use the default
-        $form.on('submit', function(e){
+        $form.on('submit', function(e) {
           e.preventDefault();
         });
         $form.trigger('submit');
@@ -258,56 +259,56 @@ define([
           timeout: options.timeout,
           data: extraData,
           url: url,
-            error: function(xhr, textStatus, errorStatus) {
-              self.loading.hide();
-              if (textStatus === 'timeout' && options.onTimeout) {
-                options.onTimeout.apply(self, xhr, errorStatus);
-              // on "error", "abort", and "parsererror"
-              } else if (options.onError) {
-                options.onError(xhr, textStatus, errorStatus);
+          error: function(xhr, textStatus, errorStatus) {
+            self.loading.hide();
+            if (textStatus === 'timeout' && options.onTimeout) {
+              options.onTimeout.apply(self, xhr, errorStatus);
+            // on "error", "abort", and "parsererror"
+            } else if (options.onError) {
+              options.onError(xhr, textStatus, errorStatus);
+            } else {
+              console.log('error happened do something');
+            }
+            self.trigger('formActionError', [xhr, textStatus, errorStatus]);
+          },
+          success: function(response, state, xhr, form) {
+            self.loading.hide();
+            // if error is found (NOTE: check for both the portal errors
+            // and the form field-level errors)
+            if ($(options.error, response).size() !== 0 ||
+                $(options.formFieldError, response).size() !== 0) {
+              if (options.onFormError) {
+                options.onFormError(self, response, state, xhr, form);
               } else {
-                console.log('error happened do something');
-              }
-              self.trigger('formActionError', [xhr, textStatus, errorStatus]);
-            },
-            success: function(response, state, xhr, form) {
-              self.loading.hide();
-              // if error is found (NOTE: check for both the portal errors
-              // and the form field-level errors)
-              if ($(options.error, response).size() !== 0 ||
-                  $(options.formFieldError, response).size() !== 0) {
-                if (options.onFormError) {
-                  options.onFormError(self, response, state, xhr, form);
-                } else {
-                  self.redraw(response, patternOptions);
-                }
-                return;
+                self.redraw(response, patternOptions);
               }
+              return;
+            }
 
-              if (options.redirectOnResponse === true) {
-                if (typeof options.redirectToUrl === 'function') {
-                  window.parent.location.href = options.redirectToUrl.apply(self, [$action, response, options]);
-                } else {
-                  window.parent.location.href = options.redirectToUrl;
-                }
-                return; // cut out right here since we're changing url
+            if (options.redirectOnResponse === true) {
+              if (typeof options.redirectToUrl === 'function') {
+                window.parent.location.href = options.redirectToUrl.apply(self, [$action, response, options]);
+              } else {
+                window.parent.location.href = options.redirectToUrl;
               }
+              return; // cut out right here since we're changing url
+            }
 
-              if (options.onSuccess) {
-                options.onSuccess(self, response, state, xhr, form);
-              }
+            if (options.onSuccess) {
+              options.onSuccess(self, response, state, xhr, form);
+            }
 
-              if (options.displayInModal === true) {
-                self.redraw(response, patternOptions);
-              } else {
-                $action.trigger('destroy.modal.patterns');
-                // also calls hide
-                if (options.reloadWindowOnClose) {
-                  self.reloadWindow();
-                }
+            if (options.displayInModal === true) {
+              self.redraw(response, patternOptions);
+            } else {
+              $action.trigger('destroy.modal.patterns');
+              // also calls hide
+              if (options.reloadWindowOnClose) {
+                self.reloadWindow();
               }
-              self.trigger('formActionSuccess', [response, state, xhr, form]);
             }
+            self.trigger('formActionSuccess', [response, state, xhr, form]);
+          }
         });
       },
       handleLinkAction: function($action, options, patternOptions) {
@@ -368,11 +369,13 @@ define([
         var $raw = self.$raw.clone();
         // fix for IE9 bug (see http://bugs.jquery.com/ticket/10550)
         $('input:checked', $raw).each(function() {
-          if (this.setAttribute) this.setAttribute('checked', 'checked');
+          if (this.setAttribute) {
+            this.setAttribute('checked', 'checked');
+          }
         });
 
         // Object that will be passed to the template
-        var tpl_object = {
+        var tplObject = {
           title: '',
           prepend: '<div />',
           content: '',
@@ -383,27 +386,27 @@ define([
         // setup the Title
         if (options.title === null) {
           var $title = $(options.titleSelector, $raw);
-          tpl_object.title = $title.html();
+          tplObject.title = $title.html();
           $(options.titleSelector, $raw).remove();
         } else {
-          tpl_object.title = options.title;
+          tplObject.title = options.title;
         }
 
         // Grab items to to insert into the prepend area
         if (options.prependContent) {
-          tpl_object.prepend = $('<div />').append($(options.prependContent, $raw).clone()).html();
+          tplObject.prepend = $('<div />').append($(options.prependContent, $raw).clone()).html();
           $(options.prependContent, $raw).remove();
         }
 
         // Filter out the content if there is a selector provided
         if (options.content) {
-          tpl_object.content = $(options.content, $raw).html();
+          tplObject.content = $(options.content, $raw).html();
         } else {
-          tpl_object.content = $raw.html();
+          tplObject.content = $raw.html();
         }
 
         // Render html
-        self.$modal = $(_.template(self.options.templateOptions.template, tpl_object));
+        self.$modal = $(_.template(self.options.templateOptions.template, tplObject));
         self.$modalDialog = $('> .' + self.options.templateOptions.classDialog, self.$modal);
 
         // In most browsers, when you hit the enter key while a form element is focused
@@ -411,12 +414,12 @@ define([
         // but not when when the default submit button is hidden with 'display: none'.
         // The following code will work around this issue:
         $('form', self.$modal).on ('keydown', function (event) {
-            // ignore keys which are not enter, and ignore enter inside a textarea.
-            if (event.keyCode !== 13 || event.target.nodeName == 'TEXTAREA')
-                return;
-
-            event.preventDefault ();
-            $('input[type=submit], button[type=submit], button:not(type)', this).eq(0).trigger ('click');
+          // ignore keys which are not enter, and ignore enter inside a textarea.
+          if (event.keyCode !== 13 || event.target.nodeName === 'TEXTAREA') {
+            return;
+          }
+          event.preventDefault();
+          $('input[type=submit], button[type=submit], button:not(type)', this).eq(0).trigger('click');
         });
 
         // Setup buttons
@@ -561,13 +564,13 @@ define([
         container: self.$wrapperInner,
         backdrop: self.backdrop,
         wrapper: self.$wrapper,
-        zIndex: function(){
-          if(self.modalInitialized()){
+        zIndex: function() {
+          if (self.modalInitialized()) {
             var zIndex = self.$modal.css('zIndex');
-            if(zIndex){
+            if (zIndex) {
               return parseInt(zIndex, 10) + 1;
             }
-          }else{
+          } else {
             return 10005;
           }
         }
@@ -613,8 +616,8 @@ define([
       self.trigger('before-ajax');
       self.loading.show();
       self.ajaxXHR = $.ajax({
-          url: self.options.ajaxUrl,
-          type: self.options.ajaxType
+        url: self.options.ajaxUrl,
+        type: self.options.ajaxType
       }).done(function(response, textStatus, xhr) {
         self.ajaxXHR = undefined;
         self.loading.hide();
@@ -658,20 +661,20 @@ define([
       absRight = absLeft = absTop = absLeft = 'auto';
 
       // -- HORIZONTAL POSITION -----------------------------------------------
-      if(horpos === 'left') {
+      if (horpos === 'left') {
         absLeft = margin + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the left to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absLeft = '0px';
         }
         returnpos.left = absLeft;
       }
-      else if(horpos === 'right') {
+      else if (horpos === 'right') {
         absRight =  margin + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the right to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absRight = '0px';
         }
         returnpos.right = absRight;
@@ -682,27 +685,27 @@ define([
         absLeft = ((wrapperInnerWidth / 2) - (modalWidth / 2) - margin) + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the left to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absLeft = '0px';
         }
         returnpos.left = absLeft;
       }
 
       // -- VERTICAL POSITION -------------------------------------------------
-      if(vertpos === 'top') {
+      if (vertpos === 'top') {
         absTop = margin + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the top to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absTop = '0px';
         }
         returnpos.top = absTop;
       }
-      else if(vertpos === 'bottom') {
+      else if (vertpos === 'bottom') {
         absBottom = margin + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the bottom to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absBottom = '0px';
         }
         returnpos.bottom = absBottom;
@@ -713,7 +716,7 @@ define([
         absTop = ((wrapperInnerHeight / 2) - (modalHeight / 2) - margin) + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the top to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absTop = '0px';
         }
         returnpos.top = absTop;
@@ -721,7 +724,7 @@ define([
 
       return returnpos;
     },
-    modalInitialized: function(){
+    modalInitialized: function() {
       var self = this;
       return self.$modal !== null && self.$modal !== undefined;
     },
@@ -736,7 +739,7 @@ define([
       var self = this;
 
       // modal isn't initialized
-      if(!self.modalInitialized()) { return; }
+      if (!self.modalInitialized()) { return; }
 
       // clear out any previously set styling
       self.$modal.removeAttr('style');
@@ -746,7 +749,7 @@ define([
 
       // if backdrop wrapper is set on body, then wrapper should have height of
       // the window, so we can do scrolling of inner wrapper
-      if(self.$wrapper.parent().is('body')) {
+      if (self.$wrapper.parent().is('body')) {
         self.$wrapper.height($(window.parent).height());
       }
 
@@ -770,9 +773,11 @@ define([
       var wrapperInnerWidth = self.$wrapperInner.width();
       var wrapperInnerHeight = self.$wrapperInner.height();
 
-      var pos = self.findPosition(horpos, vertpos, margin, modalWidth, modalHeight,
-                                  wrapperInnerWidth, wrapperInnerHeight);
-      for(var key in pos) {
+      var pos = self.findPosition(
+        horpos, vertpos, margin, modalWidth, modalHeight,
+        wrapperInnerWidth, wrapperInnerHeight
+      );
+      for (var key in pos) {
         self.$modalDialog.css(key, pos[key]);
       }
     },
@@ -788,8 +793,7 @@ define([
     },
     _show: function() {
       var self = this;
-      self.render.apply(self,
-          [self.options]);
+      self.render.apply(self, [ self.options ]);
       self.trigger('show');
       self.backdrop.show();
       self.$wrapper.show();
@@ -813,8 +817,8 @@ define([
         self.ajaxXHR.abort();
       }
       self.trigger('hide');
-      if(self._suppressHide){
-        if(!confirm(self._suppressHide)){
+      if (self._suppressHide) {
+        if (!confirm(self._suppressHide)) {
           return;
         }
       }
diff --git a/js/patterns/moment.js b/js/patterns/moment.js
index c7d0aa9..b5762d1 100644
--- a/js/patterns/moment.js
+++ b/js/patterns/moment.js
@@ -92,7 +92,7 @@ define([
   'mockup-patterns-base',
   'moment'
 ], function($, Base, moment) {
-  "use strict";
+  'use strict';
 
   var Moment = Base.extend({
     name: 'moment',
@@ -102,34 +102,34 @@ define([
       // also available options are relative, calendar
       format: 'MMMM Do YYYY, h:mm:ss a'
     },
-    convert: function($el){
+    convert: function($el) {
       var self = this;
       var date = $el.attr('data-date');
-      if(!date){
+      if (!date) {
         date = $.trim($el.html());
       }
       date = moment(date);
-      if(!date.isValid()){
+      if (!date.isValid()) {
         return;
       }
-      if(self.options.format === 'relative'){
+      if (self.options.format === 'relative') {
         date = date.fromNow();
-      }else if(self.options.format === 'calendar'){
+      }else if (self.options.format === 'calendar') {
         date = date.calendar();
-      }else{
+      } else {
         date = date.format(self.options.format);
       }
-      if(date){
+      if (date) {
         $el.html(date);
       }
     },
     init: function() {
       var self = this;
-      if(self.options.selector){
-        self.$el.find(self.options.selector).each(function(){
+      if (self.options.selector) {
+        self.$el.find(self.options.selector).each(function() {
           self.convert($(this));
         });
-      }else{
+      } else {
         self.convert(self.$el);
       }
     }
diff --git a/js/patterns/pickadate.js b/js/patterns/pickadate.js
index c53d5fd..4ce24de 100644
--- a/js/patterns/pickadate.js
+++ b/js/patterns/pickadate.js
@@ -81,7 +81,7 @@ define([
   'picker.date',
   'picker.time'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var PickADate = Base.extend({
     name: 'pickadate',
diff --git a/js/patterns/picture.js b/js/patterns/picture.js
index 521978a..01fdfab 100644
--- a/js/patterns/picture.js
+++ b/js/patterns/picture.js
@@ -9,7 +9,7 @@
  *    # Responsive images pattern
  *
  *    This pattern loads the last image that fulfills the media-query
- *    criteria. When multiple pictures are displayed, it loads the images 
+ *    criteria. When multiple pictures are displayed, it loads the images
  *    within the visible viewport first. Will update images on resize event.
  *
  *    # Examples
@@ -61,10 +61,10 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Picture = Base.extend({
-    name: "picture",
+    name: 'picture',
     defaults: {
       alt: null,
       className: {
@@ -80,14 +80,14 @@ define([
     init: function() {
       var self = this,
           resizeHandler;
-      if (Picture.__queue_picture_patterns === undefined) {
-        Picture.__queue_picture_patterns = [];
+      if (Picture.__queuePicturePatterns === undefined) {
+        Picture.__queuePicturePatterns = [];
         $(window).on('queue.picture.patterns', function() {
-          if ($('.pat-picture').length === Picture.__queue_picture_patterns.length) {
-            $.each(Picture.__queue_picture_patterns, function(index, val) {
+          if ($('.pat-picture').length === Picture.__queuePicturePatterns.length) {
+            $.each(Picture.__queuePicturePatterns, function(index, val) {
               val.display();
             });
-            Picture.__queue_picture_patterns = [];
+            Picture.__queuePicturePatterns = [];
           }
         });
       }
@@ -105,9 +105,9 @@ define([
       var self = this;
 
       if (self.visible()) {
-        Picture.__queue_picture_patterns.unshift(self);
+        Picture.__queuePicturePatterns.unshift(self);
       } else {
-        Picture.__queue_picture_patterns.push(self);
+        Picture.__queuePicturePatterns.push(self);
       }
       self.trigger('queue');
     },
@@ -117,7 +117,7 @@ define([
           matches = [],
           $img = $('img', self.$el);
 
-      $('[' + self.options.attribute.src +']', self.$el).each(function() {
+      $('[' + self.options.attribute.src + ']', self.$el).each(function() {
         var $candidate = $(this);
         if (!$candidate.attr(self.options.attribute.media) ||
             self.matchMedia($candidate.attr(self.options.attribute.media))) {
@@ -167,12 +167,12 @@ define([
           fakeBody = document.createElement('body'),
           div = document.createElement('div');
 
-      div.id = "mq-test-1";
-      div.style.cssText = "position:absolute;top:-100em";
-      fakeBody.style.background = "none";
+      div.id = 'mq-test-1';
+      div.style.cssText = 'position:absolute;top:-100em';
+      fakeBody.style.background = 'none';
       fakeBody.appendChild(div);
 
-      div.innerHTML = "­<style media=\"" + mediaQuery + "\"> #mq-test-1 { width: 42px; }</style>";
+      div.innerHTML = '­<style media="' + mediaQuery + '"> #mq-test-1 { width: 42px; }</style>';
       docElem.insertBefore(fakeBody, refNode);
       bool = div.offsetWidth === 42;
       docElem.removeChild(fakeBody);
diff --git a/js/patterns/preventdoublesubmit.js b/js/patterns/preventdoublesubmit.js
index 22eca19..c6c3a7d 100644
--- a/js/patterns/preventdoublesubmit.js
+++ b/js/patterns/preventdoublesubmit.js
@@ -39,10 +39,10 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var PreventDoubleSubmit = Base.extend({
-    name: "preventdoublesubmit",
+    name: 'preventdoublesubmit',
     defaults: {
       message : 'You already clicked the submit button. ' +
                 'Do you really want to submit this form again?',
@@ -53,11 +53,11 @@ define([
       var self = this;
 
       // if this is not a form just return
-      if(!self.$el.is('form')){
+      if (!self.$el.is('form')) {
         return;
       }
 
-      $(':submit', self.$el).click(function(e){
+      $(':submit', self.$el).click(function(e) {
 
         // mark the button as clicked
         $(':submit').removeAttr('clicked');
@@ -66,7 +66,7 @@ define([
         // if submitting and no opt-out guardClassName is found
         // pop up confirmation dialog
         if ($(this).hasClass(self.options.guardClassName) &&
-              !$(this).hasClass(self.options.optOutClassName)){
+              !$(this).hasClass(self.options.optOutClassName)) {
           return self._confirm.call(self);
         }
 
diff --git a/js/patterns/querystring.js b/js/patterns/querystring.js
index f2a23df..318155a 100644
--- a/js/patterns/querystring.js
+++ b/js/patterns/querystring.js
@@ -28,7 +28,7 @@
  *    {{ example-1 }}
  *
  *    # Without Previews
- *    
+ *
  *    {{ example-2 }}
  *
  * Example: example-1
@@ -65,7 +65,7 @@ define([
   'mockup-patterns-pickadate',
   'select2'
 ], function($, Base, Select2, PickADate, undefined) {
-  "use strict";
+  'use strict';
 
   var Criteria = function() { this.init.apply(this, arguments); };
   Criteria.prototype = {
@@ -98,12 +98,12 @@ define([
               .appendTo($el);
 
       // Remove button
-      self.$remove = $('<div>'+self.options.remove+'</div>')
-              .addClass(self.options.classRemoveName)
-              .appendTo(self.$wrapper)
-              .on('click', function(e) {
-                self.remove();
-              });
+      self.$remove = $('<div>' + self.options.remove + '</div>')
+        .addClass(self.options.classRemoveName)
+        .appendTo(self.$wrapper)
+        .on('click', function(e) {
+          self.remove();
+        });
 
       // Index selection
       self.$index = $('<select><option></option></select>')
@@ -119,24 +119,26 @@ define([
           }
           self.indexGroups[options.group].append(
             $('<option/>')
-                .attr('value', value)
-                .html(options.title));
+              .attr('value', value)
+              .html(options.title)
+          );
         }
       });
 
       // attach index select to DOM
       self.$wrapper.append(
-          $('<div/>')
-              .addClass(self.options.classIndexName)
-              .append(self.$index));
+        $('<div/>')
+          .addClass(self.options.classIndexName)
+          .append(self.$index)
+      );
 
       // add blink (select2)
       self.$index
         .patternSelect2({
-            width: self.options.indexWidth,
-            placeholder: self.options.placeholder
+          width: self.options.indexWidth,
+          placeholder: self.options.placeholder
         })
-        .on("change", function(e) {
+        .on('change', function(e) {
           self.removeValue();
           self.createOperator(e.val);
           self.createClear();
@@ -168,14 +170,15 @@ define([
 
       // attach operators select to DOM
       self.$wrapper.append(
-          $('<div/>')
-              .addClass(self.options.classOperatorName)
-              .append(self.$operator));
+        $('<div/>')
+          .addClass(self.options.classOperatorName)
+          .append(self.$operator)
+      );
 
       // add blink (select2)
       self.$operator
         .patternSelect2({ width: '10em' })
-        .on("change", function(e) {
+        .on('change', function(e) {
           self.createValue(index);
           self.createClear();
           self.trigger('operator-changed');
@@ -204,7 +207,7 @@ define([
                 .addClass(self.options.classValueName + '-' + widget)
                 .val(value)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -214,22 +217,22 @@ define([
                 .appendTo($wrapper)
                 .patternPickadate({
                   time: false,
-                  date: { format: "dd/mm/yyyy" }
+                  date: { format: 'dd/mm/yyyy' }
                 })
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
       } else if (widget === 'DateRangeWidget') {
         var startwrap = $('<span/>').appendTo($wrapper);
         var startdt = $('<input type="text"/>')
-                        .addClass(self.options.classValueName + '-' + widget)
-                        .addClass(self.options.classValueName + '-' + widget + '-start')
-                        .appendTo(startwrap)
-                        .patternPickadate({
-                          time: false,
-                          date: { format: "dd/mm/yyyy" }
-                        });
+          .addClass(self.options.classValueName + '-' + widget)
+          .addClass(self.options.classValueName + '-' + widget + '-start')
+          .appendTo(startwrap)
+          .patternPickadate({
+            time: false,
+            date: { format: 'dd/mm/yyyy' }
+          });
         $wrapper.append(
           $('<span/>')
             .html(self.options.betweendt)
@@ -242,7 +245,7 @@ define([
                         .appendTo(endwrap)
                         .patternPickadate({
                           time: false,
-                          date: { format: "dd/mm/yyyy" }
+                          date: { format: 'dd/mm/yyyy' }
                         });
         $wrapper.find('.picker__input').change(function() {
           self.trigger('value-changed');
@@ -254,7 +257,7 @@ define([
                 .after($('<span/>').html(self.options.days))
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -262,7 +265,7 @@ define([
         self.$value = $('<input type="text"/>')
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -271,7 +274,7 @@ define([
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
                 .val(value)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -279,7 +282,7 @@ define([
         self.$value = $('<select/>').attr('multiple', true)
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
         if (self.indexes[index]) {
@@ -293,7 +296,7 @@ define([
         self.$value.patternSelect2({ width: '250px' });
       }
 
-      if(value !== undefined && typeof self.$value !== 'undefined') {
+      if (value !== undefined && typeof self.$value !== 'undefined') {
         self.$value.select2('val', value);
       }
 
@@ -334,8 +337,8 @@ define([
     removeValue: function() {
       var self = this;
       self.trigger('remove-value');
-      if(self.$value) {
-        if($.isArray(self.$value)) { // date ranges have 2 values
+      if (self.$value) {
+        if ($.isArray(self.$value)) { // date ranges have 2 values
           self.$value[0].parents('.querystring-criteria-value').remove();
         }
         else {
@@ -350,26 +353,26 @@ define([
 
       // index
       var ival = self.$index.select2('val');
-      if(ival === "") { // no index selected, no query
-        return "";
+      if (ival === '') { // no index selected, no query
+        return '';
       }
-      var istr = 'query.i:records='+ival;
+      var istr = 'query.i:records=' + ival;
 
       // operator
-      if(typeof self.$operator === "undefined") { // no operator, no query
-        return "";
+      if (typeof self.$operator === 'undefined') { // no operator, no query
+        return '';
       }
       var oval = self.$operator.val(),
-          ostr = 'query.o:records='+oval;
+          ostr = 'query.o:records=' + oval;
 
       // value(s)
       var vstrbase = 'query.v:records=',
           vstrlistbase = 'query.v:records:list=',
           vstr = [];
-      if(typeof self.$value === "undefined") {
+      if (typeof self.$value === 'undefined') {
         vstr.push(vstrbase);
       }
-      else if($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
+      else if ($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
         $.each(self.$value, function(i, v) {
           vstr.push(vstrlistbase + $(this).parent().find('.picker__input').val());
         });
@@ -385,38 +388,38 @@ define([
 
       // index
       var ival = self.$index.select2('val');
-      if(ival === "") { // no index selected, no query
-        return "";
+      if (ival === '') { // no index selected, no query
+        return '';
       }
 
       // operator
-      if(typeof self.$operator === "undefined") { // no operator, no query
-        return "";
+      if (typeof self.$operator === 'undefined') { // no operator, no query
+        return '';
       }
       var oval = self.$operator.val();
 
       // value(s)
       var varr = [];
-      if($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
+      if ($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
         $.each(self.$value, function(i, v) {
           varr.push($(this).parent().find('.picker__input').val());
         });
       }
-      else if(typeof self.$value !== "undefined") {
+      else if (typeof self.$value !== 'undefined') {
         varr.push(self.$value.val());
       }
       var vval;
-      if(varr.length > 1) {
-        vval = '["'+varr.join('","')+'"]';
+      if (varr.length > 1) {
+        vval = '[j' + varr.join('","') + '"]';
       }
-      else if(varr.length === 1) {
+      else if (varr.length === 1) {
         vval = JSON.stringify(varr[0]);
       }
       else {
         vval = '""';
       }
 
-      return '{"i":"'+ival+'", "o":"'+oval+'", "v":'+vval+'}';
+      return '{"i":"' + ival + '", "o":"' + oval + '", "v":' + vval + '}';
     },
     trigger: function(name) {
       this.$wrapper.trigger(name + '-criteria.querystring.patterns', [ this ]);
@@ -464,23 +467,23 @@ define([
       // initialization can be detailed if by ajax
       self.initialized = false;
 
-      if(self.options.indexOptionsUrl){
+      if (self.options.indexOptionsUrl) {
         $.ajax({
           url: self.options.indexOptionsUrl,
-          success: function(data){
+          success: function(data) {
             self.options.indexes = data.indexes;
-            self.options.sortable_indexes = data.sortable_indexes;
+            self.options['sortable_indexes'] = data['sortable_indexes']; // jshint ignore:line
             self._init();
           },
-          error: function(xhr){
+          error: function(xhr) {
             // XXX handle this...
           }
         });
-      }else{
+      } else {
         self._init();
       }
     },
-    _init: function(){
+    _init: function() {
       var self = this;
       self.$criteriaWrapper = $('<div/>')
         .addClass(self.options.classWrapperName)
@@ -490,10 +493,10 @@ define([
         .addClass(self.options.classSortWrapperName)
         .appendTo(self.$wrapper);
 
-      if(self.options.showPreviews === 'false'){
+      if (self.options.showPreviews === 'false') {
         self.options.showPreviews = false;
       }
-      if(self.options.showPreviews){
+      if (self.options.showPreviews) {
         self.$previewWrapper = $('<div/>')
           .addClass(self.options.classPreviewWrapperName)
           .appendTo(self.$wrapper);
@@ -525,7 +528,7 @@ define([
       self.createSort();
 
       // add criteria preview pane to see results from criteria query
-      if(self.options.showPreviews){
+      if (self.options.showPreviews) {
         self.refreshPreviewEvent();
       }
       self.$el.trigger('initialized');
@@ -537,13 +540,13 @@ define([
             self.options.indexes, index, operator, value);
 
       criteria.on('remove', function(e) {
-        if (self.criterias[self.criterias.length-1] === criteria) {
+        if (self.criterias[self.criterias.length - 1] === criteria) {
           self.createCriteria();
         }
       });
 
       criteria.on('index-changed', function(e) {
-        if (self.criterias[self.criterias.length-1] === criteria) {
+        if (self.criterias[self.criterias.length - 1] === criteria) {
           self.createCriteria();
         }
       });
@@ -553,8 +556,8 @@ define([
         self.updateValue();
       };
 
-      criteria.on('remove', function(e, criteria){
-        if(self.criterias.indexOf(criteria) !== -1){
+      criteria.on('remove', function(e, criteria) {
+        if (self.criterias.indexOf(criteria) !== -1) {
           self.criterias.splice(self.criterias.indexOf(criteria), 1);
         }
         doupdates(e, criteria);
@@ -587,34 +590,31 @@ define([
       self.$sortOn = $('<select/>')
         .attr('name', 'sort_on')
         .appendTo(self.$sortWrapper)
-        .change(function(){
+        .change(function() {
           self.refreshPreviewEvent.call(self);
           $('[id$="sort_on"]', existingSortOn).val($(this).val());
         });
 
       self.$sortOn.append($('<option value="">No sorting</option>')); // default no sorting
-      for(var key in self.options.sortable_indexes) {
+      for (var key in self.options['sortable_indexes']) { // jshint ignore:line
         self.$sortOn.append(
           $('<option/>')
             .attr('value', key)
-            .html(self.options.indexes[key].title));
+            .html(self.options.indexes[key].title)
+        );
       }
       self.$sortOn.patternSelect2({width: 150});
 
-      self.$sortOrder = $("<input type='checkbox' />")
-                          .attr('name', 'sort_reversed:boolean')
-                          .change(function(){
-                            self.refreshPreviewEvent.call(self);
-                            if($(this).attr('checked') === "checked") {
-                              $('.option input[type="checkbox"]', existingSortOrder)
-                                .attr('checked', 'checked');
-                            }
-                            else {
-                              $('.option input[type="checkbox"]', existingSortOrder)
-                                .removeAttr('checked');
-                            }
-                          });
-
+      self.$sortOrder = $('<input type="checkbox" />')
+        .attr('name', 'sort_reversed:boolean')
+        .change(function() {
+          self.refreshPreviewEvent.call(self);
+          if ($(this).attr('checked') === 'checked') {
+            $('.option input[type="checkbox"]', existingSortOrder).attr('checked', 'checked');
+          } else {
+            $('.option input[type="checkbox"]', existingSortOrder).removeAttr('checked');
+          }
+        });
 
       $('<span/>')
         .addClass(self.options.classSortReverseName)
@@ -628,13 +628,13 @@ define([
 
       // if the form already contains the sort fields, hide them! Their values
       // will be synced back and forth between the querystring's form elements
-      if(existingSortOn.length >= 1 && existingSortOrder.length >= 1) {
-        var reversed = $('.option input[type="checkbox"]', existingSortOrder).attr('checked') === "checked";
-        var sort_on = $('[id$="-sort_on"]', existingSortOn).val();
-        if(reversed) {
+      if (existingSortOn.length >= 1 && existingSortOrder.length >= 1) {
+        var reversed = $('.option input[type="checkbox"]', existingSortOrder).attr('checked') === 'checked';
+        var sortOn = $('[id$="-sort_on"]', existingSortOn).val();
+        if (reversed) {
           self.$sortOrder.attr('checked', 'checked');
         }
-        self.$sortOn.select2('val', sort_on);
+        self.$sortOn.select2('val', sortOn);
         $(existingSortOn).hide();
         $(existingSortOrder).hide();
       }
@@ -642,31 +642,31 @@ define([
     refreshPreviewEvent: function() {
       var self = this;
 
-      if(!self.options.showPreviews){
+      if (!self.options.showPreviews) {
         return; // cut out of this if there are no previews available
       }
 
       /* TEMPORARY */
-      //if(typeof self._tmpcnt === "undefined") { self._tmpcnt = 0; }
+      //if (typeof self._tmpcnt === 'undefined') { self._tmpcnt = 0; }
       //self._tmpcnt++;
       /* /TEMPORARY */
 
-      if(typeof self._preview_xhr !== "undefined") {
-        self._preview_xhr.abort();
+      if (typeof self._previewXhr !== 'undefined') {
+        self._previewXhr.abort();
       }
       /*
-      if(typeof self._count_xhr !== "undefined") {
+      if (typeof self._count_xhr !== 'undefined') {
         self._count_xhr.abort();
       }
       */
-      if(typeof self.$previewPane !== "undefined") {
+      if (typeof self.$previewPane !== 'undefined') {
         self.$previewPane.remove();
       }
 
       var query = [], querypart;
       $.each(self.criterias, function(i, criteria) {
         querypart = criteria.buildQueryPart();
-        if(querypart !== "") {
+        if (querypart !== '') {
           query.push(criteria.buildQueryPart());
         }
       });
@@ -675,17 +675,17 @@ define([
         .addClass(self.options.classPreviewName)
         .appendTo(self.$previewWrapper);
 
-      if(query.length <= 0) {
+      if (query.length <= 0) {
         $('<div/>')
           .addClass(self.options.classPreviewCountWrapperName)
-          .html("No results to preview")
+          .html('No results to preview')
           .prependTo(self.$previewPane);
         return; // no query means nothing to send out requests for
       }
 
-      query.push('sort_on='+self.$sortOn.val());
+      query.push('sort_on=' + self.$sortOn.val());
       var sortorder = self.$sortOrder.attr('checked');
-      if(sortorder === "checked") {
+      if (sortorder === 'checked') {
         query.push('sort_order=reverse');
       }
 
@@ -697,15 +697,15 @@ define([
 
       /*
       self._count_xhr = $.get(self.options.previewCountURL + '?' + query.join('&'))
-          .done(function(data, stat){
+          .done(function(data, stat) {
             $('<div/>')
               .addClass(self.options.classPreviewCountWrapperName)
               .html(data)
               .prependTo(self.$previewPane);
           });
       */
-      self._preview_xhr = $.get(self.options.previewURL + '?' + query.join('&'))
-          .done(function(data, stat){
+      self._previewXhr = $.get(self.options.previewURL + '?' + query.join('&'))
+          .done(function(data, stat) {
             $('<div/>')
               .addClass(self.options.classPreviewResultsWrapperName)
               .html(data)
@@ -723,12 +723,12 @@ define([
       var criteriastrs = [];
       $.each(self.criterias, function(i, criteria) {
         var jsonstr = criteria.getJSONListStr();
-        if(jsonstr !== "") {
+        if (jsonstr !== '') {
           criteriastrs.push(jsonstr);
         }
       });
       var existing = self.$el.val();
-      var val = '['+criteriastrs.join(',')+']';
+      var val = '[' + criteriastrs.join(',') + ']';
       self.$el.val(val);
       self.$el.trigger('change');
     }
diff --git a/js/patterns/relateditems.js b/js/patterns/relateditems.js
index ee524ca..a93609c 100644
--- a/js/patterns/relateditems.js
+++ b/js/patterns/relateditems.js
@@ -93,18 +93,18 @@ define([
   'mockup-utils',
   'mockup-patterns-tree'
 ], function($, _, Base, Select2, utils, Tree) {
-  "use strict";
+  'use strict';
 
   var RelatedItems = Base.extend({
-    name: "relateditems",
+    name: 'relateditems',
     browsing: false,
     currentPath: null,
     defaults: {
       vocabularyUrl: null, // must be set to work
       width: '300px',
       multiple: true,
-      tokenSeparators: [",", " "],
-      separator: ",",
+      tokenSeparators: [',', ' '],
+      separator: ',',
       orderable: true,
       cache: true,
       mode: 'search', // possible values are search and browse
@@ -161,7 +161,7 @@ define([
       setupAjax: function() {
         // Setup the ajax object to use during requests
         var self = this;
-        if(self.query.valid){
+        if (self.query.valid) {
           return self.query.selectAjax();
         }
         return {};
@@ -170,25 +170,25 @@ define([
     applyTemplate: function(tpl, item) {
       var self = this;
       var template;
-      if (self.options[tpl+'TemplateSelector']) {
-        template = $(self.options[tpl+'TemplateSelector']).html();
+      if (self.options[tpl + 'TemplateSelector']) {
+        template = $(self.options[tpl + 'TemplateSelector']).html();
         if (!template) {
-          template = self.options[tpl+'Template'];
+          template = self.options[tpl + 'Template'];
         }
       } else {
-        template = self.options[tpl+'Template'];
+        template = self.options[tpl + 'Template'];
       }
       // let's give all the options possible to the template generation
       var options = $.extend(true, {}, self.options, item);
       options._item = item;
       return _.template(template, options);
     },
-    activateBrowsing: function(){
+    activateBrowsing: function() {
       var self = this;
       self.browsing = true;
       self.setBreadCrumbs();
     },
-    deactivateBrowsing: function(){
+    deactivateBrowsing: function() {
       var self = this;
       self.browsing = false;
       self.setBreadCrumbs();
@@ -212,8 +212,8 @@ define([
       var html;
       if (path === '/') {
         var searchText = '';
-        if(self.options.mode === 'search'){
-          searchText = '<em>'+self.options.searchAllText+'</em>';
+        if (self.options.mode === 'search') {
+          searchText = '<em>' + self.options.searchAllText + '</em>';
         }
         html = self.applyTemplate('breadCrumbs', {
           items: searchText,
@@ -232,7 +232,7 @@ define([
             itemsHtml = itemsHtml + self.applyTemplate('breadCrumb', item);
           }
         });
-        html = self.applyTemplate('breadCrumbs', {items:itemsHtml, searchText: self.options.searchText});
+        html = self.applyTemplate('breadCrumbs', {items: itemsHtml, searchText: self.options.searchText});
       }
       var $crumbs = $(html);
       $('a.crumb', $crumbs).on('click', function(e) {
@@ -247,9 +247,9 @@ define([
       var selectedNode = null;
       var treePattern = new Tree($tree, {
         data: [],
-        dataFilter: function(data){
+        dataFilter: function(data) {
           var nodes = [];
-          _.each(data.results, function(item){
+          _.each(data.results, function(item) {
             nodes.push({
               label: item.Title,
               id: item.UID,
@@ -259,36 +259,36 @@ define([
           return nodes;
         }
       });
-      treePattern.$el.bind('tree.select', function(e){
+      treePattern.$el.bind('tree.select', function(e) {
         var node = e.node;
-        if(node && !node._loaded){
+        if (node && !node._loaded) {
           self.currentPath = node.path;
           selectedNode = node;
           treePattern.$el.tree('loadDataFromUrl', self.treeQuery.getUrl(), node);
           node._loaded = true;
         }
       });
-      treePattern.$el.bind('tree.refresh', function(){
+      treePattern.$el.bind('tree.refresh', function() {
         /* the purpose of this is that when new data is loaded, the selected
          * node is cleared. This re-selects it as a user browses structure of site */
-        if(selectedNode){
+        if (selectedNode) {
           treePattern.$el.tree('selectNode', selectedNode);
         }
       });
-      $('a.pattern-relateditems-tree-cancel', $treeContainer).click(function(e){
+      $('a.pattern-relateditems-tree-cancel', $treeContainer).click(function(e) {
         e.preventDefault();
         $treeContainer.fadeOut();
         return false;
       });
 
-      $('a.pattern-relateditems-tree-itemselect', $treeContainer).click(function(e){
+      $('a.pattern-relateditems-tree-itemselect', $treeContainer).click(function(e) {
         e.preventDefault();
         self.browseTo(self.currentPath); // just browse to current path since it's set elsewhere
         $treeContainer.fadeOut();
         return false;
       });
 
-      $treeSelect.on('click', function(e){
+      $treeSelect.on('click', function(e) {
         e.preventDefault();
         self.browsing = true;
         self.currentPath = '/';
@@ -301,22 +301,22 @@ define([
     selectItem: function(item) {
       var self = this;
       self.trigger('selecting');
-      var data = self.$el.select2("data");
+      var data = self.$el.select2('data');
       data.push(item);
-      self.$el.select2("data", data);
+      self.$el.select2('data', data);
       item.selected = true;
       self.trigger('selected');
     },
     deselectItem: function(item) {
       var self = this;
       self.trigger('deselecting');
-      var data = self.$el.select2("data");
+      var data = self.$el.select2('data');
       _.each(data, function(obj, i) {
         if (obj.UID === item.UID) {
           data.splice(i, 1);
         }
       });
-      self.$el.select2("data", data);
+      self.$el.select2('data', data);
       item.selected = false;
       self.trigger('deselected');
     },
@@ -361,16 +361,16 @@ define([
       Select2.prototype.initializeOrdering.call(self);
 
       self.options.formatResult = function(item) {
-        if (!item.Type || _.indexOf(self.options.folderTypes, item.Type) === -1){
+        if (!item.Type || _.indexOf(self.options.folderTypes, item.Type) === -1) {
           item.folderish = false;
-        }else{
+        } else {
           item.folderish = true;
         }
 
         item.selectable = self.isSelectable(item);
 
         if (item.selected === undefined) {
-          var data = self.$el.select2("data");
+          var data = self.$el.select2('data');
           item.selected = false;
           _.each(data, function(obj) {
             if (obj.UID === item.UID) {
@@ -391,9 +391,9 @@ define([
             } else {
               self.selectItem(item);
               $parent.addClass('pattern-relateditems-active');
-              if(self.options.maximumSelectionSize > 0){
+              if (self.options.maximumSelectionSize > 0) {
                 var items = self.$select2.select2('data');
-                if(items.length >= self.options.maximumSelectionSize){
+                if (items.length >= self.options.maximumSelectionSize) {
                   self.$select2.select2('close');
                 }
               }
@@ -417,9 +417,11 @@ define([
           var ids = value.split(self.options.separator);
           self.query.search(
             'UID', 'plone.app.querystring.operation.list.contains', ids,
-            function(data){
+            function(data) {
               callback(data.results);
-          }, false);
+            },
+            false
+          );
         }
       };
 
@@ -438,15 +440,15 @@ define([
       self.$browsePath = $('<span class="pattern-relateditems-path" />');
       self.$container.prepend(self.$browsePath);
 
-      if(self.options.mode === 'search'){
+      if (self.options.mode === 'search') {
         self.deactivateBrowsing();
         self.browsing = false;
-      }else{
+      } else {
         self.activateBrowsing();
         self.browsing = true;
       }
 
-      self.$el.on("select2-selecting", function(event) {
+      self.$el.on('select2-selecting', function(event) {
         event.preventDefault();
       });
 
diff --git a/js/patterns/select2.js b/js/patterns/select2.js
index db92476..b846133 100644
--- a/js/patterns/select2.js
+++ b/js/patterns/select2.js
@@ -82,14 +82,14 @@ define([
   'jquery.event.drag',
   'jquery.event.drop'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Select2 = Base.extend({
-    name: "select2",
+    name: 'select2',
     defaults: {
-      separator: ","
+      separator: ','
     },
-    initializeValues: function(){
+    initializeValues: function() {
       var self = this;
       // Init Selection ---------------------------------------------
       if (self.options.initialValues) {
@@ -106,7 +106,7 @@ define([
           if (typeof(self.options.initialValues) === 'string' && self.options.initialValues !== '') {
             // if default selection value starts with a '{', then treat the value as
             // a JSON object that needs to be parsed
-            if(self.options.initialValues[0] === '{') {
+            if (self.options.initialValues[0] === '{') {
               seldefaults = JSON.parse(self.options.initialValues);
             }
             // otherwise, treat the value as a list, separated by the defaults.separator value of
@@ -133,7 +133,7 @@ define([
         };
       }
     },
-    initializeTags: function(){
+    initializeTags: function() {
       var self = this;
       if (self.options.tags && typeof(self.options.tags) === 'string') {
         if (self.options.tags.substr(0, 1) === '[') {
@@ -144,33 +144,32 @@ define([
       }
 
       if (self.options.tags && !self.options.allowNewItems) {
-         self.options.data = $.map (self.options.tags, function (value, i) {
-             return { id: value, text: value };
-         });
-         self.options.multiple = true;
-         delete self.options.tags;
+        self.options.data = $.map (self.options.tags, function (value, i) {
+          return { id: value, text: value };
+        });
+        self.options.multiple = true;
+        delete self.options.tags;
       }
     },
-    initializeOrdering: function(){
+    initializeOrdering: function() {
       var self = this;
       if (self.options.orderable) {
-        var formatSelection = function(data, $container){
+        var formatSelection = function(data, $container) {
           return data ? data.text : undefined;
         };
-        if(self.options.formatSelection){
+        if (self.options.formatSelection) {
           formatSelection = self.options.formatSelection;
         }
 
         self.options.formatSelection = function(data, $container) {
           $container.parents('li')
-            .drag("start", function(e, dd) {
+            .drag('start', function(e, dd) {
               $(this).addClass('select2-choice-dragging');
-              self.$el.select2("onSortStart");
+              self.$el.select2('onSortStart');
               $.drop({
                 tolerance: function(event, proxy, target) {
                   var test = event.pageY > (target.top + target.height / 2);
-                  $.data(target.elem, "drop+reorder",
-                         test ? "insertAfter" : "insertBefore" );
+                  $.data(target.elem, 'drop+reorder', test ? 'insertAfter' : 'insertBefore' );
                   return this.contains(target, [event.pageX, event.pageY]);
                 }
               });
@@ -186,22 +185,22 @@ define([
                 left: dd.offsetX
               });
               var drop = dd.drop[0],
-                  method = $.data(drop || {}, "drop+reorder");
+                  method = $.data(drop || {}, 'drop+reorder');
 
               /* XXX Cannot use triple equals here */
-              if (drop && (drop != dd.current || method != dd.method)){
+              if (drop && (drop != dd.current || method != dd.method)) {
                 $(this)[method](drop);
                 dd.current = drop;
                 dd.method = method;
                 dd.update();
               }
             })
-            .drag("end", function(e, dd) {
+            .drag('end', function(e, dd) {
               $(this).removeClass('select2-choice-dragging');
-              self.$el.select2("onSortEnd");
+              self.$el.select2('onSortEnd');
               $( dd.proxy ).remove();
             })
-            .drop("init", function(e, dd ) {
+            .drop('init', function(e, dd ) {
               /*jshint eqeqeq:false */
               /* XXX Cannot use triple equals here */
               return (this == dd.drag) ? false: true;
@@ -210,12 +209,12 @@ define([
         };
       }
     },
-    initializeSelect2: function(){
+    initializeSelect2: function() {
       var self = this;
       self.$el.select2(self.options);
       self.$select2 = self.$el.parent().find('.select2-container');
       self.$el.parent().off('close.modal.patterns');
-      if(self.options.orderable){
+      if (self.options.orderable) {
         self.$select2.addClass('select2-orderable');
       }
     },
@@ -226,7 +225,7 @@ define([
             JSON.parse(self.options.allowNewItems) : true;
 
       if (self.options.ajax || self.options.vocabularyUrl) {
-        if(self.options.vocabularyUrl) {
+        if (self.options.vocabularyUrl) {
           self.options.multiple = true;
           self.options.ajax = self.options.ajax || {};
           self.options.ajax.url = self.options.vocabularyUrl;
@@ -240,34 +239,34 @@ define([
           };
         }
 
-        var query_term = '';
+        var queryTerm = '';
         self.options.ajax = $.extend({
           quietMillis: 300,
           data: function (term, page) {
-            query_term = term;
+            queryTerm = term;
             return {
               query: term,
-              page_limit: 10,
+              'page_limit': 10,
               page: page
             };
           },
           results: function (data, page) {
             var results = data.results;
             if (self.options.vocabularyUrl) {
-              var data_ids = [];
+              var dataIds = [];
               $.each(data.results, function(i, item) {
-                data_ids.push(item.id);
+                dataIds.push(item.id);
               });
               results = [];
 
-              var have_result = query_term === '' || $.inArray(query_term, data_ids) >= 0;
-              if (self.options.allowNewItems && !have_result) {
-                  results.push({id:query_term, text:query_term});
+              var haveResult = queryTerm === '' || $.inArray(queryTerm, dataIds) >= 0;
+              if (self.options.allowNewItems && !haveResult) {
+                results.push({id: queryTerm, text: queryTerm});
               }
 
-              if (have_result || self.options.allowNewItems) {
+              if (haveResult || self.options.allowNewItems) {
                 $.each(data.results, function(i, item) {
-                    results.push(item);
+                  results.push(item);
                 });
               }
             }
@@ -278,16 +277,13 @@ define([
         // Multiselects need to be converted to input[type=hidden]
         // for Select2
         var vals = self.$el.val() || [];
-        var options = $.map(self.$el.find('option'),
-                            function (o) {
-                                return {text: $(o).html(), id: o.value};
-                            });
+        var options = $.map(self.$el.find('option'), function (o) { return {text: $(o).html(), id: o.value}; });
         var $hidden = $('<input type="hidden" />');
         $hidden.val(vals.join(self.options.separator));
         $hidden.attr('class', self.$el.attr('class'));
         $hidden.attr('name', self.$el.attr('name'));
         $hidden.attr('id', self.$el.attr('id'));
-        self.$orig_el = self.$el;
+        self.$orig = self.$el;
         self.$el.replaceWith($hidden);
         self.$el = $hidden;
         self.options.data = options;
diff --git a/js/patterns/sortable.js b/js/patterns/sortable.js
index 8d65b7e..36c62e4 100644
--- a/js/patterns/sortable.js
+++ b/js/patterns/sortable.js
@@ -65,10 +65,10 @@ define([
   'jquery.event.drag',
   'jquery.event.drop'
 ], function($, Base, drag, drop) {
-  "use strict";
+  'use strict';
 
   var SortablePattern = Base.extend({
-    name: "sortable",
+    name: 'sortable',
     defaults: {
       selector: 'li',
       dragClass: 'item-dragging',
@@ -84,13 +84,12 @@ define([
         $(dragged).addClass(self.options.dragClass);
         drop({
           tolerance: function(event, proxy, target) {
-            if($(target.elem).closest(self.$el).length === 0){
+            if ($(target.elem).closest(self.$el).length === 0) {
               /* prevent dragging conflict over another drag area */
               return;
             }
             var test = event.pageY > (target.top + target.height / 2);
-            $.data(target.elem, "drop+reorder",
-                   test ? "insertAfter" : "insertBefore" );
+            $.data(target.elem, 'drop+reorder', test ? 'insertAfter' : 'insertBefore' );
             return this.contains(target, [event.pageX, event.pageY]);
           }
         });
@@ -107,9 +106,9 @@ define([
           left: dd.offsetX
         });
         var drop = dd.drop[0],
-            method = $.data(drop || {}, "drop+reorder");
+            method = $.data(drop || {}, 'drop+reorder');
         /* XXX Cannot use triple equals here */
-        if (method && drop && (drop != dd.current || method != dd.method)){
+        if (method && drop && (drop != dd.current || method != dd.method)) {
           $(this)[method](drop);
           dd.current = drop;
           dd.method = method;
@@ -120,7 +119,7 @@ define([
         var $el = $(this);
         $el.removeClass(self.options.dragClass);
         $(dd.proxy).remove();
-        if(self.options.drop){
+        if (self.options.drop) {
           self.options.drop($el, $el.index() - start);
         }
       })
diff --git a/js/patterns/structure/collections/result.js b/js/patterns/structure/collections/result.js
index 921d777..75bd323 100644
--- a/js/patterns/structure/collections/result.js
+++ b/js/patterns/structure/collections/result.js
@@ -29,32 +29,32 @@ define([
   'js/patterns/structure/models/result',
   'backbone.paginator'
 ], function(_, Backbone, Result) {
-"use strict";
+  'use strict';
 
   var ResultCollection = Backbone.Paginator.requestPager.extend({
     model: Result,
     queryHelper: null, // need to set
-    initialize: function(models, options){
+    initialize: function(models, options) {
       this.options = options;
       this.url = options.url;
       this.queryParser = options.queryParser;
       this.queryHelper = options.queryHelper;
       Backbone.Paginator.requestPager.prototype.initialize.apply(this, [models, options]);
     },
-    pager: function(){
+    pager: function() {
       this.trigger('pager');
       Backbone.Paginator.requestPager.prototype.pager.apply(this, []);
     },
-    paginator_core: {
+    'paginator_core': {
       // the type of the request (GET by default)
       type: 'GET',
       // the type of reply (jsonp by default)
       dataType: 'json',
-      url: function(){
+      url: function() {
         return this.url;
       }
     },
-    paginator_ui: {
+    'paginator_ui': {
       // the lowest page index your API allows to be accessed
       firstPage: 1,
       // which page should the paginator start from
@@ -63,15 +63,15 @@ define([
       // how many items per page should be shown
       perPage: 15
     },
-    server_api: {
-      query: function(){
+    'server_api': {
+      query: function() {
         return this.queryParser();
       },
-      batch: function(){
+      batch: function() {
         this.queryHelper.options.batchSize = this.perPage;
         return JSON.stringify(this.queryHelper.getBatch(this.currentPage));
       },
-      attributes: function(){
+      attributes: function() {
         return JSON.stringify(this.queryHelper.options.attributes);
       }
     },
@@ -80,7 +80,7 @@ define([
       var results = response.results;
       // XXX manually set sort order here since backbone will otherwise
       // do arbitrary sorting?
-      _.each(results, function(item, idx){
+      _.each(results, function(item, idx) {
         item._sort = idx;
       });
       return results;
diff --git a/js/patterns/structure/collections/selected.js b/js/patterns/structure/collections/selected.js
index eec85e8..2ea969c 100644
--- a/js/patterns/structure/collections/selected.js
+++ b/js/patterns/structure/collections/selected.js
@@ -27,21 +27,21 @@ define([
   'backbone',
   'js/patterns/structure/models/result'
 ], function(Backbone, Result) {
-"use strict";
+  'use strict';
 
   var SelectedCollection = Backbone.Collection.extend({
     model: Result,
-    removeResult: function(model){
+    removeResult: function(model) {
       return this.removeByUID(model.uid());
     },
-    removeByUID: function(uid){
+    removeByUID: function(uid) {
       var found = this.getByUID(uid);
-      if(found){
+      if (found) {
         this.remove(found);
       }
       return found;
     },
-    getByUID: function(uid){
+    getByUID: function(uid) {
       return this.findWhere({UID: uid});
     }
   });
diff --git a/js/patterns/structure/models/result.js b/js/patterns/structure/models/result.js
index 001c06d..d4eb707 100644
--- a/js/patterns/structure/models/result.js
+++ b/js/patterns/structure/models/result.js
@@ -24,16 +24,16 @@
 
 
 define(['backbone'], function(Backbone) {
-  "use strict";
+  'use strict';
 
   var Result = Backbone.Model.extend({
-    defaults: function(){
+    defaults: function() {
       return {
-        is_folderish: false,
-        review_state: ''
+        'is_folderish': false,
+        'review_state': ''
       };
     },
-    uid: function(){
+    uid: function() {
       return this.attributes.UID;
     }
   });
diff --git a/js/patterns/structure/pattern.js b/js/patterns/structure/pattern.js
index 81f140a..f09f758 100644
--- a/js/patterns/structure/pattern.js
+++ b/js/patterns/structure/pattern.js
@@ -54,7 +54,7 @@ define([
   'text!js/patterns/structure/templates/table.xml',
   'text!js/ui/templates/popover.xml'
 ], function($, Base, utils, AppView) {
-  "use strict";
+  'use strict';
 
   var Structure = Base.extend({
     name: 'structure',
@@ -66,10 +66,12 @@ define([
       contextInfoUrl: null, // for add new dropdown and other info
       setDefaultPageUrl: null,
       backdropSelector: '.modal', // Element upon which to apply backdrops used for popovers
-      attributes: ['UID', 'Title', 'Type', 'path', 'review_state',
-                   'ModificationDate', 'EffectiveDate', 'CreationDate',
-                   'is_folderish', 'Subject', 'getURL', 'id', 'exclude_from_nav',
-                   'getObjSize', 'last_comment_date', 'total_comments'],
+      attributes: [
+        'UID', 'Title', 'Type', 'path', 'review_state',
+        'ModificationDate', 'EffectiveDate', 'CreationDate',
+        'is_folderish', 'Subject', 'getURL', 'id', 'exclude_from_nav',
+        'getObjSize', 'last_comment_date', 'total_comments'
+      ],
       activeColumns: [
         'ModificationDate',
         'EffectiveDate',
diff --git a/js/patterns/structure/views/addmenu.js b/js/patterns/structure/views/addmenu.js
index 1cb1570..4188d96 100644
--- a/js/patterns/structure/views/addmenu.js
+++ b/js/patterns/structure/views/addmenu.js
@@ -22,6 +22,7 @@
 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 //
 
+/* global alert:true */
 
 define([
   'jquery',
@@ -33,19 +34,19 @@ define([
   'mockup-utils',
   'bootstrap-dropdown'
 ], function($, _, Backbone, ButtonGroup, ButtonView, Modal, utils) {
-  "use strict";
+  'use strict';
 
   var AddMenu = ButtonGroup.extend({
     title: 'Add',
     className: 'btn-group addnew',
     events: {
     },
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       ButtonGroup.prototype.initialize.apply(self, [options]);
-      self.app.on('context-info-loaded', function(data){
+      self.app.on('context-info-loaded', function(data) {
         self.$items.empty();
-        _.each(data.addButtons, function(item){
+        _.each(data.addButtons, function(item) {
           var view = new ButtonView({
             id: item.id,
             title: item.title,
@@ -57,14 +58,14 @@ define([
 
           wrap.append(view.el);
           self.$items.append(wrap);
-          view.$el.click(function(e){
+          view.$el.click(function(e) {
             self.buttonClicked.apply(self, [e, view]);
             return false;
           });
         });
       });
     },
-    buttonClicked: function(e, button){
+    buttonClicked: function(e, button) {
       var self = this;
       e.preventDefault();
       self.app.loading.show();
@@ -75,7 +76,7 @@ define([
         data: {
           '_authenticator': $('[name="_authenticator"]').val(),
         },
-        success: function(response){
+        success: function(response) {
           self.app.loading.hide();
           var modal = new Modal(self.$el, {
             html: utils.parseBodyTag(response),
@@ -91,14 +92,14 @@ define([
             },
             actions: {
               'input#form-buttons-save, .formControls input[name="form.button.save"]': {
-                onSuccess: function(modal, response, state, xhr, form){
+                onSuccess: function(modal, response, state, xhr, form) {
                   self.app.collection.pager();
-                  if(self.$items.is(':visible')){
+                  if (self.$items.is(':visible')) {
                     self.$dropdown.dropdown('toggle');
                   }
                   modal.hide();
                 },
-                onError: function(){
+                onError: function() {
                   alert('error on form');
                 }
               },
@@ -109,13 +110,13 @@ define([
           });
           modal.show();
         },
-        error: function(){
+        error: function() {
           // XXX handle error
           self.app.loading.hide();
         }
       });
     },
-    render: function(){
+    render: function() {
       var self = this;
       self.$el.empty();
 
diff --git a/js/patterns/structure/views/app.js b/js/patterns/structure/views/app.js
index 3c7250f..dce9794 100644
--- a/js/patterns/structure/views/app.js
+++ b/js/patterns/structure/views/app.js
@@ -54,7 +54,7 @@ define([
             WorkflowView, DeleteView, RenameView, RearrangeView, SelectionButtonView,
             PagingView, AddMenu, ColumnsView, TextFilterView, ResultCollection,
             SelectedCollection, DropZone, utils) {
-  "use strict";
+  'use strict';
 
   var DISABLE_EVENT = 'DISABLE';
 
@@ -85,12 +85,12 @@ define([
     status: '',
     statusType: 'warning',
     pasteOperation: null,
-    sort_on: 'getObjPositionInParent',
-    sort_order: 'ascending',
+    'sort_on': 'getObjPositionInParent',
+    'sort_order': 'ascending',
     additionalCriterias: [],
     pasteSelection: null,
     cookieSettingPrefix: '_fc_',
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       BaseView.prototype.initialize.apply(self, [options]);
       self.setAllCookieSettings();
@@ -101,21 +101,21 @@ define([
 
       self.collection = new ResultCollection([], {
         url: self.options.collectionUrl,
-        queryParser: function(){
+        queryParser: function() {
           var term = null;
-          if(self.toolbar){
+          if (self.toolbar) {
             term = self.toolbar.get('filter').term;
           }
-          var sort_on = self.sort_on;
-          if(!sort_on){
-            sort_on = 'getObjPositionInParent';
+          var sortOn = self['sort_on']; // jshint ignore:line
+          if (!sortOn) {
+            sortOn = 'getObjPositionInParent';
           }
           return JSON.stringify({
             criteria: self.queryHelper.getCriterias(term, {
               additionalCriterias: self.additionalCriterias
             }),
-            sort_on: sort_on,
-            sort_order: self.sort_order
+            'sort_on': sortOn,
+            'sort_order': self['sort_order'] // jshint ignore:line
           });
         },
         queryHelper: self.options.queryHelper
@@ -136,7 +136,7 @@ define([
       });
 
       self.buttonViews = {};
-      _.map(self.buttonViewMapping, function(ViewClass, key, list){
+      _.map(self.buttonViewMapping, function(ViewClass, key, list) {
         var name = key.split('.');
         var group = name[0];
         var buttonName = name[1];
@@ -155,7 +155,7 @@ define([
           self.toolbar.get('selected').enable();
           self.buttons.primary.enable();
           self.buttons.secondary.enable();
-          if(!self.pasteAllowed){
+          if (!self.pasteAllowed) {
             self.buttons.primary.get('paste').disable();
           }
         } else {
@@ -165,36 +165,37 @@ define([
         }
       }, self);
 
-      self.collection.on('sync', function(){
+      self.collection.on('sync', function() {
         // need to reload models inside selectedCollection so they get any
         // updated metadata
-        if(self.selectedCollection.models.length > 0){
+        if (self.selectedCollection.models.length > 0) {
           var uids = [];
-          self.selectedCollection.each(function(item){
+          self.selectedCollection.each(function(item) {
             uids.push(item.attributes.UID);
           });
           self.queryHelper.search(
             'UID', 'plone.app.querystring.operation.list.contains',
             uids,
-            function(data){
-              _.each(data.results, function(attributes){
+            function(data) {
+              _.each(data.results, function(attributes) {
                 var item = self.selectedCollection.getByUID(attributes.UID);
                 item.attributes = attributes;
               });
             },
-            false);
+            false
+          );
         }
 
-        if(self.contextInfoUrl){
+        if (self.contextInfoUrl) {
           $.ajax({
             url: self.getAjaxUrl(self.contextInfoUrl),
             dataType: 'json',
-            success: function(data){
+            success: function(data) {
               self.trigger('context-info-loaded', data);
             },
-            error: function(response){
+            error: function(response) {
               // XXX handle error?
-              if(response.status === 404){
+              if (response.status === 404) {
                 console.log('context info url not found');
               }
             }
@@ -203,71 +204,71 @@ define([
         self.loading.hide();
       });
 
-      self.collection.on('pager', function(){
+      self.collection.on('pager', function() {
         self.loading.show();
       });
 
       /* detect key events */
-      $(document).bind('keyup keydown', function(e){
+      $(document).bind('keyup keydown', function(e) {
         self.keyEvent = e;
       });
 
     },
-    inQueryMode: function(){
-      if(this.additionalCriterias.length > 0){
+    inQueryMode: function() {
+      if (this.additionalCriterias.length > 0) {
         return true;
       }
-      if(this.sort_on && this.sort_on !== 'getObjPositionInParent'){
+      if (this['sort_on'] && this['sort_on'] !== 'getObjPositionInParent') { // jshint ignore:line
         return true;
       }
-      if(this.sort_order !== 'ascending'){
+      if (this['sort_order'] !== 'ascending') { // jshint ignore:line
         return true;
       }
       return false;
     },
-    getSelectedUids: function(collection){
+    getSelectedUids: function(collection) {
       var self = this;
-      if(collection === undefined){
+      if (collection === undefined) {
         collection = self.selectedCollection;
       }
       var uids = [];
-      collection.each(function(item){
+      collection.each(function(item) {
         uids.push(item.uid());
       });
       return uids;
     },
-    getAjaxUrl: function(url){
+    getAjaxUrl: function(url) {
       return url.replace('{path}', this.options.queryHelper.getCurrentPath());
     },
-    defaultButtonClickEvent: function(button){
+    defaultButtonClickEvent: function(button) {
       var self = this;
       var data = null, callback = null;
 
-      if(button.url){
+      if (button.url) {
         self.loading.show();
         // handle ajax now
 
-        if(arguments.length > 1){
+        if (arguments.length > 1) {
           var arg1 = arguments[1];
-          if(!arg1.preventDefault){
+          if (!arg1.preventDefault) {
             data = arg1;
           }
         }
-        if(arguments.length > 2){
+        if (arguments.length > 2) {
           var arg2 = arguments[2];
-          if(typeof(arg2) === 'function'){
+          if (typeof(arg2) === 'function') {
             callback = arg2;
           }
         }
-        if(data === null){
+        if (data === null) {
           data = {};
         }
-        if(data.selection === undefined){
+        if (data.selection === undefined) {
           // if selection is overridden by another mechanism
           data.selection = JSON.stringify(self.getSelectedUids());
         }
         data._authenticator = $('input[name="_authenticator"]').val();
-        if(data.folder === undefined){
+        if (data.folder === undefined) {
           data.folder = self.options.queryHelper.getCurrentPath();
         }
 
@@ -276,42 +277,42 @@ define([
           url: url,
           type: 'POST',
           data: data,
-          success: function(data){
+          success: function(data) {
             self.ajaxSuccessResponse.apply(self, [data, callback]);
             self.loading.hide();
           },
-          error: function(response){
+          error: function(response) {
             self.ajaxErrorResponse.apply(self, [response, url]);
             self.loading.hide();
           }
         }, self);
       }
     },
-    ajaxSuccessResponse: function(data, callback){
+    ajaxSuccessResponse: function(data, callback) {
       var self = this;
-      if(data.status === 'success'){
+      if (data.status === 'success') {
         self.collection.reset();
       }
-      if(data.msg){
+      if (data.msg) {
         // give status message somewhere...
         self.setStatus(data.msg);
       }
-      if(callback !== null && callback !== undefined){
+      if (callback !== null && callback !== undefined) {
         callback(data);
       }
       self.collection.pager();
     },
-    ajaxErrorResponse: function(response, url){
+    ajaxErrorResponse: function(response, url) {
       var self = this;
-      if(response.status === 404){
+      if (response.status === 404) {
         window.alert('operation url "' + url + '" is not valid');
-      }else{
+      } else {
         window.alert('there was an error performing action');
       }
     },
-    pasteEvent: function(button, e, data){
+    pasteEvent: function(button, e, data) {
       var self = this;
-      if(data === undefined){
+      if (data === undefined) {
         data = {};
       }
       data = $.extend(true, {}, {
@@ -320,20 +321,20 @@ define([
       }, data);
       self.defaultButtonClickEvent(button, data);
     },
-    cutCopyClickEvent: function(button){
+    cutCopyClickEvent: function(button) {
       var self = this;
       var txt;
-      if(button.id === 'cut'){
+      if (button.id === 'cut') {
         txt = 'cut ';
         self.pasteOperation = 'cut';
-      }else{
+      } else {
         txt = 'copied ';
         self.pasteOperation = 'copy';
       }
 
       // clone selected items
       self.pasteSelection = new Backbone.Collection();
-      self.selectedCollection.each(function(item){
+      self.selectedCollection.each(function(item) {
         self.pasteSelection.add(item);
       });
       txt += 'selection';
@@ -341,7 +342,7 @@ define([
       self.pasteAllowed = true;
       self.buttons.primary.get('paste').enable();
     },
-    setupButtons: function(){
+    setupButtons: function() {
       var self = this;
       self.buttons = {};
       var items = [];
@@ -364,14 +365,14 @@ define([
         collection: this.selectedCollection
       }));
 
-      if(self.options.contextInfoUrl){
+      if (self.options.contextInfoUrl) {
         // only add menu if set
         items.push(new AddMenu({
           contextInfoUrl: self.options.contextInfoUrl,
           app: self
         }));
       }
-      if(self.options.rearrange){
+      if (self.options.rearrange) {
         var rearrangeButton = new ButtonView({
           id: 'rearrange',
           title: 'Rearrange',
@@ -385,15 +386,15 @@ define([
         items.push(rearrangeButton);
       }
 
-      _.each(_.pairs(this.options.buttonGroups), function(group){
+      _.each(_.pairs(this.options.buttonGroups), function(group) {
         var buttons = [];
-        _.each(group[1], function(button){
+        _.each(group[1], function(button) {
           button = new ButtonView(button);
           buttons.push(button);
           // bind click events now...
           var ev = self.buttonClickEvents[button.id];
-          if(ev !== DISABLE_EVENT){
-            if(ev === undefined){
+          if (ev !== DISABLE_EVENT) {
+            if (ev === undefined) {
               ev = 'defaultButtonClickEvent'; // default click event
             }
             button.on('button:click', self[ev], self);
@@ -406,14 +407,14 @@ define([
         });
         items.push(self.buttons[group[0]]);
       });
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         var uploadBtn = new ButtonView({
           title: 'Upload',
           context: 'success',
           icon: 'upload'
         });
         items.push(uploadBtn);
-        uploadBtn.on('button:click', function(){
+        uploadBtn.on('button:click', function() {
           // update because the url can change depending on the folder we're in.
           self.dropzone.options.url = self.getAjaxUrl(self.options.uploadUrl);
           self.dropzone.hiddenFileInput.click();
@@ -427,7 +428,7 @@ define([
         items: items
       });
     },
-    moveItem: function(id, delta, subset_ids){
+    moveItem: function(id, delta, subsetIds) {
       var self = this;
       $.ajax({
         url: this.getAjaxUrl(this.options.moveUrl),
@@ -436,42 +437,42 @@ define([
           delta: delta,
           id: id,
           _authenticator: $('[name="_authenticator"]').val(),
-          subset_ids: JSON.stringify(subset_ids)
+          subsetIds: JSON.stringify(subsetIds)
         },
         dataType: 'json',
-        success: function(data){
-          if(data.msg){
+        success: function(data) {
+          if (data.msg) {
             self.setStatus(data.msg);
-          }else if(data.status !== "success"){
+          }else if (data.status !== 'success') {
             // XXX handle error here with something?
             self.setStatus('error moving item');
           }
           self.collection.pager(); // reload it all
         },
-        error: function(data){
+        error: function(data) {
           self.setStatus('error moving item');
         }
       });
     },
-    setStatus: function(txt, type){
+    setStatus: function(txt, type) {
       this.status = txt;
-      if(type === undefined){
+      if (type === undefined) {
         type = 'warning';
       }
       this.statusType = type;
       this.$('.status').addClass(type).html(txt);
     },
-    render: function(){
+    render: function() {
       var self = this;
 
       self.$el.append(self.toolbar.render().el);
       self.$el.append(self.wellView.render().el);
       self.$el.append(self.columnsView.render().el);
-      if(self.rearrangeView){
+      if (self.rearrangeView) {
         self.$el.append(self.rearrangeView.render().el);
       }
 
-      _.each(self.buttonViews, function(view){
+      _.each(self.buttonViews, function(view) {
         self.$el.append(view.render().el);
       });
 
@@ -479,7 +480,7 @@ define([
       self.$el.append(self.pagingView.render().el);
 
       /* dropzone support */
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         self.dropzone = new DropZone(self.$el, {
           className: 'structure-dropzone',
           //clickable: false,
@@ -487,11 +488,11 @@ define([
           url: self.getAjaxUrl(self.options.uploadUrl),
           autoCleanResults: true,
           useTus: self.options.useTus,
-          success: function(){
+          success: function() {
             self.collection.pager();
           }
         }).dropzone;
-        self.dropzone.on('drop', function(){
+        self.dropzone.on('drop', function() {
           // because this can change depending on the folder we're in
           self.dropzone.options.url = self.getAjaxUrl(self.options.uploadUrl);
         });
@@ -508,29 +509,29 @@ define([
 
       return self;
     },
-    getCookieSetting: function(name, _default){
-      if(_default === undefined){
+    getCookieSetting: function(name, _default) {
+      if (_default === undefined) {
         _default = null;
       }
       var val;
-      try{
+      try {
         val = $.cookie(this.cookieSettingPrefix + name);
         val = $.parseJSON(val).value;
-      }catch(e){
+      } catch (e) {
         /* error parsing json, load default here now */
         return _default;
       }
-      if(val === undefined || val === null){
+      if (val === undefined || val === null) {
         return _default;
       }
       return val;
     },
-    setCookieSetting: function(name, val){
+    setCookieSetting: function(name, val) {
       $.cookie(this.cookieSettingPrefix + name,
                JSON.stringify({'value': val})
       );
     },
-    setAllCookieSettings: function(){
+    setAllCookieSettings: function() {
       this.activeColumns = this.getCookieSetting('activeColumns', this.activeColumns);
     }
   });
diff --git a/js/patterns/structure/views/columns.js b/js/patterns/structure/views/columns.js
index a2b3468..dc91f22 100644
--- a/js/patterns/structure/views/columns.js
+++ b/js/patterns/structure/views/columns.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-sortable'
 ], function($, _, Backbone, PopoverView, Sortable) {
-  "use strict";
+  'use strict';
 
   var ColumnsView = PopoverView.extend({
     className: 'popover columns',
@@ -47,19 +47,20 @@ define([
           '<input type="checkbox" value="<%- id %>"/>' +
           '<%- title %>' +
         '</label>' +
-      '</li>'),
+      '</li>'
+    ),
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       var self = this;
       PopoverView.prototype.render.call(this);
       self.$container = self.$('ul');
-      _.each(self.app.activeColumns, function(id){
+      _.each(self.app.activeColumns, function(id) {
         var $el = $(self.itemTemplate({
           title: self.app.availableColumns[id],
           id: id
@@ -67,7 +68,7 @@ define([
         $el.find('input')[0].checked = true;
         self.$container.append($el);
       });
-      _.each(_.omit(self.app.availableColumns, self.app.activeColumns), function(name, id){
+      _.each(_.omit(self.app.availableColumns, self.app.activeColumns), function(name, id) {
         var $el = $(self.itemTemplate({
           title: name,
           id: id
@@ -81,11 +82,11 @@ define([
 
       return this;
     },
-    applyButtonClicked: function(){
+    applyButtonClicked: function() {
       var self = this;
       this.hide();
       self.app.activeColumns = [];
-      self.$('input:checked').each(function(){
+      self.$('input:checked').each(function() {
         self.app.activeColumns.push($(this).val());
       });
       self.app.setCookieSetting('activeColumns', this.app.activeColumns);
diff --git a/js/patterns/structure/views/delete.js b/js/patterns/structure/views/delete.js
index 81e22e2..d6116da 100644
--- a/js/patterns/structure/views/delete.js
+++ b/js/patterns/structure/views/delete.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var DeleteView = PopoverView.extend({
     className: 'popover delete',
@@ -41,17 +41,17 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var self = this;
-      this.app.defaultButtonClickEvent(this.triggerView, {}, function(data){
+      this.app.defaultButtonClickEvent(this.triggerView, {}, function(data) {
         self.app.selectedCollection.reset();
       });
       this.hide();
diff --git a/js/patterns/structure/views/paging.js b/js/patterns/structure/views/paging.js
index 823205c..531f50e 100644
--- a/js/patterns/structure/views/paging.js
+++ b/js/patterns/structure/views/paging.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'text!js/patterns/structure/templates/paging.xml'
 ], function($, _, Backbone, PagingTemplate) {
-  "use strict";
+  'use strict';
 
 
   var PagingView = Backbone.View.extend({
@@ -63,36 +63,36 @@ define([
       this.$el.html(html);
       return this;
     },
-    getPages: function(data){
+    getPages: function(data) {
       var perPage = data.perPage;
       var totalPages = data.totalPages;
-      if(!totalPages){
+      if (!totalPages) {
         return [];
       }
       var currentPage = data.currentPage;
       var left = 1;
       var right = totalPages;
-      if(totalPages > this.maxPages){
+      if (totalPages > this.maxPages) {
         left = Math.max(1, Math.floor(currentPage - (this.maxPages / 2)));
         right = Math.min(left + this.maxPages, totalPages);
-        if((right - left) < this.maxPages){
+        if ((right - left) < this.maxPages) {
           left = left - Math.floor(this.maxPages / 2);
         }
       }
       var pages = [];
-      for(var i=left; i<=right; i=i+1){
+      for (var i = left; i <= right; i = i + 1) {
         pages.push(i);
       }
 
       /* add before and after */
-      if(pages[0] > 1){
-        if(pages[0] > 2){
+      if (pages[0] > 1) {
+        if (pages[0] > 2) {
           pages = ['...'].concat(pages);
         }
         pages = [1].concat(pages);
       }
-      if(pages[pages.length - 1] < (totalPages - 1)){
-        if(pages[pages.length - 2] < totalPages - 2){
+      if (pages[pages.length - 1] < (totalPages - 1)) {
+        if (pages[pages.length - 2] < totalPages - 2) {
           pages.push('...');
         }
         pages.push(totalPages);
diff --git a/js/patterns/structure/views/properties.js b/js/patterns/structure/views/properties.js
index bc0192c..7151309 100644
--- a/js/patterns/structure/views/properties.js
+++ b/js/patterns/structure/views/properties.js
@@ -1,6 +1,4 @@
-// Author: Nathan Van Gheem
-// Contact: nathan at vangheem.us
-// Version: 1.0
+// Author: Nathan Van Gheem Contact: nathan at vangheem.us Version: 1.0
 //
 // Description:
 //
@@ -31,7 +29,7 @@ define([
   'mockup-patterns-pickadate',
   'mockup-patterns-select2'
 ], function($, _, Backbone, PopoverView, PickADate, Select2) {
-  "use strict";
+  'use strict';
 
   var PropertiesView = PopoverView.extend({
     className: 'popover properties',
@@ -75,11 +73,11 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$effective = this.$('[name="effective"]');
       this.$expiration = this.$('[name="expiration"]');
@@ -100,7 +98,7 @@ define([
       this.expirationPickADate = new PickADate(this.$expiration);
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var data = {
         effectiveDate: this.effectivePickADate.$date.attr('value'),
         effectiveTime: this.effectivePickADate.$time.attr('value'),
@@ -110,16 +108,16 @@ define([
         contributors: JSON.stringify(this.$contributors.select2('data')),
         creators: JSON.stringify(this.$creators.select2('data'))
       };
-      if(this.$('[name="exclude-from-nav"]:checked').length > 0){
-        data.exclude_from_nav = this.$('[name="exclude-from-nav"]:checked').val();
+      if (this.$('[name="exclude-from-nav"]:checked').length > 0) {
+        data['exclude_from_nav'] = this.$('[name="exclude-from-nav"]:checked').val(); // jshint ignore:line
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!this.opened){
+      if (!this.opened) {
         return;
       }
       this.$effective.attr('value', '');
@@ -127,7 +125,7 @@ define([
       this.$copyright.html('');
       this.$creators.select2('data', []);
       this.$contributors.select2('data', []);
-      this.$exclude.each(function(){
+      this.$exclude.each(function() {
         this.checked = false;
       });
     }
diff --git a/js/patterns/structure/views/rearrange.js b/js/patterns/structure/views/rearrange.js
index a077e65..49d4655 100644
--- a/js/patterns/structure/views/rearrange.js
+++ b/js/patterns/structure/views/rearrange.js
@@ -28,7 +28,7 @@ define([
   'underscore',
   'js/ui/views/popover'
 ], function($, _, PopoverView) {
-  "use strict";
+  'use strict';
 
   var RearrangeView = PopoverView.extend({
     className: 'popover rearrange',
@@ -37,7 +37,7 @@ define([
       '<div class="form-group">' +
         '<label>What to rearrange on</label>' +
         '<select name="rearrange_on" class="form-control">' +
-          '<% _.each(rearrangeProperties, function(title, property){ %>' +
+          '<% _.each(rearrangeProperties, function(title, property) { %>' +
             '<option value="<%- property %>"><%- title %></option>' +
           '<% }); %>' +
         '</select>' +
@@ -55,23 +55,23 @@ define([
     events: {
       'click button': 'rearrangeButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
       this.options.rearrangeProperties = this.app.options.rearrange.properties;
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$rearrangeOn = this.$('[name="rearrange_on"]');
       this.$reversed = this.$('[name="reversed"]');
       return this;
     },
-    rearrangeButtonClicked: function(){
+    rearrangeButtonClicked: function() {
       var data = {
-        rearrange_on: this.$rearrangeOn.val(),
+        'rearrange_on': this.$rearrangeOn.val(),
         reversed: false
       };
-      if(this.$reversed[0].checked){
+      if (this.$reversed[0].checked) {
         data.reversed = true;
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
diff --git a/js/patterns/structure/views/rename.js b/js/patterns/structure/views/rename.js
index 9fe8037..792cf87 100644
--- a/js/patterns/structure/views/rename.js
+++ b/js/patterns/structure/views/rename.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var PropertiesView = PopoverView.extend({
     className: 'popover rename',
@@ -47,22 +47,23 @@ define([
           '<label>Short name</label>' +
           '<input class="form-control" name="newid" value="<%= id %>" />' +
         '</div>' +
-      '</div>'),
+      '</div>'
+    ),
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$items = this.$('.itemstoremove');
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var torename = [];
-      this.$items.find('.item').each(function(){
+      this.$items.find('.item').each(function() {
         var $item = $(this);
         torename.push({
           UID: $item.find('[name="UID"]').val(),
@@ -76,14 +77,14 @@ define([
       });
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!self.opened){
+      if (!self.opened) {
         return;
       }
       self.$items.empty();
-      self.app.selectedCollection.each(function(item){
+      self.app.selectedCollection.each(function(item) {
         self.$items.append(self.itemTemplate(item.toJSON()));
       });
     }
diff --git a/js/patterns/structure/views/selectionbutton.js b/js/patterns/structure/views/selectionbutton.js
index c854682..54e68fa 100644
--- a/js/patterns/structure/views/selectionbutton.js
+++ b/js/patterns/structure/views/selectionbutton.js
@@ -29,13 +29,12 @@ define([
   'underscore',
   'js/ui/views/button',
   'text!js/patterns/structure/templates/selection_button.xml'
-  ],
-  function($, Backbone, _, ButtonView, tpl_button) {
-  "use strict";
+], function($, Backbone, _, ButtonView, tplButton) {
+  'use strict';
 
   var SelectionButton = ButtonView.extend({
     collection: null,
-    template: tpl_button,
+    template: tplButton,
     initialize: function(options) {
       ButtonView.prototype.initialize.apply(this, [options]);
 
diff --git a/js/patterns/structure/views/selectionwell.js b/js/patterns/structure/views/selectionwell.js
index dca2d9f..1cdda50 100644
--- a/js/patterns/structure/views/selectionwell.js
+++ b/js/patterns/structure/views/selectionwell.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'text!js/patterns/structure/templates/selection_item.xml'
 ], function($, _, Backbone, PopoverView, ItemTemplate) {
-  "use strict";
+  'use strict';
 
   var WellView = PopoverView.extend({
     className: 'popover selected',
@@ -38,18 +38,19 @@ define([
                       '<a href="#" class=" remove-all">' +
                         '<span class="glyphicon glyphicon-remove-circle"></span> remove all</a>'),
     content: _.template(
-      '<% collection.each(function(item){ %>' +
-        '<%= item_template(item.toJSON()) %>' +
-      '<% }); %>'),
+      '<% collection.each(function(item) { %>' +
+      '<%= item_template(item.toJSON()) %>' +
+      '<% }); %>'
+    ),
     events: {
       'click a.remove': 'itemRemoved',
       'keyup input.filter': 'filterSelected',
       'click .remove-all': 'removeAll'
     },
-    initialize: function(options){
+    initialize: function(options) {
       PopoverView.prototype.initialize.apply(this, [options]);
       this.listenTo(this.collection, 'reset all add remove', this.render);
-      this.options.item_template = _.template(ItemTemplate);
+      this.options['item_template'] = _.template(ItemTemplate); // jshint ignore:line
     },
     render: function () {
       PopoverView.prototype.render.call(this);
@@ -58,11 +59,11 @@ define([
       }
       return this;
     },
-    itemRemoved: function(e){
+    itemRemoved: function(e) {
       e.preventDefault();
       var uid = $(e.currentTarget).data('uid');
       this.collection.removeByUID(uid);
-      if(this.collection.length !== 0){
+      if (this.collection.length !== 0) {
         // re-rendering causes it to close, reopen
         this.show();
       }
diff --git a/js/patterns/structure/views/table.js b/js/patterns/structure/views/table.js
index 7de4865..40c45f6 100644
--- a/js/patterns/structure/views/table.js
+++ b/js/patterns/structure/views/table.js
@@ -34,12 +34,12 @@ define([
   'mockup-patterns-moment'
 ], function($, _, Backbone, TableRowView, TableTemplate, BaseView, Sortable,
             Moment) {
-  "use strict";
+  'use strict';
 
   var TableView = BaseView.extend({
     tagName: 'div',
     template: _.template(TableTemplate),
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       BaseView.prototype.initialize.apply(self, [options]);
       self.collection = self.app.collection;
@@ -48,20 +48,20 @@ define([
       self.listenTo(self.selectedCollection, 'remove', self.render);
       self.listenTo(self.selectedCollection, 'reset', self.render);
       self.collection.pager();
-      self.subset_ids = [];
+      self.subsetIds = [];
 
-      self.app.on('context-info-loaded', function(data){
+      self.app.on('context-info-loaded', function(data) {
         /* set default page info */
         var $defaultPage = self.$('[data-id="' + data.defaultPage + '"]');
-        if($defaultPage.length > 0){
+        if ($defaultPage.length > 0) {
           $defaultPage.find('td.title').prepend('<span>*</span> ');
           $defaultPage.addClass('default-page');
         }
         /* set breadcrumb title info */
         var crumbs = data.breadcrumbs;
-        if(crumbs && crumbs.length){
+        if (crumbs && crumbs.length) {
           var $crumbs = self.$('.breadcrumbs a.crumb');
-          _.each(crumbs, function(crumb, idx){
+          _.each(crumbs, function(crumb, idx) {
             $crumbs.eq(idx).html(crumb.title);
           });
         }
@@ -81,9 +81,9 @@ define([
         availableColumns: self.app.availableColumns
       }));
 
-      if(self.collection.length){
+      if (self.collection.length) {
         var container = self.$('tbody');
-        self.collection.each(function(result){
+        self.collection.each(function(result) {
           var view = (new TableRowView({
             model: result,
             app: self.app,
@@ -101,17 +101,17 @@ define([
       self.storeOrder();
       return this;
     },
-    breadcrumbClicked: function(e){
+    breadcrumbClicked: function(e) {
       e.preventDefault();
       var $el = $(e.target);
-      if($el[0].tagName !== 'A'){
+      if ($el[0].tagName !== 'A') {
         $el = $el.parent('a');
       }
       var path = '';
-      $($el.prevAll('a').get().reverse()).each(function(){
+      $($el.prevAll('a').get().reverse()).each(function() {
         var part = $(this).attr('data-path');
         path += part;
-        if(part !== '/'){
+        if (part !== '/') {
           path += '/';
         }
       });
@@ -132,10 +132,10 @@ define([
         this.$('.select-all').removeAttr('checked');
       }
     },
-    addReordering: function(){
+    addReordering: function() {
       var self = this;
       // if we have a custom query going on, we do not allow sorting.
-      if(self.app.inQueryMode()){
+      if (self.app.inQueryMode()) {
         self.app.setStatus('Can not order items while querying');
         self.$el.removeClass('order-support');
         return;
@@ -144,19 +144,19 @@ define([
       var dd = new Sortable(self.$('tbody'), {
         selector: 'tr',
         dragClass: 'structure-dragging',
-        drop: function($el, delta){
-          self.app.moveItem($el.attr('data-id'), delta, self.subset_ids);
+        drop: function($el, delta) {
+          self.app.moveItem($el.attr('data-id'), delta, self.subsetIds);
           self.storeOrder();
         }
       });
     },
-    storeOrder: function(){
+    storeOrder: function() {
       var self = this;
-      var subset_ids = [];
-      self.$('tbody tr.itemRow').each(function(idx){
-        subset_ids.push($(this).attr('data-id'));
+      var subsetIds = [];
+      self.$('tbody tr.itemRow').each(function(idx) {
+        subsetIds.push($(this).attr('data-id'));
       });
-      self.subset_ids = subset_ids;
+      self.subsetIds = subsetIds;
     }
   });
 
diff --git a/js/patterns/structure/views/tablerow.js b/js/patterns/structure/views/tablerow.js
index 6717b20..29ce67f 100644
--- a/js/patterns/structure/views/tablerow.js
+++ b/js/patterns/structure/views/tablerow.js
@@ -30,7 +30,7 @@ define([
   'text!js/patterns/structure/templates/tablerow.xml',
   'bootstrap-dropdown'
 ], function($, _, Backbone, TableRowTemplate) {
-  "use strict";
+  'use strict';
 
   var TableRowView = Backbone.View.extend({
     tagName: 'tr',
@@ -48,7 +48,7 @@ define([
       'click .openItem a': 'openClicked',
       'click .editItem a': 'editClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.options = options;
       this.app = options.app;
       this.selectedCollection = this.app.selectedCollection;
@@ -58,7 +58,7 @@ define([
       var self = this;
       var data = this.model.toJSON();
       data.selected = false;
-      if(this.selectedCollection.findWhere({UID: data.UID})){
+      if (this.selectedCollection.findWhere({UID: data.UID})) {
         data.selected = true;
       }
       data.attributes = self.model.attributes;
@@ -69,16 +69,16 @@ define([
       data.inQueryMode = self.app.inQueryMode();
       self.$el.html(self.template(data));
       var attrs = self.model.attributes;
-      self.$el.addClass('state-' + attrs.review_state).
-        addClass('type-' + attrs.Type);
-      if(attrs.is_folderish){
+      self.$el.addClass('state-' + attrs['review_state']).addClass('type-' + attrs.Type); // jshint ignore:line
+      if (attrs['is_folderish']) { // jshint ignore:line
         self.$el.addClass('folder');
       }
       self.$el.attr('data-path', data.path);
       self.$el.attr('data-UID', data.UID);
       self.$el.attr('data-id', data.id);
       self.$el.attr('data-type', data.Type);
-      self.$el.attr('data-folderish', data.is_folderish);
+      self.$el.attr('data-folderish', data['is_folderish']); // jshint ignore:line
+
       self.el.model = this.model;
 
       self.$dropdown = self.$('.dropdown-toggle');
@@ -86,27 +86,27 @@ define([
 
       return this;
     },
-    itemClicked: function(e){
+    itemClicked: function(e) {
       e.preventDefault();
       /* check if this should just be opened in new window */
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.ctrlKey){
+      if (keyEvent && keyEvent.ctrlKey) {
         this.openClicked(e);
-      }else if(this.model.attributes.is_folderish){
+      } else if (this.model.attributes['is_folderish']) { // jshint ignore:line
         // it's a folder, go down path and show in contents window.
         this.app.queryHelper.currentPath = this.model.attributes.path;
         // also switch to fix page in batch
         var collection = this.app.collection;
         collection.goTo(collection.information.firstPage);
-      }else{
+      } else {
         this.openClicked(e);
       }
     },
-    itemSelected: function(){
+    itemSelected: function() {
       var checkbox = this.$('input')[0];
-      if(checkbox.checked){
+      if (checkbox.checked) {
         this.app.selectedCollection.add(this.model);
-      }else{
+      } else {
         this.app.selectedCollection.removeResult(this.model);
       }
 
@@ -114,43 +114,43 @@ define([
 
       /* check for shift click now */
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.shiftKey && this.app.last_selected &&
-            this.app.last_selected.parentNode !== null){
-        var $el = $(this.app.last_selected);
-        var last_checked_index = $el.index();
-        var this_index = this.$el.index();
-        this.app.tableView.$('input[type="checkbox"]').each(function(){
+      if (keyEvent && keyEvent.shiftKey && this.app['last_selected'] && // jshint ignore:line
+            this.app['last_selected'].parentNode !== null) { // jshint ignore:line
+        var $el = $(this.app['last_selected']); // jshint ignore:line
+        var lastCheckedIndex = $el.index();
+        var thisIndex = this.$el.index();
+        this.app.tableView.$('input[type="checkbox"]').each(function() {
           $el = $(this);
           var index = $el.parents('tr').index();
-          if((index > last_checked_index && index < this_index) ||
-              (index < last_checked_index && index > this_index)){
+          if ((index > lastCheckedIndex && index < thisIndex) ||
+              (index < lastCheckedIndex && index > thisIndex)) {
             this.checked = checkbox.checked;
             var model = $(this).closest('tr')[0].model;
             var existing = selectedCollection.getByUID(model.attributes.UID);
-            if(this.checked){
-              if(!existing){
+            if (this.checked) {
+              if (!existing) {
                 selectedCollection.add(model);
               }
-            } else if(existing){
+            } else if (existing) {
               selectedCollection.remove(existing);
             }
           }
         });
 
       }
-      this.app.last_selected = this.el;
+      this.app['last_selected'] = this.el; // jshint ignore:line
     },
-    cutClicked: function(e){
+    cutClicked: function(e) {
       e.preventDefault();
       this.cutCopyClicked('cut');
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    copyClicked: function(e){
+    copyClicked: function(e) {
       e.preventDefault();
       this.cutCopyClicked('copy');
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    cutCopyClicked: function(operation){
+    cutCopyClicked: function(operation) {
       var self = this;
       self.app.pasteOperation = operation;
 
@@ -160,22 +160,22 @@ define([
       self.app.pasteAllowed = true;
       self.app.buttons.primary.get('paste').enable();
     },
-    pasteClicked: function(e){
+    pasteClicked: function(e) {
       e.preventDefault();
       this.app.pasteEvent(this.app.buttons.primary.get('paste'), e, {
         folder: this.model.attributes.path
       });
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    moveTopClicked: function(e){
+    moveTopClicked: function(e) {
       e.preventDefault();
       this.app.moveItem(this.model.attributes.id, 'top');
     },
-    moveBottomClicked: function(e){
+    moveBottomClicked: function(e) {
       e.preventDefault();
       this.app.moveItem(this.model.attributes.id, 'bottom');
     },
-    setDefaultPageClicked: function(e){
+    setDefaultPageClicked: function(e) {
       e.preventDefault();
       var self = this;
       $.ajax({
@@ -185,41 +185,41 @@ define([
           '_authenticator': $('[name="_authenticator"]').val(),
           'id': this.$active.attr('data-id')
         },
-        success: function(data){
+        success: function(data) {
           self.app.ajaxSuccessResponse.apply(self.app, [data]);
         },
-        error: function(data){
+        error: function(data) {
           self.app.ajaxErrorResponse.apply(self.app, [data]);
         }
       });
     },
-    getSelectedBaseUrl: function(){
+    getSelectedBaseUrl: function() {
       var self = this;
       return self.model.attributes.getURL;
     },
-    getWindow: function(){
+    getWindow: function() {
       var win = window;
       if (win.parent !== window) {
         win = win.parent;
       }
       return win;
     },
-    openUrl: function(url){
+    openUrl: function(url) {
       var self = this;
       var win = self.getWindow();
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.ctrlKey){
+      if (keyEvent && keyEvent.ctrlKey) {
         win.open(url);
-      }else{
+      } else {
         win.location = url;
       }
     },
-    openClicked: function(e){
+    openClicked: function(e) {
       e.preventDefault();
       var self = this;
       self.openUrl(self.getSelectedBaseUrl() + '/view');
     },
-    editClicked: function(e){
+    editClicked: function(e) {
       e.preventDefault();
       var self = this;
       self.openUrl(self.getSelectedBaseUrl() + '/edit');
diff --git a/js/patterns/structure/views/tags.js b/js/patterns/structure/views/tags.js
index cc831a1..d126b1f 100644
--- a/js/patterns/structure/views/tags.js
+++ b/js/patterns/structure/views/tags.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-select2'
 ], function($, _, Backbone, PopoverView, Select2) {
-  "use strict";
+  'use strict';
 
   var TagsView = PopoverView.extend({
     title: _.template('Add/Remove tags'),
@@ -49,13 +49,13 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       this.removeSelect2 = null;
       this.addSelect2 = null;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$remove = this.$('.toremove');
       this.$add = this.$('.toadd');
@@ -66,24 +66,24 @@ define([
       });
       return this;
     },
-    getSelect2Values: function($el){
+    getSelect2Values: function($el) {
       var values = [];
-      _.each($el.select2('data'), function(item){
+      _.each($el.select2('data'), function(item) {
         values.push(item.id);
       });
       return values;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       this.app.defaultButtonClickEvent(this.triggerView, {
         remove: JSON.stringify(this.getSelect2Values(this.$remove)),
         add: JSON.stringify(this.getSelect2Values(this.$add))
       });
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!this.opened){
+      if (!this.opened) {
         return;
       }
       // clear out
@@ -91,12 +91,12 @@ define([
       self.$remove.empty();
       self.$add.select2('data', []);
 
-      self.app.selectedCollection.each(function(item){
-        if(!item.attributes.Subject){
+      self.app.selectedCollection.each(function(item) {
+        if (!item.attributes.Subject) {
           return;
         }
-        _.each(item.attributes.Subject, function(tag){
-          if(self.$remove.find('[value="' + tag + '"]').length === 0){
+        _.each(item.attributes.Subject, function(tag) {
+          if (self.$remove.find('[value="' + tag + '"]').length === 0) {
             self.$remove.append('<option value="' + tag + '">' + tag + '</option>');
           }
         });
diff --git a/js/patterns/structure/views/textfilter.js b/js/patterns/structure/views/textfilter.js
index 40e658c..24fa369 100644
--- a/js/patterns/structure/views/textfilter.js
+++ b/js/patterns/structure/views/textfilter.js
@@ -32,17 +32,18 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-querystring'
 ], function($, Backbone, _, BaseView, ButtonView, PopoverView, QueryString) {
-  "use strict";
+  'use strict';
 
   var TextFilterView = BaseView.extend({
     tagName: 'div',
     className: 'navbar-search form-search ui-offset-parent',
     template: _.template(
       '<div class="input-group">' +
-        '<input type="text" class="form-control search-query" placeholder="Filter">' +
-        '<span class="input-group-btn">' +
-        '</span>' +
-      '</div>'),
+      '<input type="text" class="form-control search-query" placeholder="Filter">' +
+      '<span class="input-group-btn">' +
+      '</span>' +
+      '</div>'
+    ),
     popoverContent: _.template(
       '<input class="pat-querystring" />'
     ),
@@ -52,11 +53,11 @@ define([
     term: null,
     timeoutId: null,
     keyupDelay: 300,
-    initialize: function(options){
+    initialize: function(options) {
       BaseView.prototype.initialize.apply(this, [options]);
       this.app = this.options.app;
     },
-    render: function(){
+    render: function() {
       this.$el.html(this.template({}));
       this.button = new ButtonView({
         title: 'Query'
@@ -73,30 +74,30 @@ define([
       this.$queryString = this.popover.$('input.pat-querystring');
       this.queryString = new QueryString(
         this.$queryString, {
-        indexOptionsUrl: this.app.options.indexOptionsUrl,
-        showPreviews: false
-      });
+          indexOptionsUrl: this.app.options.indexOptionsUrl,
+          showPreviews: false
+        });
       var self = this;
-      self.queryString.$el.on('change', function(){
-        if(self.timeoutId){
+      self.queryString.$el.on('change', function() {
+        if (self.timeoutId) {
           clearTimeout(self.timeoutId);
         }
-        self.timeoutId = setTimeout(function(){
+        self.timeoutId = setTimeout(function() {
           var criterias = $.parseJSON(self.$queryString.val());
           self.app.additionalCriterias = criterias;
           self.app.collection.pager();
         }, this.keyupDelay);
       });
-      self.queryString.$el.on('initialized', function(){
-        self.queryString.$sortOn.on('change', function(){
-          self.app.sort_on = self.queryString.$sortOn.val();
+      self.queryString.$el.on('initialized', function() {
+        self.queryString.$sortOn.on('change', function() {
+          self.app['sort_on'] = self.queryString.$sortOn.val(); // jshint ignore:line
           self.app.collection.pager();
         });
-        self.queryString.$sortOrder.change(function(){
-          if(self.queryString.$sortOrder[0].checked){
-            self.app.sort_order = 'reverse';
-          }else{
-            self.app.sort_order = 'ascending';
+        self.queryString.$sortOrder.change(function() {
+          if (self.queryString.$sortOrder[0].checked) {
+            self.app['sort_order'] = 'reverse'; // jshint ignore:line
+          } else {
+            self.app['sort_order'] = 'ascending'; // jshint ignore:line
           }
           self.app.collection.pager();
         });
@@ -105,10 +106,10 @@ define([
     },
     filter: function(event) {
       var self = this;
-      if(self.timeoutId){
+      if (self.timeoutId) {
         clearTimeout(self.timeoutId);
       }
-      self.timeoutId = setTimeout(function(){
+      self.timeoutId = setTimeout(function() {
         self.term = $(event.currentTarget).val();
         self.app.collection.pager();
       }, this.keyupDelay);
diff --git a/js/patterns/structure/views/workflow.js b/js/patterns/structure/views/workflow.js
index 4f45dd9..38d50e0 100644
--- a/js/patterns/structure/views/workflow.js
+++ b/js/patterns/structure/views/workflow.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var WorkflowView = PopoverView.extend({
     className: 'popover workflow',
@@ -66,31 +66,31 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$comments = this.$('textarea');
       this.$transition = this.$('select');
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var data = {
         comments: this.$comments.val(),
         transition: this.$transition.val()
       };
-      if(this.$('[name="recurse"]')[0].checked){
+      if (this.$('[name="recurse"]')[0].checked) {
         data.recurse = 'yes';
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!self.opened){
+      if (!self.opened) {
         return;
       }
       self.$comments.val('');
@@ -102,14 +102,12 @@ define([
           selection: JSON.stringify(self.app.getSelectedUids()),
           transitions: true
         },
-        success: function(data){
-          _.each(data.transitions, function(transition){
-            self.$transition.append(
-              '<option value="' + transition.id + '">' + transition.title +
-                '</option>');
+        success: function(data) {
+          _.each(data.transitions, function(transition) {
+            self.$transition.append('<option value="' + transition.id + '">' + transition.title + '</option>');
           });
         },
-        error: function(data){
+        error: function(data) {
           // XXX error handling...
           window.alert('error getting transition data');
         }
diff --git a/js/patterns/tablesorter.js b/js/patterns/tablesorter.js
index 71492fb..3d5a0ec 100644
--- a/js/patterns/tablesorter.js
+++ b/js/patterns/tablesorter.js
@@ -21,7 +21,7 @@
  *      guesses about it. It can turn out weird (try sorting on the "No Date"
  *      column).
  *
- *    # Example 
+ *    # Example
  *
  *    {{ example-1 }}
  *
@@ -92,32 +92,35 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var TableSorter = Base.extend({
-    name: "tablesorter",
+    name: 'tablesorter',
     defaults: {},
-    sortabledataclass: function (cell){
+    sortabledataclass: function (cell) {
       var re, matches;
 
-      re = new RegExp("sortabledata-([^ ]*)","g");
+      re = new RegExp('sortabledata-([^ ]*)','g');
       matches = re.exec(cell.attr('class'));
-      if (matches) { return matches[1]; }
-        else { return null; }
+      if (matches) {
+        return matches[1];
+      } else {
+        return null;
+      }
     },
     sortable: function (cell) {
       var self = this;
-        // convert a cell into something sortable
+      // convert a cell into something sortable
 
       // use sortabledata-xxx cell class if it is defined
       var text = self.sortabledataclass(cell);
       if (text === null) { text = cell.text(); }
 
       // A number, but not a date?
-        if (text.charAt(4) !== '-' && text.charAt(7) !== '-' && !isNaN(parseFloat(text))) {
-            return parseFloat(text);
-        }
-        return text.toLowerCase();
+      if (text.charAt(4) !== '-' && text.charAt(7) !== '-' && !isNaN(parseFloat(text))) {
+        return parseFloat(text);
+      }
+      return text.toLowerCase();
     },
     sort: function ($this) {
       var self = this;
@@ -131,39 +134,39 @@ define([
 
       $($this).parent().find('th .sortdirection')
           .html('&#x2003;');
-      $($this).children('.sortdirection').html(
-          reverse ? '&#x25bc;': '&#x25b2;' );
+      $($this).children('.sortdirection').html( reverse ? '&#x25bc;': '&#x25b2;' );
 
       index = $($this).parent().children('th').index($this);
       data = [];
       usenumbers = true;
       tbody.find('tr').each(function() {
-          var cells, sortableitem;
-
-          cells = $(this).children('td');
-          sortableitem = self.sortable.apply(self, [cells.slice(index,index+1)]);
-          if (isNaN(sortableitem)) { usenumbers = false; }
-          data.push([
-              sortableitem,
-              // crude way to sort by surname and name after first choice
-              self.sortable.apply(self, [cells.slice(1,2)]),
-              self.sortable.apply(self, [cells.slice(0,1)]),
-              this]);
+        var cells, sortableitem;
+
+        cells = $(this).children('td');
+        sortableitem = self.sortable.apply(self, [cells.slice(index,index + 1)]);
+        if (isNaN(sortableitem)) { usenumbers = false; }
+        data.push([
+          sortableitem,
+          // crude way to sort by surname and name after first choice
+          self.sortable.apply(self, [cells.slice(1,2)]),
+          self.sortable.apply(self, [cells.slice(0,1)]),
+          this
+        ]);
       });
 
       if (data.length) {
-          if (usenumbers) {
-              data.sort(function(a,b) {return a[0]-b[0];});
-          } else {
-              data.sort();
-          }
-          if (reverse) { data.reverse(); }
-          table.attr('sorted', reverse ? '' : colnum);
-
-          // appending the tr nodes in sorted order will remove them from their old ordering
-          tbody.append($.map(data, function(a) { return a[3]; }));
-          // jquery :odd and :even are 0 based
-          tbody.each(self.setoddeven);
+        if (usenumbers) {
+          data.sort(function(a,b) { return a[0] - b[0]; });
+        } else {
+          data.sort();
+        }
+        if (reverse) { data.reverse(); }
+        table.attr('sorted', reverse ? '' : colnum);
+
+        // appending the tr nodes in sorted order will remove them from their old ordering
+        tbody.append($.map(data, function(a) { return a[3]; }));
+        // jquery :odd and :even are 0 based
+        tbody.each(self.setoddeven);
       }
     },
 
@@ -184,7 +187,7 @@ define([
       // the first one of the cells gets a up arrow instead.
       self.$el.find('thead th').append(blankarrow.clone())
           .css('cursor', 'pointer')
-          .on("click", function(e) {
+          .on('click', function(e) {
             self.sort.apply(self, [this]);
           });
 
diff --git a/js/patterns/tiles/texttile.js b/js/patterns/tiles/texttile.js
index 1615e22..97c7d81 100644
--- a/js/patterns/tiles/texttile.js
+++ b/js/patterns/tiles/texttile.js
@@ -3,6 +3,7 @@ define([
   'js/patterns/tiles/tiletype',
   'js/patterns/modalform'
 ], function($, TileType, ModalForm) {
+  'use strict';
 
   var TextTile = TileType.register('text', {
     actions: {
diff --git a/js/patterns/tiles/tile.js b/js/patterns/tiles/tile.js
index af4fcf5..f59a5a7 100644
--- a/js/patterns/tiles/tile.js
+++ b/js/patterns/tiles/tile.js
@@ -1,10 +1,11 @@
+
 define([
   'jquery',
   'js/patterns/base',
   'js/patterns/tiles/tiletype',
   'js/patterns/modalform.js'
 ], function($, Base, TileType) {
-  "use strict";
+  'use strict';
 
   // wire events to action buttons.
   //
@@ -20,13 +21,13 @@ define([
     $('> li > a', $el.actions).each(function(i, action) {
       var actionnames = [];
       $($(action).attr('class').split(' ')).each(function(i, classname) {
-        if(classname.substr(0, 7) === 'action-') {
+        if (classname.substr(0, 7) === 'action-') {
           actionnames.push(classname.substr(7, classname.length));
         }
       });
 
       $.each(actionnames, function(i, actionmethod) {
-        if($el.type.actions !== undefined && $el.type.actions[actionmethod] !== undefined) {
+        if ($el.type.actions !== undefined && $el.type.actions[actionmethod] !== undefined) {
           $(action).off('click').on('click', function(e) {
             e.preventDefault();
             e.stopPropagation();
@@ -57,7 +58,7 @@ define([
   //  ajaxType -- type to use for the jquery $.ajax call
   //
   var Tile = Base.extend({
-    name: "tile",
+    name: 'tile',
     defaults: {
       type: 'text',
       autoshow: true,
@@ -78,13 +79,13 @@ define([
       // Grab the element that should contain all the tile content, if it does
       // not exist, create it and append it to the tiles child list
       self.wrapper = $(self.options.innerWrapper);
-      if(self.wrapper.length <= 0) {
+      if (self.wrapper.length <= 0) {
         self.wrapper = $('<div/>').addClass(self.options.innerWrapper);
         self.$el.append(self.wrapper);
         $(self.wrapper).css('position', 'relative'); // to make sure the buttons are positioned correctly
       }
 
-      if(self.options.autoshow) {
+      if (self.options.autoshow) {
         self.show();
       }
     },
@@ -92,46 +93,44 @@ define([
     show: function() {
       var self = this;
 
-      if(self.options.forceload) {
+      if (self.options.forceload) {
         self.hide(); // get rid of all visible content in the tile
       }
 
       // tiles with content don't need to be dynamically loaded,
       // unless the tile has been marked as forced to load
-      if($(self.wrapper).html().trim() === "") {
+      if ($(self.wrapper).html().trim() === '') {
         // add actions
         $(self.wrapper).append(self.actions);
         hookupActions(self);
 
         // show actions on hover
         $('li > a', self.actions).off('hover').on('hover', function(e) {
-          if(self.actions.is(":visible")) {
+          if (self.actions.is(':visible')) {
             self.actions.show();
-          }
-          else {
+          } else {
             self.actions.hide();
           }
         });
         self.wrapper.off('hover').on('hover', function(e) {
-          if(self.actions.is(":visible")) {
+          if (self.actions.is(':visible')) {
             self.actions.hide();
-          }
-          else {
+          } else {
             self.actions.show();
           }
         });
 
         // load content
         self.ajaxXHR = $.ajax({
-            url: self.options.url,
-            type: self.options.ajaxType
+          url: self.options.url,
+          type: self.options.ajaxType
         }).done(function(response, textStatus, xhr) {
           self.ajaxXHR = undefined;
 
           var respcontent = (/<body[^>]*>((.|[\n\r])*)<\/body>/im)
-                              .exec(response)[0]
-                              .replace('<body', '<div')
-                              .replace('</body>', '</div>');
+            .exec(response)[0]
+            .replace('<body', '<div')
+            .replace('</body>', '</div>');
           var contentcore = $('#content', respcontent).html();
           $(self.wrapper).append(contentcore);
 
@@ -142,7 +141,8 @@ define([
     },
 
     hide: function() {
-      $(self.wrapper).html("");
+      var self = this;
+      $(self.wrapper).html('');
     }
   });
 
diff --git a/js/patterns/tiles/tiletype.js b/js/patterns/tiles/tiletype.js
index 9a5678b..aea35c3 100644
--- a/js/patterns/tiles/tiletype.js
+++ b/js/patterns/tiles/tiletype.js
@@ -2,7 +2,7 @@ define([
   'jquery',
   'js/patterns/modalform'
 ], function($, modalform) {
-  "use strict";
+  'use strict';
 
   var TileTypeBase = {
     init: function(name) {
@@ -12,7 +12,7 @@ define([
     },
 
     styleButtons: function(buttons) {
-      buttons.css("cssText", "color: #333333 !important;");
+      buttons.css('cssText', 'color: #333333 !important;');
       buttons.addClass('tile-button');
     },
 
@@ -27,7 +27,7 @@ define([
           actions = $('.tiletype-actions', el).clone();
 
       if (actions.size() === 0) {
-          actions = $('#tiletype-' + self.typeid + ' .tiletype-actions').clone();
+        actions = $('#tiletype-' + self.typeid + ' .tiletype-actions').clone();
       }
 
       self.styleActions(actions);
@@ -51,7 +51,8 @@ define([
 
     constructor.prototype = $.extend(
       base || TileTypeBase,
-      tiletype || {});
+      tiletype || {}
+    );
 
     return constructor;
   }
@@ -75,7 +76,7 @@ define([
     // tiletype -- optional object containing definitions for the tiletype instance
     // base -- optional base object to extend from
     register: function(name, tiletype, base) {
-      if(TypeRegistry[name] === undefined) {
+      if (TypeRegistry[name] === undefined) {
         TypeRegistry[name] = createTileType(name, tiletype, base);
       }
 
diff --git a/js/patterns/tinymce/links.js b/js/patterns/tinymce/links.js
index 2b9c164..4dd11da 100644
--- a/js/patterns/tinymce/links.js
+++ b/js/patterns/tinymce/links.js
@@ -36,32 +36,32 @@ define([
   'text!js/patterns/tinymce/templates/image.xml'
 ], function($, _, Base, RelatedItems, Modal, tinymce, DropZone,
             LinkTemplate, ImageTemplate) {
-  "use strict";
+  'use strict';
 
   var LinkType = Base.extend({
     defaults: {
       linkModal: null // required
     },
-    init: function(){
+    init: function() {
       this.linkModal = this.options.linkModal;
       this.tinypattern = this.options.tinypattern;
       this.tiny = this.tinypattern.tiny;
       this.dom = this.tiny.dom;
       this.$input = this.$el.find('input');
     },
-    value: function(){
+    value: function() {
       return this.$input.val();
     },
-    toUrl: function(){
+    toUrl: function() {
       return this.value();
     },
-    load: function(element){
+    load: function(element) {
       this.$input.attr('value', this.tiny.dom.getAttrib(element, 'data-val'));
     },
-    set: function(val){
+    set: function(val) {
       this.$input.attr('value', val);
     },
-    attributes: function(){
+    attributes: function() {
       return {
         'data-val': this.value()
       };
@@ -69,38 +69,38 @@ define([
   });
 
   var InternalLink = LinkType.extend({
-    init: function(){
+    init: function() {
       var self = this;
       LinkType.prototype.init.call(self);
       self.$input.addClass('pat-relateditems');
       self.createRelatedItems();
     },
-    createRelatedItems: function(){
+    createRelatedItems: function() {
       this.relatedItems = new RelatedItems(this.$input,
         this.linkModal.options.relatedItems);
     },
-    value: function(){
+    value: function() {
       var self = this;
       var val = self.$input.select2('data');
-      if(val && typeof(val) === 'object'){
+      if (val && typeof(val) === 'object') {
         val = val[0];
       }
       return val;
     },
-    toUrl: function(){
+    toUrl: function() {
       var value = this.value();
-      if(value){
+      if (value) {
         return this.tinypattern.generateUrl(value);
       }
       return null;
     },
-    load: function(element){
+    load: function(element) {
       var val = this.tiny.dom.getAttrib(element, 'data-val');
-      if(val){
+      if (val) {
         this.set(val);
       }
     },
-    set: function(val){
+    set: function(val) {
       // kill it and then reinitialize since select2 will load data then
       this.$input.select2('destroy');
       this.$input.attr('data-relateditems', undefined); // reset the pattern
@@ -108,9 +108,9 @@ define([
       this.$input.attr('value', val);
       this.createRelatedItems();
     },
-    attributes: function(){
+    attributes: function() {
       var val = this.value();
-      if(val){
+      if (val) {
         return {
           'data-val': val.UID
         };
@@ -121,34 +121,34 @@ define([
   });
 
   var ImageLink = InternalLink.extend({
-    toUrl: function(){
+    toUrl: function() {
       var value = this.value();
       return this.tinypattern.generateImageUrl(value, this.linkModal.$scale.val());
     }
   });
 
   var EmailLink = LinkType.extend({
-    toUrl: function(){
+    toUrl: function() {
       var self = this;
       var val = self.value();
-      if(val){
+      if (val) {
         var subject = self.getSubject();
         var href = 'mailto:' + val;
-        if(subject){
+        if (subject) {
           href += '?subject=' + subject;
         }
         return href;
       }
       return null;
     },
-    load: function(element){
+    load: function(element) {
       LinkType.prototype.load.apply(this, [element]);
       this.linkModal.$subject.val(this.tiny.dom.getAttrib(element, 'data-subject'));
     },
-    getSubject: function(){
+    getSubject: function() {
       return this.linkModal.$subject.val();
     },
-    attributes: function(){
+    attributes: function() {
       var attribs = LinkType.prototype.attributes.call(this);
       attribs['data-subject'] = this.getSubject();
       return attribs;
@@ -156,7 +156,7 @@ define([
   });
 
   var AnchorLink = LinkType.extend({
-    init: function(){
+    init: function() {
       var self = this;
       LinkType.prototype.init.call(self);
       self.$select = self.$el.find('select');
@@ -164,15 +164,15 @@ define([
       self.anchorData = [];
       self.populate();
     },
-    value: function(){
+    value: function() {
       var self = this;
       var val = self.$select.select2('data');
-      if(val && typeof(val) === 'object'){
+      if (val && typeof(val) === 'object') {
         val = val[0];
       }
       return val;
     },
-    populate: function(){
+    populate: function() {
       var self = this;
       self.$select.find('option').remove();
       self.anchorNodes = [];
@@ -180,13 +180,13 @@ define([
       var node, i, name, title;
 
       var nodes = self.tiny.dom.select('a.mceItemAnchor,img.mceItemAnchor,a.mce-item-anchor,img.mce-item-anchor');
-      for (i = 0; i < nodes.length; i=i+1) {
+      for (i = 0; i < nodes.length; i = i + 1) {
         node = nodes[i];
-        name = self.tiny.dom.getAttrib(node, "name");
-        if(!name){
-          name = self.tiny.dom.getAttrib(node, "id");
+        name = self.tiny.dom.getAttrib(node, 'name');
+        if (!name) {
+          name = self.tiny.dom.getAttrib(node, 'id');
         }
-        if (name !== "") {
+        if (name !== '') {
           self.anchorNodes.push(node);
           self.anchorData.push({name: name, title: name});
         }
@@ -194,65 +194,65 @@ define([
 
       nodes = self.tiny.dom.select(self.linkModal.options.anchorSelector);
       if (nodes.length > 0) {
-        for (i = 0; i < nodes.length; i=i+1) {
+        for (i = 0; i < nodes.length; i = i + 1) {
           node = nodes[i];
           title = $(node).text().replace(/^\s+|\s+$/g, '');
-          if (title==='') {
+          if (title === '') {
             continue;
           }
           name = title.toLowerCase().substring(0,1024);
           name = name.replace(/[^a-z0-9]/g, '-');
           /* okay, ugly, but we need to first check that this anchor isn't already available */
           var found = false;
-          for(i=0; i<self.anchorNodes.length; i=i+1){
+          for (i = 0; i < self.anchorNodes.length; i = i + 1) {
             var anode = self.anchorData[i];
-            if(anode.name === name){
+            if (anode.name === name) {
               found = true;
               // so it's also found, let's update the title to be more presentable
               anode.title = title;
               break;
             }
           }
-          if(!found){
-            self.anchorData.push({name: name, title:title, newAnchor: true});
+          if (!found) {
+            self.anchorData.push({name: name, title: title, newAnchor: true});
             self.anchorNodes.push(node);
           }
         }
       }
-      if(self.anchorNodes.length > 0){
-        for(i = 0; i < self.anchorData.length; i=i+1){
+      if (self.anchorNodes.length > 0) {
+        for(i = 0; i < self.anchorData.length; i = i + 1) {
           var data = self.anchorData[i];
-          self.$select.append("<option value='" + i + "'>" + data.title + '</option>');
+          self.$select.append('<option value="' + i + '">' + data.title + '</option>');
         }
       } else {
         self.$select.append('<option>No anchors found..</option>');
       }
     },
-    getIndex: function(name){
+    getIndex: function(name) {
       var self = this;
-      for(var i=0; i<self.anchorData.length; i=i+1){
+      for (var i = 0; i < self.anchorData.length; i = i + 1) {
         var data = self.anchorData[i];
-        if(data.name === name){
+        if (data.name === name) {
           return i;
         }
       }
       return 0;
     },
-    toUrl: function(){
+    toUrl: function() {
       var self = this;
       var val = self.value();
-      if(val){
+      if (val) {
         var index = parseInt(val, 10);
         var node = self.anchorNodes[index];
         var data = self.anchorData[index];
-        if(data.newAnchor){
+        if (data.newAnchor) {
           node.innerHTML = '<a name="' + data.name + '" class="mce-item-anchor"></a>' + node.innerHTML;
         }
         return '#' + data.name;
       }
       return null;
     },
-    set: function(val){
+    set: function(val) {
       var anchor = this.getIndex(val);
       this.$select.select2('data', '' + anchor);
     }
@@ -327,14 +327,14 @@ define([
       'externalImage': ImageTemplate
     },
 
-    template: function(data){
+    template: function(data) {
       return  _.template(this.linkTypeTemplateMapping[this.linkType])(data);
     },
 
-    init: function(){
+    init: function() {
       var self = this;
       self.tinypattern = self.options.tinypattern;
-      if(self.tinypattern.options.anchorSelector){
+      if (self.tinypattern.options.anchorSelector) {
         self.options.anchorSelector = self.tinypattern.options.anchorSelector;
       }
       self.tiny = self.tinypattern.tiny;
@@ -346,11 +346,11 @@ define([
         content: null,
         buttons: '.btn'
       });
-      self.modal.on('shown', function(e){
+      self.modal.on('shown', function(e) {
         self.modalShown.apply(self, [e]);
       });
     },
-    generateModalHtml: function(){
+    generateModalHtml: function() {
       var self = this;
       return self.template({
         text: self.options.text,
@@ -370,10 +370,10 @@ define([
         insertBtn: self.options.text.insertBtn
       });
     },
-    isImageMode: function(){
+    isImageMode: function() {
       return ['image', 'externalImage'].indexOf(this.linkType) !== -1;
     },
-    initElements: function(){
+    initElements: function() {
       var self = this;
       self.$target = $('select[name="target"]', self.modal.$modal);
       self.$button = $('.modal-footer input[name="insert"]', self.modal.$modal);
@@ -385,7 +385,7 @@ define([
       self.$scale = $('select[name="scale"]', self.modal.$modal);
 
       /* load up all the link types */
-      _.each(self.options.linkTypes, function(type){
+      _.each(self.options.linkTypes, function(type) {
         var $container = $('.linkType.' + type + ' .main', self.modal.$modal);
         self.linkTypes[type] = new self.options.linkTypeClassMapping[type]($container, {
           linkModal: self,
@@ -396,44 +396,44 @@ define([
       /* modal els */
       self.$linkTypes = $('.linkTypes', self.modal.$modal);
       var $linkType = self.$linkTypes.find('input[value="' + self.linkType + '"]');
-      if($linkType.length > 0){
+      if ($linkType.length > 0) {
         $linkType[0].checked = true;
       }
     },
-    getLinkUrl: function(){
+    getLinkUrl: function() {
       // get the url, only get one uid
       var self = this;
       return self.linkTypes[self.linkType].toUrl();
     },
-    getValue: function(){
+    getValue: function() {
       return this.linkTypes[this.linkType].value();
     },
-    updateAnchor: function(href){
+    updateAnchor: function(href) {
       var self = this;
       var target = self.$target.val();
       var title = self.$title.val();
       var data = $.extend(true, {}, {
         title: title ? title : null,
         target: target ? target : null,
-        "data-linkType": self.linkType,
+        'data-linkType': self.linkType,
         href: href
       }, self.linkTypes[self.linkType].attributes());
       self.tiny.execCommand('mceInsertLink', false, data);
     },
-    focusElement: function(elm){
+    focusElement: function(elm) {
       var self = this;
       self.tiny.focus();
       self.tiny.selection.select(elm);
       self.tiny.nodeChanged();
     },
-    updateImage: function(src){
+    updateImage: function(src) {
       var self = this;
       var data = $.extend(true, {}, {
         src: src,
         alt: self.$alt.val(),
         'class': 'image-' + self.$align.val(),
-        "data-linkType": self.linkType,
-        "data-scale": self.$scale.val()
+        'data-linkType': self.linkType,
+        'data-scale': self.$scale.val()
       }, self.linkTypes[self.linkType].attributes());
       if (self.imgElm && !self.imgElm.getAttribute('data-mce-object')) {
         data.width = self.dom.getAttrib(self.imgElm, 'width');
@@ -459,24 +459,24 @@ define([
       }
 
       waitLoad(self.imgElm);
-      if(self.imgElm.complete){
+      if (self.imgElm.complete) {
         self.focusElement(self.imgElm);
       }
     },
-    modalShown: function(e){
+    modalShown: function(e) {
       var self = this;
 
       self.initElements();
       self.initData();
 
-      self.$button.off('click').on('click', function(e){
+      self.$button.off('click').on('click', function(e) {
         e.preventDefault();
         e.stopPropagation();
         var href = self.getLinkUrl();
-        if(!href){
+        if (!href) {
           return; // just cut out if no url
         }
-        if(self.isImageMode()){
+        if (self.isImageMode()) {
           self.updateImage(href);
         } else {
           /* regular anchor */
@@ -484,35 +484,35 @@ define([
         }
         self.hide();
       });
-      $('.modal-footer input[name="cancel"]', self.modal.$modal).click(function(e){
+      $('.modal-footer input[name="cancel"]', self.modal.$modal).click(function(e) {
         e.preventDefault();
         self.hide();
       });
       self.setupDropzone();
     },
-    setupDropzone: function(){
+    setupDropzone: function() {
       var self = this;
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         self.dropzone = new DropZone(self.modal.$modal, {
           className: 'tinymce-dropzone',
           clickable: false,
           url: self.options.uploadUrl,
           wrap: 'inner',
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             self.tinypattern.fileUploaded($.parseJSON(data));
             self.hide();
           }
         });
       }
     },
-    show: function(){
+    show: function() {
       this.modal.show();
     },
-    hide: function(){
+    hide: function() {
       this.modal.hide();
     },
-    initData: function(){
+    initData: function() {
       var self = this;
 
       self.selection = self.tiny.selection;
@@ -522,60 +522,60 @@ define([
       self.anchorElm = self.dom.getParent(selectedElm, 'a[href]');
 
       var linkType;
-      if(self.isImageMode()){
-        if(self.imgElm.nodeName !== 'IMG'){
+      if (self.isImageMode()) {
+        if (self.imgElm.nodeName !== 'IMG') {
           // try finding elsewhere
-          if(self.anchorElm){
+          if (self.anchorElm) {
             var imgs = self.anchorElm.getElementsByTagName('img');
-            if(imgs.length > 0){
+            if (imgs.length > 0) {
               self.imgElm = imgs[0];
               self.focusElement(self.imgElm);
             }
           }
         }
-        if(self.imgElm.nodeName !== 'IMG'){
+        if (self.imgElm.nodeName !== 'IMG') {
           // okay, still no image, unset
           self.imgElm = null;
         }
-        if(self.imgElm){
+        if (self.imgElm) {
           var src = self.dom.getAttrib(self.imgElm, 'src');
           self.$alt.val(self.dom.getAttrib(self.imgElm, 'alt'));
           linkType = self.dom.getAttrib(self.imgElm, 'data-linktype');
-          if(linkType){
+          if (linkType) {
             self.linkType = linkType;
             self.linkTypes[self.linkType].load(self.imgElm);
             var scale = self.dom.getAttrib(self.imgElm, 'data-scale');
             self.$scale.val(scale);
-          }else if(src){
+          }else if (src) {
             self.guessImageLink(src);
           }
           var className = self.dom.getAttrib(self.imgElm, 'class');
           var klasses = className.split(' ');
-          for(var i=0; i<klasses.length; i=i+1){
+          for (var i = 0; i < klasses.length; i = i + 1) {
             var klass = klasses[i];
-            if(klass.indexOf('image-') !== -1){
+            if (klass.indexOf('image-') !== -1) {
               self.$align.val(klass.replace('image-', ''));
             }
           }
         }
-      }else if(self.anchorElm){
+      }else if (self.anchorElm) {
         self.focusElement(self.anchorElm);
         var href = '';
         href = self.dom.getAttrib(self.anchorElm, 'href');
         self.$target.val(self.dom.getAttrib(self.anchorElm, 'target'));
         self.$title.val(self.dom.getAttrib(self.anchorElm, 'title'));
         linkType = self.dom.getAttrib(self.anchorElm, 'data-linktype');
-        if(linkType){
+        if (linkType) {
           self.linkType = linkType;
           self.linkTypes[self.linkType].load(self.anchorElm);
-        }else if(href){
+        }else if (href) {
           self.guessAnchorLink(href);
         }
       }
     },
-    guessImageLink: function(src){
+    guessImageLink: function(src) {
       var self = this;
-      if(src.indexOf(self.options.prependToScalePart) !== -1){
+      if (src.indexOf(self.options.prependToScalePart) !== -1) {
         self.linkType = 'image';
         self.$scale.val(self.tinypattern.getScaleFromUrl(src));
         self.linkTypes.image.set(self.tinypattern.stripGeneratedUrl(src));
@@ -584,23 +584,23 @@ define([
         self.linkTypes.externalImage.set(src);
       }
     },
-    guessAnchorLink: function(href){
+    guessAnchorLink: function(href) {
       var self = this;
-      if(self.options.prependToUrl &&
-          href.indexOf(self.options.prependToUrl) !== -1){
+      if (self.options.prependToUrl &&
+          href.indexOf(self.options.prependToUrl) !== -1) {
         // XXX if using default configuration, it gets more difficult
         // here to detect internal urls so this might need to change...
         self.linkType = 'internal';
         self.linkTypes.internal.set(self.tinypattern.stripGeneratedUrl(href));
-      } else if(href.indexOf('mailto:') !== -1){
+      } else if (href.indexOf('mailto:') !== -1) {
         self.linkType = 'email';
-        var email = href.substring("mailto:".length, href.length);
+        var email = href.substring('mailto:'.length, href.length);
         var split = email.split('?subject=');
         self.linkTypes.email.set(split[0]);
-        if(split.length > 1){
+        if (split.length > 1) {
           self.$subject.val(decodeURIComponent(split[1]));
         }
-      } else if(href[0] === '#'){
+      } else if (href[0] === '#') {
         self.linkType = 'anchor';
         self.linkTypes.anchor.setRaw(href.substring(1));
       } else {
@@ -608,14 +608,14 @@ define([
         self.linkTypes.external.setRaw(href);
       }
     },
-    setSelectElement: function($el, val){
+    setSelectElement: function($el, val) {
       $el.find('option:selected').attr('selected', '');
-      if(val){
+      if (val) {
         // update
-        $el.find('option[value="' + val + '"]').attr('selected', "true");
+        $el.find('option[value="' + val + '"]').attr('selected', 'true');
       }
     },
-    reinitialize: function(){
+    reinitialize: function() {
       /*
        * This will probably be called before show is run.
        * It will overwrite the base html template given to
diff --git a/js/patterns/tinymce/pattern.js b/js/patterns/tinymce/pattern.js
index 8bc19f0..a4d635f 100644
--- a/js/patterns/tinymce/pattern.js
+++ b/js/patterns/tinymce/pattern.js
@@ -60,6 +60,8 @@ toolbar: "undo redo | styleselect | bold italic | alignleft aligncenter alignrig
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+/*global alert:true */
+
 define([
   'jquery',
   'underscore',
@@ -80,7 +82,7 @@ define([
             AutoTOC, DropZone, dropzone,
             ResultTemplate, SelectionTemplate,
             utils, LinkModal, UploadModal) {
-  "use strict";
+  'use strict';
 
   var TinyMCE = Base.extend({
     name: 'tinymce',
@@ -131,23 +133,23 @@ define([
       linkableTypes: 'Document,Event,File,Folder,Image,News Item,Topic',
       tiny: {
         plugins: [
-          "advlist autolink lists charmap print preview anchor ploneupload",
-          "searchreplace visualblocks code fullscreen autoresize",
-          "insertdatetime media table contextmenu paste plonelink ploneimage"
+          'advlist autolink lists charmap print preview anchor ploneupload',
+          'searchreplace visualblocks code fullscreen autoresize',
+          'insertdatetime media table contextmenu paste plonelink ploneimage'
         ],
-        menubar: "edit table format tools view insert",
-        toolbar: "undo redo | styleselect | bold italic | " +
-                 "alignleft aligncenter alignright alignjustify | " +
-                 "bullist numlist outdent indent | " +
-                 "unlink plonelink ploneimage | ploneupload",
-        autoresize_max_height: 1500
+        menubar: 'edit table format tools view insert',
+        toolbar: 'undo redo | styleselect | bold italic | ' +
+                 'alignleft aligncenter alignright alignjustify | ' +
+                 'bullist numlist outdent indent | ' +
+                 'unlink plonelink ploneimage | ploneupload',
+        'autoresize_max_height': 1500
       },
-      rel_upload_path: null,
-      folder_url: null
+      'rel_upload_path': null,
+      'folder_url': null
     },
-    uploadFileClicked: function(){
+    uploadFileClicked: function() {
       var self = this;
-      if(self.uploadModal === null){
+      if (self.uploadModal === null) {
         var $el = $('<div/>').insertAfter(self.$el);
         self.uploadModal = new UploadModal($el,
           $.extend(true, {}, self.options, {
@@ -168,9 +170,9 @@ define([
         self.uploadModal.show();
       }
     },
-    addLinkClicked: function(){
+    addLinkClicked: function() {
       var self = this;
-      if(self.linkModal === null){
+      if (self.linkModal === null) {
         var $el = $('<div/>').insertAfter(self.$el);
         self.linkModal = new LinkModal($el,
           $.extend(true, {}, self.options, {
@@ -189,9 +191,9 @@ define([
         self.linkModal.show();
       }
     },
-    addImageClicked: function(){
+    addImageClicked: function() {
       var self = this;
-      if(self.imageModal === null){
+      if (self.imageModal === null) {
         var options = $.extend(true, {}, self.options, {
           tinypattern: self,
           linkTypes: ['image', 'externalImage'],
@@ -218,60 +220,60 @@ define([
         self.imageModal.show();
       }
     },
-    generateUrl: function(data){
+    generateUrl: function(data) {
       var self = this;
       var part = data[self.options.linkAttribute];
       return self.options.prependToUrl + part + self.options.appendToUrl;
     },
-    generateImageUrl: function(data, scale){
+    generateImageUrl: function(data, scale) {
       var self = this;
       var url = self.generateUrl(data);
       return url + self.options.prependToScalePart + scale + self.options.appendToScalePart;
     },
-    stripGeneratedUrl: function(url){
+    stripGeneratedUrl: function(url) {
       // to get original attribute back
       var self = this;
       url = url.split(self.options.prependToScalePart, 2)[0];
-      if(self.options.prependToUrl){
+      if (self.options.prependToUrl) {
         var parts = url.split(self.options.prependToUrl, 2);
-        if(parts.length === 2){
+        if (parts.length === 2) {
           url = parts[1];
         }
       }
-      if(self.options.appendToUrl){
+      if (self.options.appendToUrl) {
         url = url.split(self.options.appendToUrl)[0];
       }
       return url;
     },
-    getScaleFromUrl: function(url){
+    getScaleFromUrl: function(url) {
       var self = this;
       var split = url.split(self.options.prependToScalePart);
       var baseUrl = split[0];
-      if(split.length !== 2){
+      if (split.length !== 2) {
         // not valid scale, screw it
         return null;
       }
-      if(self.options.appendToScalePart){
+      if (self.options.appendToScalePart) {
         url = split[1].split(self.options.appendToScalePart)[0];
-      }else{
+      } else {
         url = split[1];
       }
-      if(url.indexOf('/image_') !== -1){
+      if (url.indexOf('/image_') !== -1) {
         url = url.split('/image_')[1];
       }
       return url;
     },
-    fileUploaded: function(data){
+    fileUploaded: function(data) {
       var self = this;
-      if(data === null){
+      if (data === null) {
         return; // bail, something is wrong here...
       }
       var filename = data.filename;
       var ext = filename.split('.');
-      ext = ext[ext.length-1].toLowerCase();
+      ext = ext[ext.length - 1].toLowerCase();
       var attr;
 
-      if(['png', 'jpg', 'gif', 'jpeg'].indexOf(ext) !== -1){
+      if (['png', 'jpg', 'gif', 'jpeg'].indexOf(ext) !== -1) {
         /* handle images different than others */
         attr = {
           src: self.generateImageUrl(data, 'thumb'),
@@ -281,7 +283,7 @@ define([
         self.tiny.insertContent(self.tiny.dom.createHTML('img', attr));
         var imgElm = self.tiny.dom.get('__mcenew');
         self.tiny.dom.setAttrib(imgElm, 'id', null);
-      }else{
+      } else {
         attr = {
           id: '__mcenew'
         };
@@ -292,8 +294,8 @@ define([
         self.tiny.dom.setHTML(aElm, filename);
       }
     },
-    fileUploadError: function(){
-      /* XXX need to be able to handle errors better? */
+    fileUploadError: function() {
+      /* TODO: need to be able to handle errors better? */
       alert('There was an error attempting to upload file. ' +
             'It is possible the file you are uploading is not allowed ' +
             'in the folder you are trying to add it to.');
@@ -305,32 +307,32 @@ define([
       var id = utils.setId(self.$el);
       var tinyOptions = self.options.tiny;
       tinyOptions.selector = '#' + id;
-      tinyOptions.addLinkClicked = function(){
+      tinyOptions.addLinkClicked = function() {
         self.addLinkClicked.apply(self, []);
       };
-      tinyOptions.addImageClicked = function(){
+      tinyOptions.addImageClicked = function() {
         self.addImageClicked.apply(self, []);
       };
       // XXX: disabled skin means it wont load css files which we already
       // include in widgets.min.css
       tinyOptions.skin = false;
 
-      self.options.relatedItems.generateImageUrl = function(data, scale){
+      self.options.relatedItems.generateImageUrl = function(data, scale) {
         // this is so, in our result and selection template, we can
         // access getting actual urls from related items
         return self.generateImageUrl.apply(self, [data, scale]);
       };
 
-      if(!self.options.base_url){
-        self.options.base_url = window.location.href;
+      if (!self.options['base_url']) { // jshint ignore:line
+        self.options['base_url'] = window.location.href; // jshint ignore:line
       }
-      if(self.options.rel_upload_path){
-        self.options.uploadUrl = self.options.folder_url + '/' + self.options.rel_upload_path;
+      if (self.options['rel_upload_path']) { // jshint ignore:line
+        self.options.uploadUrl = self.options['folder_url'] + '/' + self.options['rel_upload_path']; // jshint ignore:line
       } else {
         self.options.uploadUrl = null;
       }
 
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         /*
          * disable until it works better
          * can still upload via link and file overlays
@@ -341,16 +343,16 @@ define([
           url: self.options.uploadUrl,
           wrap: true,
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             self.fileUploaded($.parseJSON(data));
           },
-          error: function(){
+          error: function() {
             self.fileUploadError();
           }
         });
         */
 
-        tinyOptions.uploadFileClicked = function(){
+        tinyOptions.uploadFileClicked = function() {
           self.uploadFileClicked.apply(self, []);
         };
       } else {
@@ -363,18 +365,17 @@ define([
 
       /* fixes chrome at least,
        * still not working quite right in firefox
-      if(self.options.uploadUrl){
-        var events = ["drop", "dragstart", "dragend", "dragenter", "dragover",
-                      "dragleave"];
+      if (self.options.uploadUrl) {
+        var events = ['drop', 'dragstart', 'dragend', 'dragenter', 'dragover', 'dragleave'];
         var iframe = self.$el.prev().find('.mce-edit-area iframe');
         var win = $(window.frames[iframe.attr('id')]);
         var body = iframe.contents().find('body');
-        $.each(events, function(index, ev){
-          win.on(ev, function(e){
+        $.each(events, function(index, ev) {
+          win.on(ev, function(e) {
             self.dropzone.dropzone.emit(ev);
             console.log(ev);
           });
-          body.on(ev, function(e){
+          body.on(ev, function(e) {
             self.dropzone.dropzone.emit(ev);
             console.log(ev);
           });
@@ -385,7 +386,7 @@ define([
       /* tiny really should be doing this by default
        * but this fixes overlays not saving data */
       var $form = self.$el.parents('form');
-      $form.on('submit', function(){
+      $form.on('submit', function() {
         self.tiny.save();
       });
     }
diff --git a/js/patterns/tinymce/upload.js b/js/patterns/tinymce/upload.js
index 9afb1b6..91fc52a 100644
--- a/js/patterns/tinymce/upload.js
+++ b/js/patterns/tinymce/upload.js
@@ -39,7 +39,7 @@ define([
   'tinymce',
   'text!js/patterns/tinymce/templates/upload.xml'
 ], function($, _, Base, RelatedItems, Modal, tinymce, UploadTemplate) {
-  "use strict";
+  'use strict';
 
 
   tinymce.PluginManager.add('ploneimage', function(editor) {
@@ -85,11 +85,11 @@ define([
         file: 'File',
         uploadBtn: 'Upload',
         uploadLocationWarning: 'If you do not select a folder to upload to, ' +
-                               "the file will be uploaded to the current folder."
+                               'the file will be uploaded to the current folder.'
       }
     },
     template: _.template(UploadTemplate),
-    init: function(){
+    init: function() {
       var self = this;
       self.tinypattern = self.options.tinypattern;
       self.modal = new Modal(self.$el, {
@@ -103,17 +103,17 @@ define([
         content: null,
         buttons: '.btn'
       });
-      self.modal.on('shown', function(e){
+      self.modal.on('shown', function(e) {
         self.modalShown.apply(self, [e]);
       });
     },
-    show: function(){
+    show: function() {
       this.modal.show();
     },
-    hide: function(){
+    hide: function() {
       this.modal.hide();
     },
-    modalShown: function(){
+    modalShown: function() {
       var self = this;
       /* initialize elements so submit does the right thing.. */
       self.$uploadBtn = $('.modal-footer input[type="submit"]', self.modal.$modal);
@@ -122,15 +122,14 @@ define([
       self.$location = $('[name="location"]', self.modal.$modal);
       self.$location.addClass('pat-relateditems').patternRelateditems(self.options.relatedItems);
 
-      self.$form.on('submit', function(e){
+      self.$form.on('submit', function(e) {
         /* handle file upload */
         var locationData = self.$location.select2('data');
-        if(locationData.length > 0){
-          self.$form.attr('action',
-            locationData[0].getURL + '/' + self.options.rel_upload_path);
+        if (locationData.length > 0) {
+          self.$form.attr('action', locationData[0].getURL + '/' + self.options['rel_upload_path']); // jshint ignore:line
         }
         self.modal.loading.show();
-        self.$iframe.on('load', function(){
+        self.$iframe.on('load', function() {
           var response = self.$iframe.contents();
           self.modal.loading.hide();
           self.hide();
@@ -142,12 +141,12 @@ define([
         });
         self.$form[0].target = 'upload_target';
       });
-      self.$uploadBtn.on('click', function(e){
+      self.$uploadBtn.on('click', function(e) {
         e.preventDefault();
         self.$form.trigger('submit');
       });
     },
-    reinitialize: function(){
+    reinitialize: function() {
     }
   });
 
diff --git a/js/patterns/toggle.js b/js/patterns/toggle.js
index 1c41c61..59ae9bf 100644
--- a/js/patterns/toggle.js
+++ b/js/patterns/toggle.js
@@ -63,7 +63,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-4
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -80,7 +80,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-5
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -90,7 +90,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-6
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -100,7 +100,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-7
  *    <div class="panel panel-default">
  *      <div class="panel-heading">
@@ -115,7 +115,7 @@
  *        </ul>
  *      </div>
  *    </div>
- *    
+ *
  *
  * License:
  *    Copyright (C) 2010 Plone Foundation
@@ -139,7 +139,7 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base, undefined) {
-  "use strict";
+  'use strict';
 
   var Toggle = Base.extend({
     name: 'toggle',
@@ -163,14 +163,11 @@ define([
 
       if (!self.options.target) {
         self.$target = self.$el;
-      }
-      else if(self.options.targetScope === 'global') {
+      } else if (self.options.targetScope === 'global') {
         self.$target = $(self.options.target);
-      }
-      else {
+      } else {
         //self.$target = self.$el[self.options.menu](self.options.target);
-        self.$target = self.$el.parents(
-          self.options.targetScope).first().find(self.options.target);
+        self.$target = self.$el.parents(self.options.targetScope).first().find(self.options.target);
       }
 
       if (!self.$target || self.$target.size() === 0) {
@@ -187,21 +184,18 @@ define([
       var self = this;
       var marked = false;
 
-      for (var i=0;i<this.$target.length;i+=1){
+      for (var i = 0; i < this.$target.length; i = i + 1) {
         if (self.options.attribute === 'class') {
-          if (this.$target.eq(i).hasClass(this.options.value)){
+          if (this.$target.eq(i).hasClass(this.options.value)) {
             marked = true;
-          }
-          else{
+          } else {
             marked = false;
             break;
           }
-        }
-        else{
-          if (this.$target.eq(i).attr(this.options.attribute) === this.options.value){
+        } else {
+          if (this.$target.eq(i).attr(this.options.attribute) === this.options.value) {
             marked = true;
-          }
-          else{
+          } else {
             marked = false;
             break;
           }
diff --git a/js/patterns/tooltip.js b/js/patterns/tooltip.js
index 67a9af8..84f772f 100644
--- a/js/patterns/tooltip.js
+++ b/js/patterns/tooltip.js
@@ -1,123 +1,122 @@
-/* Tooltip pattern.
- *
- * Options:
- *    event_enter(string): Event used to trigger tooltip. ('mouseenter')
- *    event_exit(string): Event used to dismiss tooltip. ('mouseleave')
- *
- * Documentation:
- *    # Directions
- *
- *    You can use this inside Plone or on any static page. Please check below
- *    for additional directions for non-Plone sites as there are some lines
- *    of code you need to add to the header of your webpage.
- *
- *    # Adding tooltip using Plone
- *
- *    - Make sure your viewing the page you want to add the tool tip too.
- *    - Log in
- *    - Create some text that you want to be the link that will reveal the
- *      tooltip.
- *    - Select the view html button
- *    - Find your text. and wrap that text with an href tag, and add a class
- *      and the href tag. 
- *    - It should look like < a class="pat-tooltip" href="#my-demo-tip"> My
- *      link text </a>
- *    - Choose Save
- *
- *    Now that we have added our link we now need to add our tooltip.
- *
- *    - Choose "edit"
- *    - Immediently following the link click to add some text and hit your 
- *      "return" key
- *    - Add the text that you want to be the tip.
- *    - Choose the "edit html" button
- *    - Find the tip text and wrap that text with a div tag, an ID tag and a
- *      class.
- *    - It should look like <div id="my-demo-tip" class="tooltips"> My Tip
- *      Text here </div>
- *    - Choose Save and test your tooltip.
- *
- *    Note: it's important that the href AND the ID be named exactly the same
- *    thing. This is what links them together.
- *
- *    # Example 
- *
- *    {{ example-1 }}
- *
- * Example: example-1
- *    <p href=".example-class" class="pat-tooltip">
- *      Hover over this line to see a tooltip
- *    </p>
- *    <p class="tooltips example-class">
- *      Setting the .example-class in the href makes this show up
- *    </p>
- *
- * License:
- *    Copyright (C) 2010 Plone Foundation
- *
- *    This program is free software; you can redistribute it and/or modify it
- *    under the terms of the GNU General Public License as published by the
- *    Free Software Foundation; either version 2 of the License.
- *
- *    This program is distributed in the hope that it will be useful, but
- *    WITHOUT ANY WARRANTY; without even the implied warranty of
- *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- *    Public License for more details.
- *
- *    You should have received a copy of the GNU General Public License along
- *    with this program; if not, write to the Free Software Foundation, Inc.,
- *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-define([
-  'jquery',
-  'mockup-patterns-base'
-], function($, Base, undefined) {
-  "use strict";
-
-  var ToolTip = Base.extend({
-    name: 'tooltip',
-    defaults: {
-      attribute: 'class',
-      event_enter: 'mouseenter',
-      event_exit: 'mouseleave'
-    },
-    init: function() {
-      var self = this;
-
-      self.on(self.options.event_enter, function(e) {
-        e.stopPropagation();
-        self.show.apply(self, [e]);
-      });
-      self.on(self.options.event_exit, function(e) {
-        e.stopPropagation();
-        self.hide.apply(self, [e]);
-      });
-
-    },
-    closest: function($el, selector) {
-        var $closest;
-        $.each($el.parents(), function(i, el) {
-            $closest = $(selector, el);
-            if ($closest.size() !== 0) {
-                return false;
-            }
-        });
-        return $closest;
-    },
-    show : function(e) {
-        var s = $(e.target).attr('href');
-        this.closest(this.$el, s).addClass('active');
-    },
-
-    hide : function(e) {
-        var s = $(e.target).attr('href');
-        this.closest(this.$el, s).removeClass('active');
-    }
-
-  });
-
-
-  return ToolTip;
-
-});
+/* Tooltip pattern.
+ *
+ * Options:
+ *    enterEvent(string): Event used to trigger tooltip. ('mouseenter')
+ *    exitEvent(string): Event used to dismiss tooltip. ('mouseleave')
+ *
+ * Documentation:
+ *    # Directions
+ *
+ *    You can use this inside Plone or on any static page. Please check below
+ *    for additional directions for non-Plone sites as there are some lines
+ *    of code you need to add to the header of your webpage.
+ *
+ *    # Adding tooltip using Plone
+ *
+ *    - Make sure your viewing the page you want to add the tool tip too.
+ *    - Log in
+ *    - Create some text that you want to be the link that will reveal the
+ *      tooltip.
+ *    - Select the view html button
+ *    - Find your text. and wrap that text with an href tag, and add a class
+ *      and the href tag.
+ *    - It should look like < a class="pat-tooltip" href="#my-demo-tip"> My
+ *      link text </a>
+ *    - Choose Save
+ *
+ *    Now that we have added our link we now need to add our tooltip.
+ *
+ *    - Choose "edit"
+ *    - Immediently following the link click to add some text and hit your
+ *      "return" key
+ *    - Add the text that you want to be the tip.
+ *    - Choose the "edit html" button
+ *    - Find the tip text and wrap that text with a div tag, an ID tag and a
+ *      class.
+ *    - It should look like <div id="my-demo-tip" class="tooltips"> My Tip
+ *      Text here </div>
+ *    - Choose Save and test your tooltip.
+ *
+ *    Note: it's important that the href AND the ID be named exactly the same
+ *    thing. This is what links them together.
+ *
+ *    # Example
+ *
+ *    {{ example-1 }}
+ *
+ * Example: example-1
+ *    <p href=".example-class" class="pat-tooltip">
+ *      Hover over this line to see a tooltip
+ *    </p>
+ *    <p class="tooltips example-class">
+ *      Setting the .example-class in the href makes this show up
+ *    </p>
+ *
+ * License:
+ *    Copyright (C) 2010 Plone Foundation
+ *
+ *    This program is free software; you can redistribute it and/or modify it
+ *    under the terms of the GNU General Public License as published by the
+ *    Free Software Foundation; either version 2 of the License.
+ *
+ *    This program is distributed in the hope that it will be useful, but
+ *    WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ *    Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License along
+ *    with this program; if not, write to the Free Software Foundation, Inc.,
+ *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+define([
+  'jquery',
+  'mockup-patterns-base'
+], function($, Base, undefined) {
+  'use strict';
+
+  var ToolTip = Base.extend({
+    name: 'tooltip',
+    defaults: {
+      attribute: 'class',
+      enterEvent: 'mouseenter',
+      exitEvent: 'mouseleave'
+    },
+    init: function() {
+      var self = this;
+
+      self.on(self.options.enterEvent, function(e) {
+        e.stopPropagation();
+        self.show.apply(self, [e]);
+      });
+      self.on(self.options.exitEvent, function(e) {
+        e.stopPropagation();
+        self.hide.apply(self, [e]);
+      });
+
+    },
+    closest: function($el, selector) {
+      var $closest;
+      $.each($el.parents(), function(i, el) {
+        $closest = $(selector, el);
+        if ($closest.size() !== 0) {
+          return false;
+        }
+      });
+      return $closest;
+    },
+    show : function(e) {
+      var s = $(e.target).attr('href');
+      this.closest(this.$el, s).addClass('active');
+    },
+
+    hide : function(e) {
+      var s = $(e.target).attr('href');
+      this.closest(this.$el, s).removeClass('active');
+    }
+
+  });
+
+  return ToolTip;
+
+});
diff --git a/js/patterns/tree.js b/js/patterns/tree.js
index 5fae458..8b5b765 100644
--- a/js/patterns/tree.js
+++ b/js/patterns/tree.js
@@ -1,15 +1,12 @@
 /* Tree pattern.
  *
- * Options:
- *    data(jSON): load data structure directly into tree (undefined)
- *    dataUrl(jSON): Load data from remote url (undefined)
- *    autoOpen(boolean): auto open tree contents (false)
- *    dragAndDrop(boolean): node drag and drop support (false)
- *    selectable(boolean): if nodes can be selectable (true)
- *    keyboardSupport(boolean): if keyboard naviation is allowed (true)
+ * Options: data(jSON): load data structure directly into tree (undefined)
+ * dataUrl(jSON): Load data from remote url (undefined) autoOpen(boolean): auto
+ * open tree contents (false) dragAndDrop(boolean): node drag and drop support
+ * (false) selectable(boolean): if nodes can be selectable (true)
+ * keyboardSupport(boolean): if keyboard naviation is allowed (true)
  *
- * Documentation:
- *    # JSON node data
+ * Documentation: # JSON node data
  *
  *    {{ example-1 }}
  *
@@ -22,30 +19,33 @@
  *    {{ example-3 }}
  *
  * Example: example-1
- *    <div class="pat-tree" data-pat-tree='data:[
- *      {"label": "node1",
- *       "children": [{
- *         "label": "child1"
- *        },{
- *         "label": "child2"
- *        }]
- *      },{
- *       "label": "node2",
- *       "children": [{
- *         "label": "child3"
- *        }]
- *      }];'>
- *    </div>
+ *    <div class="pat-tree"
+ *         data-pat-tree='data:[
+ *          { "label": "node1",
+ *            "children": [
+ *              { "label": "child1" },
+ *              { "label": "child2" }
+ *            ]
+ *          },
+ *          { "label": "node2",
+ *            "children": [
+ *              { "label": "child3" }
+ *            ]
+ *          }
+ *        ];'> </div>
  *
  * Example: example-2
  *    <div class="pat-tree"
- *        data-pat-tree="dataUrl:/tests/json/fileTree.json;autoOpen:true"></div>  
+ *         data-pat-tree="dataUrl:/tests/json/fileTree.json;
+ *                        autoOpen:true"></div>
  *
  * Example: example-3
- *    <div class="pat-tree" data-pat-tree="dataUrl:/tests/json/fileTree.json; dragAndDrop: true; autoOpen: true"></div>
+ *    <div class="pat-tree"
+ *         data-pat-tree="dataUrl:/tests/json/fileTree.json;
+ *                        dragAndDrop: true;
+ *                        autoOpen: true"></div>
  *
- * License:
- *    Copyright (C) 2010 Plone Foundation
+ * License: Copyright (C) 2010 Plone Foundation
  *
  *    This program is free software; you can redistribute it and/or modify it
  *    under the terms of the GNU General Public License as published by the
@@ -69,7 +69,7 @@ define([
   'mockup-utils',
   'jqtree'
 ], function($, _, Base, utils) {
-  "use strict";
+  'use strict';
 
   var Tree = Base.extend({
     name: 'tree',
@@ -82,21 +82,21 @@ define([
     init: function() {
       var self = this;
       /* convert all bool options */
-      for(var optionKey in self.options){
+      for (var optionKey in self.options) {
         var def = self.defaults[optionKey];
-        if(def !== undefined && typeof(def) === "boolean"){
+        if (def !== undefined && typeof(def) === 'boolean') {
           self.options[optionKey] = utils.bool(self.options[optionKey]);
         }
       }
 
-      if(self.options.dragAndDrop && self.options.onCanMoveTo === undefined){
-        self.options.onCanMoveTo = function(moved, target, position){
+      if (self.options.dragAndDrop && self.options.onCanMoveTo === undefined) {
+        self.options.onCanMoveTo = function(moved, target, position) {
           /* if not using folder option, just allow, otherwise, only allow if folder */
           return target.folder === undefined || target.folder === true;
         };
       }
 
-      if(self.options.data && typeof(self.options.data) === "string"){
+      if (self.options.data && typeof(self.options.data) === 'string') {
         self.options.data = $.parseJSON(self.options.data);
       }
       self.tree = self.$el.tree(self.options);
diff --git a/js/router.js b/js/router.js
index d55179c..e91eb1d 100644
--- a/js/router.js
+++ b/js/router.js
@@ -31,7 +31,7 @@ define([
   'underscore',
   'backbone'
 ], function($, _, Backbone) {
-  "use strict";
+  'use strict';
 
   var regexEscape = function(s) {
     return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
@@ -71,7 +71,7 @@ define([
           if (path.match(regex)) {
             hash = '!/' + action.patternName + ':' + action.id;
             var replaceWith = '';
-            if(action.expReplace){
+            if (action.expReplace) {
               replaceWith = action.expReplace;
             }
             newPath = path.replace(regex, replaceWith);
@@ -92,10 +92,10 @@ define([
       }
 
       if (hash !== undefined) {
-        this._change_location.apply(this, [newPath, hash]);
+        this._changeLocation.apply(this, [newPath, hash]);
       }
     },
-    _change_location: function(path, hash) {
+    _changeLocation: function(path, hash) {
       window.parent.location.hash = hash;
       window.parent.location.pathname = path;
     },
diff --git a/js/ui/views/base.js b/js/ui/views/base.js
index 75b48b6..c7a3b3d 100644
--- a/js/ui/views/base.js
+++ b/js/ui/views/base.js
@@ -26,8 +26,8 @@
 define([
   'underscore',
   'backbone'
-  ], function(_, Backbone) {
-  "use strict";
+], function(_, Backbone) {
+  'use strict';
 
   var BaseView = Backbone.View.extend({
     isUIView: true,
@@ -46,7 +46,7 @@ define([
       this.trigger('render', this);
       this.afterRender();
 
-      if(!this.$el.attr('id') && this.options.id){
+      if (!this.$el.attr('id') && this.options.id) {
         // apply id to element
         this.$el.attr('id', 'gen-' + this.options.id);
       }
diff --git a/js/ui/views/button.js b/js/ui/views/button.js
index 839d8a0..ece7a1c 100644
--- a/js/ui/views/button.js
+++ b/js/ui/views/button.js
@@ -29,9 +29,8 @@ define([
   'underscore',
   'js/ui/views/base',
   'bootstrap-tooltip'
-],
-  function($, Backbone, _, BaseView) {
-  "use strict";
+], function($, Backbone, _, BaseView) {
+  'use strict';
 
   var ButtonView = BaseView.extend({
     tagName: 'a',
@@ -62,7 +61,7 @@ define([
       }, this);
 
       this.on('render', function() {
-        if(this.context !== null){
+        if (this.context !== null) {
           this.$el.addClass('btn-' + this.context);
         }
 
@@ -72,15 +71,15 @@ define([
           });
           // XXX since tooltip triggers hidden
           // suppress so it plays nice with modals, backdrops, etc
-          this.$el.on('hidden', function(e){
-            if(e.type == 'hidden'){
+          this.$el.on('hidden', function(e) {
+            if (e.type === 'hidden') {
               e.stopPropagation();
             }
           });
         }
       }, this);
     },
-    handleClick: function(e){
+    handleClick: function(e) {
       e.preventDefault();
       if (!this.$el.is('.disabled')) {
         this.uiEventTrigger('click', this, e);
diff --git a/js/ui/views/buttongroup.js b/js/ui/views/buttongroup.js
index 5b731cd..35bfd44 100644
--- a/js/ui/views/buttongroup.js
+++ b/js/ui/views/buttongroup.js
@@ -27,8 +27,8 @@ define([
   'underscore',
   'backbone',
   'js/ui/views/container'
-  ], function(_, Backbone, ContainerView) {
-  "use strict";
+], function(_, Backbone, ContainerView) {
+  'use strict';
 
   var ButtonGroup = ContainerView.extend({
     tagName: 'div',
diff --git a/js/ui/views/container.js b/js/ui/views/container.js
index b9f340b..0db7995 100644
--- a/js/ui/views/container.js
+++ b/js/ui/views/container.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/base'
 ], function($, _, Backbone, BaseView) {
-  "use strict";
+  'use strict';
 
   var Container = BaseView.extend({
     id: '',
@@ -58,12 +58,12 @@ define([
       if (this.itemContainer !== null) {
         $container = $(this.itemContainer, this.$el);
         if ($container.length === 0) {
-          throw "Item Container element not found.";
+          throw 'Item Container element not found.';
         }
       } else {
         $container = this.$el;
       }
-      _.each(this.items, function(view){
+      _.each(this.items, function(view) {
         if (view.appendInContainer === true) {
           $container.append(view.render().$el);
         } else {
@@ -95,14 +95,14 @@ define([
         });
       });
     },
-    get: function(id){
+    get: function(id) {
       // Remove the recursive part because it was confusing if two children had the
       // same id
       return _.findWhere(this.items, {'id': id});
     },
     add: function(item) {
       if (item.id !== undefined && this.get(item.id)) {
-        throw "Another item with the same `id` already exists.";
+        throw 'Another item with the same `id` already exists.';
       }
       this.items.push(item);
     }
diff --git a/js/ui/views/popover.js b/js/ui/views/popover.js
index 3116f55..a09b516 100644
--- a/js/ui/views/popover.js
+++ b/js/ui/views/popover.js
@@ -31,7 +31,7 @@ define([
   'mockup-patterns-backdrop',
   'text!js/ui/templates/popover.xml',
 ], function($, _, Backbone, ContainerView, Backdrop, PopoverTemplate) {
-  "use strict";
+  'use strict';
 
   var PopoverView = ContainerView.extend({
     tagName: 'div',
@@ -44,7 +44,7 @@ define([
     triggerEvents: {
       'button:click': 'toggle'
     },
-    placement: "bottom",
+    placement: 'bottom',
     events: {
     },
     opened: false,
@@ -54,10 +54,10 @@ define([
     $backdrop: null,
     useBackdrop: true,
     backdropOptions: {
-      zIndex: "1009",
-      opacity: "0.4",
-      className: "backdrop backdrop-popover",
-      classActiveName: "backdrop-active",
+      zIndex: '1009',
+      opacity: '0.4',
+      className: 'backdrop backdrop-popover',
+      classActiveName: 'backdrop-active',
       closeOnEsc: false,
       closeOnClick: true
     },
@@ -80,14 +80,14 @@ define([
         }, this);
       }
     },
-    getPosition: function(){
+    getPosition: function() {
       var $el = this.triggerView.$el;
       return $.extend({}, {
         width: $el[0].offsetWidth,
         height: $el[0].offsetHeight
       }, $el.offset());
     },
-    show: function(){
+    show: function() {
       var pos = this.getPosition();
       var $tip = this.$el, tp, placement, actualWidth, actualHeight;
 
@@ -117,19 +117,19 @@ define([
       this.applyPlacement(tp, placement);
 
       this.setBackdrop();
-      if(this.useBackdrop === true){
+      if (this.useBackdrop === true) {
         this.backdrop.show();
       }
 
       this.opened = true;
 
-      if(this.triggerView){
+      if (this.triggerView) {
         this.triggerView.$el.addClass('active');
       }
 
       this.uiEventTrigger('show', this);
     },
-    applyPlacement: function(offset, placement){
+    applyPlacement: function(offset, placement) {
       var $el = this.$el,
         $tip = this.$el,
         width = $tip[0].offsetWidth,
@@ -154,7 +154,7 @@ define([
       if (placement === 'bottom' || placement === 'top') {
         delta = 0;
 
-        if (offset.left < 0){
+        if (offset.left < 0) {
           delta = offset.left * -2;
           offset.left = 0;
           $el.offset(offset);
@@ -174,18 +174,18 @@ define([
     },
     positionArrow: function(delta, dimension, position) {
       var $arrow = this.$('.arrow');
-      $arrow.css(position, delta ? (50 * (1 - delta / dimension) + "%") : '');
+      $arrow.css(position, delta ? (50 * (1 - delta / dimension) + '%') : '');
     },
-    hide: function(){
+    hide: function() {
       this.opened = false;
       this.$el.removeClass('active');
-      if(this.triggerView){
+      if (this.triggerView) {
         this.triggerView.$el.removeClass('active');
       }
       this.uiEventTrigger('hide', this);
     },
-    toggle: function(button, e){
-      if(this.opened){
+    toggle: function(button, e) {
+      if (this.opened) {
         this.hide();
       } else {
         this.show();
diff --git a/js/ui/views/toolbar.js b/js/ui/views/toolbar.js
index 18c3533..8b00699 100644
--- a/js/ui/views/toolbar.js
+++ b/js/ui/views/toolbar.js
@@ -28,7 +28,7 @@ define([
   'backbone',
   'js/ui/views/container'
 ], function(_, Backbone, ContainerView) {
-  "use strict";
+  'use strict';
 
   var Toolbar = ContainerView.extend({
     tagName: 'div',
diff --git a/js/utils.js b/js/utils.js
index bec7107..8005a0b 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -29,9 +29,9 @@
 define([
   'jquery'
 ], function($) {
-  "use strict";
+  'use strict';
 
-  var QueryHelper = function(options){
+  var QueryHelper = function(options) {
     /* if pattern argument provided, it can implement the interface of:
       *    - browsing: boolean if currently browsing
       *    - currentPath: string of current path to apply to search if browsing
@@ -50,7 +50,7 @@ define([
     };
     self.options = $.extend({}, defaults, options);
     self.pattern = self.options.pattern;
-    if(self.pattern === undefined || self.pattern === null){
+    if (self.pattern === undefined || self.pattern === null) {
       self.pattern = {
         browsing: false,
         basePath: '/'
@@ -59,46 +59,46 @@ define([
 
     if (self.options.url && !self.options.vocabularyUrl) {
       self.options.vocabularyUrl = self.options.url;
-    }else if(self.pattern.vocabularyUrl){
+    } else if (self.pattern.vocabularyUrl) {
       self.options.vocabularyUrl = self.pattern.vocabularyUrl;
     }
-    if(self.options.vocabularyUrl !== undefined &&
-        self.options.vocabularyUrl !== null){
+    if (self.options.vocabularyUrl !== undefined &&
+        self.options.vocabularyUrl !== null) {
       self.valid = true;
-    }else{
+    } else {
       self.valid = false;
     }
 
-    self.getCurrentPath = function(){
+    self.getCurrentPath = function() {
       var pattern = self.pattern;
       var currentPath;
       /* If currentPath is set on the QueryHelper object, use that first.
        * Then, check on the pattern.
        * Finally, see if it is a function and call it if it is.
        */
-      if(self.currentPath){
+      if (self.currentPath) {
         currentPath = self.currentPath;
-      }else{
+      } else {
         currentPath = pattern.currentPath;
       }
-      if(typeof(currentPath) === 'function'){
+      if (typeof(currentPath) === 'function') {
         currentPath = currentPath();
       }
       var path = currentPath;
-      if(!path){
-        if(pattern.basePath){
+      if (!path) {
+        if (pattern.basePath) {
           path = pattern.basePath;
-        }else if(pattern.options.basePath){
+        } else if (pattern.options.basePath) {
           path = pattern.options.basePath;
-        }else{
+        } else {
           path = '/';
         }
       }
       return path;
     };
 
-    self.getCriterias = function(term, options){
-      if(options === undefined){
+    self.getCriterias = function(term, options) {
+      if (options === undefined) {
         options = {};
       }
       options = $.extend({}, {
@@ -107,10 +107,10 @@ define([
       }, options);
 
       var criterias = [];
-      if(options.useBaseCriteria){
+      if (options.useBaseCriteria) {
         criterias = self.options.baseCriteria.slice(0);
       }
-      if(term){
+      if (term) {
         term += '*';
         criterias.push({
           i: self.options.searchParam,
@@ -118,7 +118,7 @@ define([
           v: term
         });
       }
-      if(self.pattern.browsing){
+      if (self.pattern.browsing) {
         criterias.push({
           i: 'path',
           o: 'plone.app.querystring.operation.string.path',
@@ -129,8 +129,8 @@ define([
       return criterias;
     };
 
-    self.getBatch = function(page){
-      if(!page){
+    self.getBatch = function(page) {
+      if (!page) {
         page = 1;
       }
       return {
@@ -139,7 +139,7 @@ define([
       };
     };
 
-    self.selectAjax = function(){
+    self.selectAjax = function() {
       return {
         url: self.options.vocabularyUrl,
         dataType: 'JSON',
@@ -155,35 +155,35 @@ define([
       };
     };
 
-    self.getUrl = function(){
+    self.getUrl = function() {
       var url = self.options.vocabularyUrl;
-      if(url.indexOf('?') === -1){
+      if (url.indexOf('?') === -1) {
         url += '?';
-      }else{
+      } else {
         url += '&';
       }
       return url + $.param(self.getQueryData());
     };
 
-    self.getQueryData = function(term, page){
+    self.getQueryData = function(term, page) {
       var data = {
         query: JSON.stringify({
           criteria: self.getCriterias(term)
         }),
         attributes: JSON.stringify(self.options.attributes)
       };
-      if(page){
+      if (page) {
         data.batch = JSON.stringify(self.getBatch(page));
       }
       return data;
     };
 
-    self.search = function(term, operation, value, callback, useBaseCriteria){
-      if(useBaseCriteria === undefined){
+    self.search = function(term, operation, value, callback, useBaseCriteria) {
+      if (useBaseCriteria === undefined) {
         useBaseCriteria = true;
       }
       var criteria = [];
-      if(useBaseCriteria){
+      if (useBaseCriteria) {
         criteria = self.options.baseCriteria.slice(0);
       }
       criteria.push({
@@ -206,7 +206,7 @@ define([
     return self;
   };
 
-  var ProgressIndicator = function(options){
+  var ProgressIndicator = function(options) {
     /*
      * Options:
      *   className(string): Defaults to "progress-indicator"
@@ -226,21 +226,21 @@ define([
       wrapper: null,
       zIndex: 10005 // can be a function
     };
-    if(!options){
+    if (!options) {
       options = {};
     }
     self.options = $.extend({}, defaults, options);
-    if(self.options.container === null){
+    if (self.options.container === null) {
       self.options.container = $('body');
     }
     self.$loading = $('> .' + self.options.className, self.options.container);
-    if (self.$loading.size() === 0){
+    if (self.$loading.size() === 0) {
       self.$loading = $('<div/>').hide()
         .addClass(self.options.className)
         .appendTo(self.options.container);
     }
     self.$wrapper = self.options.wrapper;
-    if(self.$wrapper === null){
+    if (self.$wrapper === null) {
       self.$wrapper = self.options.container;
     }
 
@@ -249,7 +249,7 @@ define([
         closable = true;
       }
 
-      if(self.options.backdrop){
+      if (self.options.backdrop) {
         self.options.backdrop.closeOnClick = closable;
         self.options.backdrop.closeOnEsc = closable;
         self.options.backdrop.init();
@@ -257,7 +257,7 @@ define([
 
       self.$wrapper.parent().css('overflow', 'hidden');
       self.$wrapper.show();
-      if(self.options.backdrop){
+      if (self.options.backdrop) {
         self.options.backdrop.show();
       }
       self.$loading.show();
@@ -266,8 +266,8 @@ define([
 
     self.position = function() {
       self.$loading.css({
-        'margin-left': self.$wrapper.width()/2 - self.$loading.width()/2,
-        'margin-top': self.$wrapper.height()/2 - self.$loading.height()/2,
+        'margin-left': self.$wrapper.width() / 2 - self.$loading.width() / 2,
+        'margin-top': self.$wrapper.height() / 2 - self.$loading.height() / 2,
         'position': 'absolute',
         'bottom': '0',
         'left': '0',
@@ -275,13 +275,13 @@ define([
         'top': '0'
       });
       var zIndex = self.options.zIndex;
-      if(typeof(zIndex) === 'function'){
+      if (typeof(zIndex) === 'function') {
         zIndex = zIndex();
       }
       self.$loading.css('zIndex', zIndex);
     };
 
-    self.hide = function(){
+    self.hide = function() {
       self.$loading.hide();
       self.$wrapper.parent().css('overflow', '');
     };
@@ -291,16 +291,16 @@ define([
 
   return {
 
-    parseBodyTag: function(txt){
+    parseBodyTag: function(txt) {
       return $((/<body[^>]*>((.|[\n\r])*)<\/body>/im).exec(txt)[0]
           .replace('<body', '<div').replace('</body>', '</div>')).eq(0).html();
     },
-    setId: function($el, prefix){
-      if(prefix === undefined){
+    setId: function($el, prefix) {
+      if (prefix === undefined) {
         prefix = 'id';
       }
       var id = $el.attr('id');
-      if(id === undefined){
+      if (id === undefined) {
         id = prefix + (Math.floor((1 + Math.random()) * 0x10000)
           .toString(16).substring(1));
       } else {
@@ -311,8 +311,8 @@ define([
       $el.attr('id', id);
       return id;
     },
-    bool: function(val){
-      if(typeof(val) === 'string'){
+    bool: function(val) {
+      if (typeof(val) === 'string') {
         val = $.trim(val).toLowerCase();
       }
       return ['true', true, 1].indexOf(val) !== -1;
diff --git a/package.json b/package.json
index 1385cb7..36231f3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
-  "name": "plone-mockup",
-  "version": "1.4.0",
+  "name": "mockup",
+  "version": "1.6.0",
   "description": "Collection of Plone CMS Core Patterns",
   "homepage": "http://plone.github.io/mockup",
   "devDependencies": {
@@ -14,6 +14,7 @@
     "grunt-contrib-less": "~0.9.0",
     "grunt-contrib-requirejs": "~0.4.1",
     "grunt-contrib-uglify": "~0.3.2",
+    "grunt-jscs-checker": "~0.4.0",
     "grunt-karma": "~0.7.2",
     "grunt-sed": "~0.1.1",
     "karma": "~0.11.13",
diff --git a/package.nix b/package.nix
index 6f0d2ec..f1b8b4f 100644
--- a/package.nix
+++ b/package.nix
@@ -210,7 +210,7 @@
     buildInputs =
       (self.nativeDeps."archiver" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
       self.by-version."zip-stream"."0.1.4"
       self.by-version."lazystream"."0.1.0"
       self.by-version."file-utils"."0.1.5"
@@ -566,8 +566,8 @@
       self.by-version."decompress-zip"."0.0.4"
       self.by-version."fstream"."0.1.25"
       self.by-version."fstream-ignore"."0.0.7"
-      self.by-version."glob"."3.2.8"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."glob"."3.2.9"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."handlebars"."1.0.12"
       self.by-version."inquirer"."0.3.5"
       self.by-version."junk"."0.2.2"
@@ -611,7 +611,7 @@
     buildInputs =
       (self.nativeDeps."bower-config" or []);
     deps = [
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."mout"."0.6.0"
       self.by-version."optimist"."0.6.1"
       self.by-version."osenv"."0.0.3"
@@ -634,7 +634,7 @@
     buildInputs =
       (self.nativeDeps."bower-config" or []);
     deps = [
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."mout"."0.6.0"
       self.by-version."optimist"."0.6.1"
       self.by-version."osenv"."0.0.3"
@@ -677,7 +677,7 @@
       (self.nativeDeps."bower-json" or []);
     deps = [
       self.by-version."deep-extend"."0.2.8"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."intersect"."0.0.3"
     ];
     peerDependencies = [
@@ -719,7 +719,7 @@
     deps = [
       self.by-version."async"."0.2.10"
       self.by-version."bower-config"."0.4.5"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."lru-cache"."2.3.1"
       self.by-version."request"."2.27.0"
       self.by-version."request-replay"."0.2.0"
@@ -803,7 +803,7 @@
     buildInputs =
       (self.nativeDeps."cardinal" or []);
     deps = [
-      self.by-version."redeyed"."0.4.2"
+      self.by-version."redeyed"."0.4.4"
       self.by-version."ansicolors"."0.2.1"
     ];
     peerDependencies = [
@@ -968,7 +968,7 @@
     buildInputs =
       (self.nativeDeps."cli" or []);
     deps = [
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -1073,6 +1073,25 @@
     ];
     passthru.names = [ "colors" ];
   };
+  by-spec."colors"."0.6.0-1" =
+    self.by-version."colors"."0.6.0-1";
+  by-version."colors"."0.6.0-1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-colors-0.6.0-1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz";
+        name = "colors-0.6.0-1.tgz";
+        sha1 = "6dbb68ceb8bc60f2b313dcc5ce1599f06d19e67a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."colors" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "colors" ];
+  };
   by-spec."colors"."0.x.x" =
     self.by-version."colors"."0.6.2";
   by-version."colors"."0.6.2" = lib.makeOverridable self.buildNodePackage {
@@ -1133,6 +1152,26 @@
     ];
     passthru.names = [ "commander" ];
   };
+  by-spec."commander"."1.2.0" =
+    self.by-version."commander"."1.2.0";
+  by-version."commander"."1.2.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-commander-1.2.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/commander/-/commander-1.2.0.tgz";
+        name = "commander-1.2.0.tgz";
+        sha1 = "fd5713bfa153c7d6cc599378a5ab4c45c535029e";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."commander" or []);
+    deps = [
+      self.by-version."keypress"."0.1.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "commander" ];
+  };
   by-spec."commander"."2.0.0" =
     self.by-version."commander"."2.0.0";
   by-version."commander"."2.0.0" = lib.makeOverridable self.buildNodePackage {
@@ -1195,7 +1234,7 @@
       self.by-version."mkdirp"."0.3.5"
       self.by-version."js-yaml"."2.1.3"
       self.by-version."osenv"."0.0.3"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
     ];
     peerDependencies = [
     ];
@@ -1528,7 +1567,7 @@
       self.by-version."mkpath"."0.1.0"
       self.by-version."binary"."0.3.0"
       self.by-version."touch"."0.0.2"
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
       self.by-version."nopt"."2.1.2"
     ];
     peerDependencies = [
@@ -1725,7 +1764,7 @@
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."1.5.0"
       self.by-version."esutils"."1.0.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -1747,21 +1786,21 @@
     deps = [
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."0.0.4"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
     passthru.names = [ "escodegen" ];
   };
-  by-spec."escodegen"."1.0.x" =
-    self.by-version."escodegen"."1.0.1";
-  by-version."escodegen"."1.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "escodegen-1.0.1";
+  by-spec."escodegen"."1.1.x" =
+    self.by-version."escodegen"."1.1.0";
+  by-version."escodegen"."1.1.0" = lib.makeOverridable self.buildNodePackage {
+    name = "escodegen-1.1.0";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/escodegen/-/escodegen-1.0.1.tgz";
-        name = "escodegen-1.0.1.tgz";
-        sha1 = "84c92c4a07440271b90e6b78e620973bf721226e";
+        url = "http://registry.npmjs.org/escodegen/-/escodegen-1.1.0.tgz";
+        name = "escodegen-1.1.0.tgz";
+        sha1 = "c663923f6e20aad48d0c0fa49f31c6d4f49360cf";
       })
     ];
     buildInputs =
@@ -1770,12 +1809,31 @@
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."1.5.0"
       self.by-version."esutils"."1.0.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
     passthru.names = [ "escodegen" ];
   };
+  by-spec."esprima"."1.0.3" =
+    self.by-version."esprima"."1.0.3";
+  by-version."esprima"."1.0.3" = lib.makeOverridable self.buildNodePackage {
+    name = "esprima-1.0.3";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz";
+        name = "esprima-1.0.3.tgz";
+        sha1 = "7bdb544f95526d424808654d3b8fbe928650c0fe";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."esprima" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "esprima" ];
+  };
   by-spec."esprima"."1.0.x" =
     self.by-version."esprima"."1.0.4";
   by-version."esprima"."1.0.4" = lib.makeOverridable self.buildNodePackage {
@@ -1797,8 +1855,6 @@
   };
   by-spec."esprima"."~ 1.0.2" =
     self.by-version."esprima"."1.0.4";
-  by-spec."esprima"."~1.0.0" =
-    self.by-version."esprima"."1.0.4";
   by-spec."esprima"."~1.0.2" =
     self.by-version."esprima"."1.0.4";
   by-spec."esprima"."~1.0.4" =
@@ -1901,7 +1957,7 @@
     ];
     passthru.names = [ "eventemitter2" ];
   };
-  by-spec."exit"."~0.1.1" =
+  by-spec."exit"."0.1.x" =
     self.by-version."exit"."0.1.2";
   by-version."exit"."0.1.2" = lib.makeOverridable self.buildNodePackage {
     name = "node-exit-0.1.2";
@@ -1920,6 +1976,8 @@
     ];
     passthru.names = [ "exit" ];
   };
+  by-spec."exit"."~0.1.1" =
+    self.by-version."exit"."0.1.2";
   by-spec."extend"."~1.2.1" =
     self.by-version."extend"."1.2.1";
   by-version."extend"."1.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -1957,7 +2015,7 @@
       self.by-version."lodash"."2.1.0"
       self.by-version."iconv-lite"."0.2.11"
       self.by-version."rimraf"."2.2.6"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
       self.by-version."minimatch"."0.2.14"
       self.by-version."findup-sync"."0.1.2"
       self.by-version."isbinaryfile"."0.1.9"
@@ -1981,7 +2039,7 @@
       (self.nativeDeps."fileset" or []);
     deps = [
       self.by-version."minimatch"."0.2.14"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -2127,7 +2185,7 @@
     deps = [
       self.by-version."rimraf"."2.2.6"
       self.by-version."mkdirp"."0.3.5"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."inherits"."2.0.1"
     ];
     peerDependencies = [
@@ -2194,7 +2252,28 @@
       (self.nativeDeps."glob" or []);
     deps = [
       self.by-version."minimatch"."0.2.14"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
+      self.by-version."inherits"."2.0.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "glob" ];
+  };
+  by-spec."glob"."3.2.7" =
+    self.by-version."glob"."3.2.7";
+  by-version."glob"."3.2.7" = lib.makeOverridable self.buildNodePackage {
+    name = "node-glob-3.2.7";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/glob/-/glob-3.2.7.tgz";
+        name = "glob-3.2.7.tgz";
+        sha1 = "275f39a0eee805694790924f36eac38e1db6d802";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."glob" or []);
+    deps = [
+      self.by-version."minimatch"."0.2.14"
       self.by-version."inherits"."2.0.1"
     ];
     peerDependencies = [
@@ -2202,14 +2281,14 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob"."3.x" =
-    self.by-version."glob"."3.2.8";
-  by-version."glob"."3.2.8" = lib.makeOverridable self.buildNodePackage {
-    name = "node-glob-3.2.8";
+    self.by-version."glob"."3.2.9";
+  by-version."glob"."3.2.9" = lib.makeOverridable self.buildNodePackage {
+    name = "node-glob-3.2.9";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/glob/-/glob-3.2.8.tgz";
-        name = "glob-3.2.8.tgz";
-        sha1 = "5506f4311721bcc618c7d8dba144188750307073";
+        url = "http://registry.npmjs.org/glob/-/glob-3.2.9.tgz";
+        name = "glob-3.2.9.tgz";
+        sha1 = "56af2289aa43d07d7702666480373eb814d91d40";
       })
     ];
     buildInputs =
@@ -2223,7 +2302,7 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob".">= 3.1.4" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.1.21" =
     self.by-version."glob"."3.1.21";
   by-version."glob"."3.1.21" = lib.makeOverridable self.buildNodePackage {
@@ -2247,11 +2326,11 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob"."~3.2.1" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.2.6" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.2.7" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."graceful-fs"."~1.1" =
     self.by-version."graceful-fs"."1.1.14";
   by-version."graceful-fs"."1.1.14" = lib.makeOverridable self.buildNodePackage {
@@ -2291,14 +2370,14 @@
     passthru.names = [ "graceful-fs" ];
   };
   by-spec."graceful-fs"."~2.0.0" =
-    self.by-version."graceful-fs"."2.0.1";
-  by-version."graceful-fs"."2.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "node-graceful-fs-2.0.1";
+    self.by-version."graceful-fs"."2.0.2";
+  by-version."graceful-fs"."2.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-graceful-fs-2.0.2";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.1.tgz";
-        name = "graceful-fs-2.0.1.tgz";
-        sha1 = "7fd6e0a4837c35d0cc15330294d9584a3898cf84";
+        url = "http://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz";
+        name = "graceful-fs-2.0.2.tgz";
+        sha1 = "26806eaca4bff8fc5dbc935e696135792175c46f";
       })
     ];
     buildInputs =
@@ -2310,7 +2389,7 @@
     passthru.names = [ "graceful-fs" ];
   };
   by-spec."graceful-fs"."~2.0.1" =
-    self.by-version."graceful-fs"."2.0.1";
+    self.by-version."graceful-fs"."2.0.2";
   by-spec."growl"."1.7.x" =
     self.by-version."growl"."1.7.0";
   by-version."growl"."1.7.0" = lib.makeOverridable self.buildNodePackage {
@@ -2432,7 +2511,7 @@
     buildInputs =
       (self.nativeDeps."grunt-contrib-jshint" or []);
     deps = [
-      self.by-version."jshint"."2.4.3"
+      self.by-version."jshint"."2.4.4"
     ];
     peerDependencies = [
       self.by-version."grunt"."0.4.2"
@@ -2465,36 +2544,36 @@
   };
   "grunt-contrib-less" = self.by-version."grunt-contrib-less"."0.9.0";
   by-spec."grunt-contrib-requirejs"."~0.4.1" =
-    self.by-version."grunt-contrib-requirejs"."0.4.1";
-  by-version."grunt-contrib-requirejs"."0.4.1" = lib.makeOverridable self.buildNodePackage {
-    name = "node-grunt-contrib-requirejs-0.4.1";
+    self.by-version."grunt-contrib-requirejs"."0.4.3";
+  by-version."grunt-contrib-requirejs"."0.4.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-contrib-requirejs-0.4.3";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz";
-        name = "grunt-contrib-requirejs-0.4.1.tgz";
-        sha1 = "862ba167141b8a8f36af5444feab3272bb8cf4bd";
+        url = "http://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.3.tgz";
+        name = "grunt-contrib-requirejs-0.4.3.tgz";
+        sha1 = "ac243dc312af5c85cd095169da1b3177bfe89c59";
       })
     ];
     buildInputs =
       (self.nativeDeps."grunt-contrib-requirejs" or []);
     deps = [
-      self.by-version."requirejs"."2.1.10"
+      self.by-version."requirejs"."2.1.11"
     ];
     peerDependencies = [
       self.by-version."grunt"."0.4.2"
     ];
     passthru.names = [ "grunt-contrib-requirejs" ];
   };
-  "grunt-contrib-requirejs" = self.by-version."grunt-contrib-requirejs"."0.4.1";
+  "grunt-contrib-requirejs" = self.by-version."grunt-contrib-requirejs"."0.4.3";
   by-spec."grunt-contrib-uglify"."~0.3.2" =
-    self.by-version."grunt-contrib-uglify"."0.3.2";
-  by-version."grunt-contrib-uglify"."0.3.2" = lib.makeOverridable self.buildNodePackage {
-    name = "node-grunt-contrib-uglify-0.3.2";
+    self.by-version."grunt-contrib-uglify"."0.3.3";
+  by-version."grunt-contrib-uglify"."0.3.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-contrib-uglify-0.3.3";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.3.2.tgz";
-        name = "grunt-contrib-uglify-0.3.2.tgz";
-        sha1 = "865b00ae0d11d1f5fafca3967c9b099f8929684b";
+        url = "http://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.3.3.tgz";
+        name = "grunt-contrib-uglify-0.3.3.tgz";
+        sha1 = "91f04d2ae0984c8bdf73ae6ee23f13cd5c44f0af";
       })
     ];
     buildInputs =
@@ -2509,7 +2588,32 @@
     ];
     passthru.names = [ "grunt-contrib-uglify" ];
   };
-  "grunt-contrib-uglify" = self.by-version."grunt-contrib-uglify"."0.3.2";
+  "grunt-contrib-uglify" = self.by-version."grunt-contrib-uglify"."0.3.3";
+  by-spec."grunt-jscs-checker"."~0.4.0" =
+    self.by-version."grunt-jscs-checker"."0.4.0";
+  by-version."grunt-jscs-checker"."0.4.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-jscs-checker-0.4.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz";
+        name = "grunt-jscs-checker-0.4.0.tgz";
+        sha1 = "aac281242fc5f40fed511d751a807f3b6a4fe0ac";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."grunt-jscs-checker" or []);
+    deps = [
+      self.by-version."hooker"."0.2.3"
+      self.by-version."jscs"."1.3.0"
+      self.by-version."lodash.assign"."2.4.1"
+      self.by-version."vow"."0.4.1"
+    ];
+    peerDependencies = [
+      self.by-version."grunt"."0.4.2"
+    ];
+    passthru.names = [ "grunt-jscs-checker" ];
+  };
+  "grunt-jscs-checker" = self.by-version."grunt-jscs-checker"."0.4.0";
   by-spec."grunt-karma"."~0.7.2" =
     self.by-version."grunt-karma"."0.7.2";
   by-version."grunt-karma"."0.7.2" = lib.makeOverridable self.buildNodePackage {
@@ -2758,7 +2862,7 @@
       self.by-version."domhandler"."2.1.0"
       self.by-version."domutils"."1.1.6"
       self.by-version."domelementtype"."1.1.1"
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -2843,7 +2947,7 @@
       (self.nativeDeps."ibrik" or []);
     deps = [
       self.by-version."coffee-script-redux"."2.0.0-beta4"
-      self.by-version."istanbul"."0.2.4"
+      self.by-version."istanbul"."0.2.5"
       self.by-version."optimist"."0.6.1"
       self.by-version."escodegen"."1.2.0"
       self.by-version."mkdirp"."0.3.5"
@@ -2998,21 +3102,21 @@
     passthru.names = [ "isbinaryfile" ];
   };
   by-spec."istanbul"."*" =
-    self.by-version."istanbul"."0.2.4";
-  by-version."istanbul"."0.2.4" = lib.makeOverridable self.buildNodePackage {
-    name = "istanbul-0.2.4";
+    self.by-version."istanbul"."0.2.5";
+  by-version."istanbul"."0.2.5" = lib.makeOverridable self.buildNodePackage {
+    name = "istanbul-0.2.5";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/istanbul/-/istanbul-0.2.4.tgz";
-        name = "istanbul-0.2.4.tgz";
-        sha1 = "faaaa400f2cf652c3dc8b3d9484b44a5528e3a04";
+        url = "http://registry.npmjs.org/istanbul/-/istanbul-0.2.5.tgz";
+        name = "istanbul-0.2.5.tgz";
+        sha1 = "c6e5e5e2632ae7f208b4322dd69082bb76771ea4";
       })
     ];
     buildInputs =
       (self.nativeDeps."istanbul" or []);
     deps = [
       self.by-version."esprima"."1.0.4"
-      self.by-version."escodegen"."1.0.1"
+      self.by-version."escodegen"."1.1.0"
       self.by-version."handlebars"."1.3.0"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."nopt"."2.1.2"
@@ -3022,7 +3126,7 @@
       self.by-version."abbrev"."1.0.4"
       self.by-version."wordwrap"."0.0.2"
       self.by-version."resolve"."0.6.1"
-      self.by-version."js-yaml"."3.0.1"
+      self.by-version."js-yaml"."3.0.2"
     ];
     peerDependencies = [
     ];
@@ -3099,14 +3203,14 @@
     passthru.names = [ "jedediah" ];
   };
   by-spec."js-yaml"."3.x" =
-    self.by-version."js-yaml"."3.0.1";
-  by-version."js-yaml"."3.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "js-yaml-3.0.1";
+    self.by-version."js-yaml"."3.0.2";
+  by-version."js-yaml"."3.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "js-yaml-3.0.2";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/js-yaml/-/js-yaml-3.0.1.tgz";
-        name = "js-yaml-3.0.1.tgz";
-        sha1 = "76405fea5bce30fc8f405d48c6dca7f0a32c6afe";
+        url = "http://registry.npmjs.org/js-yaml/-/js-yaml-3.0.2.tgz";
+        name = "js-yaml-3.0.2.tgz";
+        sha1 = "9937865f8e897a5e894e73c2c5cf2e89b32eb771";
       })
     ];
     buildInputs =
@@ -3161,15 +3265,43 @@
     ];
     passthru.names = [ "js-yaml" ];
   };
+  by-spec."jscs"."~1.3.0" =
+    self.by-version."jscs"."1.3.0";
+  by-version."jscs"."1.3.0" = lib.makeOverridable self.buildNodePackage {
+    name = "jscs-1.3.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz";
+        name = "jscs-1.3.0.tgz";
+        sha1 = "b3b7cffd634f96dd70963eb94901fc21c521a9e5";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."jscs" or []);
+    deps = [
+      self.by-version."esprima"."1.0.3"
+      self.by-version."vow"."0.3.9"
+      self.by-version."vow-fs"."0.2.3"
+      self.by-version."colors"."0.6.0-1"
+      self.by-version."commander"."1.2.0"
+      self.by-version."minimatch"."0.2.12"
+      self.by-version."glob"."3.2.7"
+      self.by-version."xmlbuilder"."1.1.2"
+      self.by-version."strip-json-comments"."0.1.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "jscs" ];
+  };
   by-spec."jshint"."~2.4.0" =
-    self.by-version."jshint"."2.4.3";
-  by-version."jshint"."2.4.3" = lib.makeOverridable self.buildNodePackage {
-    name = "jshint-2.4.3";
+    self.by-version."jshint"."2.4.4";
+  by-version."jshint"."2.4.4" = lib.makeOverridable self.buildNodePackage {
+    name = "jshint-2.4.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/jshint/-/jshint-2.4.3.tgz";
-        name = "jshint-2.4.3.tgz";
-        sha1 = "1beb074b4d9f817773bb5aa16882fd67164c216a";
+        url = "http://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz";
+        name = "jshint-2.4.4.tgz";
+        sha1 = "4162238314c649f987752651e8e064e30a68706e";
       })
     ];
     buildInputs =
@@ -3181,6 +3313,7 @@
       self.by-version."minimatch"."0.2.14"
       self.by-version."htmlparser2"."3.3.0"
       self.by-version."console-browserify"."0.1.6"
+      self.by-version."exit"."0.1.2"
     ];
     peerDependencies = [
     ];
@@ -3260,7 +3393,7 @@
       self.by-version."di"."0.0.1"
       self.by-version."socket.io"."0.9.16"
       self.by-version."chokidar"."0.8.1"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
       self.by-version."minimatch"."0.2.14"
       self.by-version."http-proxy"."0.10.4"
       self.by-version."optimist"."0.6.1"
@@ -3270,11 +3403,11 @@
       self.by-version."colors"."0.6.2"
       self.by-version."lodash"."2.4.1"
       self.by-version."mime"."1.2.11"
-      self.by-version."log4js"."0.6.10"
+      self.by-version."log4js"."0.6.12"
       self.by-version."useragent"."2.0.7"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."connect"."2.12.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -3417,7 +3550,7 @@
     ];
     peerDependencies = [
       self.by-version."karma"."0.11.14"
-      self.by-version."requirejs"."2.1.10"
+      self.by-version."requirejs"."2.1.11"
     ];
     passthru.names = [ "karma-requirejs" ];
   };
@@ -3436,7 +3569,7 @@
     buildInputs =
       (self.nativeDeps."karma-sauce-launcher" or []);
     deps = [
-      self.by-version."wd"."0.2.10"
+      self.by-version."wd"."0.2.11"
       self.by-version."sauce-connect-launcher"."0.2.2"
       self.by-version."q"."0.9.7"
       self.by-version."saucelabs"."0.1.1"
@@ -3487,6 +3620,25 @@
     ];
     passthru.names = [ "kew" ];
   };
+  by-spec."keypress"."0.1.x" =
+    self.by-version."keypress"."0.1.0";
+  by-version."keypress"."0.1.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-keypress-0.1.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz";
+        name = "keypress-0.1.0.tgz";
+        sha1 = "4a3188d4291b66b4f65edb99f806aa9ae293592a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."keypress" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "keypress" ];
+  };
   by-spec."lazystream"."~0.1.0" =
     self.by-version."lazystream"."0.1.0";
   by-version."lazystream"."0.1.0" = lib.makeOverridable self.buildNodePackage {
@@ -3501,7 +3653,7 @@
     buildInputs =
       (self.nativeDeps."lazystream" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -3540,7 +3692,7 @@
     buildInputs =
       (self.nativeDeps."lcov-result-merger" or []);
     deps = [
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -3562,10 +3714,10 @@
       (self.nativeDeps."less" or []);
     deps = [
       self.by-version."mime"."1.2.11"
-      self.by-version."request"."2.33.0"
+      self.by-version."request"."2.34.0"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."clean-css"."2.0.8"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -3685,6 +3837,120 @@
     ];
     passthru.names = [ "lodash" ];
   };
+  by-spec."lodash._basebind"."~2.4.1" =
+    self.by-version."lodash._basebind"."2.4.1";
+  by-version."lodash._basebind"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basebind-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz";
+        name = "lodash._basebind-2.4.1.tgz";
+        sha1 = "e940b9ebdd27c327e0a8dab1b55916c5341e9575";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basebind" or []);
+    deps = [
+      self.by-version."lodash._basecreate"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basebind" ];
+  };
+  by-spec."lodash._basecreate"."~2.4.1" =
+    self.by-version."lodash._basecreate"."2.4.1";
+  by-version."lodash._basecreate"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreate-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz";
+        name = "lodash._basecreate-2.4.1.tgz";
+        sha1 = "f8e6f5b578a9e34e541179b56b8eeebf4a287e08";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreate" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash.noop"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreate" ];
+  };
+  by-spec."lodash._basecreatecallback"."~2.4.1" =
+    self.by-version."lodash._basecreatecallback"."2.4.1";
+  by-version."lodash._basecreatecallback"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreatecallback-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz";
+        name = "lodash._basecreatecallback-2.4.1.tgz";
+        sha1 = "7d0b267649cb29e7a139d0103b7c11fae84e4851";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreatecallback" or []);
+    deps = [
+      self.by-version."lodash.bind"."2.4.1"
+      self.by-version."lodash.identity"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash.support"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreatecallback" ];
+  };
+  by-spec."lodash._basecreatewrapper"."~2.4.1" =
+    self.by-version."lodash._basecreatewrapper"."2.4.1";
+  by-version."lodash._basecreatewrapper"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreatewrapper-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz";
+        name = "lodash._basecreatewrapper-2.4.1.tgz";
+        sha1 = "4d31f2e7de7e134fbf2803762b8150b32519666f";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreatewrapper" or []);
+    deps = [
+      self.by-version."lodash._basecreate"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreatewrapper" ];
+  };
+  by-spec."lodash._createwrapper"."~2.4.1" =
+    self.by-version."lodash._createwrapper"."2.4.1";
+  by-version."lodash._createwrapper"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._createwrapper-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz";
+        name = "lodash._createwrapper-2.4.1.tgz";
+        sha1 = "51d6957973da4ed556e37290d8c1a18c53de1607";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._createwrapper" or []);
+    deps = [
+      self.by-version."lodash._basebind"."2.4.1"
+      self.by-version."lodash._basecreatewrapper"."2.4.1"
+      self.by-version."lodash.isfunction"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._createwrapper" ];
+  };
   by-spec."lodash._isnative"."~2.4.1" =
     self.by-version."lodash._isnative"."2.4.1";
   by-version."lodash._isnative"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3723,6 +3989,27 @@
     ];
     passthru.names = [ "lodash._objecttypes" ];
   };
+  by-spec."lodash._setbinddata"."~2.4.1" =
+    self.by-version."lodash._setbinddata"."2.4.1";
+  by-version."lodash._setbinddata"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._setbinddata-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz";
+        name = "lodash._setbinddata-2.4.1.tgz";
+        sha1 = "f7c200cd1b92ef236b399eecf73c648d17aa94d2";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._setbinddata" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+      self.by-version."lodash.noop"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._setbinddata" ];
+  };
   by-spec."lodash._shimkeys"."~2.4.1" =
     self.by-version."lodash._shimkeys"."2.4.1";
   by-version."lodash._shimkeys"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3743,6 +4030,68 @@
     ];
     passthru.names = [ "lodash._shimkeys" ];
   };
+  by-spec."lodash._slice"."~2.4.1" =
+    self.by-version."lodash._slice"."2.4.1";
+  by-version."lodash._slice"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._slice-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz";
+        name = "lodash._slice-2.4.1.tgz";
+        sha1 = "745cf41a53597b18f688898544405efa2b06d90f";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._slice" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._slice" ];
+  };
+  by-spec."lodash.assign"."~2.4.1" =
+    self.by-version."lodash.assign"."2.4.1";
+  by-version."lodash.assign"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.assign-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz";
+        name = "lodash.assign-2.4.1.tgz";
+        sha1 = "84c39596dd71181a97b0652913a7c9675e49b1aa";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.assign" or []);
+    deps = [
+      self.by-version."lodash._basecreatecallback"."2.4.1"
+      self.by-version."lodash.keys"."2.4.1"
+      self.by-version."lodash._objecttypes"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.assign" ];
+  };
+  by-spec."lodash.bind"."~2.4.1" =
+    self.by-version."lodash.bind"."2.4.1";
+  by-version."lodash.bind"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.bind-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz";
+        name = "lodash.bind-2.4.1.tgz";
+        sha1 = "5d19fa005c8c4d236faf4742c7b7a1fcabe29267";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.bind" or []);
+    deps = [
+      self.by-version."lodash._createwrapper"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.bind" ];
+  };
   by-spec."lodash.defaults"."~2.4.1" =
     self.by-version."lodash.defaults"."2.4.1";
   by-version."lodash.defaults"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3764,6 +4113,44 @@
     ];
     passthru.names = [ "lodash.defaults" ];
   };
+  by-spec."lodash.identity"."~2.4.1" =
+    self.by-version."lodash.identity"."2.4.1";
+  by-version."lodash.identity"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.identity-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz";
+        name = "lodash.identity-2.4.1.tgz";
+        sha1 = "6694cffa65fef931f7c31ce86c74597cf560f4f1";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.identity" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.identity" ];
+  };
+  by-spec."lodash.isfunction"."~2.4.1" =
+    self.by-version."lodash.isfunction"."2.4.1";
+  by-version."lodash.isfunction"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.isfunction-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz";
+        name = "lodash.isfunction-2.4.1.tgz";
+        sha1 = "2cfd575c73e498ab57e319b77fa02adef13a94d1";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.isfunction" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.isfunction" ];
+  };
   by-spec."lodash.isobject"."~2.4.1" =
     self.by-version."lodash.isobject"."2.4.1";
   by-version."lodash.isobject"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3806,6 +4193,45 @@
     ];
     passthru.names = [ "lodash.keys" ];
   };
+  by-spec."lodash.noop"."~2.4.1" =
+    self.by-version."lodash.noop"."2.4.1";
+  by-version."lodash.noop"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.noop-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz";
+        name = "lodash.noop-2.4.1.tgz";
+        sha1 = "4fb54f816652e5ae10e8f72f717a388c7326538a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.noop" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.noop" ];
+  };
+  by-spec."lodash.support"."~2.4.1" =
+    self.by-version."lodash.support"."2.4.1";
+  by-version."lodash.support"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.support-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz";
+        name = "lodash.support-2.4.1.tgz";
+        sha1 = "320e0b67031673c28d7a2bb5d9e0331a45240515";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.support" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.support" ];
+  };
   by-spec."log-driver"."1.2.1" =
     self.by-version."log-driver"."1.2.1";
   by-version."log-driver"."1.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -3826,14 +4252,14 @@
     passthru.names = [ "log-driver" ];
   };
   by-spec."log4js"."~0.6.3" =
-    self.by-version."log4js"."0.6.10";
-  by-version."log4js"."0.6.10" = lib.makeOverridable self.buildNodePackage {
-    name = "node-log4js-0.6.10";
+    self.by-version."log4js"."0.6.12";
+  by-version."log4js"."0.6.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-log4js-0.6.12";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz";
-        name = "log4js-0.6.10.tgz";
-        sha1 = "3a47a2551dc6362672901b73f7f47aee6310f785";
+        url = "http://registry.npmjs.org/log4js/-/log4js-0.6.12.tgz";
+        name = "log4js-0.6.12.tgz";
+        sha1 = "ef806ec669ea3fc7bf5be92a95891fb67517e642";
       })
     ];
     buildInputs =
@@ -3841,7 +4267,7 @@
     deps = [
       self.by-version."async"."0.1.15"
       self.by-version."semver"."1.1.4"
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -3972,6 +4398,27 @@
     self.by-version."mime"."1.2.11";
   by-spec."mime"."~1.2.9" =
     self.by-version."mime"."1.2.11";
+  by-spec."minimatch"."0.2.12" =
+    self.by-version."minimatch"."0.2.12";
+  by-version."minimatch"."0.2.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-minimatch-0.2.12";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz";
+        name = "minimatch-0.2.12.tgz";
+        sha1 = "ea82a012ac662c7ddfaa144f1c147e6946f5dafb";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."minimatch" or []);
+    deps = [
+      self.by-version."lru-cache"."2.5.0"
+      self.by-version."sigmund"."1.0.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "minimatch" ];
+  };
   by-spec."minimatch"."0.x" =
     self.by-version."minimatch"."0.2.14";
   by-version."minimatch"."0.2.14" = lib.makeOverridable self.buildNodePackage {
@@ -4006,14 +4453,14 @@
   by-spec."minimatch"."~0.2.9" =
     self.by-version."minimatch"."0.2.14";
   by-spec."minimist"."~0.0.1" =
-    self.by-version."minimist"."0.0.7";
-  by-version."minimist"."0.0.7" = lib.makeOverridable self.buildNodePackage {
-    name = "node-minimist-0.0.7";
+    self.by-version."minimist"."0.0.8";
+  by-version."minimist"."0.0.8" = lib.makeOverridable self.buildNodePackage {
+    name = "node-minimist-0.0.8";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/minimist/-/minimist-0.0.7.tgz";
-        name = "minimist-0.0.7.tgz";
-        sha1 = "dc4c620253c542eda0d2eb91c3c6a971a11e63e7";
+        url = "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
+        name = "minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
       })
     ];
     buildInputs =
@@ -4174,7 +4621,7 @@
     buildInputs =
       (self.nativeDeps."multiparty" or []);
     deps = [
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
       self.by-version."stream-counter"."0.2.0"
     ];
     peerDependencies = [
@@ -4297,6 +4744,25 @@
     ];
     passthru.names = [ "next-tick" ];
   };
+  by-spec."node-uuid"."1.4.0" =
+    self.by-version."node-uuid"."1.4.0";
+  by-version."node-uuid"."1.4.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-node-uuid-1.4.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz";
+        name = "node-uuid-1.4.0.tgz";
+        sha1 = "07f9b2337572ff6275c775e1d48513f3a45d7a65";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."node-uuid" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "node-uuid" ];
+  };
   by-spec."node-uuid"."~1.4.0" =
     self.by-version."node-uuid"."1.4.1";
   by-version."node-uuid"."1.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -4338,6 +4804,26 @@
     passthru.names = [ "nomnom" ];
   };
   by-spec."nopt"."2" =
+    self.by-version."nopt"."2.2.0";
+  by-version."nopt"."2.2.0" = lib.makeOverridable self.buildNodePackage {
+    name = "nopt-2.2.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/nopt/-/nopt-2.2.0.tgz";
+        name = "nopt-2.2.0.tgz";
+        sha1 = "3d106676f3607ac466af9bf82bd707b1501d3bd5";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."nopt" or []);
+    deps = [
+      self.by-version."abbrev"."1.0.4"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "nopt" ];
+  };
+  by-spec."nopt"."2.1.x" =
     self.by-version."nopt"."2.1.2";
   by-version."nopt"."2.1.2" = lib.makeOverridable self.buildNodePackage {
     name = "nopt-2.1.2";
@@ -4357,8 +4843,6 @@
     ];
     passthru.names = [ "nopt" ];
   };
-  by-spec."nopt"."2.1.x" =
-    self.by-version."nopt"."2.1.2";
   by-spec."nopt"."~1.0.10" =
     self.by-version."nopt"."1.0.10";
   by-version."nopt"."1.0.10" = lib.makeOverridable self.buildNodePackage {
@@ -4402,7 +4886,7 @@
       self.by-version."once"."1.1.1"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."osenv"."0.0.3"
-      self.by-version."nopt"."2.1.2"
+      self.by-version."nopt"."2.2.0"
       self.by-version."semver"."1.1.4"
       self.by-version."ini"."1.1.0"
     ];
@@ -4501,7 +4985,7 @@
       (self.nativeDeps."optimist" or []);
     deps = [
       self.by-version."wordwrap"."0.0.2"
-      self.by-version."minimist"."0.0.7"
+      self.by-version."minimist"."0.0.8"
     ];
     peerDependencies = [
     ];
@@ -4714,14 +5198,14 @@
     passthru.names = [ "proto-list" ];
   };
   by-spec."punycode".">=0.2.0" =
-    self.by-version."punycode"."1.2.3";
-  by-version."punycode"."1.2.3" = lib.makeOverridable self.buildNodePackage {
-    name = "node-punycode-1.2.3";
+    self.by-version."punycode"."1.2.4";
+  by-version."punycode"."1.2.4" = lib.makeOverridable self.buildNodePackage {
+    name = "node-punycode-1.2.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/punycode/-/punycode-1.2.3.tgz";
-        name = "punycode-1.2.3.tgz";
-        sha1 = "b4e304471082d783c73b3bafabf2fd9b6a486266";
+        url = "http://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz";
+        name = "punycode-1.2.4.tgz";
+        sha1 = "54008ac972aec74175def9cba6df7fa9d3918740";
       })
     ];
     buildInputs =
@@ -4874,14 +5358,14 @@
     passthru.names = [ "read" ];
   };
   by-spec."readable-stream"."1.0" =
-    self.by-version."readable-stream"."1.0.25";
-  by-version."readable-stream"."1.0.25" = lib.makeOverridable self.buildNodePackage {
-    name = "node-readable-stream-1.0.25";
+    self.by-version."readable-stream"."1.0.26";
+  by-version."readable-stream"."1.0.26" = lib.makeOverridable self.buildNodePackage {
+    name = "node-readable-stream-1.0.26";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.25.tgz";
-        name = "readable-stream-1.0.25.tgz";
-        sha1 = "df19f64e6f74fd37ecf9d3ab8dbf1e2d11c9a045";
+        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz";
+        name = "readable-stream-1.0.26.tgz";
+        sha1 = "12a9c4415f6a85374abe18b7831ba52d43105766";
       })
     ];
     buildInputs =
@@ -4894,18 +5378,18 @@
     passthru.names = [ "readable-stream" ];
   };
   by-spec."readable-stream"."~1.0.2" =
-    self.by-version."readable-stream"."1.0.25";
+    self.by-version."readable-stream"."1.0.26";
   by-spec."readable-stream"."~1.0.24" =
-    self.by-version."readable-stream"."1.0.25";
+    self.by-version."readable-stream"."1.0.26";
   by-spec."readable-stream"."~1.1.8" =
-    self.by-version."readable-stream"."1.1.10";
-  by-version."readable-stream"."1.1.10" = lib.makeOverridable self.buildNodePackage {
-    name = "node-readable-stream-1.1.10";
+    self.by-version."readable-stream"."1.1.11";
+  by-version."readable-stream"."1.1.11" = lib.makeOverridable self.buildNodePackage {
+    name = "node-readable-stream-1.1.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.10.tgz";
-        name = "readable-stream-1.1.10.tgz";
-        sha1 = "d4dc2e5319e9c90d1e71c69390ef62cd90827f65";
+        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz";
+        name = "readable-stream-1.1.11.tgz";
+        sha1 = "76ae0d88df2ac36c59e7c205e0cafc81c57bc07d";
       })
     ];
     buildInputs =
@@ -4920,16 +5404,16 @@
     passthru.names = [ "readable-stream" ];
   };
   by-spec."readable-stream"."~1.1.9" =
-    self.by-version."readable-stream"."1.1.10";
+    self.by-version."readable-stream"."1.1.11";
   by-spec."redeyed"."~0.4.0" =
-    self.by-version."redeyed"."0.4.2";
-  by-version."redeyed"."0.4.2" = lib.makeOverridable self.buildNodePackage {
-    name = "node-redeyed-0.4.2";
+    self.by-version."redeyed"."0.4.4";
+  by-version."redeyed"."0.4.4" = lib.makeOverridable self.buildNodePackage {
+    name = "node-redeyed-0.4.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/redeyed/-/redeyed-0.4.2.tgz";
-        name = "redeyed-0.4.2.tgz";
-        sha1 = "f0133b990cb972bdbcf2d2dce0aec36595f419bc";
+        url = "http://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz";
+        name = "redeyed-0.4.4.tgz";
+        sha1 = "37e990a6f2b21b2a11c2e6a48fd4135698cba97f";
       })
     ];
     buildInputs =
@@ -5013,14 +5497,14 @@
     passthru.names = [ "request" ];
   };
   by-spec."request".">=2.12.0" =
-    self.by-version."request"."2.33.0";
-  by-version."request"."2.33.0" = lib.makeOverridable self.buildNodePackage {
-    name = "node-request-2.33.0";
+    self.by-version."request"."2.34.0";
+  by-version."request"."2.34.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-request-2.34.0";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/request/-/request-2.33.0.tgz";
-        name = "request-2.33.0.tgz";
-        sha1 = "5167878131726070ec633752ea230a2379dc65ff";
+        url = "http://registry.npmjs.org/request/-/request-2.34.0.tgz";
+        name = "request-2.34.0.tgz";
+        sha1 = "b5d8b9526add4a2d4629f4d417124573996445ae";
       })
     ];
     buildInputs =
@@ -5076,6 +5560,35 @@
   };
   by-spec."request"."~2.33.0" =
     self.by-version."request"."2.33.0";
+  by-version."request"."2.33.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-request-2.33.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/request/-/request-2.33.0.tgz";
+        name = "request-2.33.0.tgz";
+        sha1 = "5167878131726070ec633752ea230a2379dc65ff";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."request" or []);
+    deps = [
+      self.by-version."qs"."0.6.6"
+      self.by-version."json-stringify-safe"."5.0.0"
+      self.by-version."forever-agent"."0.5.2"
+      self.by-version."node-uuid"."1.4.1"
+      self.by-version."mime"."1.2.11"
+      self.by-version."tough-cookie"."0.12.1"
+      self.by-version."form-data"."0.1.2"
+      self.by-version."tunnel-agent"."0.3.0"
+      self.by-version."http-signature"."0.10.0"
+      self.by-version."oauth-sign"."0.3.0"
+      self.by-version."hawk"."1.0.0"
+      self.by-version."aws-sign2"."0.5.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "request" ];
+  };
   by-spec."request-progress"."~0.3.0" =
     self.by-version."request-progress"."0.3.1";
   by-version."request-progress"."0.3.1" = lib.makeOverridable self.buildNodePackage {
@@ -5117,14 +5630,14 @@
     passthru.names = [ "request-replay" ];
   };
   by-spec."requirejs"."~2.1" =
-    self.by-version."requirejs"."2.1.10";
-  by-version."requirejs"."2.1.10" = lib.makeOverridable self.buildNodePackage {
-    name = "requirejs-2.1.10";
+    self.by-version."requirejs"."2.1.11";
+  by-version."requirejs"."2.1.11" = lib.makeOverridable self.buildNodePackage {
+    name = "requirejs-2.1.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/requirejs/-/requirejs-2.1.10.tgz";
-        name = "requirejs-2.1.10.tgz";
-        sha1 = "1e1d7f608790e532a422c6199dad2abe15484b54";
+        url = "http://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz";
+        name = "requirejs-2.1.11.tgz";
+        sha1 = "0eafaa6b46ca9b5b1e13406f119c020190a24442";
       })
     ];
     buildInputs =
@@ -5136,10 +5649,10 @@
     passthru.names = [ "requirejs" ];
   };
   by-spec."requirejs"."~2.1.0" =
-    self.by-version."requirejs"."2.1.10";
+    self.by-version."requirejs"."2.1.11";
   by-spec."requirejs"."~2.1.10" =
-    self.by-version."requirejs"."2.1.10";
-  "requirejs" = self.by-version."requirejs"."2.1.10";
+    self.by-version."requirejs"."2.1.11";
+  "requirejs" = self.by-version."requirejs"."2.1.11";
   by-spec."resolve"."0.5.x" =
     self.by-version."resolve"."0.5.1";
   by-version."resolve"."0.5.1" = lib.makeOverridable self.buildNodePackage {
@@ -5492,14 +6005,14 @@
     passthru.names = [ "socket.io-client" ];
   };
   by-spec."source-map"."0.1.x" =
-    self.by-version."source-map"."0.1.31";
-  by-version."source-map"."0.1.31" = lib.makeOverridable self.buildNodePackage {
-    name = "node-source-map-0.1.31";
+    self.by-version."source-map"."0.1.33";
+  by-version."source-map"."0.1.33" = lib.makeOverridable self.buildNodePackage {
+    name = "node-source-map-0.1.33";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz";
-        name = "source-map-0.1.31.tgz";
-        sha1 = "9f704d0d69d9e138a81badf6ebb4fde33d151c61";
+        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.33.tgz";
+        name = "source-map-0.1.33.tgz";
+        sha1 = "c659297a73af18c073b0aa2e7cc91e316b5c570c";
       })
     ];
     buildInputs =
@@ -5512,13 +6025,13 @@
     passthru.names = [ "source-map" ];
   };
   by-spec."source-map".">= 0.1.2" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.30" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.31" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.7" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."stream-counter"."~0.2.0" =
     self.by-version."stream-counter"."0.2.0";
   by-version."stream-counter"."0.2.0" = lib.makeOverridable self.buildNodePackage {
@@ -5533,7 +6046,7 @@
     buildInputs =
       (self.nativeDeps."stream-counter" or []);
     deps = [
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
     ];
     peerDependencies = [
     ];
@@ -5596,6 +6109,25 @@
     ];
     passthru.names = [ "strip-ansi" ];
   };
+  by-spec."strip-json-comments"."0.1.1" =
+    self.by-version."strip-json-comments"."0.1.1";
+  by-version."strip-json-comments"."0.1.1" = lib.makeOverridable self.buildNodePackage {
+    name = "strip-json-comments-0.1.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz";
+        name = "strip-json-comments-0.1.1.tgz";
+        sha1 = "eb5a750bd4e8dc82817295a115dc11b63f01d4b0";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."strip-json-comments" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "strip-json-comments" ];
+  };
   by-spec."sudo-block"."~0.2.0" =
     self.by-version."sudo-block"."0.2.1";
   by-version."sudo-block"."0.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -5729,7 +6261,7 @@
     buildInputs =
       (self.nativeDeps."tough-cookie" or []);
     deps = [
-      self.by-version."punycode"."1.2.3"
+      self.by-version."punycode"."1.2.4"
     ];
     peerDependencies = [
     ];
@@ -5826,7 +6358,7 @@
       (self.nativeDeps."uglify-js" or []);
     deps = [
       self.by-version."async"."0.2.10"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
       self.by-version."optimist"."0.3.7"
     ];
     peerDependencies = [
@@ -5848,7 +6380,7 @@
       (self.nativeDeps."uglify-js" or []);
     deps = [
       self.by-version."async"."0.2.10"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
       self.by-version."optimist"."0.3.7"
       self.by-version."uglify-to-browserify"."1.0.2"
     ];
@@ -5913,6 +6445,25 @@
     ];
     passthru.names = [ "underscore" ];
   };
+  by-spec."underscore".">=1.5.x" =
+    self.by-version."underscore"."1.6.0";
+  by-version."underscore"."1.6.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-underscore-1.6.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz";
+        name = "underscore-1.6.0.tgz";
+        sha1 = "8b38b10cacdef63337b8b24e4ff86d45aea529a8";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."underscore" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "underscore" ];
+  };
   by-spec."underscore"."~1.4.3" =
     self.by-version."underscore"."1.4.4";
   by-spec."underscore"."~1.4.4" =
@@ -6044,15 +6595,116 @@
     ];
     passthru.names = [ "vargs" ];
   };
+  by-spec."vow"."0.3.9" =
+    self.by-version."vow"."0.3.9";
+  by-version."vow"."0.3.9" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.3.9";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.3.9.tgz";
+        name = "vow-0.3.9.tgz";
+        sha1 = "c9b67ac7ed4911a49ad5af23ebf7f4392e835d74";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow".">= 0.3.9" =
+    self.by-version."vow"."0.4.1";
+  by-version."vow"."0.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.4.1.tgz";
+        name = "vow-0.4.1.tgz";
+        sha1 = "97c816578b2547d59083898bd65a1bff6c016454";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow"."~0.3.9" =
+    self.by-version."vow"."0.3.12";
+  by-version."vow"."0.3.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.3.12";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.3.12.tgz";
+        name = "vow-0.3.12.tgz";
+        sha1 = "ca631885e2c8bfa4d5ae38daa125f8f71f379903";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow"."~0.4.1" =
+    self.by-version."vow"."0.4.1";
+  by-spec."vow-fs"."0.2.3" =
+    self.by-version."vow-fs"."0.2.3";
+  by-version."vow-fs"."0.2.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-fs-0.2.3";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz";
+        name = "vow-fs-0.2.3.tgz";
+        sha1 = "ac8c942c30175f91210f0202d3c27730a0ad9fbe";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow-fs" or []);
+    deps = [
+      self.by-version."node-uuid"."1.4.0"
+      self.by-version."vow-queue"."0.0.2"
+      self.by-version."vow"."0.3.12"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow-fs" ];
+  };
+  by-spec."vow-queue"."0.0.2" =
+    self.by-version."vow-queue"."0.0.2";
+  by-version."vow-queue"."0.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-queue-0.0.2";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz";
+        name = "vow-queue-0.0.2.tgz";
+        sha1 = "deba6cfc2a82d6061d10eb3a12fad63a8e6bb64d";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow-queue" or []);
+    deps = [
+    ];
+    peerDependencies = [
+      self.by-version."vow"."0.3.12"
+    ];
+    passthru.names = [ "vow-queue" ];
+  };
   by-spec."wd"."~0.2.8" =
-    self.by-version."wd"."0.2.10";
-  by-version."wd"."0.2.10" = lib.makeOverridable self.buildNodePackage {
-    name = "wd-0.2.10";
+    self.by-version."wd"."0.2.11";
+  by-version."wd"."0.2.11" = lib.makeOverridable self.buildNodePackage {
+    name = "wd-0.2.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/wd/-/wd-0.2.10.tgz";
-        name = "wd-0.2.10.tgz";
-        sha1 = "c4ac58eff5f32cc8e79e8f272a4c365c4240a68e";
+        url = "http://registry.npmjs.org/wd/-/wd-0.2.11.tgz";
+        name = "wd-0.2.11.tgz";
+        sha1 = "27889d290facf3d19e050b3c789f2e852ca03f10";
       })
     ];
     buildInputs =
@@ -6156,6 +6808,26 @@
     ];
     passthru.names = [ "xmlbuilder" ];
   };
+  by-spec."xmlbuilder"."1.1.2" =
+    self.by-version."xmlbuilder"."1.1.2";
+  by-version."xmlbuilder"."1.1.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-xmlbuilder-1.1.2";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz";
+        name = "xmlbuilder-1.1.2.tgz";
+        sha1 = "83873690df07061a4e65340ea0b899c1b9c86e23";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."xmlbuilder" or []);
+    deps = [
+      self.by-version."underscore"."1.6.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "xmlbuilder" ];
+  };
   by-spec."xmlhttprequest"."1.4.2" =
     self.by-version."xmlhttprequest"."1.4.2";
   by-version."xmlhttprequest"."1.4.2" = lib.makeOverridable self.buildNodePackage {
@@ -6227,7 +6899,7 @@
     buildInputs =
       (self.nativeDeps."zip-stream" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
       self.by-version."lodash.defaults"."2.4.1"
     ];
     peerDependencies = [
diff --git a/tests/config.js b/tests/config.js
index 2798c6d..14591d0 100644
--- a/tests/config.js
+++ b/tests/config.js
@@ -1,19 +1,21 @@
 var tests = Object.keys(window.__karma__.files).filter(function (file) {
-    if (window.__karma__.config.args.pattern) {
-      return (new RegExp(window.__karma__.config.args.pattern + "-test.js$")).test(file);
-    }
-    return (/\-test\.js$/).test(file);
+  'use strict';
+
+  if (window.__karma__.config.args.pattern) {
+    return (new RegExp(window.__karma__.config.args.pattern + '-test.js$')).test(file);
+  }
+  return (/\-test\.js$/).test(file);
 });
 
 requirejs.config({
-    // Karma serves files from '/base'
-    baseUrl: '/base',
+  // Karma serves files from '/base'
+  baseUrl: '/base',
 
-    // ask Require.js to load these files (all our tests)
-    deps: tests,
+  // ask Require.js to load these files (all our tests)
+  deps: tests,
 
-    // start test run, once Require.js is done
-    callback: window.__karma__.start
+  // start test run, once Require.js is done
+  callback: window.__karma__.start
 });
 
 window.DEBUG = true;
diff --git a/tests/fakeserver.js b/tests/fakeserver.js
index ad1bcf4..fdc305d 100644
--- a/tests/fakeserver.js
+++ b/tests/fakeserver.js
@@ -3,19 +3,19 @@ define([
   'jquery',
   'underscore'
 ], function(sinon, $, _) {
-  "use strict";
+  'use strict';
 
   function getQueryVariable(url, variable) {
     var query = url.split('?')[1];
-    if(query === undefined){
+    if (query === undefined) {
       return null;
     }
     var vars = query.split('&');
     for (var i = 0; i < vars.length; i += 1) {
-        var pair = vars[i].split('=');
-        if (decodeURIComponent(pair[0]) === variable) {
-            return decodeURIComponent(pair[1]);
-        }
+      var pair = vars[i].split('=');
+      if (decodeURIComponent(pair[0]) === variable) {
+        return decodeURIComponent(pair[1]);
+      }
     }
     return null;
   }
@@ -34,7 +34,7 @@ define([
   server.autoRespond = true;
   server.autoRespondAfter = 200;
 
-  server.respondWith("GET", /select2-test\.json/, function (xhr, id) {
+  server.respondWith('GET', /select2-test\.json/, function (xhr, id) {
     var items = [
       {id: 'red', text: 'Red'},
       {id: 'green', text: 'Green'},
@@ -42,85 +42,97 @@ define([
       {id: 'orange', text: 'Orange'},
       {id: 'yellow', text: 'Yellow'}
     ];
-    xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+    xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
       total: items.length,
       results: items
     }));
   });
 
-  server.respondWith("GET", /search\.json/, function (xhr, id) {
+  server.respondWith('GET', /search\.json/, function (xhr, id) {
     var items = [
       {
-        "UID": "123sdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: '123sdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf1123asZ",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf1123asZ',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf1231as",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf1231as',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf12231451",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf12231451',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf1235dsd",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf1235dsd',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasd345345f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasd345345f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf465",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf465',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooaewrwsdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooaewrwsdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasd123f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasd123f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdas123f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdas123f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdfsdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdfsdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       }
     ];
 
@@ -134,13 +146,13 @@ define([
     } else {
       if (batch) {
         var start, end;
-        start = (batch.page-1) * batch.size;
+        start = (batch.page - 1) * batch.size;
         end = start + batch.size;
         results = items.slice(start, end);
       }
     }
 
-    xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+    xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
       total: results.length,
       results: results
     }));
@@ -153,52 +165,52 @@ define([
   var possibleNames = ['Page', 'News Item', 'Info', 'Blog Item'];
   var possibleTags = ['one', 'two', 'three', 'four'];
 
-  function generateUID(size){
-    if(!size){
+  function generateUID(size) {
+    if (!size) {
       size = 30;
     }
-    var text = "";
-    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    var text = '';
+    var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 
-    for(var i=0; i<size; i=i+1){
+    for (var i = 0; i < size; i = i + 1) {
       text += possible.charAt(Math.floor(Math.random() * possible.length));
     }
     return text;
   }
-  for(var pathi=0; pathi<basePaths.length; pathi=pathi+1){
+  for (var pathi = 0; pathi < basePaths.length; pathi = pathi + 1) {
     var basePath = basePaths[pathi];
-    for(var i=0; i<1000; i=i+1){
+    for (var j = 0; j < 1000; j = j + 1) {
       randomItems.push({
         UID: generateUID(),
-        Title: possibleNames[Math.floor(Math.random()*possibleNames.length)] + ' ' + i,
+        Title: possibleNames[Math.floor(Math.random() * possibleNames.length)] + ' ' + j,
         path: basePath + generateUID(8),
-        Type: "Document"
+        Type: 'Document'
       });
     }
   }
 
   server.respondWith(/relateditems-test\.json/, function(xhr, id) {
     var searchables = [
-      {"UID": "jasdlfdlkdkjasdf", "Title": "Some Image", "path": "/test.png", "Type": "Image"},
-      {"UID": "asdlfkjasdlfkjasdf", "Title": "News", "path": "/news", "Type": "Folder"},
-      {"UID": "124asdfasasdaf34", "Title": "About", "path": "/about", "Type": "Folder"},
-      {"UID": "asdf1234", "Title": "Projects", "path": "/projects", "Type": "Folder"},
-      {"UID": "asdf1234gsad", "Title": "Contact", "path": "/contact", "Type": "Document"},
-      {"UID": "asdv34sdfs", "Title": "Privacy Policy", "path": "/policy", "Type": "Document"},
-      {"UID": "asdfasdf234sdf", "Title": "Our Process", "path": "/our-process", "Type": "Folder"},
-      {"UID": "asdhsfghyt45", "Title": "Donate", "path": "/donate-now", "Type": "Document"},
+      {UID: 'jasdlfdlkdkjasdf', Title: 'Some Image', path: '/test.png', Type: 'Image'},
+      {UID: 'asdlfkjasdlfkjasdf', Title: 'News', path: '/news', Type: 'Folder'},
+      {UID: '124asdfasasdaf34', Title: 'About', path: '/about', Type: 'Folder'},
+      {UID: 'asdf1234', Title: 'Projects', path: '/projects', Type: 'Folder'},
+      {UID: 'asdf1234gsad', Title: 'Contact', path: '/contact', Type: 'Document'},
+      {UID: 'asdv34sdfs', Title: 'Privacy Policy', path: '/policy', Type: 'Document'},
+      {UID: 'asdfasdf234sdf', Title: 'Our Process', path: '/our-process', Type: 'Folder'},
+      {UID: 'asdhsfghyt45', Title: 'Donate', path: '/donate-now', Type: 'Document'},
       // about
-      {"UID": "gfn5634f", "Title": "About Us", "path": "/about/about-us", "Type": "Document"},
-      {"UID": "45dsfgsdcd", "Title": "Philosophy", "path": "/about/philosophy", "Type": "Document"},
-      {"UID": "dfgsdfgj675", "Title": "Staff", "path": "/about/staff", "Type": "Folder"},
-      {"UID": "sdfbsfdh345", "Title": "Board of Directors", "path": "/about/board-of-directors", "Type": "Document"},
+      {UID: 'gfn5634f', Title: 'About Us', path: '/about/about-us', Type: 'Document'},
+      {UID: '45dsfgsdcd', Title: 'Philosophy', path: '/about/philosophy', Type: 'Document'},
+      {UID: 'dfgsdfgj675', Title: 'Staff', path: '/about/staff', Type: 'Folder'},
+      {UID: 'sdfbsfdh345', Title: 'Board of Directors', path: '/about/board-of-directors', Type: 'Document'},
       // staff
-      {"UID": "asdfasdf9sdf", "Title": "Mike", "path": "/about/staff/mike", "Type": "Document"},
-      {"UID": "cvbcvb82345", "Title": "Joe", "path": "/about/staff/joe", "Type": "Document"}
+      {UID: 'asdfasdf9sdf', Title: 'Mike', path: '/about/staff/mike', Type: 'Document'},
+      {UID: 'cvbcvb82345', Title: 'Joe', path: '/about/staff/joe', Type: 'Document'}
     ];
     searchables = searchables.concat(randomItems);
 
-    var addSomeData = function(list){
+    var addSomeData = function(list) {
       /* add getURL value, review_state, modification, creation */
       var dates = [
         'January 1, 2011',
@@ -207,22 +219,22 @@ define([
         'April 1, 2012',
         'May 20, 2013'
       ];
-      for(var i=0; i<list.length; i=i+1){
+      for (var i = 0; i < list.length; i = i + 1) {
         var data = list[i];
         data.getURL = window.location.origin + data.path;
-        data.review_state = ['published', 'private', 'review'][Math.floor(Math.random()*3)];
-        data.CreationDate = dates[Math.floor(Math.random()*dates.length)];
-        data.ModificationDate = dates[Math.floor(Math.random()*dates.length)];
-        data.EffectiveDate = dates[Math.floor(Math.random()*dates.length)];
+        data['review_state'] = ['published', 'private', 'review'][Math.floor(Math.random() * 3)];  // jshint ignore:line
+        data.CreationDate = dates[Math.floor(Math.random() * dates.length)];
+        data.ModificationDate = dates[Math.floor(Math.random() * dates.length)];
+        data.EffectiveDate = dates[Math.floor(Math.random() * dates.length)];
         data.Subject = [
-          possibleTags[Math.floor(Math.random()*possibleTags.length)],
-          possibleTags[Math.floor(Math.random()*possibleTags.length)]
+          possibleTags[Math.floor(Math.random() * possibleTags.length)],
+          possibleTags[Math.floor(Math.random() * possibleTags.length)]
         ];
         data.id = data.Title.replace(' ', '-').toLowerCase();
-        if(data.Type === 'Folder'){
-          data.is_folderish = true;
-        }else{
-          data.is_folderish = false;
+        if (data.Type === 'Folder') {
+          data['is_folderish'] = true;  // jshint ignore:line
+        } else {
+          data['is_folderish'] = false;  // jshint ignore:line
         }
       }
     };
@@ -234,24 +246,24 @@ define([
     // grab the page number and number of items per page -- note, page is 1-based from Select2
     var batch = getQueryVariable(xhr.url, 'batch');
     var page = 1;
-    var page_size = 10;
-    if(batch){
+    var pageSize = 10;
+    if (batch) {
       batch = $.parseJSON(batch);
       page = batch.page;
-      page_size = batch.size;
+      pageSize = batch.size;
     }
     page = page - 1;
 
     var query = getQueryVariable(xhr.url, 'query');
     var path = null;
     var term = '';
-    if(query){
+    if (query) {
       query = $.parseJSON(query);
-      for(var i=0; i<query.criteria.length; i=i+1){
+      for (var i = 0; i < query.criteria.length; i = i + 1) {
         var criteria = query.criteria[i];
-        if(criteria.i === 'path'){
+        if (criteria.i === 'path') {
           path = criteria.v.split('::')[0];
-        }else{
+        } else {
           term = criteria.v;
         }
       }
@@ -260,23 +272,23 @@ define([
     // this seach is for basically searching the entire hierarchy -- this IS NOT the browse "search"
     function search(items, term) {
       results = [];
-      if (term === undefined){
+      if (term === undefined) {
         return searchables;
       }
       _.each(items, function(item) {
         var q;
         var keys = (item.UID + ' ' + item.Title + ' ' + item.path + ' ' + item.Type).toLowerCase();
-        if(typeof(term) === 'object'){
-          for(var i=0; i<term.length; i=i+1){
+        if (typeof(term) === 'object') {
+          for (var i = 0; i < term.length; i = i + 1) {
             q = term[i].toLowerCase();
-            if (keys.indexOf(q) > -1){
+            if (keys.indexOf(q) > -1) {
               results.push(item);
               break;
             }
           }
-        }else{
+        } else {
           q = term.toLowerCase().replace('*', '');
-          if (keys.indexOf(q) > -1){
+          if (keys.indexOf(q) > -1) {
             results.push(item);
           }
         }
@@ -285,16 +297,16 @@ define([
 
     function browse(items, q, p) {
       results = [];
-      var path = p.substring(0, p.length-1);
+      var path = p.substring(0, p.length - 1);
       var splitPath = path.split('/');
       var fromPath = [];
       _.each(items, function(item) {
         var itemSplit = item.path.split('/');
-        if (item.path.indexOf(path) === 0 && itemSplit.length-1 === splitPath.length) {
+        if (item.path.indexOf(path) === 0 && itemSplit.length - 1 === splitPath.length) {
           fromPath.push(item);
         }
       });
-      if (q === undefined){
+      if (q === undefined) {
         return fromPath;
       }
       search(fromPath, q);
@@ -305,83 +317,88 @@ define([
       search(searchables, term);
     }
 
-    xhr.respond(200, { "Content-Type": "application/json" },
+    xhr.respond(200, { 'Content-Type': 'application/json' },
       JSON.stringify({
-        "total": results.length,
-        "results": results.slice(page*page_size, (page*page_size)+(page_size-1))
-    }));
+        total: results.length,
+        results: results.slice(page * pageSize, (page * pageSize) + (pageSize - 1))
+      })
+    );
   });
 
-  server.respondWith("GET", /something\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Content from AJAX</h1>'+
-'    <p>Ah, it is a rock, though. Should beat everything.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Content from AJAX</h1>' +
+    '<p>Ah, it is a rock, though. Should beat everything.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /something-link\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Content from AJAX with a link</h1>'+
-'    <p>Ah, it is a rock, though. Should beat <a href="something-else.html">link</a> everything.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something-link\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Content from AJAX with a link</h1>' +
+    '<p>Ah, it is a rock, though. Should beat <a href="something-else.html">link</a> everything.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /something-else\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Something else</h1>'+
-'    <p>We loaded a link.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something-else\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Something else</h1>' +
+    '<p>We loaded a link.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /modal-form\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Modal with Form</h1>'+
-'    <p>This modal contains a form.</p>'+
-'    <form method="POST" action="/modal-submit.html">' +
-'      <label for="name">Name:</label><input type="text" name="name" />' +
-'      <div class="formControls"> ' +
-'        <input type="submit" class="btn btn-primary" value="Submit" name="submit" />' +
-'      </div> '+
-'    </form>' +
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /modal-form\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Modal with Form</h1>' +
+    '<p>This modal contains a form.</p>' +
+    '<form method="POST" action="/modal-submit.html">' +
+    '  <label for="name">Name:</label><input type="text" name="name" />' +
+    '  <div class="formControls"> ' +
+    '    <input type="submit" class="btn btn-primary" value="Submit" name="submit" />' +
+    '  </div> ' +
+    '</form>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
   server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
-    var name = getQueryVariable('?'+xhr.requestBody, 'name');
-    xhr.respond(200, {"content-Type": "text/html"},
-      '<html> '+
-      '  <head></head>'+
-      '  <body> '+
-      '    <div id="content">'+
-      '      <h1>Hello, '+_.escape(name)+'</h1>'+
-      '      <p>Thanks!</p>'+
-      '  </body> '+
+    var name = getQueryVariable('?' + xhr.requestBody, 'name');
+    xhr.respond(200, {'content-Type': 'text/html'},
+      '<html> ' +
+      '  <head></head>' +
+      '  <body> ' +
+      '    <div id="content">' +
+      '      <h1>Hello, ' + _.escape(name) + '</h1>' +
+      '      <p>Thanks!</p>' +
+      '  </body> ' +
       '</html>'
     );
   });
 
   server.respondWith('POST', /upload/, function(xhr, id) {
-    xhr.respond(200, {"content-Type": "application/json"},
+    xhr.respond(200, {'content-Type': 'application/json'},
       JSON.stringify({
         url: 'http://localhost:8000/blah.png',
         uid: 'sldlfkjsldkjlskdjf',
@@ -395,11 +412,11 @@ define([
 
   server.respondWith('GET', /portal_factory\/@@querybuilder_html_results/, function(xhr, id) {
     var content = $('#querystring-example-results').text();
-    xhr.respond(200, {"content-Type": "text/html"}, content);
+    xhr.respond(200, {'content-Type': 'text/html'}, content);
   });
   server.respondWith('GET', /portal_factory\/@@querybuildernumberofresults/, function(xhr, id) {
     var content = $('#querystring-number-results-example-results').text();
-    xhr.respond(200, {"content-Type": "text/html"}, content);
+    xhr.respond(200, {'content-Type': 'text/html'}, content);
   });
 
   var basicActions = [
@@ -417,102 +434,102 @@ define([
   ];
 
   var actionData = {
-    '/copy': function(xhr){
+    '/copy': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: selection.length + ' items copied'
       };
     },
-    '/cut': function(xhr){
+    '/cut': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: selection.length + ' items cut'
       };
     },
-    '/paste': function(xhr){
+    '/paste': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'pasted ' + selection.length + ' items'
       };
     },
-    '/order': function(xhr){
+    '/order': function(xhr) {
       return {
-        status: "success",
+        status: 'success',
         msg: 'Folder ordering set'
       };
     },
-    '/tags': function(xhr){
+    '/tags': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Tags updated for ' + selection.length + ' items'
       };
     },
-    '/properties': function(xhr){
+    '/properties': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Properties updated for ' + selection.length + ' items'
       };
     },
-    '/rename': function(xhr){
+    '/rename': function(xhr) {
       var torename = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'torename'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Renamed ' + torename.length + ' items'
       };
     },
-    '/workflow': function(xhr){
+    '/workflow': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
-      if(xhr.requestBody.indexOf('transitions') !== -1){
+      if (xhr.requestBody.indexOf('transitions') !== -1) {
         var transitions = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'transitions'));
         // get possible transitions...
         return {
-          "status": "success",
-          "transitions": [{
-            id: "publish",
-            title: "Publish"
-          },{
-            id: "retract",
-            title: "Retract"
+          status: 'success',
+          transitions: [{
+            id: 'publish',
+            title: 'Publish'
+          }, {
+            id: 'retract',
+            title: 'Retract'
           }]
         };
-      }else{
+      } else {
         return {
-          status: "success",
+          status: 'success',
           msg: 'Workflow updated for ' + selection.length + ' items'
         };
       }
     },
-    '/delete': function(xhr){
+    '/delete': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Deleted ' + selection.length + ' items'
       };
     },
-    '/rearrange': function(xhr){
+    '/rearrange': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Rearranged items'
       };
     }
   };
 
-  _.each(basicActions, function(action){
+  _.each(basicActions, function(action) {
     server.respondWith('POST', action, function(xhr, id) {
       server.autoRespondAfter = 200;
       var data = {
-          "status": "success"
+        status: 'success'
       };
-      if(actionData[action]){
+      if (actionData[action]) {
         data = actionData[action](xhr);
       }
-      xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify(data));
+      xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify(data));
     });
   });
 
diff --git a/tests/iframe-test.js b/tests/iframe-test.js
index 25cb660..a3d37a1 100644
--- a/tests/iframe-test.js
+++ b/tests/iframe-test.js
@@ -3,46 +3,46 @@ define([
   'jquery',
   'mockup-iframe'
 ], function(expect, $, IFrame, undefined) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
 
-  describe("Registry", function () {
+  describe('Registry', function () {
     beforeEach(function() {
       this.iframe = new $.IFrame({
         el: $('<div><p>some</p><a href="#">some link</a></div>').appendTo('body'),
         position: 'top'
       });
-      this.iframe._window_location = function() {};
-      this.iframe._window_open = function() {};
+      this.iframe._windowLocation = function() {};
+      this.iframe._windowOpen = function() {};
     });
     afterEach(function() {
       this.iframe.$el.remove();
     });
-    it("simple stretch and shrink", function() {
-      var initial_height = this.iframe.$el.height();
+    it('simple stretch and shrink', function() {
+      var initialHeight = this.iframe.$el.height();
 
-      expect(initial_height).to.not.equal(0);
+      expect(initialHeight).to.not.equal(0);
 
       this.iframe.stretch();
-      expect(initial_height).to.be.below(this.iframe.$el.height());
+      expect(initialHeight).to.be.below(this.iframe.$el.height());
 
       this.iframe.shrink();
-      expect(initial_height).to.be.equal(this.iframe.$el.height());
+      expect(initialHeight).to.be.equal(this.iframe.$el.height());
 
       this.iframe.toggle();
-      expect(initial_height).to.be.above(this.iframe.$el.height());
+      expect(initialHeight).to.be.above(this.iframe.$el.height());
 
       this.iframe.toggle();
-      expect(initial_height).to.be.equal(this.iframe.$el.height());
+      expect(initialHeight).to.be.equal(this.iframe.$el.height());
     });
 
   });
 });
 
-//    "defult handling of clicks inside iframe": function() {
-//      var stub_location = this.stub($.iframe, '_window_location'),
-//          stub_open = this.stub($.iframe, '_window_open');
+//    'defult handling of clicks inside iframe': function() {
+//      var stub_location = this.stub($.iframe, '_windowLocation'),
+//          stub_open = this.stub($.iframe, '_windowOpen');
 //
 //      $('a', $.iframe.$el).trigger({ type: 'click', which: 1 });  // left click
 //      $('a', $.iframe.$el).trigger({ type: 'click', which: 2 });  // middle click
@@ -52,14 +52,14 @@ define([
 //      assert.callOrder(stub_location, stub_open);
 //    },
 //
-//    "custom handling of clicks inside iframe": function() {
+//    'custom handling of clicks inside iframe': function() {
 //      $.iframe.registerAction(
 //        function(e, iframe) { return true; },
 //        function(e, iframe) { assert(true); });
 //      $('p', $.iframe.$el).trigger({ type: 'click' });
 //    },
 //
-//    "when iframe is stretch click can also happen on html element": function() {
+//    'when iframe is stretch click can also happen on html element': function() {
 //      $.iframe.registerAction(
 //        function(e, iframe) { return true; },
 //        function(e, iframe) { assert(true); });
diff --git a/tests/iframe_init-test.js b/tests/iframe_init-test.js
index 7a9a79d..9bd1a39 100644
--- a/tests/iframe_init-test.js
+++ b/tests/iframe_init-test.js
@@ -2,7 +2,7 @@ define([
   'expect',
   'mockup-iframe_init'
 ], function(expect) {
-  "use strict";
+  'use strict';
 
 
   // ======================================================================= //
@@ -11,7 +11,7 @@ define([
 
   function createElement(name, resources, content, extra) {
 
-    var el = document.createElement("div");
+    var el = document.createElement('div');
     el.setAttribute('data-iframe', name);
     el.setAttribute('data-iframe-resources', resources);
 
@@ -55,27 +55,27 @@ define([
                   getPropertyValue(property);
     }
 
-    return "";
+    return '';
   }
 
   function onLoad(done, iframes, callable) {
 
-    var iframes_loaded;
+    var iframesLoaded;
 
     function onLoadInner() {
 
       if (iframes.loaded !== undefined) {
-        iframes_loaded = iframes.loaded;
+        iframesLoaded = iframes.loaded;
       } else {
-        iframes_loaded = true;
+        iframesLoaded = true;
         for (var i = 0; i < iframes.length; i += 1) {
-          if (iframes_loaded === false || iframes[i].loaded === false) {
-            iframes_loaded = false;
+          if (iframesLoaded === false || iframes[i].loaded === false) {
+            iframesLoaded = false;
           }
         }
       }
 
-      if (iframes_loaded === true) {
+      if (iframesLoaded === true) {
         callable();
         done();
         return;
@@ -95,11 +95,12 @@ define([
 
   window.mocha.setup('bdd');
 
-  describe("iframe.js", function() {
+  describe('iframe.js', function() {
     beforeEach(function() {
       this.el = createElement('example',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-          '<p>example content</p>');
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
     });
     afterEach(function() {
       removeElements(document.getElementsByTagName('iframe'));
@@ -118,157 +119,165 @@ define([
         }
       }
     });
-    it("checks html of generated iframe", function(done) {
-      window.iframe_initialize();
+    it('checks html of generated iframe', function(done) {
+      window.iframeInitialize();
       onLoad(done, window.iframe.example, function() {
-        var iframe_el = window.iframe.example.el,
-            iframe_doc = window.iframe.example.document;
+        var iframeEl = window.iframe.example.el,
+            iframeDocument = window.iframe.example.document;
 
         expect(document.getElementsByTagName('iframe').length).to.equal(1);
-        expect(iframe_doc.body.childNodes.length).to.equal(3);
-        expect(iframe_doc.getElementsByTagName('p').length).to.equal(1);
-        expect(iframe_doc.getElementsByTagName('p')[0].innerHTML).to.equal('example content');
+        expect(iframeDocument.body.childNodes.length).to.equal(3);
+        expect(iframeDocument.getElementsByTagName('p').length).to.equal(1);
+        expect(iframeDocument.getElementsByTagName('p')[0].innerHTML).to.equal('example content');
 
-        var link = iframe_doc.getElementsByTagName('link')[0];
-        expect(iframe_doc.getElementsByTagName('link').length ).to.equal(1);
+        var link = iframeDocument.getElementsByTagName('link')[0];
+        expect(iframeDocument.getElementsByTagName('link').length ).to.equal(1);
         expect(link.getAttribute('href') ).to.equal('/base/tests/example-resource.css');
         expect(link.getAttribute('type') ).to.equal('text/css');
         expect(link.getAttribute('rel') ).to.equal('stylesheet');
 
-        var script = iframe_doc.getElementsByTagName('script')[0];
-        expect(iframe_doc.getElementsByTagName('script').length ).to.equal(1);
+        var script = iframeDocument.getElementsByTagName('script')[0];
+        expect(iframeDocument.getElementsByTagName('script').length ).to.equal(1);
         expect(script.getAttribute('src') ).to.equal('/base/tests/example-resource.js');
         expect(script.getAttribute('type') ).to.equal('text/javascript');
 
-        expect(iframe_el.getAttribute('frameBorder') ).to.equal('0');
-        expect(iframe_el.getAttribute('border') ).to.equal('0');
-        expect(iframe_el.getAttribute('allowTransparency') ).to.equal('true');
-        expect(iframe_el.getAttribute('scrolling') ).to.equal('no');
-        expect(iframe_el.getAttribute('id') ).to.equal('example');
-        expect(iframe_el.getAttribute('name') ).to.equal('example');
-        expect(iframe_el.getAttribute('style').indexOf('height:0px') ).to.equal(-1);
+        expect(iframeEl.getAttribute('frameBorder') ).to.equal('0');
+        expect(iframeEl.getAttribute('border') ).to.equal('0');
+        expect(iframeEl.getAttribute('allowTransparency') ).to.equal('true');
+        expect(iframeEl.getAttribute('scrolling') ).to.equal('no');
+        expect(iframeEl.getAttribute('id') ).to.equal('example');
+        expect(iframeEl.getAttribute('name') ).to.equal('example');
+        expect(iframeEl.getAttribute('style').indexOf('height:0px') ).to.equal( -1 );
 
-        expect(window.iframe.example.el ).to.equal(iframe_el);
+        expect(window.iframe.example.el ).to.equal(iframeEl);
 
         // TODO: test updateOption method
         // TODO: test add method
       });
     });
-    it("less resources", function(done) {
+    it('less resources', function(done) {
       expect(document.getElementsByTagName('iframe').length).to.equal(0);
       createElement('example2', '/base/tests/example-resource.less');
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(2);
 
-        var iframe2_doc = window.iframe.example2.document,
-            link = iframe2_doc.getElementsByTagName('link')[0];
+        var iframe2Document = window.iframe.example2.document,
+            link = iframe2Document.getElementsByTagName('link')[0];
 
-        expect(iframe2_doc.getElementsByTagName('link').length).to.equal(1);
+        expect(iframe2Document.getElementsByTagName('link').length).to.equal(1);
         expect(link.getAttribute('href')).to.equal('/base/tests/example-resource.less');
         expect(link.getAttribute('type')).to.equal('text/css');
         expect(link.getAttribute('rel')).to.equal('stylesheet/less');
       });
     });
-    it("z-index can be custom", function(done) {
+    it('z-index can be custom', function(done) {
       createElement('example2', '', '', {'data-iframe-zindex': '1000'});
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(getElementStyle(window.iframe.example2.el, 'z-index')).to.equal('1000');
       });
     });
-    it("height of empty iframe should be 0px", function(done) {
+    it('height of empty iframe should be 0px', function(done) {
       createElement('example2', '', '');
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(getElementStyle(window.iframe.example2.el, 'height')).to.equal('0px');
       });
     });
-    it("2 elements gets content into DIFFERENT iframe", function(done) {
-      createElement('example3',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              '<p>example content</p>');
-      window.iframe_initialize();
+    it('2 elements gets content into DIFFERENT iframe', function(done) {
+      createElement(
+        'example3',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example3 ], function() {
+        window.iframe.example,
+        window.iframe.example3
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(2);
       });
     });
-    it("2 elements gets content into SAME iframe", function(done) {
-      createElement('example',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              '<p>example content</p>');
-      window.iframe_initialize();
+    it('2 elements gets content into SAME iframe', function(done) {
+      createElement(
+        'example',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
+      window.iframeInitialize();
       onLoad(done, window.iframe.example, function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(1);
       });
     });
-    it("Bottom-aligned iFrame does not add to height", function(done) {
-      createElement('example_top',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              "<p>I'm on top of the world!</p>",
-              { 'data-iframe-position': 'top' });
-      createElement('example_bottom',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              "<p>I'm.......<br/><br/><br/>Not.</p>",
-              { 'data-iframe-position': 'bottom' });
-      window.iframe_initialize();
+    it('Bottom-aligned iFrame does not add to height', function(done) {
+      createElement(
+        'exampletop',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>I\'m on top of the world!</p>',
+        { 'data-iframe-position': 'top' }
+      );
+      createElement(
+        'examplebottom',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>I\'m.......<br/><br/><br/>Not.</p>',
+        { 'data-iframe-position': 'bottom' }
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example_top,
-          window.iframe.example_bottom ], function() {
-
+        window.iframe.example,
+        window.iframe.exampletop,
+        window.iframe.examplebottom
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
 
         //TODO
-        expect(window.iframe.example_top.el.offsetHeight <
-               window.iframe.example_bottom.el.offsetHeight).to.equal(true);
-
-        expect(window.iframe.example_top.el.offsetHeight + 'px').to.equal(
-            getElementStyle(document.body, 'margin-top'));
-        expect(window.iframe.example_bottom.el.offsetHeight + 'px').to.equal(
-            getElementStyle(document.body, 'margin-bottom'));
+        expect(window.iframe.exampletop.el.offsetHeight <
+               window.iframe.examplebottom.el.offsetHeight).to.equal(true);
 
+        expect(window.iframe.exampletop.el.offsetHeight + 'px')
+          .to.equal(getElementStyle(document.body, 'margin-top'));
+        expect(window.iframe.examplebottom.el.offsetHeight + 'px')
+          .to.equal(getElementStyle(document.body, 'margin-bottom'));
       });
     });
-    it("CSS Styles only apply to inner document", function(done) {
-      createElement('example_pink', '',
-              "<h1>I'm a pink title</h1>",
-              { 'data-iframe-styles': 'h1 { background-color: pink; }' });
-      window.iframe_initialize();
+    it('CSS Styles only apply to inner document', function(done) {
+      createElement(
+        'examplepink', '',
+        '<h1>I\'m a pink title</h1>',
+        { 'data-iframe-styles': 'h1 { background-color: pink; }' }
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example_pink ], function() {
-
+        window.iframe.example,
+        window.iframe.examplepink
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
-
-        expect(
-          getElementStyle(window.iframe.example_pink.document.getElementsByTagName('h1')[0], 'background-color')).to.not.equal(
-          getElementStyle(document.getElementsByTagName('h1')[0], 'background-color')
-          );
-
+        expect(getElementStyle(window.iframe.examplepink.document.getElementsByTagName('h1')[0], 'background-color'))
+          .to.not.equal(getElementStyle(document.getElementsByTagName('h1')[0], 'background-color'));
       });
     });
-    it("extra attributes passed via url", function(done) {
-      createElement('example2',
-          '/base/tests/example-resource.js?data-main="example";');
-      window.iframe_initialize();
+    it('extra attributes passed via url', function(done) {
+      createElement(
+        'example2',
+        '/base/tests/example-resource.js?data-main="example";'
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
-
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
-
-        expect(window.iframe.example2.document
-                  .getElementsByTagName('script')[0]
-                  .getAttribute('data-main')).to.equal('example');
+        expect(window.iframe.example2.document.getElementsByTagName('script')[0].getAttribute('data-main')).to.equal('example');
       });
     });
   });
diff --git a/tests/pattern-accessibility-test.js b/tests/pattern-accessibility-test.js
index 8040a22..405ec03 100644
--- a/tests/pattern-accessibility-test.js
+++ b/tests/pattern-accessibility-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-accessibility'
 ], function(expect, $, registry, Accessibility) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Accessibility
   ========================== */
 
-  describe("Accessibility", function () {
+  describe('Accessibility', function () {
     beforeEach(function() {
       $.removeCookie('fontsize');
       this.$el = $('' +
@@ -23,40 +23,39 @@ define([
           '<a id="btn3" />' +
         '</div>');
     });
-    it("test cookie remains set", function() {
+    it('test cookie remains set', function() {
       var accessibility = new Accessibility(this.$el);
       expect($.cookie('fontsize')).to.be.equal(undefined);
-      accessibility.setBaseFontSize("smallText", 1);
+      accessibility.setBaseFontSize('smallText', 1);
       expect($.cookie('fontsize')).to.be.equal('smallText');
     });
-    it("test class is set", function() {
+    it('test class is set', function() {
       var accessibility = new Accessibility(this.$el);
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
-      expect(this.$el.hasClass("largeText")).to.be.equal(false);
-      accessibility.setBaseFontSize("smallText", 1);
-      expect(this.$el.hasClass("smallText")).to.be.equal(true);
-      expect(this.$el.hasClass("largeText")).to.be.equal(false);
-      accessibility.setBaseFontSize("largeText", 1);
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
-      expect(this.$el.hasClass("largeText")).to.be.equal(true);
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
+      expect(this.$el.hasClass('largeText')).to.be.equal(false);
+      accessibility.setBaseFontSize('smallText', 1);
+      expect(this.$el.hasClass('smallText')).to.be.equal(true);
+      expect(this.$el.hasClass('largeText')).to.be.equal(false);
+      accessibility.setBaseFontSize('largeText', 1);
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
+      expect(this.$el.hasClass('largeText')).to.be.equal(true);
     });
-    it("test class is set if a cookie is found", function() {
-      $.cookie('fontsize', "smallText");
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
+    it('test class is set if a cookie is found', function() {
+      $.cookie('fontsize', 'smallText');
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
       registry.scan(this.$el);
-      expect(this.$el.hasClass("smallText")).to.be.equal(true);
+      expect(this.$el.hasClass('smallText')).to.be.equal(true);
     });
-    it("test setting small font size with button works", function(){
+    it('test setting small font size with button works', function() {
       // add pattern to anchor
-      this.$el.attr("data-pat-accessibility", "smallbtn: #btn1");
+      this.$el.attr('data-pat-accessibility', 'smallbtn: #btn1');
       registry.scan(this.$el);
       $('#btn1', this.$el).trigger('click');
       expect(this.$el.hasClass('smallText')).to.be.equal(true);
     });
-    it("test setting large font size with button works", function(){
+    it('test setting large font size with button works', function() {
       // add pattern to anchor
-      this.$el.attr("data-pat-accessibility",
-        "largebtn: #btn3; smallbtn: #btn1");
+      this.$el.attr('data-pat-accessibility', 'largebtn: #btn3; smallbtn: #btn1');
       registry.scan(this.$el);
       $('#btn3', this.$el).trigger('click');
       expect(this.$el.hasClass('largeText')).to.be.equal(true);
diff --git a/tests/pattern-autotoc-test.js b/tests/pattern-autotoc-test.js
index a0c4928..fb721bc 100644
--- a/tests/pattern-autotoc-test.js
+++ b/tests/pattern-autotoc-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-autotoc'
 ], function(expect, $, Registry, AutoTOC) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,7 +14,7 @@ define([
    TEST: AutoTOC
   ========================== */
 
-  describe("AutoTOC", function () {
+  describe('AutoTOC', function () {
     beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-autotoc">' +
@@ -38,7 +38,7 @@ define([
     afterEach(function() {
       this.$el.remove();
     });
-    it("by default creates TOC from h1/h2/h3", function() {
+    it('by default creates TOC from h1/h2/h3', function() {
       expect($('> nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(1);
@@ -48,56 +48,56 @@ define([
       expect($('> nav > a.autotoc-level-3', this.$el).size()).to.equal(1);
       expect($('> nav > a.autotoc-level-4', this.$el).size()).to.equal(0);
     });
-    it("can be used as jQuery plugin as well", function () {
+    it('can be used as jQuery plugin as well', function () {
       expect($('> nav', this.$el).size()).to.equal(0);
       this.$el.patternAutotoc();
       expect($('> nav', this.$el).size()).to.equal(1);
     });
-    it("can have custom levels", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1");
+    it('can have custom levels', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1');
       expect($('> nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(1);
       expect($('> nav > a.autotoc-level-1', this.$el).size()).to.equal(4);
       expect($('> nav > a.autotoc-level-2', this.$el).size()).to.equal(0);
     });
-    it("can be appended anywhere", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1;appendTo:.placeholder");
+    it('can be appended anywhere', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1;appendTo:.placeholder');
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(1);
-      expect($('div.placeholder', this.$el).children().eq(0).attr('id')).to.equal("first-elem");
-      expect($('div.placeholder', this.$el).children().eq(1).attr('class')).to.equal("autotoc-nav");
+      expect($('div.placeholder', this.$el).children().eq(0).attr('id')).to.equal('first-elem');
+      expect($('div.placeholder', this.$el).children().eq(1).attr('class')).to.equal('autotoc-nav');
     });
-    it("can be prepended anywhere", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1;prependTo:.placeholder");
+    it('can be prepended anywhere', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1;prependTo:.placeholder');
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(1);
-      expect($('div.placeholder', this.$el).children().eq(0).attr('class')).to.equal("autotoc-nav");
-      expect($('div.placeholder', this.$el).children().eq(1).attr('id')).to.equal("first-elem");
+      expect($('div.placeholder', this.$el).children().eq(0).attr('class')).to.equal('autotoc-nav');
+      expect($('div.placeholder', this.$el).children().eq(1).attr('id')).to.equal('first-elem');
     });
-    it("custom className", function() {
+    it('custom className', function() {
       this.$el.attr('data-pat-autotoc', 'className:SOMETHING');
       Registry.scan(this.$el);
       expect(this.$el.hasClass('SOMETHING')).to.equal(true);
     });
-    it("scrolls to content", function(done) {
+    it('scrolls to content', function(done) {
       Registry.scan(this.$el);
       expect($(document).scrollTop()).to.equal(0);
-      if (navigator.userAgent.search("PhantomJS") >= 0) {
-          // TODO Make this test work in PhantomJS as well as Chrome
-          //      See https://github.com/ariya/phantomjs/issues/10162
-          done();
+      if (navigator.userAgent.search('PhantomJS') >= 0) {
+        // TODO Make this test work in PhantomJS as well as Chrome
+        //      See https://github.com/ariya/phantomjs/issues/10162
+        done();
       }
-      $("> nav > a.autotoc-level-1", this.$el).last()
+      $('> nav > a.autotoc-level-1', this.$el).last()
         .on('clicked.autodoc.patterns', function() {
           var documentOffset = Math.round($(document).scrollTop());
-          var headingOffset = Math.round($("#autotoc-item-autotoc-8", this.$el).offset().top);
+          var headingOffset = Math.round($('#autotoc-item-autotoc-8', this.$el).offset().top);
           expect(documentOffset).to.equal(headingOffset);
           done();
         })
diff --git a/tests/pattern-backdrop-test.js b/tests/pattern-backdrop-test.js
index ef0d215..7514197 100644
--- a/tests/pattern-backdrop-test.js
+++ b/tests/pattern-backdrop-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-backdrop'
 ], function(expect, $, registry, Backdrop) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Backdrop
   ========================== */
 
-  describe("Backdrop", function() {
-    it("default behaviour", function() {
+  describe('Backdrop', function() {
+    it('default behaviour', function() {
       var $el = $('<div></div>'),
           backdrop = new Backdrop($el);
       expect($('.backdrop', $el).size()).to.equal(1);
@@ -29,7 +29,7 @@ define([
       expect($el.hasClass('backdrop-active')).to.equal(false);
       backdrop.show();
       expect($el.hasClass('backdrop-active')).to.equal(true);
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 50;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.equal(true);
diff --git a/tests/pattern-cookiedirective-test.js b/tests/pattern-cookiedirective-test.js
index 6577f72..834dc6c 100644
--- a/tests/pattern-cookiedirective-test.js
+++ b/tests/pattern-cookiedirective-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-cookiedirective'
 ], function(expect, $, registry, CookieDirective) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,10 +13,10 @@ define([
    TEST: CookieDirective
   ========================== */
 
-  describe("CookieDirective", function () {
+  describe('CookieDirective', function () {
     beforeEach(function() {
-      $.removeCookie("Allow_Cookies_For_Site");
-      $.removeCookie("_cookiesEnabled");
+      $.removeCookie('Allow_Cookies_For_Site');
+      $.removeCookie('_cookiesEnabled');
       this.$el = $('' +
         '<div class="pat-cookiedirective"' +
         '     data-pat-cookiedirective="shouldAsk: true;' +
@@ -24,119 +24,117 @@ define([
         '  <div class="login"></div>' +
         '</div>');
     });
-    it("test ask permission shows", function() {
+    it('test ask permission shows', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(1);
     });
-    it("test ask permission can be hidden", function() {
+    it('test ask permission can be hidden', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
-      this.$el.attr("data-pat-cookiedirective", "shouldAsk: false");
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false');
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission don't show if replied yes", function() {
+    it('test ask permission don\'t show if replied yes', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       $.cookie('Allow_Cookies_For_Site', 1);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission don't show if replied no", function() {
+    it('test ask permission don\'t show if replied no', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       $.cookie('Allow_Cookies_For_Site', 0);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission allow button", function() {
+    it('test ask permission allow button', function() {
       var cookie = $.cookie('Allow_Cookies_For_Site');
-      if(cookie === null){
+      if (cookie === null) {
         cookie = undefined;
       }
       expect(cookie).to.be.equal(undefined);
       registry.scan(this.$el);
       this.$el.find('.cookieallowbutton').trigger('click');
-      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal("1");
+      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal('1');
       expect(this.$el.find('.cookiedirective').is(':hidden')).to.be.equal(true);
     });
-    it("test ask permission deny button", function() {
+    it('test ask permission deny button', function() {
       var cookie = $.cookie('Allow_Cookies_For_Site');
-      if(cookie === null){
+      if (cookie === null) {
         cookie = undefined;
       }
       expect(cookie).to.be.equal(undefined);
       registry.scan(this.$el);
       this.$el.find('.cookiedenybutton').trigger('click');
-      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal("0");
+      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal('0');
       expect(this.$el.find('.cookiedirective').is(':hidden')).to.be.equal(true);
     });
-    it("test ask permission customizable", function() {
-      this.$el.attr("data-pat-cookiedirective",
-        "askPermissionMsg: Test askPermissionMsg;" +
-        "allowMsg: Test allowMsg;" +
-        "denyMsg: Test denyMsg");
+    it('test ask permission customizable', function() {
+      this.$el.attr('data-pat-cookiedirective',
+        'askPermissionMsg: Test askPermissionMsg;' +
+        'allowMsg: Test allowMsg;' +
+        'denyMsg: Test denyMsg'
+      );
       registry.scan(this.$el);
-      expect(this.$el.find('.cookiemsg').text()).to.equal("Test askPermissionMsg");
-      expect(this.$el.find('.cookieallowbutton').text()).to.equal("Test allowMsg");
-      expect(this.$el.find('.cookiedenybutton').text()).to.equal("Test denyMsg");
+      expect(this.$el.find('.cookiemsg').text()).to.equal('Test askPermissionMsg');
+      expect(this.$el.find('.cookieallowbutton').text()).to.equal('Test allowMsg');
+      expect(this.$el.find('.cookiedenybutton').text()).to.equal('Test denyMsg');
 
     });
-    it("test enable cookies shows", function() {
+    it('test enable cookies shows', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective", "shouldAsk: false");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(1);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("test enable cookies can be hidden", function() {
+    it('test enable cookies can be hidden', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldAsk: false; shouldEnable: false");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false; shouldEnable: false');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("show enable cookies and ask permission", function() {
+    it('show enable cookies and ask permission', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(1);
       expect(this.$el.find('.cookiedirective').size()).to.equal(1);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("test enable cookies shouldn't show if selector is not found", function() {
+    it('test enable cookies shouldn\'t show if selector is not found', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldEnableSelector: .another-login; denyMsg: Test denyMsg");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldEnableSelector: .another-login; denyMsg: Test denyMsg');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("show enable cookies message customizable", function() {
+    it('show enable cookies message customizable', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldEnableMsg: Test shouldEnableMsg");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldEnableMsg: Test shouldEnableMsg');
       registry.scan(this.$el);
-      expect(this.$el.find('.shouldenablecookiesmsg').text()).to.equal("Test shouldEnableMsg");
+      expect(this.$el.find('.shouldenablecookiesmsg').text()).to.equal('Test shouldEnableMsg');
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
   });
 
diff --git a/tests/pattern-dropzone-test.js b/tests/pattern-dropzone-test.js
index d7cd748..d39867a 100644
--- a/tests/pattern-dropzone-test.js
+++ b/tests/pattern-dropzone-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-dropzone'
 ], function(expect, $, registry, Dropzone) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Dropzone
   ========================== */
 
-  describe("Dropzone", function () {
-    describe("Div", function () {
+  describe('Dropzone', function () {
+    describe('Div', function () {
       beforeEach(function() {
         this.$el = $('' +
           '<div>' +
@@ -115,8 +115,8 @@ define([
         //TODO
       });
     });
-    
-    describe("Form", function () {
+
+    describe('Form', function () {
       beforeEach(function() {
         this.$el = $('' +
           '<div>' +
diff --git a/tests/pattern-expose-test.js b/tests/pattern-expose-test.js
index df063ab..c9f5f15 100644
--- a/tests/pattern-expose-test.js
+++ b/tests/pattern-expose-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-expose'
 ], function(expect, $, registry, Expose) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Expose
   ========================== */
 
-  describe("Expose", function() {
-    it("default behaivour", function() {
+  describe('Expose', function() {
+    it('default behaivour', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <form class="pat-expose" data-pat-expose="backdrop: #body">' +
@@ -27,7 +27,7 @@ define([
       $('input', $el).focusin();
       expect($('form', $el).css('z-index')).to.equal('1041');
       expect($el.hasClass('backdrop-active')).to.equal(true);
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 27;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.equal(false);
diff --git a/tests/pattern-formautofocus-test.js b/tests/pattern-formautofocus-test.js
index cb40a69..406db72 100644
--- a/tests/pattern-formautofocus-test.js
+++ b/tests/pattern-formautofocus-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-formautofocus'
 ], function(expect, $, registry, FormAutoFocus) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: FormAutoFocus
   ========================== */
 
-  describe("FormAutoFocus", function() {
+  describe('FormAutoFocus', function() {
     beforeEach(function() {
       // We are including another form to the DOM, just to be sure we focus
       // inside the form that actually has the pattern
@@ -31,7 +31,7 @@ define([
     afterEach(function() {
       this.$el.remove();
     });
-    it("when the condition is met, focus on the first one", function(done) {
+    it('when the condition is met, focus on the first one', function(done) {
       var $el = $('' +
         '<div>' +
         ' <form class="pat-formautofocus">' +
@@ -55,7 +55,7 @@ define([
       registry.scan($el);
       $el.remove();
     });
-    it("when the condition is not met, focus on the first input", function(done) {
+    it('when the condition is not met, focus on the first input', function(done) {
       var $el = $('' +
         '<div>' +
         ' <form class="pat-formautofocus">' +
diff --git a/tests/pattern-formunloadalert-test.js b/tests/pattern-formunloadalert-test.js
index 459d55a..280ece8 100644
--- a/tests/pattern-formunloadalert-test.js
+++ b/tests/pattern-formunloadalert-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-formunloadalert'
 ], function(expect, $, registry, FormUnloadAlert) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: FormUnloadAlert
   ========================== */
 
-  describe("FormUnloadAlert", function() {
+  describe('FormUnloadAlert', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<form class="pat-formunloadalert">' +
@@ -42,8 +42,8 @@ define([
       expect(pattern._changed).to.be.equal(true);
 
       $('a', this.$el)
-        .on('click', function(e){
-          var returnedString = pattern._handle_unload(pattern, e);
+        .on('click', function(e) {
+          var returnedString = pattern._handleUnload(pattern, e);
           var returnValue = e.returnValue;
           if (e.returnValue === undefined) {
             // If we are testing in a Safari based browser, e.g. PhantomJS
@@ -71,14 +71,14 @@ define([
       $select.trigger('change');
       expect(pattern._changed).to.be.equal(true);
 
-      $(this.$el).on('submit', function(e){
-        var returnedString = pattern._handle_unload(pattern, e);
+      $(this.$el).on('submit', function(e) {
+        var returnedString = pattern._handleUnload(pattern, e);
         var returnValue = e.returnValue;
         if (e.returnValue === undefined) {
-            // If we are testing in a Safari based browser, e.g. PhantomJS
-            // then e.returnValue is not set, it just reads the string for
-            // dialog message
-            returnValue = returnedString;
+          // If we are testing in a Safari based browser, e.g. PhantomJS
+          // then e.returnValue is not set, it just reads the string for
+          // dialog message
+          returnValue = returnedString;
         }
         expect(returnValue).to.not.equal(pattern.options.message);
         // Need to prevent action from doing it's default thing otherwise
@@ -88,18 +88,18 @@ define([
       });
       $(this.$el).trigger('submit');
     });
-    it('shows the right message on beforeunload event', function(done){
+    it('shows the right message on beforeunload event', function(done) {
       registry.scan(this.$el);
-      var returnValue = "";
+      var returnValue = '';
       // current instance of the pattern
       var pattern = this.$el.data('pattern-formunloadalert');
       var $select = $('select', this.$el);
 
-      // Override the _handle_msg of the pattern as we need to
+      // Override the _handleMsg of the pattern as we need to
       // get the msg string out somehow, and there's no way to
       // do this that I can find after triggering beforeunload
 
-      pattern._handle_msg = function(e, msg) {
+      pattern._handleMsg = function(e, msg) {
         // Set the msg into a variable that we can actually read
         returnValue = msg;
       };
@@ -108,15 +108,14 @@ define([
       $select.trigger('change');
       expect(pattern._changed).to.be.equal(true);
 
-      $(window)
-        .on('messageset.formunloadalert.patterns', function(){
+      $(window).on('messageset.formunloadalert.patterns', function() {
         expect(returnValue).to.equal(pattern.options.message);
         done();
       });
       // Trigger the beforeunload event
       $(window).trigger('beforeunload');
     });
-    it("doesn't interfere if there's no form", function() {
+    it('doesn\'t interfere if there\'s no form', function() {
       this.$el = $('' +
         '<div class="pat-formunloadalert">' +
         ' <select name="aselect">' +
diff --git a/tests/pattern-livesearch-test.js b/tests/pattern-livesearch-test.js
index 8794690..98041d0 100644
--- a/tests/pattern-livesearch-test.js
+++ b/tests/pattern-livesearch-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-livesearch'
 ], function(expect, $, sinon, registry, Livesearch) {
-  "use strict";
+  'use strict';
 
   var errormsg;
   window.mocha.setup({globals: ['setTimeout', 'setInterval', 'clearTimeout', 'clearInterval']});
@@ -17,7 +17,7 @@ define([
   ========================== */
 
   describe('Livesearch', function() {
-    beforeEach(function(){
+    beforeEach(function() {
 
       this._error = $.error;
       $.error = function(msg) {
@@ -30,49 +30,50 @@ define([
 
       function getQueryVariable(url, variable) {
         var query = url.split('?')[1];
-        if(query === undefined){
+        if (query === undefined) {
           return null;
         }
         var vars = query.split('&');
         for (var i = 0; i < vars.length; i += 1) {
-            var pair = vars[i].split('=');
-            if (decodeURIComponent(pair[0]) === variable) {
-                return decodeURIComponent(pair[1]);
-            }
+          var pair = vars[i].split('=');
+          if (decodeURIComponent(pair[0]) === variable) {
+            return decodeURIComponent(pair[1]);
+          }
         }
         return null;
       }
-      this.server.respondWith("GET", /search.json/, function (xhr, id) {
+      this.server.respondWith('GET', /search.json/, function (xhr, id) {
         var items = [
           {
-            "UID": "123sdfasdf",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: '123sdfasdf',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection',
+            Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf1123asZ",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'fooasdfasdf1123asZ',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           },
           {
-            "UID": "fooasdfasdf1231as",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: 'fooasdfasdf1231as',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf12231451",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'fooasdfasdf12231451',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           },
           {
-            "UID": "sdfsdkfo12231451",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'sdfsdkfo12231451',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           }
         ];
 
@@ -84,14 +85,14 @@ define([
         } else {
           if (batch) {
             var start, end;
-            start = (batch.page-1) * batch.size;
+            start = (batch.page - 1) * batch.size;
             end = start + batch.size;
             results = items.slice(start, end);
           } else {
             results = items;
           }
         }
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: results.length,
           results: results
         }));
@@ -104,20 +105,20 @@ define([
       this.server.restore();
 
       this.$el.remove();
-      $.error= this._error;
+      $.error = this._error;
       errormsg = undefined;
 
     });
 
     it('test default elements', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -130,14 +131,14 @@ define([
     });
 
     it('keyboard navigation and selection', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json; isTest: true">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json; isTest: true">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -229,14 +230,14 @@ define([
     });
 
     it('user help is shown indicating how many chars to type', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -260,14 +261,14 @@ define([
     });
 
     it('no results found message', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -286,14 +287,14 @@ define([
     });
 
     it('searching message is displayed', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -303,7 +304,7 @@ define([
       d.which = 68;
 
       $input.val('123').trigger(d);
-      this.clock.tick(pattern.options.delay+5);
+      this.clock.tick(pattern.options.delay + 5);
 
       expect(pattern.$results.text()).to.contain('Searching...');
 
@@ -311,15 +312,15 @@ define([
     });
 
     it('template from selector', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
               'data-pat-livesearch="url:/search.json;' +
-          '                          #tpl_livesearch">'+
-          ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-          ' <div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+          '                          #tpl_livesearch">' +
+          ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+          ' <div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
       var tpl = $('<script type="text/template" id="tpl_livesearch">' +
         '<li class="pattern-livesearch-result pattern-livesearch-type-<%= Type %>">' +
@@ -331,7 +332,7 @@ define([
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
 
-      var $input= pattern.$input;
+      var $input = pattern.$input;
       $input.val('abcd').trigger('keyup');
 
       this.clock.tick(1000);
@@ -339,20 +340,20 @@ define([
       var $results = pattern.items();
 
       expect($results.length).to.be.greaterThan(1);
-      expect($results.first().text().indexOf('Site News')).to.be.greaterThan(-1);
+      expect($results.first().text().indexOf('Site News')).to.be.greaterThan( -1 );
 
       $el.remove();
       tpl.remove();
     });
 
-    it('log error msg if there is no input field', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json">'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('log error msg if there is no input field', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json">' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -361,15 +362,15 @@ define([
       $el.remove();
     });
 
-    it('log error msg if there is no url', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="">'+
-            ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('log error msg if there is no url', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="">' +
+            ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -378,15 +379,15 @@ define([
       $el.remove();
     });
 
-    it('hide search result if clicking somewhere', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('hide search result if clicking somewhere', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -398,15 +399,15 @@ define([
 
     });
 
-    it('show cached result', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json; isTest: true">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('show cached result', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json; isTest: true">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
diff --git a/tests/pattern-modal-test.js b/tests/pattern-modal-test.js
index 43c81d5..0fd52bb 100644
--- a/tests/pattern-modal-test.js
+++ b/tests/pattern-modal-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-modal'
 ], function(expect, $, sinon, registry, Modal) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,46 +14,49 @@ define([
    TEST: Modal
   ========================== */
 
-  describe("Modal", function() {
-    beforeEach(function(){
+  describe('Modal', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
       this.server.respondWith(/patterns-modal-load-via-ajax/, function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "text/html" }, '' +
+        xhr.respond(200, { 'Content-Type': 'text/html' }, '' +
           '<html><body>' +
           '<div id="content">Exampel</div>' +
-          '</body></html>');
+          '</body></html>'
+        );
       });
 
-      this.server.respondWith("GET", /modal-form\.html/, function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "text/html" },
-          '<html>'+
-          '<head></head>'+
-          '<body>'+
-          '<div id="content">'+
-          '<h1>Modal with Form</h1>'+
-          '<p>This modal contains a form.</p>'+
+      this.server.respondWith('GET', /modal-form\.html/, function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'text/html' },
+          '<html>' +
+          '<head></head>' +
+          '<body>' +
+          '<div id="content">' +
+          '<h1>Modal with Form</h1>' +
+          '<p>This modal contains a form.</p>' +
           '<form method="POST" action="/modal-submit.html">' +
           '  <label for="name">Name:</label><input type="text" name="name" />' +
           '  <div class="formControls"> ' +
           '    <input type="submit" class="btn btn-primary" value="Submit" name="save" />' +
-          '  </div>'+
+          '  </div>' +
           '</form>' +
-          '</body>'+
-          '</html>');
-        });
-
-        this.server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
-          xhr.respond(200, {"content-Type": "text/html"},
-            '<html> '+
-            '  <head></head>'+
-            '  <body> '+
-            '    <div id="content">'+
-            '      <h1>Form submitted</h1>'+
-            '      <p>Thanks!</p>'+
-            '  </body> '+
-            '</html>');
-        });
+          '</body>' +
+          '</html>'
+        );
+      });
+
+      this.server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
+        xhr.respond(200, {'content-Type': 'text/html'},
+          '<html> ' +
+          '  <head></head>' +
+          '  <body> ' +
+          '    <div id="content">' +
+          '      <h1>Form submitted</h1>' +
+          '      <p>Thanks!</p>' +
+          '  </body> ' +
+          '</html>'
+        );
+      });
     });
 
     afterEach(function() {
@@ -61,7 +64,7 @@ define([
       this.server.restore();
     });
 
-    it("default behaviour", function() {
+    it('default behaviour', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <a class="pat-modal" href="#target"' +
@@ -87,7 +90,7 @@ define([
       expect($('.modal .modal-body', $el).size()).to.equal(1);
       expect($('.modal .modal-footer', $el).size()).to.equal(1);
 
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 27;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.be.equal(false);
@@ -96,7 +99,7 @@ define([
       $el.remove();
     });
 
-    it("customize modal on show event", function() {
+    it('customize modal on show event', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <a class="pat-modal" href="#target"' +
@@ -107,43 +110,49 @@ define([
       $('a', $el)
         .patternModal()
         .on('show.modal.patterns', function(e) {
-            var modal = $(this).data('pattern-modal');
-            $('.modal-header', modal.$modal).prepend($('<h3>New Title</h3>'));
-          })
+          var modal = $(this).data('pattern-modal');
+          $('.modal-header', modal.$modal).prepend($('<h3>New Title</h3>'));
+        })
         .click();
       expect($('.modal .modal-header h3', $el).text()).to.equal('New Title');
 
       $el.remove();
     });
 
-    it("load modal content via ajax", function(done) {
+    it('load modal content via ajax', function(done) {
       $('<a class="pat-modal" />')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           expect(true).to.be.equal(true);
           done();
-      }).click();
+        })
+        .click();
     });
 
-    it("redirects to base urls", function(done){
+    it('redirects to base urls', function(done) {
       $('<a class="pat-modal" />')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           var modal = $(this).data('pattern-modal');
-          expect(modal.defaults.actionOptions.redirectToUrl('ignore',
-              '<html><head><base href="testurl"></base></head></html>')).to.equal('testurl');
-          expect(modal.defaults.actionOptions.redirectToUrl('ignore',
-              '<html><head><base href="testurl" /></head></html>')).to.equal('testurl');
+          expect(modal.defaults.actionOptions.redirectToUrl(
+            'ignore',
+            '<html><head><base href="testurl"></base></head></html>'
+          )).to.equal('testurl');
+          expect(modal.defaults.actionOptions.redirectToUrl(
+            'ignore',
+            '<html><head><base href="testurl" /></head></html>'
+          )).to.equal('testurl');
           done();
-      }).click();
+        })
+        .click();
     });
 
-    it("handles forms and form submits", function(done) {
+    it('handles forms and form submits', function(done) {
       var server = this.server;
       $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
         .appendTo('body')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           var $input = $('.pattern-modal-buttons').find('input');
           expect($input.size()).to.equal(1);
           $input.click();
@@ -159,27 +168,27 @@ define([
       server.respond(); // XXX could not get autorespond to work
     });
 
-    it("handles form submits with enter key", function(done) {
-        var server = this.server;
-        $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
-            .appendTo('body')
-            .patternModal()
-            .on('show.modal.patterns', function(e){
-                var event = $.Event ('keydown');
-                event.which = event.keyCode = 13;
-                $('.modal form').trigger (event);
-                server.respond();
-            })
-            .on('formActionSuccess.modal.patterns', function() {
-                var title = $('.modal-header').find('h3').text();
-                expect(title).to.equal('Form submitted');
-                done();
-            })
-            .click();
-        server.respond();
+    it('handles form submits with enter key', function(done) {
+      var server = this.server;
+      $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
+        .appendTo('body')
+        .patternModal()
+        .on('show.modal.patterns', function(e) {
+          var event = $.Event ('keydown');
+          event.which = event.keyCode = 13;
+          $('.modal form').trigger (event);
+          server.respond();
+        })
+        .on('formActionSuccess.modal.patterns', function() {
+          var title = $('.modal-header').find('h3').text();
+          expect(title).to.equal('Form submitted');
+          done();
+        })
+        .click();
+      server.respond();
     });
 
-    describe("modal positioning (findPosition) ", function() {
+    describe('modal positioning (findPosition) ', function() {
       //
       // -- CHANGE POSITION ONLY ----------------------------------------------
       //
diff --git a/tests/pattern-moment-test.js b/tests/pattern-moment-test.js
index edd4f37..f048895 100644
--- a/tests/pattern-moment-test.js
+++ b/tests/pattern-moment-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-moment'
 ], function(expect, $, registry, Moment) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,40 +13,33 @@ define([
    TEST: Moment
   ========================== */
 
-  describe("Moment", function () {
+  describe('Moment', function () {
     beforeEach(function() {
     });
-    it("test parse relative", function() {
+    it('test parse relative', function() {
       var date = new Date();
       date.setMinutes(date.getMinutes() + 2);
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:relative">' + date + '</div>');
+      var $el = $('<div class="pat-moment" data-pat-moment="format:relative">' + date + '</div>');
       registry.scan($el);
       expect($el.html()).to.equal('in 2 minutes');
     });
-    it("test parse calendar", function() {
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:calendar">2012-10-02 14:30</div>');
+    it('test parse calendar', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar">2012-10-02 14:30</div>');
       registry.scan($el);
       expect($el.html()).to.equal('10/02/2012');
     });
-    it("test parse custom", function() {
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:YYYY">2012-10-02 14:30</div>');
+    it('test parse custom', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY">2012-10-02 14:30</div>');
       registry.scan($el);
       expect($el.html()).to.equal('2012');
     });
-    it("test parse custom", function() {
-      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY;selector:*">' +
-        '<div>2012-10-02 14:30</div>' +
-      '</div>');
+    it('test parse custom', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY;selector:*"><div>2012-10-02 14:30</div></div>');
       registry.scan($el);
       expect($el.find('div').html()).to.equal('2012');
     });
-    it("test parse no date", function() {
-      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar">' +
-        '<div></div>' +
-      '</div>');
+    it('test parse no date', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar"><div></div></div>');
       registry.scan($el);
       expect($el.find('div').html()).to.equal('');
     });
diff --git a/tests/pattern-pickadate-test.js b/tests/pattern-pickadate-test.js
index d6b6ba8..159847b 100644
--- a/tests/pattern-pickadate-test.js
+++ b/tests/pattern-pickadate-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-pickadate'
 ], function(expect, $, registry, PickADate) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: PickADate
   ========================== */
 
-  describe("PickADate", function() {
+  describe('PickADate', function() {
 
     beforeEach(function() {
       this.$el = $('<div><input class="pat-pickadate" /></div>');
diff --git a/tests/pattern-picture-test.js b/tests/pattern-picture-test.js
index d712639..0840cf1 100644
--- a/tests/pattern-picture-test.js
+++ b/tests/pattern-picture-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-picture'
 ], function(expect, $, registry, Toggle) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,30 +13,31 @@ define([
    TEST: Picture
   ========================== */
 
-  describe("Picture", function() {
+  describe('Picture', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-picture" ' +
         '     data-pat-picture="alt:Alternative text;">' +
         '   <div data-src="http://placehold.it/480x320"></div> ' +
         '   <div data-src="http://placehold.it/640x427" data-media="(min-width: 480px)"></div>' +
-        '</div>').appendTo('body');
+        '</div>'
+      ).appendTo('body');
     });
     afterEach(function() {
       this.$el.remove();
     });
-    it("create responsive image widget", function() {
+    it('create responsive image widget', function() {
       expect($('img', this.$el).size()).to.equal(0);
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
     });
-    it("test alternative text is recorded", function() {
+    it('test alternative text is recorded', function() {
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
       expect($('img', this.$el).attr('alt')).to.equal('Alternative text');
     });
     /*
-    it("test state change classes", function() {
+    it('test state change classes', function() {
       registry.scan(this.$el);
       var img = $('img', this.$el);
       expect($('img', this.$el).size()).to.equal(1);
@@ -44,7 +45,7 @@ define([
       expect(img.attr('class')).to.equal('test-error');
     });
     // Chrome and friends don't allow resizing except in popups
-    it("resize window to see media query in action", function() {
+    it('resize window to see media query in action', function() {
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
       window.resizeTo(640, 480);
diff --git a/tests/pattern-preventdoublesubmit-test.js b/tests/pattern-preventdoublesubmit-test.js
index 9fffaf6..65d4c1d 100644
--- a/tests/pattern-preventdoublesubmit-test.js
+++ b/tests/pattern-preventdoublesubmit-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-preventdoublesubmit'
 ], function(expect, $, registry, PreventDoubleSubmit) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,17 +13,17 @@ define([
    TEST: PreventDoubleSubmit
   ========================== */
 
-  describe("PreventDoubleSubmit", function() {
+  describe('PreventDoubleSubmit', function() {
     beforeEach(function() {
       var self = this;
       // mock up `_confirm` func
-      self._old_confirm = PreventDoubleSubmit.prototype._confirm;
+      self._oldConfirm = PreventDoubleSubmit.prototype._confirm;
       PreventDoubleSubmit.prototype._confirm = function() {
         this.confirmed = true;
       };
     });
     afterEach(function() {
-      PreventDoubleSubmit.prototype._confirm = this._old_confirm;
+      PreventDoubleSubmit.prototype._confirm = this._oldConfirm;
     });
     it('prevent form to be submitted twice', function() {
       var $el = $('' +
@@ -40,29 +40,29 @@ define([
 
       var guardKlass = 'submitting';
       var optOutKlass = 'allowMultiSubmit';
-      var get_confirmed = function(el) {
+      var getConfirmed = function(el) {
         return el.data('pattern-preventdoublesubmit').confirmed;
       };
-      var reset_confirmed = function(el) {
+      var resetConfirmed = function(el) {
         el.data('pattern-preventdoublesubmit').confirmed = undefined;
       };
 
       var $b1 = $('#b1', $el);
       var $b2 = $('#b2', $el);
 
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
       $b1.trigger('click');
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
       expect($b1.hasClass(guardKlass)).to.be.equal(true);
       $b1.trigger('click');
-      expect(get_confirmed($el)).to.be.equal(true);
+      expect(getConfirmed($el)).to.be.equal(true);
 
       // reset confirmed flag
-      reset_confirmed($el);
+      resetConfirmed($el);
 
       $b2.trigger('click');
       expect($b2.hasClass(guardKlass)).to.be.equal(true);
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
 
     });
   });
diff --git a/tests/pattern-relateditems-test.js b/tests/pattern-relateditems-test.js
index a70c122..e008bce 100644
--- a/tests/pattern-relateditems-test.js
+++ b/tests/pattern-relateditems-test.js
@@ -1,11 +1,12 @@
 define([
   'expect',
   'jquery',
+  'underscore',
   'sinon',
   'mockup-registry',
   'mockup-patterns-relateditems'
-], function(expect, $, sinon, registry, RelatedItems) {
-  "use strict";
+], function(expect, $, _, sinon, registry, RelatedItems) {
+  'use strict';
 
   window.mocha.setup('bdd').globals(['jQuery*']);
   $.fx.off = true;
@@ -14,52 +15,52 @@ define([
    TEST: Related Items
   ========================== */
 
-  describe("Related Items", function() {
-    beforeEach(function(){
+  describe('Related Items', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
       function getQueryVariable(url, variable) {
         var query = url.split('?')[1];
-        if(query === undefined){
+        if (query === undefined) {
           return null;
         }
         var vars = query.split('&');
         for (var i = 0; i < vars.length; i += 1) {
-            var pair = vars[i].split('=');
-            if (decodeURIComponent(pair[0]) === variable) {
-                return decodeURIComponent(pair[1]);
-            }
+          var pair = vars[i].split('=');
+          if (decodeURIComponent(pair[0]) === variable) {
+            return decodeURIComponent(pair[1]);
+          }
         }
         return null;
       }
       this.server.respondWith(/relateditems-test.json/, function(xhr, id) {
         var root = [
-          {"UID": "jasdlfdlkdkjasdf", "Title": "Some Image", "path": "/test.png", "Type": "Image"},
-          {"UID": "asdlfkjasdlfkjasdf", "Title": "News", "path": "/news", "Type": "Folder"},
-          {"UID": "124asdfasasdaf34", "Title": "About", "path": "/about", "Type": "Folder"},
-          {"UID": "asdf1234", "Title": "Projects", "path": "/projects", "Type": "Folder"},
-          {"UID": "asdf1234gsad", "Title": "Contact", "path": "/contact", "Type": "Document"},
-          {"UID": "asdv34sdfs", "Title": "Privacy Policy", "path": "/policy", "Type": "Document"},
-          {"UID": "asdfasdf234sdf", "Title": "Our Process", "path": "/our-process", "Type": "Folder"},
-          {"UID": "asdhsfghyt45", "Title": "Donate", "path": "/donate-now", "Type": "Document"},
+          {UID: 'jasdlfdlkdkjasdf', Title: 'Some Image', path: '/test.png', Type: 'Image'},
+          {UID: 'asdlfkjasdlfkjasdf', Title: 'News', path: '/news', Type: 'Folder'},
+          {UID: '124asdfasasdaf34', Title: 'About', path: '/about', Type: 'Folder'},
+          {UID: 'asdf1234', Title: 'Projects', path: '/projects', Type: 'Folder'},
+          {UID: 'asdf1234gsad', Title: 'Contact', path: '/contact', Type: 'Document'},
+          {UID: 'asdv34sdfs', Title: 'Privacy Policy', path: '/policy', Type: 'Document'},
+          {UID: 'asdfasdf234sdf', Title: 'Our Process', path: '/our-process', Type: 'Folder'},
+          {UID: 'asdhsfghyt45', Title: 'Donate', path: '/donate-now', Type: 'Document'},
         ];
         var about = [
-          {"UID": "gfn5634f", "Title": "About Us", "path": "/about/about-us", "Type": "Document"},
-          {"UID": "45dsfgsdcd", "Title": "Philosophy", "path": "/about/philosophy", "Type": "Document"},
-          {"UID": "dfgsdfgj675", "Title": "Staff", "path": "/about/staff", "Type": "Folder"},
-          {"UID": "sdfbsfdh345", "Title": "Board of Directors", "path": "/about/board-of-directors", "Type": "Document"}
+          {UID: 'gfn5634f', Title: 'About Us', path: '/about/about-us', Type: 'Document'},
+          {UID: '45dsfgsdcd', Title: 'Philosophy', path: '/about/philosophy', Type: 'Document'},
+          {UID: 'dfgsdfgj675', Title: 'Staff', path: '/about/staff', Type: 'Folder'},
+          {UID: 'sdfbsfdh345', Title: 'Board of Directors', path: '/about/board-of-directors', Type: 'Document'}
         ];
 
         var staff = [
-          {"UID": "asdfasdf9sdf", "Title": "Mike", "path": "/about/staff/mike", "Type": "Document"},
-          {"UID": "cvbcvb82345", "Title": "Joe", "path": "/about/staff/joe", "Type": "Document"}
+          {UID: 'asdfasdf9sdf', Title: 'Mike', path: '/about/staff/mike', Type: 'Document'},
+          {UID: 'cvbcvb82345', Title: 'Joe', path: '/about/staff/joe', Type: 'Document'}
         ];
         var searchables = about.concat(root).concat(staff);
 
-        var addUrls = function(list){
+        var addUrls = function(list) {
           /* add getURL value */
-          for(var i=0; i<list.length; i=i+1){
+          for(var i = 0; i < list.length; i = i + 1) {
             var data = list[i];
             data.getURL = window.location.origin + data.path;
           }
@@ -73,24 +74,24 @@ define([
         // grab the page number and number of items per page -- note, page is 1-based from Select2
         var batch = getQueryVariable(xhr.url, 'batch');
         var page = 1;
-        var page_size = 10;
-        if(batch){
+        var pageSize = 10;
+        if (batch) {
           batch = $.parseJSON(batch);
           page = batch.page;
-          page_size = batch.size;
+          pageSize = batch.size;
         }
         page = page - 1;
 
         var query = getQueryVariable(xhr.url, 'query');
         var path = null;
         var term = '';
-        if(query){
+        if (query) {
           query = $.parseJSON(query);
-          for(var i=0; i<query.criteria.length; i=i+1){
+          for (var i = 0; i < query.criteria.length; i = i + 1) {
             var criteria = query.criteria[i];
-            if(criteria.i === 'path'){
+            if (criteria.i === 'path') {
               path = criteria.v.split('::')[0];
-            }else{
+            } else {
               term = criteria.v;
             }
           }
@@ -99,23 +100,23 @@ define([
         // this seach is for basically searching the entire hierarchy -- this IS NOT the browse "search"
         function search(items, term) {
           results = [];
-          if (term === undefined){
+          if (term === undefined) {
             return searchables;
           }
           _.each(items, function(item) {
             var q;
             var keys = (item.UID + ' ' + item.Title + ' ' + item.path + ' ' + item.Type).toLowerCase();
-            if(typeof(term) === 'object'){
-              for(var i=0; i<term.length; i=i+1){
+            if (typeof(term) === 'object') {
+              for (var i = 0; i < term.length; i = i + 1) {
                 q = term[i].toLowerCase();
-                if (keys.indexOf(q) > -1){
+                if (keys.indexOf(q) > -1) {
                   results.push(item);
                   break;
                 }
               }
-            }else{
+            } else {
               q = term.toLowerCase();
-              if (keys.indexOf(q) > -1){
+              if (keys.indexOf(q) > -1) {
                 results.push(item);
               }
             }
@@ -124,16 +125,16 @@ define([
 
         function browse(items, q, p) {
           results = [];
-          var path = p.substring(0, p.length-1);
+          var path = p.substring(0, p.length - 1);
           var splitPath = path.split('/');
           var fromPath = [];
           _.each(items, function(item) {
             var itemSplit = item.path.split('/');
-            if (item.path.indexOf(path) === 0 && itemSplit.length-1 === splitPath.length) {
+            if (item.path.indexOf(path) === 0 && itemSplit.length - 1 === splitPath.length) {
               fromPath.push(item);
             }
           });
-          if (q === undefined){
+          if (q === undefined) {
             return fromPath;
           }
           search(fromPath, q);
@@ -144,15 +145,16 @@ define([
           search(searchables, term);
         }
 
-        xhr.respond(200, { "Content-Type": "application/json" },
+        xhr.respond(200, { 'Content-Type': 'application/json' },
           JSON.stringify({
-            "total": results.length,
-            "results": results.slice(page*page_size, (page*page_size)+(page_size-1))
-        }));
+            total: results.length,
+            results: results.slice(page * pageSize, (page * pageSize) + (pageSize - 1))
+          })
+        );
       });
     });
 
-    it('test initialize', function(){
+    it('test initialize', function() {
       var $el = $('' +
         '<div>' +
         ' <input class="pat-relateditems"' +
@@ -160,7 +162,7 @@ define([
         '                          vocabularyUrl: /relateditems-test.json" />' +
         '</div>').appendTo('body');
       var pattern = $('.pat-relateditems', $el).patternRelateditems().data('patternRelateditems');
-      
+
       expect($('.select2-container-multi', $el)).to.have.length(1);
       expect($('.pattern-relateditems-container', $el)).to.have.length(1);
       expect($('.pattern-relateditems-path', $el)).to.have.length(1);
@@ -218,7 +220,7 @@ define([
       expect(pattern.$el.select2('val')).to.have.length(0);
 
       // // Need to simulate a backspace to remove the selected item: below doesn't work
-      // var backspaceEvent = $.Event("keydown");
+      // var backspaceEvent = $.Event('keydown');
       // backspaceEvent.ctrlKey = false;
       // backspaceEvent.which = 8;
       // $('.select2-search-field input').trigger( backspaceEvent );
diff --git a/tests/pattern-select2-test.js b/tests/pattern-select2-test.js
index d2f96bf..b58a36d 100644
--- a/tests/pattern-select2-test.js
+++ b/tests/pattern-select2-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-select2'
 ], function(expect, $, sinon, registry, Select2) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,19 +14,19 @@ define([
    TEST: Select2
   ========================== */
 
-  describe("Select2", function() {
-    beforeEach(function(){
+  describe('Select2', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /select2-ajax\.json/, function (xhr, id) {
+      this.server.respondWith('GET', /select2-ajax\.json/, function (xhr, id) {
         var items = [
           {id: 'red', text: 'Red'},
           {id: 'blue', text: 'Blue'},
           {id: 'yellow', text: 'Yellow'}
         ];
 
-        xhr.respond(200, {"Content-Type": "application/json"}, JSON.stringify({
+        xhr.respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
           total: items.length,
           results: items
         }));
@@ -53,198 +53,200 @@ define([
     });
 
     it('init value map/tags from JSON string', function() {
-        var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
-        $el.patternSelect2({tags: '["Red", "Yellow"]',
-                            initialValues: '{"Red": "RedTEXT", "Yellow": "YellowTEXT"}'
-        });
-        var $choices = $('.select2-choices li');
-        expect($choices.size()).to.equal(2);
+      var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
+      $el.patternSelect2({
+        tags: '["Red", "Yellow"]',
+        initialValues: '{"Red": "RedTEXT", "Yellow": "YellowTEXT"}'
+      });
+      var $choices = $('.select2-choices li');
+      expect($choices.size()).to.equal(2);
     });
 
     it('init value map from string', function() {
-        var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
-        $el.patternSelect2({tags: '["Red", "Yellow"]',
-                            initialValues: 'Yellow: YellowTEXT, Red: RedTEXT'
-        });
-        var $choices = $('.select2-choices li');
-        expect($choices.size()).to.equal(2);
-        var $red_choice = $choices.eq(0);
-        expect($red_choice.find('div').text()).to.equal('RedTEXT');
+      var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
+      $el.patternSelect2({
+        tags: '["Red", "Yellow"]',
+        initialValues: 'Yellow: YellowTEXT, Red: RedTEXT'
+      });
+      var $choices = $('.select2-choices li');
+      expect($choices.size()).to.equal(2);
+      var $redChoice = $choices.eq(0);
+      expect($redChoice.find('div').text()).to.equal('RedTEXT');
     });
 
     it('init value map', function() {
-        var $el = $(
-        '<div>' +
-        ' <input class="pat-select2"' +
-        '        data-pat-select2="{' +
-        '          "tags": "Red,Yellow,Blue",' +
-        '          "initialValues": {' +
-        '            "Yellow": "YellowTEXT",' +
-        '            "Red": "RedTEXT"' +
-        '          }' +
-        '        }"' +
-        '        value="Yellow,Red"/>' +
-        '</div>');
+      var $el = $(
+      '<div>' +
+      ' <input class="pat-select2"' +
+      '        data-pat-select2="{' +
+      '          "tags": "Red,Yellow,Blue",' +
+      '          "initialValues": {' +
+      '            "Yellow": "YellowTEXT",' +
+      '            "Red": "RedTEXT"' +
+      '          }' +
+      '        }"' +
+      '        value="Yellow,Red"/>' +
+      '</div>');
 
-        registry.scan($el);
-        expect($('.select2-choices li', $el).size()).to.equal(3);
+      registry.scan($el);
+      expect($('.select2-choices li', $el).size()).to.equal(3);
     });
 
     it('ajax vocabulary url configuration', function() {
-        var $el = $(
-        '<input class="pat-select2"' +
-        '       data-pat-select2="vocabularyUrl: select2-users-vocabulary"' +
-        '       />');
-
-        registry.scan($el);
-        var select2 = $el.data('pattern-select2');
-        expect(select2.options.ajax.url).to.equal("select2-users-vocabulary");
+      var $el = $(
+      '<input class="pat-select2"' +
+      '       data-pat-select2="vocabularyUrl: select2-users-vocabulary"' +
+      '       />');
+
+      registry.scan($el);
+      var select2 = $el.data('pattern-select2');
+      expect(select2.options.ajax.url).to.equal('select2-users-vocabulary');
     });
 
     it('displays the vocabulary when clicking an empty checkbox', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="placeholder:Search for a Value;' +
-          '                     vocabularyUrl: /select2-ajax.json;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var clock = sinon.useFakeTimers();
-        $('.select2-input').click();
-        clock.tick(1000);
-
-        $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(3);
-        expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
-        expect($results.first().text()).to.be.equal('Red');
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="placeholder:Search for a Value;' +
+        '                     vocabularyUrl: /select2-ajax.json;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var clock = sinon.useFakeTimers();
+      $('.select2-input').click();
+      clock.tick(1000);
+
+      $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(3);
+      expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
+      expect($results.first().text()).to.be.equal('Red');
     });
 
     it('prepends the query term to the selection', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="placeholder:Search for a Value;' +
-          '                     vocabularyUrl: /select2-ajax.json;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(4);
-        expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
-        expect($results.first().text()).to.be.equal('AAA');
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="placeholder:Search for a Value;' +
+        '                     vocabularyUrl: /select2-ajax.json;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(4);
+      expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
+      expect($results.first().text()).to.be.equal('AAA');
     });
 
     it('sets up orderable tags', function() {
-        var $el = $(
+      var $el = $(
         '<div>' +
         ' <input class="pat-select2"' +
         '        data-pat-select2="orderable: true; tags: Red,Yellow,Blue"' +
         '        value="Red"' +
         '        />' +
         '</div>'
-        );
+      );
 
-        registry.scan($el);
-        expect($('.select2-container', $el).hasClass('select2-orderable')).to.be.equal(true);
+      registry.scan($el);
+      expect($('.select2-container', $el).hasClass('select2-orderable')).to.be.equal(true);
     });
 
     it('handles orderable tag drag events', function() {
-        var $el = $(
+      var $el = $(
         '<div>' +
         ' <input class="pat-select2"' +
         '        data-pat-select2="orderable: true; tags: Red,Yellow,Blue"' +
         '        value="Yellow,Red"' +
         '        />' +
         '</div>'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var $results = $('li.select2-search-choice');
-        expect($results.size()).to.equal(2);
-        expect($.trim($results.eq(0).text())).to.equal('Yellow');
-        expect($.trim($results.eq(1).text())).to.equal('Red');
-
-        var first_elem = $results.eq(0);
-        var second_elem = $results.eq(1);
-        // css class is set and proxy is created when starting to drag
-        expect($('li.dragging').size()).to.equal(0);
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(false);
-
-        first_elem.trigger($.Event('dragstart'));
-
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(true);
-        var $proxy = $('li.dragging');
-        expect($proxy.size()).to.equal(1);
-
-        // css position is updated while dragging
-        first_elem.trigger($.Event('drag'), {proxy: $proxy,
-                                             drop: [],
-                                             offsetX: 10,
-                                             offsetY: 0
-                                            });
-        expect($proxy.css('top')).to.equal('0px');
-        expect($proxy.css('left')).to.equal('10px');
-
-        // css class is removed and proxy is deleted when dragging stops
-        first_elem.trigger($.Event('dragend'), {proxy: $proxy});
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(false);
-        expect($('li.dragging').size()).to.equal(0);
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var $results = $('li.select2-search-choice');
+      expect($results.size()).to.equal(2);
+      expect($.trim($results.eq(0).text())).to.equal('Yellow');
+      expect($.trim($results.eq(1).text())).to.equal('Red');
+
+      var firstElem = $results.eq(0);
+      var secondElem = $results.eq(1);
+      // css class is set and proxy is created when starting to drag
+      expect($('li.dragging').size()).to.equal(0);
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(false);
+
+      firstElem.trigger($.Event('dragstart'));
+
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(true);
+      var $proxy = $('li.dragging');
+      expect($proxy.size()).to.equal(1);
+
+      // css position is updated while dragging
+      firstElem.trigger($.Event('drag'), {
+        proxy: $proxy,
+        drop: [],
+        offsetX: 10,
+        offsetY: 0
+      });
+      expect($proxy.css('top')).to.equal('0px');
+      expect($proxy.css('left')).to.equal('10px');
+
+      // css class is removed and proxy is deleted when dragging stops
+      firstElem.trigger($.Event('dragend'), {proxy: $proxy});
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(false);
+      expect($('li.dragging').size()).to.equal(0);
     });
 
     it('does not allow new items to be added', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="tags: Red,Yellow,Blue;' +
-          '                     allowNewItems: false;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var $no_results = $('li.select2-no-results');
-        expect($no_results.size()).to.equal(1);
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="tags: Red,Yellow,Blue;' +
+        '                     allowNewItems: false;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var $noResults = $('li.select2-no-results');
+      expect($noResults.size()).to.equal(1);
     });
 
     it('does not allow new items to be added when using ajax', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="vocabularyUrl: /select2-ajax.json;' +
-          '                     allowNewItems: false;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var $no_results = $('li.select2-no-results');
-        expect($no_results.size()).to.equal(1);
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="vocabularyUrl: /select2-ajax.json;' +
+        '                     allowNewItems: false;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var $noResults = $('li.select2-no-results');
+      expect($noResults.size()).to.equal(1);
     });
 
-    it('HTML multiple select widget converted to hidden inuput, before applying select2',
-       function() {
-        var $el = $(
+    it('HTML multiple select widget converted to hidden inuput, before applying select2', function() {
+      var $el = $(
         '<div>' +
         ' <select multiple class="pat-select2" id="test-select2" name="test-name"' +
         '         data-pat-select2="{"orderable": true, "multiple": true, "separator": ";"}">' +
@@ -253,18 +255,19 @@ define([
         '   <option value="3" selected>Three</value>' +
         '   <option value="4">Four</value>' +
         ' </select>' +
-        '</div>');
+        '</div>'
+      );
 
-        registry.scan($el);
-        expect($('#test-select2', $el).is('input')).to.equal(true);
-        expect($('#test-select2', $el).attr('type')).to.equal('hidden');
-        expect($('#test-select2', $el).attr('class')).to.equal('pat-select2 select2-offscreen');
-        expect($('#test-select2', $el).attr('name')).to.equal('test-name');
-        expect($('#test-select2', $el).val()).to.equal('1;3');
-        var $results = $('li.select2-search-choice', $el);
-        expect($results.size()).to.equal(2);
-        expect($.trim($results.eq(0).text())).to.equal('One');
-        expect($.trim($results.eq(1).text())).to.equal('Three');
+      registry.scan($el);
+      expect($('#test-select2', $el).is('input')).to.equal(true);
+      expect($('#test-select2', $el).attr('type')).to.equal('hidden');
+      expect($('#test-select2', $el).attr('class')).to.equal('pat-select2 select2-offscreen');
+      expect($('#test-select2', $el).attr('name')).to.equal('test-name');
+      expect($('#test-select2', $el).val()).to.equal('1;3');
+      var $results = $('li.select2-search-choice', $el);
+      expect($results.size()).to.equal(2);
+      expect($.trim($results.eq(0).text())).to.equal('One');
+      expect($.trim($results.eq(1).text())).to.equal('Three');
     });
 
   });
diff --git a/tests/pattern-sortable-test.js b/tests/pattern-sortable-test.js
index 4313377..8949ea3 100644
--- a/tests/pattern-sortable-test.js
+++ b/tests/pattern-sortable-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-sortable'
 ], function(expect, $, registry, Sortable) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Toggle
   ========================== */
 
-  describe("Sortable", function() {
+  describe('Sortable', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<ul class="pat-sortable">' +
@@ -28,7 +28,7 @@ define([
       this.$el.remove();
     });
 
-    it("adds class on drag start", function() {
+    it('adds class on drag start', function() {
       var sortable = new Sortable(this.$el);
       var $todrag = this.$el.find('li').eq(0);
       $todrag.trigger('dragstart');
diff --git a/tests/pattern-structure-test.js b/tests/pattern-structure-test.js
index a19ec83..dc3f7f5 100644
--- a/tests/pattern-structure-test.js
+++ b/tests/pattern-structure-test.js
@@ -5,22 +5,22 @@ define([
   'mockup-patterns-structure',
   'sinon',
 ], function(expect, $, registry, Structure, sinon) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
   function getQueryVariable(url, variable) {
     var query = url.split('?')[1];
-    if(query === undefined){
+    if (query === undefined) {
       return null;
     }
     var vars = query.split('&');
     for (var i = 0; i < vars.length; i += 1) {
-        var pair = vars[i].split('=');
-        if (decodeURIComponent(pair[0]) === variable) {
-            return decodeURIComponent(pair[1]);
-        }
+      var pair = vars[i].split('=');
+      if (decodeURIComponent(pair[0]) === variable) {
+        return decodeURIComponent(pair[1]);
+      }
     }
     return null;
   }
@@ -29,8 +29,8 @@ define([
    /* ==========================
    TEST: Structure
   ========================== */
-  describe("Structure", function() {
-    beforeEach(function(){
+  describe('Structure', function() {
+    beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-structure" ' +
              'data-pat-structure="vocabularyUrl:/data.json;' +
@@ -46,55 +46,56 @@ define([
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /data.json/, function (xhr, id) {
+      this.server.respondWith('GET', /data.json/, function (xhr, id) {
         var batch = JSON.parse(getQueryVariable(xhr.url, 'batch'));
         var start = 0;
         var end = 15;
-        if(batch){
-          start = (batch.page-1) * batch.size;
+        if (batch) {
+          start = (batch.page - 1) * batch.size;
           end = start + batch.size;
         }
         var items = [];
-        for(var i=start; i<end; i++){
+        for (var i = start; i < end; i = i + 1) {
           items.push({
-            "UID": "123sdfasdf" + i,
-            "getURL": "http://localhost:8081/item" + i,
-            "path": '/item' + i,
-            "Type": "Page " + i, "Description": "page",
-            "Title": "Page " + i,
+            UID: '123sdfasdf' + i,
+            getURL: 'http://localhost:8081/item' + i,
+            path: '/item' + i,
+            Type: 'Page ' + i,
+            Description: 'page',
+            Title: 'Page ' + i,
             'review_state': 'published',
             'is_folderish': false,
-            'Subject': [],
-            'id': 'item' + i
+            Subject: [],
+            id: 'item' + i
           });
         }
 
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: 100,
           results: items
         }));
       });
-      this.server.respondWith("POST", '/rearrange', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          status: "success",
+      this.server.respondWith('POST', '/rearrange', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          status: 'success',
           msg: 'rearranged'
         }));
       });
-      this.server.respondWith("POST", '/paste', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          status: "success",
+      this.server.respondWith('POST', '/paste', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          status: 'success',
           msg: 'pasted'
         }));
       });
-      this.server.respondWith("GET", '/contextInfo.json', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          "addButtons": [{
-            "id": "page",
-            "title": "Page",
-            "url": "/addpage"
+      this.server.respondWith('GET', '/contextInfo.json', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          addButtons: [{
+            id: 'page',
+            title: 'Page',
+            url: '/addpage'
           },{
-            "id": "folder",
-            "title": "Folder"
+            id: 'folder',
+            title: 'Folder'
           }]
         }));
       });
@@ -102,7 +103,7 @@ define([
       this.clock = sinon.useFakeTimers();
     });
 
-    afterEach(function(){
+    afterEach(function() {
       this.server.restore();
       this.clock.restore();
     });
@@ -118,7 +119,7 @@ define([
       var cb = this.$el.find('.itemRow td.selection input').eq(0);
       cb[0].checked = true;
       cb.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('1');
+      expect(this.$el.find('#selected').html()).to.contain('1');
     });
 
     it('remove item from selection well', function() {
@@ -128,7 +129,7 @@ define([
       $item1[0].checked = true;
       $item1.trigger('change');
       this.$el.find('.items.popover-content a.remove').trigger('click').trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('0');
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
     it('remove all from selection well', function() {
@@ -140,9 +141,9 @@ define([
       var $item2 = this.$el.find('.itemRow td.selection input').eq(1);
       $item2[0].checked = true;
       $item2.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('2');
+      expect(this.$el.find('#selected').html()).to.contain('2');
       this.$el.find('.popover.selected a.remove-all').trigger('click');
-      expect(this.$el.find("#selected").html()).to.contain('0');
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
     it('paging', function() {
@@ -166,7 +167,7 @@ define([
     });
 
     it('test paging does not apply overflow hidden to parent', function() {
-      /* 
+      /*
        * very odd here, overflow hidden is getting applied by something after
        * the table of results is re-rendered with new data
        */
@@ -242,7 +243,7 @@ define([
       var $item = this.$el.find('table th .select-all');
       $item[0].checked = true;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('15');
+      expect(this.$el.find('#selected').html()).to.contain('15');
 
     });
 
@@ -253,11 +254,10 @@ define([
       var $item = this.$el.find('table th .select-all');
       $item[0].checked = true;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('15');
+      expect(this.$el.find('#selected').html()).to.contain('15');
       $item[0].checked = false;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('0');
-
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
   });
diff --git a/tests/pattern-tablesorter-test.js b/tests/pattern-tablesorter-test.js
index a55085c..cedbf27 100644
--- a/tests/pattern-tablesorter-test.js
+++ b/tests/pattern-tablesorter-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-tablesorter'
 ], function(expect, $, registry, Tablesorter) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,51 +13,51 @@ define([
    TEST: TableSorter
   ========================== */
 
-  describe("TableSorter", function () {
+  describe('TableSorter', function () {
     beforeEach(function() {
-      this.$el = $('' +
-        '<table class="pat-tablesorter">'+
-        '   <thead>'+
-        '     <tr>'+
-        '       <th>First Name</th>'+
-        '       <th>Last Name</th>'+
-        '       <th>Number</th>'+
-        '     </tr>'+
-        '   </thead>'+
-        '   <tbody>'+
-        '     <tr>'+
-        '       <td>AAA</td>'+
-        '       <td>ZZZ</td>'+
-        '       <td>3</td>'+
-        '     </tr>'+
-        '     <tr>'+
-        '       <td>BBB</td>'+
-        '       <td>YYY</td>'+
-        '       <td>1</td>'+
-        '     </tr>'+
-        '     <tr>'+
-        '       <td>CCC</td>'+
-        '       <td>XXX</td>'+
-        '       <td>2</td>'+
-        '     </tr>'+
-        '   </tbody>'+
+      this.$el = $ ('' +
+        '<table class="pat-tablesorter">' +
+        '   <thead>' +
+        '     <tr>' +
+        '       <th>First Name</th>' +
+        '       <th>Last Name</th>' +
+        '       <th>Number</th>' +
+        '     </tr>' +
+        '   </thead>' +
+        '   <tbody>' +
+        '     <tr>' +
+        '       <td>AAA</td>' +
+        '       <td>ZZZ</td>' +
+        '       <td>3</td>' +
+        '     </tr>' +
+        '     <tr>' +
+        '       <td>BBB</td>' +
+        '       <td>YYY</td>' +
+        '       <td>1</td>' +
+        '     </tr>' +
+        '     <tr>' +
+        '       <td>CCC</td>' +
+        '       <td>XXX</td>' +
+        '       <td>2</td>' +
+        '     </tr>' +
+        '   </tbody>' +
         ' </table>');
     });
-    it("test headers have the sort arrow", function() {
+    it('test headers have the sort arrow', function() {
       registry.scan(this.$el);
       expect(this.$el.find('.sortdirection').size()).to.equal(3);
     });
-    it("test sort by second column", function() {
+    it('test sort by second column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(1).trigger("click");
+      this.$el.find('thead th').eq(1).trigger('click');
 
-      var should_be = ["CCC", "BBB", "AAA"];
+      var shouldBe = ['CCC', 'BBB', 'AAA'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
@@ -69,17 +69,17 @@ define([
       expect(trs.eq(2).hasClass('even')).to.be.equal(false);
 
     });
-    it("test sort by third column", function() {
+    it('test sort by third column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(2).trigger("click");
+      this.$el.find('thead th').eq(2).trigger('click');
 
-      var should_be = ["BBB", "CCC", "AAA"];
+      var shouldBe = ['BBB', 'CCC', 'AAA'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
@@ -91,22 +91,22 @@ define([
       expect(trs.eq(2).hasClass('even')).to.be.equal(false);
 
     });
-    it("test several sorts and finally back to first column", function() {
+    it('test several sorts and finally back to first column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(2).trigger("click");
-      this.$el.find('thead th').eq(3).trigger("click");
-      this.$el.find('thead th').eq(2).trigger("click");
-      this.$el.find('thead th').eq(1).trigger("click");
-      this.$el.find('thead th').eq(3).trigger("click");
-      this.$el.find('thead th').eq(1).trigger("click");
+      this.$el.find('thead th').eq(2).trigger('click');
+      this.$el.find('thead th').eq(3).trigger('click');
+      this.$el.find('thead th').eq(2).trigger('click');
+      this.$el.find('thead th').eq(1).trigger('click');
+      this.$el.find('thead th').eq(3).trigger('click');
+      this.$el.find('thead th').eq(1).trigger('click');
 
-      var should_be = ["AAA", "BBB", "CCC"];
+      var shouldBe = ['AAA', 'BBB', 'CCC'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
diff --git a/tests/pattern-tinymce-test.js b/tests/pattern-tinymce-test.js
index 0bc8b70..45d0314 100644
--- a/tests/pattern-tinymce-test.js
+++ b/tests/pattern-tinymce-test.js
@@ -6,78 +6,80 @@ define([
   'tinymce',
   'mockup-patterns-tinymce'
 ], function(expect, $, sinon, registry, tinymce, TinyMCE) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  var createTinymce = function(options){
-    if(options === undefined){
+  var createTinymce = function(options) {
+    if (options === undefined) {
       options = {};
     }
-    var $el = $(
-      '<textarea class="pat-tinymce">' +
-      '</textarea>').appendTo('body');
+    var $el = $('<textarea class="pat-tinymce"></textarea>').appendTo('body');
 
     return new TinyMCE($el, options);
   };
 
-  describe("TinyMCE", function() {
-    afterEach(function(){
+  describe('TinyMCE', function() {
+    afterEach(function() {
       $('body').empty();
     });
 
-    beforeEach(function(){
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /data.json/, function (xhr, id) {
+      this.server.respondWith('GET', /data.json/, function (xhr, id) {
         var items = [
           {
-            "UID": "123sdfasdf",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "path": '/news/aggregator',
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: '123sdfasdf',
+            getURL: 'http://localhost:8081/news/aggregator',
+            path: '/news/aggregator',
+            Type: 'Collection',
+            Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf1123asZ",
-            'path': '/about',
-            "getURL": "http://localhost:8081/about",
-            "Type": "Page", "Description": "About",
-            "Title": "About"
+            UID: 'fooasdfasdf1123asZ',
+            path: '/about',
+            getURL: 'http://localhost:8081/about',
+            Type: 'Page',
+            Description: 'About',
+            Title: 'About'
           },
         ];
 
-        if(xhr.url.indexOf('123sdfasdf') !== -1){
+        if (xhr.url.indexOf('123sdfasdf') !== -1) {
           // ajax request for this one val
           items.pop();
         }
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: items.length,
           results: items
         }));
       });
     });
 
-    it('creates tinymce', function(){
+    it('creates tinymce', function() {
       var $el = $(
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect($el.children().length).to.be.greaterThan(1);
       tinymce.get(0).remove();
     });
 
-    it('maintains an initial textarea value', function(){
+    it('maintains an initial textarea value', function() {
       var $el = $(
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '    foobar' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect(tinymce.get(0).getContent()).to.be.equal('<p>foobar</p>');
     });
@@ -87,22 +89,24 @@ define([
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect(tinymce.get(0).buttons).to.have.keys('plonelink', 'ploneimage');
     });
 
-    it('on form submit, save data to form', function(){
+    it('on form submit, save data to form', function() {
       var $container = $(
        '<form>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</form>').appendTo('body');
+       '</form>'
+      ).appendTo('body');
 
       var $el = $container.find('textarea');
       var tinymce = new TinyMCE($el);
       tinymce.tiny.setContent('<p>foobar</p>');
-      $container.submit(function(e){
+      $container.submit(function(e) {
         e.preventDefault();
       });
       $container.trigger('submit');
@@ -110,7 +114,7 @@ define([
       expect($el.val()).to.equal('<p>foobar</p>');
     });
 
-    it('auto adds image on upload', function(){
+    it('auto adds image on upload', function() {
       var tinymce = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -123,10 +127,8 @@ define([
       expect(tinymce.tiny.getContent()).to.contain('resolveuid/foobar');
 
     });
-    it('auto adds link on file upload', function(){
-      var $el = $(
-       '<textarea class="pat-tinymce">' +
-       '</textarea>').appendTo('body');
+    it('auto adds link on file upload', function() {
+      var $el = $('<textarea class="pat-tinymce"></textarea>').appendTo('body');
 
       var tinymce = new TinyMCE($el);
 
@@ -138,7 +140,7 @@ define([
 
     });
 
-    it('test create correct url from metadata', function(){
+    it('test create correct url from metadata', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -148,7 +150,7 @@ define([
       };
       expect(tiny.generateUrl(data)).to.equal('resolveuid/foobar');
     });
-    it('test creates correct url from metadata with append', function(){
+    it('test creates correct url from metadata with append', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -159,7 +161,7 @@ define([
       };
       expect(tiny.generateUrl(data)).to.equal('resolveuid/foobar.html');
     });
-    it('test parses correct attribute from url', function(){
+    it('test parses correct attribute from url', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -167,7 +169,7 @@ define([
       expect(tiny.stripGeneratedUrl('resolveuid/foobar')).to.equal('foobar');
     });
 
-    it('test parses correct attribute from url with appended value', function(){
+    it('test parses correct attribute from url with appended value', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -176,28 +178,28 @@ define([
       expect(tiny.stripGeneratedUrl('resolveuid/foobar/@@view')).to.equal('foobar');
     });
 
-    it('test get scale from url', function(){
+    it('test get scale from url', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/'
       });
       expect(pattern.getScaleFromUrl('foobar/somescale/foobar')).to.equal('foobar');
     });
 
-    it('test get scale return null if invalid', function(){
+    it('test get scale return null if invalid', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/'
       });
       expect(pattern.getScaleFromUrl('foobar')).to.equal(null);
     });
 
-    it('get scale handles edge case of image_ for plone', function(){
+    it('get scale handles edge case of image_ for plone', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale'
       });
       expect(pattern.getScaleFromUrl('foobar/somescale/image_large')).to.equal('large');
     });
 
-    it('get scale with appended option', function(){
+    it('get scale with appended option', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/',
         appendToScalePart: '/@@view'
@@ -205,7 +207,7 @@ define([
       expect(pattern.getScaleFromUrl('foobar/somescale/large/@@view')).to.equal('large');
     });
 
-    it('get scale handles edge case of image_ for plone', function(){
+    it('get scale handles edge case of image_ for plone', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale'
       });
@@ -213,7 +215,7 @@ define([
     });
 
 
-    it('test add link', function(){
+    it('test add link', function() {
       var pattern = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -231,7 +233,7 @@ define([
       });
       expect(pattern.linkModal.getLinkUrl()).to.equal('resolveuid/foobar');
     });
-    it('test add external link', function(){
+    it('test add external link', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       var modal = pattern.linkModal;
@@ -239,14 +241,14 @@ define([
       modal.linkTypes.external.$input.attr('value', 'http://foobar');
       expect(pattern.linkModal.getLinkUrl()).to.equal('http://foobar');
     });
-    it('test add email link', function(){
+    it('test add email link', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       pattern.linkModal.linkType = 'email';
       pattern.linkModal.linkTypes.email.$input.attr('value', 'foo at bar.com');
       expect(pattern.linkModal.getLinkUrl()).to.equal('mailto:foo at bar.com');
     });
-    it('test add image link', function(){
+    it('test add image link', function() {
       var pattern = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -262,11 +264,10 @@ define([
 
       pattern.imageModal.linkType = 'image';
       pattern.imageModal.$scale.find('[value="thumb"]')[0].selected = true;
-      expect(pattern.imageModal.getLinkUrl()).to.equal(
-        'resolveuid/foobar/@@images/image/thumb');
+      expect(pattern.imageModal.getLinkUrl()).to.equal('resolveuid/foobar/@@images/image/thumb');
     });
 
-    it('test adds data attributes', function(){
+    it('test adds data attributes', function() {
       var pattern = createTinymce();
 
       pattern.addLinkClicked();
@@ -283,7 +284,7 @@ define([
       expect(pattern.tiny.getContent()).to.contain('data-linktype="internal"');
     });
 
-    it('test loading link also sets up related items correctly', function(){
+    it('test loading link also sets up related items correctly', function() {
       var pattern = createTinymce({
         relatedItems: {
           vocabularyUrl: '/data.json'
@@ -294,18 +295,18 @@ define([
 
       pattern.linkModal.linkTypes.internal.set('123sdfasdf');
       var val = pattern.linkModal.linkTypes.internal.$input.select2('data');
-      /* XXX ajax not loading quickly enough here... 
+      /* XXX ajax not loading quickly enough here...
       expect(val.UID).to.equal('123sdfasdf');
       */
     });
 
-    it('test create upload file modal', function(){
+    it('test create upload file modal', function() {
       var pattern = createTinymce();
       pattern.uploadFileClicked();
       expect(pattern.uploadModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen upload file modal', function(){
+    it('test reopen upload file modal', function() {
       var pattern = createTinymce();
       pattern.uploadFileClicked();
       pattern.uploadModal.hide();
@@ -314,7 +315,7 @@ define([
       expect(pattern.uploadModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen add link modal', function(){
+    it('test reopen add link modal', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       pattern.linkModal.hide();
@@ -323,7 +324,7 @@ define([
       expect(pattern.linkModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen add image modal', function(){
+    it('test reopen add image modal', function() {
       var pattern = createTinymce();
       pattern.addImageClicked();
       pattern.imageModal.hide();
@@ -332,44 +333,39 @@ define([
       expect(pattern.imageModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test loads existing link external values', function(){
+    it('test loads existing link external values', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a href="foobar" data-linktype="external" data-val="foobar">foobar</a>');
+      pattern.tiny.setContent('<a href="foobar" data-linktype="external" data-val="foobar">foobar</a>');
 
-      pattern.tiny.selection.select(
-        pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
+      pattern.tiny.selection.select(pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.external.$input.val()).to.equal('foobar');
     });
 
-    it('test loads existing link email values', function(){
+    it('test loads existing link email values', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a href="mailto:foo at bar.com" data-linktype="email" data-val="foo at bar.com">foobar</a>');
+      pattern.tiny.setContent('<a href="mailto:foo at bar.com" data-linktype="email" data-val="foo at bar.com">foobar</a>');
 
-      pattern.tiny.selection.select(
-        pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
+      pattern.tiny.selection.select(pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.email.$input.val()).to.equal('foo at bar.com');
     });
 
-    it('test anchor link adds existing anchors to list', function(){
+    it('test anchor link adds existing anchors to list', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a class="mceItemAnchor" name="foobar"></a>');
+      pattern.tiny.setContent('<a class="mceItemAnchor" name="foobar"></a>');
 
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.anchor.anchorNodes.length).to.equal(1);
     });
 
-    it('test anchor link adds anchors from option', function(){
+    it('test anchor link adds anchors from option', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
@@ -379,7 +375,7 @@ define([
       expect(pattern.linkModal.linkTypes.anchor.anchorNodes.length).to.equal(1);
     });
 
-    it('test anchor get index', function(){
+    it('test anchor get index', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
@@ -389,7 +385,7 @@ define([
       expect(pattern.linkModal.linkTypes.anchor.getIndex('foobar')).to.equal(1);
     });
 
-    it('test anchor get url', function(){
+    it('test anchor get url', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
diff --git a/tests/pattern-toggle-test.js b/tests/pattern-toggle-test.js
index c3ef7ea..97e7f23 100644
--- a/tests/pattern-toggle-test.js
+++ b/tests/pattern-toggle-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-toggle'
 ], function(expect, $, registry, Toggle) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Toggle
   ========================== */
 
-  describe("Toggle", function() {
+  describe('Toggle', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<div id="body">' +
@@ -31,9 +31,9 @@ define([
       this.$el.remove();
     });
 
-    it("by default toggles on click event", function() { 
+    it('by default toggles on click event', function() {
       expect($('.toggled', this.$el).size()).to.equal(0);
-      
+
       // scan dom for patterns
       registry.scan(this.$el);
       expect($('.toggled', this.$el).size()).to.equal(0);
@@ -43,224 +43,223 @@ define([
       expect($('.toggled', this.$el).size()).to.equal(0);
     });
 
-    it("can also listen to custom event", function() {
-     $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; event: customEvent');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     registry.scan(this.$el);
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     $('.pat-toggle', this.$el).trigger('customEvent');
-     expect($('.toggled', this.$el).size()).to.equal(1);
+    it('can also listen to custom event', function() {
+      $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; event: customEvent');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      registry.scan(this.$el);
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      $('.pat-toggle', this.$el).trigger('customEvent');
+      expect($('.toggled', this.$el).size()).to.equal(1);
     });
 
-    it("can also toggle custom element attribute", function() {
-     $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; attribute: rel');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
-     registry.scan(this.$el);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     $('.pat-toggle', this.$el).trigger('click');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(1);
-     $('.pat-toggle', this.$el).trigger('click');
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+    it('can also toggle custom element attribute', function() {
+      $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; attribute: rel');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+      registry.scan(this.$el);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      $('.pat-toggle', this.$el).trigger('click');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(1);
+      $('.pat-toggle', this.$el).trigger('click');
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
     });
 
-    it("toggle multiple targets", function() {
+    it('toggle multiple targets', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target"></div>' +
-       '  </div>' +
-       '  <div class="target"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target"></div>' +
+        '  </div>' +
+        '  <div class="target"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("if some elements already marked, mark all with first click", function() {
+    it('if some elements already marked, mark all with first click', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target toggled"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target toggled"></div>' +
-       '  </div>' +
-       '  <div class="target toggled"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(3);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target toggled"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target toggled"></div>' +
+        '  </div>' +
+        '  <div class="target toggled"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(3);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("if all elements already marked, unmark all with first click", function() {
+    it('if all elements already marked, unmark all with first click', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target toggled"></div>' +
-       '    </div>' +
-       '    <div class="target toggled"></div>' +
-       '    <div class="target toggled"></div>' +
-       '  </div>' +
-       '  <div class="target toggled"></div>' +
-       '  <div class="target toggled"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target toggled"></div>' +
+        '    </div>' +
+        '    <div class="target toggled"></div>' +
+        '    <div class="target toggled"></div>' +
+        '  </div>' +
+        '  <div class="target toggled"></div>' +
+        '  <div class="target toggled"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should also be able to mark the toggle itself", function() {
+    it('should also be able to mark the toggle itself', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle target"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target"></div>' +
-       '  </div>' +
-       '  <div class="target"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(6);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle target"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target"></div>' +
+        '  </div>' +
+        '  <div class="target"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(6);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should target itself when no target is specified", function() {
-     var $el = $('' +
-       '<div>' +
-       ' <a class="pat-toggle"' +
-       '    data-pat-toggle="value: toggled">Button</a>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+    it('should target itself when no target is specified', function() {
+      var $el = $('' +
+        '<div>' +
+        ' <a class="pat-toggle"' +
+        '    data-pat-toggle="value: toggled">Button</a>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should use the targetScope option to find the target when specified", function() {
-     var $el = $('' +
-       '<div>' +
-       '  <div class="parent1 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <div class="target pt1">' +
-       '     <a href="patterns.html">Click here to go somewhere else</a>' +
-       '    </div>' +
-       '  </div>' +
-       '  <div class="parent2 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <div class="target pt2">' +
-       '     <a href="patterns.html">Click here to go somewhere else</a>' +
-       '    </div>' +
-       '  </div>' +
-       '</div>');
-     registry.scan($el);
-     var $pattern1 = $el.find('.pat-toggle').first();
-     expect($('.toggled', $el).size()).to.equal(0);
-     $pattern1.trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     expect($('.parent1 .toggled', $el).size()).to.equal(1);
-     expect($('.parent2 .toggled', $el).size()).to.equal(0);
+    it('should use the targetScope option to find the target when specified', function() {
+      var $el = $('' +
+        '<div>' +
+        '  <div class="parent1 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <div class="target pt1">' +
+        '     <a href="patterns.html">Click here to go somewhere else</a>' +
+        '    </div>' +
+        '  </div>' +
+        '  <div class="parent2 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <div class="target pt2">' +
+        '     <a href="patterns.html">Click here to go somewhere else</a>' +
+        '    </div>' +
+        '  </div>' +
+        '</div>');
+      registry.scan($el);
+      var $pattern1 = $el.find('.pat-toggle').first();
+      expect($('.toggled', $el).size()).to.equal(0);
+      $pattern1.trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      expect($('.parent1 .toggled', $el).size()).to.equal(1);
+      expect($('.parent2 .toggled', $el).size()).to.equal(0);
     });
-    
-    it("the targetScope option should also work with other tags like p tag", function() {
-     var $el = $('' +
-       '<div>' +
-       '  <p class="parent1 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <a class="target" href="patterns.html">Click here to go somewhere else</a>' +
-       '  </p>' +
-       '  <p class="parent2 myParent">' +
-       '    <a class="uupat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <p><a class="target" href="patterns.html">Click here to go somewhere else</a></p>' +
-       '  </p>' +
-       '</div>');
-     registry.scan($el);
-     var $pattern1 = $el.find('.pat-toggle').first();
-     expect($('.toggled', $el).size()).to.equal(0);
-     $pattern1.trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     expect($('.parent1 .toggled', $el).size()).to.equal(1);
-     expect($('.parent2 .toggled', $el).size()).to.equal(0);
+
+    it('the targetScope option should also work with other tags like p tag', function() {
+      var $el = $('' +
+        '<div>' +
+        '  <p class="parent1 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <a class="target" href="patterns.html">Click here to go somewhere else</a>' +
+        '  </p>' +
+        '  <p class="parent2 myParent">' +
+        '    <a class="uupat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <p><a class="target" href="patterns.html">Click here to go somewhere else</a></p>' +
+        '  </p>' +
+        '</div>');
+      registry.scan($el);
+      var $pattern1 = $el.find('.pat-toggle').first();
+      expect($('.toggled', $el).size()).to.equal(0);
+      $pattern1.trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      expect($('.parent1 .toggled', $el).size()).to.equal(1);
+      expect($('.parent2 .toggled', $el).size()).to.equal(0);
     });
 
-    it("should throw an error when it cannot find the target", function() {
-     var $el = $('' +
-       '<div id="body">' +
-       ' <a class="pat-toggle"' +
-       '    data-pat-toggle="target: #notarget;' +
-       '                     targetScope: #body;' +
-       '                     value: toggled">Button</a>' +
-       ' <div id="target">' +
-       '   <a href="patterns.html">Click here to go somewhere else</a>' +
-       ' </div>' +
-       '</div>');
-     try {
-       registry.scan($el);
-     }
-     catch(err) {
-       expect(err.message).to.equal('No target found for "#notarget".');
-     }
+    it('should throw an error when it cannot find the target', function() {
+      var $el = $('' +
+        '<div id="body">' +
+        ' <a class="pat-toggle"' +
+        '    data-pat-toggle="target: #notarget;' +
+        '                     targetScope: #body;' +
+        '                     value: toggled">Button</a>' +
+        ' <div id="target">' +
+        '   <a href="patterns.html">Click here to go somewhere else</a>' +
+        ' </div>' +
+        '</div>');
+      try {
+        registry.scan($el);
+      } catch (err) {
+        expect(err.message).to.equal('No target found for "#notarget".');
+      }
     });
   });
 
diff --git a/tests/pattern-tooltip-test.js b/tests/pattern-tooltip-test.js
index 833624d..4683d7a 100644
--- a/tests/pattern-tooltip-test.js
+++ b/tests/pattern-tooltip-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-tooltip'
 ], function(expect, $, registry, ToolTip) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,35 +13,34 @@ define([
    TEST: Tooltip
   ========================== */
 
-  describe("Tooltip", function () {
+  describe('Tooltip', function () {
 
     beforeEach(function() {
       this.$el = $('' +
-        '<div><p href=".example-class" class="pat-tooltip">'+
-        '  Hover over this line to see a tooltip'+
-        '</p>'+
-        '<p class="tooltips example-class">'+
-        '  Setting the .example-class in the href makes this show up'+
+        '<div><p href=".example-class" class="pat-tooltip">' +
+        '  Hover over this line to see a tooltip' +
+        '</p>' +
+        '<p class="tooltips example-class">' +
+        '  Setting the .example-class in the href makes this show up' +
         '</p></div>');
     });
 
     afterEach(function() {
-        this.$el.remove();
+      this.$el.remove();
     });
 
-    it("tooltip appears and disappears", function() {
-        registry.scan(this.$el);
+    it('tooltip appears and disappears', function() {
+      registry.scan(this.$el);
 
-        var trs;
+      var trs;
 
-        $('.pat-tooltip', this.$el).trigger('mouseenter.tooltip.patterns');
-        trs = this.$el.find('.example-class');
-        expect(trs.eq(0).hasClass('active')).to.be.equal(true);
-
-        $('.pat-tooltip', this.$el).trigger('mouseleave.tooltip.patterns');
-        trs = this.$el.find('.example-class');
-        expect(trs.eq(0).hasClass('active')).to.be.equal(false);
+      $('.pat-tooltip', this.$el).trigger('mouseenter.tooltip.patterns');
+      trs = this.$el.find('.example-class');
+      expect(trs.eq(0).hasClass('active')).to.be.equal(true);
 
+      $('.pat-tooltip', this.$el).trigger('mouseleave.tooltip.patterns');
+      trs = this.$el.find('.example-class');
+      expect(trs.eq(0).hasClass('active')).to.be.equal(false);
     });
 
   });
diff --git a/tests/pattern-tree-test.js b/tests/pattern-tree-test.js
index 3026f7b..9b242dc 100644
--- a/tests/pattern-tree-test.js
+++ b/tests/pattern-tree-test.js
@@ -4,37 +4,31 @@ define([
   'mockup-registry',
   'mockup-patterns-tree'
 ], function(expect, $, registry, Tree) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  describe("Tree", function() {
-    beforeEach(function() {
-    });
-    afterEach(function() {
-    });
-    it("loads the tree with data", function() {
+  describe('Tree', function() {
+    it('loads the tree with data', function() {
       var $el = $('<div class="pat-tree"/>').appendTo('body');
       var tree = new Tree($el, {
         autoOpen: true,
-        data: [
-          {"label": "node1",
-          "children": [{
-            "label": "child1"
-            },{
-            "label": "child2"
-            }]
+        data: [{
+          label: 'node1',
+          children: [{
+            label: 'child1'
           },{
-          "label": "node2",
-          "children": [{
-            "label": "child3"
-            }]
+            label: 'child2'
           }]
+        },{
+          label: 'node2',
+          children: [{ label: 'child3' }]
+        }]
       });
       expect(tree.$el.find('ul').length).to.be.equal(3);
     });
-    it("load string of json", function() {
+    it('load string of json', function() {
       var $el = $('<div class="pat-tree"/>').appendTo('body');
       var tree = new Tree($el, {
         autoOpen: true,
@@ -49,7 +43,6 @@ define([
       });
       expect(tree.$el.find('ul').length).to.be.equal(2);
     });
-
   });
 
 });
diff --git a/tests/router-test.js b/tests/router-test.js
index 3846df8..bfa8d54 100644
--- a/tests/router-test.js
+++ b/tests/router-test.js
@@ -4,18 +4,18 @@ define([
   'mockup-router',
   'backbone'
 ], function(expect, $, Router, Backbone) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
   Router.start();
 
-  describe("Router", function () {
+  describe('Router', function () {
 
     beforeEach(function() {
       var self = this;
-      Router._change_location = function(path, hash) {
+      Router._changeLocation = function(path, hash) {
         self.routerPath = path + '#' + hash;
       };
     });
@@ -24,7 +24,7 @@ define([
       this.routerPath = undefined;
     });
 
-    it("routes and calls back", function() {
+    it('routes and calls back', function() {
       var foo = {
         set: false
       };
@@ -34,12 +34,12 @@ define([
       };
 
       Router.addRoute('test', 'foo', callback, foo, '');
-      Router.navigate("test:foo", {trigger: true});
+      Router.navigate('test:foo', {trigger: true});
 
       expect(foo.set).to.equal(true);
     });
 
-    it("redirects from added action", function() {
+    it('redirects from added action', function() {
       var foo = {
         set: false
       };
@@ -57,7 +57,7 @@ define([
       Router.reset();
     });
 
-    it("basic redirect", function() {
+    it('basic redirect', function() {
 
       Router.addRedirect('/', 'test:two');
       Router.redirect();
diff --git a/tests/utils-test.js b/tests/utils-test.js
index 7807552..3068b7a 100644
--- a/tests/utils-test.js
+++ b/tests/utils-test.js
@@ -3,16 +3,16 @@ define([
   'jquery',
   'mockup-utils'
 ], function(expect, $, utils) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  describe("utils", function () {
+  describe('utils', function () {
 
     describe('setId', function() {
 
-      it("by default uses 'id' as prefix", function() {
+      it('by default uses "id" as prefix', function() {
         var $el = $('<div>'),
             id = utils.setId($el);
         expect(id).to.not.be.an('undefined');
@@ -20,13 +20,13 @@ define([
         expect(id.indexOf('id')).to.be(0);
       });
 
-      it("can use a custom prefix", function() {
+      it('can use a custom prefix', function() {
         var $el = $('<div>'),
             id = utils.setId($el, 'myprefix');
         expect(id.indexOf('myprefix')).to.be(0);
       });
 
-      it("updates the id of an element with no id", function() {
+      it('updates the id of an element with no id', function() {
         var $el = $('<div>'),
             id;
         utils.setId($el);
@@ -36,7 +36,7 @@ define([
         expect(id).to.contain('id');
       });
 
-      it("replaces dots in ids with dashes", function() {
+      it('replaces dots in ids with dashes', function() {
         var $el = $('<div id="something.with.dots"></div>'),
             id = utils.setId($el);
         id = $el.attr('id');
@@ -46,25 +46,25 @@ define([
 
     describe('parseBodyTag', function() {
 
-      it("parses the body tag's content from a response", function() {
+      it('parses the body tag\'s content from a response', function() {
         var response = '<body><p>foo</p></body>',
             html = utils.parseBodyTag(response);
         expect(html).to.equal('<p>foo</p>');
       });
 
-      it("returns an empty string for responses with an empty body", function() {
+      it('returns an empty string for responses with an empty body', function() {
         var response = '<body></body>',
             html = utils.parseBodyTag(response);
         expect(html).to.equal('');
       });
 
-      it("fails for empty responses", function() {
+      it('fails for empty responses', function() {
         var response = '',
             fn = function () {utils.parseBodyTag(response);};
         expect(fn).to.throwException(TypeError);
       });
 
-      it("fails for responses without a body tag", function() {
+      it('fails for responses without a body tag', function() {
         var response = '<div>qux</div>',
             fn = function () {utils.parseBodyTag(response);};
         expect(fn).to.throwException(TypeError);
@@ -74,30 +74,30 @@ define([
 
     describe('bool', function() {
 
-      it("returns true for 'true'", function() {
+      it('returns true for "true"', function() {
         expect(utils.bool('true')).to.be.equal(true);
         expect(utils.bool(' true ')).to.be.equal(true);
         expect(utils.bool('TRUE')).to.be.equal(true);
         expect(utils.bool('True')).to.be.equal(true);
       });
 
-      it("returns true for true", function() {
+      it('returns true for true', function() {
         var val = utils.bool(true);
         expect(val).to.be.equal(true);
       });
 
-      it("returns true for true", function() {
+      it('returns true for true', function() {
         var val = utils.bool(1);
         expect(val).to.be.equal(true);
       });
 
-      it("returns false for strings != 'true'", function() {
+      it('returns false for strings != "true"', function() {
         expect(utils.bool('1')).to.be.equal(false);
         expect(utils.bool('')).to.be.equal(false);
         expect(utils.bool('false')).to.be.equal(false);
       });
 
-      it("returns false for undefined/null", function() {
+      it('returns false for undefined/null', function() {
         expect(utils.bool(undefined)).to.be.equal(false);
         expect(utils.bool(null)).to.be.equal(false);
       });
@@ -106,30 +106,31 @@ define([
 
     describe('QueryHelper', function() {
 
-      it("getQueryData correctly", function() {
+      it('getQueryData correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var qd = qh.getQueryData('foobar');
         expect(qd.query).to.equal('{"criteria":[{"i":"SearchableText","o":"plone.app.querystring.operation.string.contains","v":"foobar*"}]}');
       });
-      it("getQueryData use attributes correctly", function() {
+      it('getQueryData use attributes correctly', function() {
         var qh = new utils.QueryHelper({
           vocabularyUrl: 'http://foobar.com/',
-          attributes: ['one', 'two']});
+          attributes: ['one', 'two']
+        });
         var qd = qh.getQueryData('foobar');
         expect(qd.attributes).to.equal('["one","two"]');
       });
-      it("getQueryData set batch", function() {
+      it('getQueryData set batch', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var qd = qh.getQueryData('foobar', 1);
         expect(qd.batch).to.equal('{"page":1,"size":' + qh.options.batchSize + '}');
       });
 
-      it("selectAjax gets data correctly", function() {
+      it('selectAjax gets data correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var sa = qh.selectAjax();
         expect(sa.data('foobar').query).to.equal('{"criteria":[{"i":"SearchableText","o":"plone.app.querystring.operation.string.contains","v":"foobar*"}]}');
       });
-      it("selectAjax formats results correctly", function() {
+      it('selectAjax formats results correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var sa = qh.selectAjax();
         var data = sa.results({total: 100, results: [1,2,3]}, 1);
@@ -137,19 +138,17 @@ define([
         expect(data.more).to.equal(true);
       });
 
-      it("getUrl correct", function() {
+      it('getUrl correct', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
-        expect(qh.getUrl()).to.equal(
-          'http://foobar.com/?query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
+        expect(qh.getUrl()).to.equal('http://foobar.com/?query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
       });
-      it("getUrl correct and url query params already present", function() {
+      it('getUrl correct and url query params already present', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/?foo=bar'});
-        expect(qh.getUrl()).to.equal(
-          'http://foobar.com/?foo=bar&query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
+        expect(qh.getUrl()).to.equal('http://foobar.com/?foo=bar&query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
       });
 
 
-      it("browsing adds path criteria", function() {
+      it('browsing adds path criteria', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/?foo=bar'});
         qh.pattern.browsing = true;
         expect(qh.getQueryData('foobar').query).to.contain('plone.app.querystring.operation.string.path');
@@ -160,40 +159,40 @@ define([
 
     describe('ProgressIndicator', function() {
 
-      it("creates element", function() {
+      it('creates element', function() {
         var pi = new utils.ProgressIndicator();
         expect($('.' + pi.options.className).length).to.equal(1);
       });
-      it("hidden on creation", function() {
+      it('hidden on creation', function() {
         var pi = new utils.ProgressIndicator();
         expect(pi.$loading.is(':visible')).to.equal(false);
       });
-      it("shows loader", function() {
+      it('shows loader', function() {
         var pi = new utils.ProgressIndicator();
         pi.show();
         expect(pi.$loading.is(':visible')).to.equal(true);
       });
-      it("hide loader", function() {
+      it('hide loader', function() {
         var pi = new utils.ProgressIndicator();
         pi.show();
         pi.hide();
         expect(pi.$loading.is(':visible')).to.equal(false);
       });
-      it("test custom zIndex", function() {
+      it('test custom zIndex', function() {
         var pi = new utils.ProgressIndicator({
-          zIndex: function(){ return 999; }
+          zIndex: function() { return 999; }
         });
         pi.show();
         expect(pi.$loading.css('zIndex')).to.equal('999');
       });
-      it("works with backdrop", function() {
+      it('works with backdrop', function() {
         var initCalled = false;
         var showCalled = false;
         var fakeBackdrop = {
-          init: function(){
+          init: function() {
             initCalled = true;
           },
-          show: function(){
+          show: function() {
             showCalled = true;
           }
         };
@@ -206,11 +205,11 @@ define([
         expect(fakeBackdrop.closeOnClick).to.equal(true);
         expect(fakeBackdrop.closeOnEsc).to.equal(true);
       });
-      it("removed overflow css", function() {
+      it('removed overflow css', function() {
         var $parent = $('<div><div /></div>');
         var $el = $parent.children();
         var pi = new utils.ProgressIndicator({
-          zIndex: function(){ return 999; },
+          zIndex: function() { return 999; },
           container: $el
         });
         pi.show();


Repository: mockup
Branch: refs/heads/master
Date: 2014-03-06T15:46:19-08:00
Author: David Glick (davisagli) <david at glicksoftware.com>
Commit: https://github.com/plone/mockup/commit/bb34383e3cbf6cbe6be9c143f792b3c2b6a05fd4

Merge pull request #331 from plone/garbas-adding-jscs-linter

add JavaScript Code Style checker

Files changed:
A .jscs.json
M .jshintrc
M Gruntfile.js
M Makefile
M bower.json
M default.nix
M js/bundles/barceloneta.js
M js/bundles/docs.js
M js/bundles/plone.js
M js/bundles/plone_develop.js
M js/bundles/structure.js
M js/bundles/structure_develop.js
M js/bundles/tiles.js
M js/bundles/toolbar.js
M js/bundles/toolbar_develop.js
M js/bundles/widgets.js
M js/bundles/widgets_develop.js
M js/config.js
M js/grunt.js
M js/iframe.js
M js/iframe_init.js
M js/patterns/accessibility.js
M js/patterns/ace.js
M js/patterns/autotoc.js
M js/patterns/backdrop.js
M js/patterns/cookiedirective.js
M js/patterns/dropzone.js
M js/patterns/expose.js
M js/patterns/filemanager/pattern.js
M js/patterns/filemanager/views/app.js
M js/patterns/formautofocus.js
M js/patterns/formunloadalert.js
M js/patterns/livesearch.js
M js/patterns/modal.js
M js/patterns/moment.js
M js/patterns/pickadate.js
M js/patterns/picture.js
M js/patterns/preventdoublesubmit.js
M js/patterns/querystring.js
M js/patterns/relateditems.js
M js/patterns/select2.js
M js/patterns/sortable.js
M js/patterns/structure/collections/result.js
M js/patterns/structure/collections/selected.js
M js/patterns/structure/models/result.js
M js/patterns/structure/pattern.js
M js/patterns/structure/views/addmenu.js
M js/patterns/structure/views/app.js
M js/patterns/structure/views/columns.js
M js/patterns/structure/views/delete.js
M js/patterns/structure/views/paging.js
M js/patterns/structure/views/properties.js
M js/patterns/structure/views/rearrange.js
M js/patterns/structure/views/rename.js
M js/patterns/structure/views/selectionbutton.js
M js/patterns/structure/views/selectionwell.js
M js/patterns/structure/views/table.js
M js/patterns/structure/views/tablerow.js
M js/patterns/structure/views/tags.js
M js/patterns/structure/views/textfilter.js
M js/patterns/structure/views/workflow.js
M js/patterns/tablesorter.js
M js/patterns/tiles/texttile.js
M js/patterns/tiles/tile.js
M js/patterns/tiles/tiletype.js
M js/patterns/tinymce/links.js
M js/patterns/tinymce/pattern.js
M js/patterns/tinymce/upload.js
M js/patterns/toggle.js
M js/patterns/tooltip.js
M js/patterns/tree.js
M js/router.js
M js/ui/views/base.js
M js/ui/views/button.js
M js/ui/views/buttongroup.js
M js/ui/views/container.js
M js/ui/views/popover.js
M js/ui/views/toolbar.js
M js/utils.js
M package.json
M package.nix
M tests/config.js
M tests/fakeserver.js
M tests/iframe-test.js
M tests/iframe_init-test.js
M tests/pattern-accessibility-test.js
M tests/pattern-autotoc-test.js
M tests/pattern-backdrop-test.js
M tests/pattern-cookiedirective-test.js
M tests/pattern-dropzone-test.js
M tests/pattern-expose-test.js
M tests/pattern-formautofocus-test.js
M tests/pattern-formunloadalert-test.js
M tests/pattern-livesearch-test.js
M tests/pattern-modal-test.js
M tests/pattern-moment-test.js
M tests/pattern-pickadate-test.js
M tests/pattern-picture-test.js
M tests/pattern-preventdoublesubmit-test.js
M tests/pattern-relateditems-test.js
M tests/pattern-select2-test.js
M tests/pattern-sortable-test.js
M tests/pattern-structure-test.js
M tests/pattern-tablesorter-test.js
M tests/pattern-tinymce-test.js
M tests/pattern-toggle-test.js
M tests/pattern-tooltip-test.js
M tests/pattern-tree-test.js
M tests/router-test.js
M tests/utils-test.js
D .jshintignore

diff --git a/.jscs.json b/.jscs.json
new file mode 100644
index 0000000..2da777a
--- /dev/null
+++ b/.jscs.json
@@ -0,0 +1,22 @@
+{
+  "disallowEmptyBlocks": true,
+  "disallowKeywords": ["with"],
+  "disallowLeftStickedOperators": ["?", "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
+  "disallowMixedSpacesAndTabs": true,
+  "disallowMultipleLineStrings": true,
+  "disallowRightStickedOperators": ["?", "/", "*", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="],
+  "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~"],
+  "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+  "disallowTrailingWhitespace": true,
+  "requireCamelCaseOrUpperCaseIdentifiers": true,
+  "requireLeftStickedOperators": [","],
+  "requireLineFeedAtFileEnd": true,
+  "requireRightStickedOperators": ["!"],
+  "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"],
+  "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+  "requireSpacesInFunctionExpression": { "beforeOpeningCurlyBrace": true },
+  "validateIndentation": 2,
+  "validateLineBreaks": "LF",
+  "validateQuoteMarks": "'"
+}
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644
index bace015..0000000
--- a/.jshintignore
+++ /dev/null
@@ -1 +0,0 @@
-tests/karma.conf.js
diff --git a/.jshintrc b/.jshintrc
index 6b50f8c..b45618a 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -16,7 +16,12 @@
    "evil": true,
    "globals": {
       "console": true,
+      "it": true,
+      "describe": true,
+      "afterEach": true,
+      "beforeEach": true,
       "define": false,
+      "requirejs": true,
       "require": false,
       "tinymce": true,
       "document": false,
diff --git a/Gruntfile.js b/Gruntfile.js
index 5b57fc5..e5c2f47 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,4 +1,7 @@
+/* globals module:true */
+
 module.exports = function(grunt) {
+  'use strict';
 
   var MockupGrunt = require('./js/grunt'),
       requirejsOptions = require('./js/config'),
@@ -6,7 +9,7 @@ module.exports = function(grunt) {
       docsExtraIncludes = [];
 
 
-  for (var i = 0; i < mockup.patterns.length; i++) {
+  for (var i = 0; i < mockup.patterns.length; i = i + 1) {
     docsExtraIncludes.push(mockup.patterns[i]);
     docsExtraIncludes.push('text!' + requirejsOptions.paths[mockup.patterns[i]] + '.js');
   }
@@ -44,7 +47,7 @@ module.exports = function(grunt) {
   }, {
     path: 'docs/dev/',
     url: 'docs',
-    extraInclude: docsExtraIncludes, 
+    extraInclude: docsExtraIncludes,
   }, ['requirejs', 'less', 'copy', 'sed']);
 
   mockup.registerBundle('structure', {}, {
@@ -78,7 +81,7 @@ module.exports = function(grunt) {
             'bower_components/html5shiv/dist/html5shiv.js',
             'bower_components/respond/dest/respond.matchmedia.addListener.src.js',
             'bower_components/respond/dest/respond.src.js'
-           ]
+          ]
         }
       }
     },
@@ -105,10 +108,9 @@ module.exports = function(grunt) {
   }, {
     url: '++resource++plonetheme.barceloneta',
     exclude: ['jquery', 'mockup-registry', 'mockup-patterns-base']
-  },
+
   // skip the uglify section; barceloneta has a custom dev loader, since it assumed the presence of the plone bundle
-  ['requirejs', 'less', 'copy', 'sed']
-  );
+  }, ['requirejs', 'less', 'copy', 'sed']);
 
   mockup.registerBundle('widgets');
 
diff --git a/Makefile b/Makefile
index a273517..7153e87 100644
--- a/Makefile
+++ b/Makefile
@@ -50,11 +50,11 @@ bootstrap: clean bootstrap-common
 
 bootstrap-nix: clean bootstrap-common
 	nix-build default.nix -A build -o nixenv
-	ln -s nixenv/lib/node_modules/plone-mockup/node_modules
+	ln -s nixenv/lib/node_modules/mockup/node_modules
 	ln -s nixenv/bower_components
 
 jshint:
-	NODE_PATH=$(NODE_PATH) $(GRUNT) jshint
+	NODE_PATH=$(NODE_PATH) $(GRUNT) jshint jscs
 
 test:
 	NODE_PATH=$(NODE_PATH) $(GRUNT) test --pattern=$(pattern)
diff --git a/bower.json b/bower.json
index ba043d3..8c2a5f7 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "mockup",
-  "version": "1.5.0",
+  "version": "1.6.0",
   "description": "Plone core patterns",
   "dependencies": {
     "ace-builds": "1.1.1",
diff --git a/default.nix b/default.nix
index 58248f7..3604745 100644
--- a/default.nix
+++ b/default.nix
@@ -1,4 +1,4 @@
-{ plone-mockup ? { outPath = ./.; name = "plone-mockup"; }
+{ mockup ? { outPath = ./.; name = "mockup"; }
 }:
 let
   pkgs = import <nixpkgs> {};
@@ -11,11 +11,11 @@ let
     generated = ./package.nix;
   };
 in rec {
-  tarball = pkgs.runCommand "plone-mockup-1.4.0.tgz" { buildInputs = [ pkgs.nodejs ]; } ''
-    mv `HOME=$PWD npm pack ${plone-mockup}` $out
+  tarball = pkgs.runCommand "mockup-1.6.0.tgz" { buildInputs = [ pkgs.nodejs ]; } ''
+    mv `HOME=$PWD npm pack ${mockup}` $out
   '';
   build = nodePackages.buildNodePackage {
-    name = "plone-mockup-1.4.0";
+    name = "mockup-1.6.0";
     src = [ tarball ];
     buildInputs = [ ];
     deps = with nodePackages; [
@@ -29,6 +29,7 @@ in rec {
       grunt-contrib-less
       grunt-contrib-requirejs
       grunt-contrib-uglify
+      grunt-jscs-checker
       grunt-karma
       grunt-sed
       karma
@@ -52,6 +53,6 @@ in rec {
     '';
 
     peerDependencies = [];
-    passthru.names = [ "plone-mockup" ];
+    passthru.names = [ "mockup" ];
   };
 }
diff --git a/js/bundles/barceloneta.js b/js/bundles/barceloneta.js
index 989ee87..a45c5ba 100644
--- a/js/bundles/barceloneta.js
+++ b/js/bundles/barceloneta.js
@@ -26,11 +26,11 @@ define([
   'mockup-registry',
   'mockup-patterns-base'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var PloneBarceloneta = Base.extend({
-    name: "plone-barceloneta",
+    name: 'plone-barceloneta',
     init: function() {
       var self = this;
 
diff --git a/js/bundles/docs.js b/js/bundles/docs.js
index fe70498..eeea946 100644
--- a/js/bundles/docs.js
+++ b/js/bundles/docs.js
@@ -6,7 +6,9 @@ require([
   'bootstrap-collapse',
   'mockup-fakeserver'
 ], function(Docs, GETTING_STARTED, TUTORIAL, CONTRIBUTE) {
-  new Docs({
+  'use strict';
+
+  var docs = new Docs({
     pages: [
       { id: 'index',
         title: 'Mockup',
@@ -172,5 +174,6 @@ require([
     ]
   });
 
+  return docs;
 });
 
diff --git a/js/bundles/plone.js b/js/bundles/plone.js
index 007c100..835d51a 100644
--- a/js/bundles/plone.js
+++ b/js/bundles/plone.js
@@ -44,11 +44,11 @@ define([
   'bootstrap-collapse',
   'bootstrap-tooltip'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var Plone = Base.extend({
-    name: "plone",
+    name: 'plone',
     init: function() {
       var self = this;
 
diff --git a/js/bundles/plone_develop.js b/js/bundles/plone_develop.js
index 023d839..2ab680d 100644
--- a/js/bundles/plone_develop.js
+++ b/js/bundles/plone_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,15 +9,15 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-plone', 'mockup-bundles-barceloneta']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/plone.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
diff --git a/js/bundles/structure.js b/js/bundles/structure.js
index 46de768..fc44ab0 100644
--- a/js/bundles/structure.js
+++ b/js/bundles/structure.js
@@ -22,8 +22,8 @@
 
 
 if (window.jQuery) {
-  define( "jquery", [], function () {
-    "use strict";
+  define( 'jquery', [], function () {
+    'use strict';
     return window.jQuery;
   } );
 }
@@ -35,13 +35,13 @@ define([
   'mockup-patterns-modal',
   'mockup-patterns-structure'
 ], function($, registry, Base, Modal, Structure) {
-  "use strict";
+  'use strict';
 
-  $(document).ready(function(){
+  $(document).ready(function() {
     var $structure = $('.pat-structure');
-    if($structure.length === 1){
+    if ($structure.length === 1) {
       var $container = $structure.parents('#content');
-      if($container.length === 0){
+      if ($container.length === 0) {
         // uh oh, no content id, let's go up a few levels and use that as parent
         $container = $structure.parent().parent();
       }
@@ -56,12 +56,12 @@ define([
       });
       var modal = $modal.data('pattern-modal');
       modal.show();
-      modal.$modal.find('a.close').on('destroy.modal.patterns', function(){
+      modal.$modal.find('a.close').on('destroy.modal.patterns', function() {
         var $base = $('base');
         var url;
-        if($base.length === 0){
+        if ($base.length === 0) {
           url = window.location.href.replace('@@folder_contents', '').replace('folder_contents', '');
-        }else{
+        } else {
           url = $base.attr('href');
         }
         window.location = url;
diff --git a/js/bundles/structure_develop.js b/js/bundles/structure_develop.js
index 9d9254c..c8ded52 100644
--- a/js/bundles/structure_develop.js
+++ b/js/bundles/structure_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,15 +9,15 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-structure']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/structure.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
diff --git a/js/bundles/tiles.js b/js/bundles/tiles.js
index 4a7be49..03e8b9e 100644
--- a/js/bundles/tiles.js
+++ b/js/bundles/tiles.js
@@ -3,7 +3,7 @@ define([
   './../registry.js',
   './../patterns/tiles/tile.js'
 ], function($, registry) {
-  "use strict";
+  'use strict';
 
 
 
diff --git a/js/bundles/toolbar.js b/js/bundles/toolbar.js
index 15284d0..b5cc8c2 100644
--- a/js/bundles/toolbar.js
+++ b/js/bundles/toolbar.js
@@ -45,11 +45,11 @@ define([
 ], function($, Router, iframe, registry, Base, Toggle, Modal, TinyMCE,
             Structure, AutoTOC, Accessibility, FormUnloadAlert, LiveSearch,
             PloneWidgets) {
-  "use strict";
+  'use strict';
 
   // BBB: we need to hook pattern to classes which plone was using until now
   var Toolbar = Base.extend({
-    name: "plone-toolbar",
+    name: 'plone-toolbar',
     init: function() {
       var self = this;
 
@@ -82,16 +82,16 @@ define([
       $match.addClass('pat-formunloadalert');
       // TODO: need to get form_modified_message into body data attributes
       //$match.attr({
-      //  'data-pat-formunloadalert':'message: '+window.form_modified_message
+      //  'data-pat-formunloadalert':'message: ' +window.form_modified_message
       //});
 
-      // Use toggle to replace the toggleSelect from the select_all.js {{{
+      // Use toggle to replace the toggleSelect from the selectAll.js {{{
       // First, remove the previous onclick
-      $("[onclick^='toggleSelect']", self.$el).attr('onclick', null);
+      $('[onclick^="toggleSelect"]', self.$el).attr('onclick', null);
 
       // Assign the class and data attributes for the "select all of the content_status_history template
-      var select_all = $('form[action$=content_status_history] table.listing > thead tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      var selectAll = $('form[action$=content_status_history] table.listing > thead tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'table.listing input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -100,8 +100,8 @@ define([
       });
 
       // Assign the class and data attributes for the "select all of the usergroup-groupmembership view
-      select_all = $('form[action*=usergroup-groupmembership] table.listing tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('form[action*=usergroup-groupmembership] table.listing tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'table.listing input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -110,8 +110,8 @@ define([
       });
 
       // Assign the class and data attributes for the "select all of the usergroup-usermembership view
-      select_all = $('form[action*=usergroup-usermembership] table.listing tr th input[type=checkbox]', self.$el);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('form[action*=usergroup-usermembership] table.listing tr th input[type=checkbox]', self.$el);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'form[action*=usergroup-usermembership] table.listing:last input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -120,8 +120,8 @@ define([
       });
 
       // plone/app/search/search.pt
-      select_all = $("[onchange*='toggleSelect']", self.$el).attr('onchange', null);
-      select_all.addClass('pat-toggle').patternToggle({
+      selectAll = $('[onchange*="toggleSelect"]', self.$el).attr('onchange', null);
+      selectAll.addClass('pat-toggle').patternToggle({
         target: 'form[name=searchform] dd.actionMenuContent input[type=checkbox]',
         attribute: 'checked',
         value: 'checked',
@@ -136,14 +136,14 @@ define([
         .not('[action$="@@new-user"]')
         .not('[action$="@@usergroup-groupdetails"]')
         .patternPreventdoublesubmit({
-          message: window.form_resubmit_message
+          message: window['form_resubmit_message'] || '' // jshint ignore:line
         });
 
       // Add the form auto focus for the add or edit forms
-      var add_form = $('form[action*="++add++"]', self.$el);
-      add_form.addClass('pat-formautofocus');
-      var edit_form = $('form[action*="@@edit"]', self.$el);
-      edit_form.addClass('pat-formautofocus');
+      var addForm = $('form[action*="++add++"]', self.$el);
+      addForm.addClass('pat-formautofocus');
+      var editForm = $('form[action*="@@edit"]', self.$el);
+      editForm.addClass('pat-formautofocus');
 
       /*** Login ***/
       var loginOptions = {
@@ -197,10 +197,10 @@ define([
         .patternModal(defaultPage);
 
       /*** Add user form ***/
-      var users_add = $('form[name="users_add"]', self.$el);
-      if ( users_add.length > 0) {
+      var usersAdd = $('form[name="usersAdd"]', self.$el);
+      if ( usersAdd.length > 0) {
         var addUserOptions = {
-          ajaxUrl: users_add[0].action,
+          ajaxUrl: usersAdd[0].action,
           triggers: ['click input[name="form.button.AddUser"]'],
           buttons: 'input[name="form.actions.register"]',
           content: '#content',
@@ -212,10 +212,10 @@ define([
       }
 
       /*** Add group form ***/
-      var groups_add = $('form[name="groups_add"]', self.$el);
-      if ( groups_add.length > 0) {
+      var groupsAdd = $('form[name="groupsAdd"]', self.$el);
+      if ( groupsAdd.length > 0) {
         var addGroupOptions = {
-          ajaxUrl: groups_add[0].action,
+          ajaxUrl: groupsAdd[0].action,
           triggers: ['click input[name="form.button.AddGroup"]'],
           buttons: 'input[name="form.button.Save"]',
           content: '#content',
@@ -234,41 +234,41 @@ define([
         actionOptions: {
           displayInModal: false
         }
-      }).on('shown.modal.patterns', function(modal){
+      }).on('shown.modal.patterns', function(modal) {
         var $modal = modal.$modal;
-        var prefered = $(".current_prefer_form", $modal),
-            allowed = $(".current_allow_form", $modal),
-            constrain_mode = $(".constrain_types_mode_form", $modal),
-            prefered_field = prefered.parents('.field'),
-            allowed_field = allowed.parents('.field'),
+        var prefered = $('.current_prefer_form', $modal),
+            allowed = $('.current_allow_form', $modal),
+            constrainMode = $('.constrain_types_mode_form', $modal),
+            preferedField = prefered.parents('.field'),
+            allowedField = allowed.parents('.field'),
             ACQUIRE = -1,
             DISABLED = 0,
             ENABLED = 1;
-        function updateVisibility(){
-          var mode = parseInt(constrain_mode.val(), 10);
-          if(mode === ENABLED){
-            prefered_field.show();
-            allowed_field.show();
-          }else{
-            prefered_field.hide();
-            allowed_field.hide();
+        function updateVisibility() {
+          var mode = parseInt(constrainMode.val(), 10);
+          if (mode === ENABLED) {
+            preferedField.show();
+            allowedField.show();
+          } else {
+            preferedField.hide();
+            allowedField.hide();
           }
         }
-        function updateSelectable(){
-          prefered.each(function(){
-            var allowed_id = this.id.replace('prefer', 'allow'),
-                allowed_item = allowed_field.find("#" + allowed_id);
-            if (this.checked){
-              allowed_item[0].disabled = false;
-            }else{
-              allowed_item[0].disabled = true;
-              allowed_item[0].checked = false;
+        function updateSelectable() {
+          prefered.each(function() {
+            var allowedId = this.id.replace('prefer', 'allow'),
+                allowedItem = allowedField.find('#' + allowedId);
+            if (this.checked) {
+              allowedItem[0].disabled = false;
+            } else {
+              allowedItem[0].disabled = true;
+              allowedItem[0].checked = false;
             }
           });
         }
-        constrain_mode.change(updateVisibility);
+        constrainMode.change(updateVisibility);
         updateVisibility();
-        prefered_field.change(updateSelectable);
+        preferedField.change(updateSelectable);
         updateSelectable();
       });
 
@@ -305,16 +305,16 @@ define([
         .patternModal(renameOptions);
 
       /*** Delete action ***/
-      var delete_action = $('#plone-contentmenu-actions-delete > a, #plone-contentmenu-actions-delete', self.$el);
-      delete_action
+      var deleteAction = $('#plone-contentmenu-actions-delete > a, #plone-contentmenu-actions-delete', self.$el);
+      deleteAction
         .addClass('pat-modal')
         .patternModal({
           actionOptions: {
             onSuccess: function(modal, responseBody, state, xhr, form) {
-              modal.$el.on('afterDraw.modal.patterns', function(e){
+              modal.$el.on('afterDraw.modal.patterns', function(e) {
                 // cleanup modal here, we only want to show the status
                 var $info = $('.portalMessage.info', modal.$modal);
-                if($info.length > 0){
+                if ($info.length > 0) {
                   var $modalBody = $('.modal-body', modal.$modal);
                   $modalBody.empty();
                   $modalBody.append($info);
@@ -343,7 +343,7 @@ define([
 
       // make sure clicking on anything in the menu closes the toggled element
       $('.toolbar-dropdown .toolbar-dropdown-menu a', self.$el).click(function(e) {
-          $(this).parents('.toolbar-dropdown').children('a').trigger('click');
+        $(this).parents('.toolbar-dropdown').children('a').trigger('click');
       });
 
       // at opening toolbar dropdown:
@@ -411,7 +411,7 @@ define([
         width: '96%',
         position: 'middle top',
         actionOptions: {
-          onSuccess: function(modal, response, state, xhr, form){
+          onSuccess: function(modal, response, state, xhr, form) {
           }
         }
       });
@@ -424,14 +424,14 @@ define([
           displayInModal: false
         }
       }).on('show.modal.patterns', function(evt, modal) {
-        $('a[href]', modal.$modal).each(function(){
+        $('a[href]', modal.$modal).each(function() {
           var href = this.href;
           var parts = href.split('/');
-          parts.splice(parts.length-1, 0, '++nodiazo++');
+          parts.splice(parts.length - 1, 0, ' ++nodiazo++');
           href = parts.join('/');
 
           $(this).attr('href', href);
-          $(this).click(function(){
+          $(this).click(function() {
             window.open(href);
           });
         });
@@ -456,38 +456,37 @@ define([
         // Kill the onchange method so we can wire up our own
         $('.section select', modal.$raw).removeAttr('onchange');
         modal.options.actions = {
-            // Handle adding portlets via the select
-            '.section select': {
-              eventType: 'change',
-              onSuccess: function(modal, response, state, xhr, form) {
-                  if (modal.$modal.find('.pattern-modal-buttons input').length === 0) {
-                      // The portlet didn't have an edit form (e.g. calendar)
-                      modal.reloadWindow();
-                  }
-              },
-              ajaxUrl: function($action, options) {
-                var portlet = $action.val();
-                var form_action = $action.parents('form').attr('action');
-                return form_action + portlet;
-              }
-            },
-            '.actionButtons input': {
-              // Handle errors on portlet submission
-              error: '.fieldErrorBox',
-              onSuccess: function(modal, response, state, xhr, form) {
+          // Handle adding portlets via the select
+          '.section select': {
+            eventType: 'change',
+            onSuccess: function(modal, response, state, xhr, form) {
+              if (modal.$modal.find('.pattern-modal-buttons input').length === 0) {
+                // The portlet didn't have an edit form (e.g. calendar)
                 modal.reloadWindow();
               }
             },
-            // Handle moving and hiding portlets
-            '.portlet-action': {
-              isForm: true
+            ajaxUrl: function($action, options) {
+              var portlet = $action.val();
+              var formAction = $action.parents('form').attr('action');
+              return formAction + portlet;
             }
-          };
+          },
+          '.actionButtons input': {
+            // Handle errors on portlet submission
+            error: '.fieldErrorBox',
+            onSuccess: function(modal, response, state, xhr, form) {
+              modal.reloadWindow();
+            }
+          },
+          // Handle moving and hiding portlets
+          '.portlet-action': {
+            isForm: true
+          }
+        };
       })
       .on('hidden.modal.patterns', function(e) {
-          $(this).data('pattern-modal').reloadWindow();
-        }
-      );
+        $(this).data('pattern-modal').reloadWindow();
+      });
 
       // Edit/Add
       $('#plone-contentmenu-factories ul li', self.$el).addClass('is-content');
@@ -498,7 +497,7 @@ define([
         backdropOptions: {
           closeOnClick: false
         },
-        position: "center top",
+        position: 'center top',
         content: '#content',
         automaticallyAddButtonActions: false,
         actionOptions: {
@@ -547,7 +546,7 @@ define([
           $(this).data('pattern-modal').options.actions = {
             'table.listing a': {
               ajaxUrl: function($action, options) {
-                return $action.attr('href').replace(/@@/g, "++nodiazo++/@@");
+                return $action.attr('href').replace(/@@/g, '++nodiazo++/@@');
               },
               displayInModal: false
             },
@@ -582,20 +581,20 @@ define([
         }
       });
 
-      self.$el.find('.mce_editable').addClass('pat-tinymce').each(function(){
+      self.$el.find('.mce_editable').addClass('pat-tinymce').each(function() {
         var $tiny = $(this);
         var config = $.parseJSON($tiny.attr('data-mce-config'));
-        config.content_css = config.portal_url + '/base.css';
+        config['content_css'] = config['portal_url'] + '/base.css'; // jshint ignore:line
         delete config.customplugins;
         delete config.plugins;
         delete config.theme;
         $tiny.attr({
           'data-pat-tinymce': JSON.stringify({
             relatedItems: {
-              vocabularyUrl: config.portal_url + '/@@getVocabulary?name=plone.app.vocabularies.Catalog'
+              vocabularyUrl: config['portal_url'] + '/@@getVocabulary?name=plone.app.vocabularies.Catalog' // jshint ignore:line
             },
-            rel_upload_path: '@@fileUpload',
-            folder_url: config.document_base_url,
+            'rel_upload_path': '@@fileUpload', // jshint ignore:line
+            'folder_url': config['document_base_url'], // jshint ignore:line
             tiny: config,
             prependToUrl: 'resolveuid/',
             linkAttribute: 'UID',
@@ -606,8 +605,8 @@ define([
 
 
       // XXX important, run pattern mods against overlays
-      $('body').on('rendered.modal.patterns', function(){
-        (new Toolbar($(this))); // just run init again...
+      $('body').on('rendered.modal.patterns', function() {
+        var toolbar = new Toolbar($(this)); // just run init again...
       });
 
     }
@@ -617,34 +616,34 @@ define([
 
   /* maybe hackish fix here, but.....  let's get these in and out widgets working in overlays
    * TODO: Override all in and out widgets in python to use select2 */
-  var updateValues = function(id, $to){
+  var updateValues = function(id, $to) {
     var $container = $('#' + id + '-toDataContainer');
     $container.empty();
     var name = id.replace('-', '.').replace('-', '.') + ':list';
-    $to.find('option').each(function(){
+    $to.find('option').each(function() {
       $container.append('<input name="' + name + '" type="hidden" value="' + $(this).val() + '" />');
     });
   };
 
-  window.from2to = function(id){
+  window.from2to = function(id) {
     var $el = $('#' + id);
     var $selects = $el.find('select');
     var $from = $selects.eq(0);
     var $to = $selects.eq(1);
-    $from.find('option').each(function(){
-      if(this.selected){
+    $from.find('option').each(function() {
+      if (this.selected) {
         $to.append($(this));
       }
     });
     updateValues(id, $to);
   };
-  window.to2from = function(id){
+  window.to2from = function(id) {
     var $el = $('#' + id);
     var $selects = $el.find('select');
     var $from = $selects.eq(0);
     var $to = $selects.eq(1);
-    $to.find('option').each(function(){
-      if(this.selected){
+    $to.find('option').each(function() {
+      if (this.selected) {
         $from.append($(this));
       }
     });
diff --git a/js/bundles/toolbar_develop.js b/js/bundles/toolbar_develop.js
index 1188ea6..e9bae5b 100644
--- a/js/bundles/toolbar_develop.js
+++ b/js/bundles/toolbar_develop.js
@@ -1,5 +1,7 @@
-(function($) {
-  "use strict";
+/* globals less:true, domready:true */
+
+(function() {
+  'use strict';
 
   domready(function() {
 
@@ -7,18 +9,18 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
       require(['mockup-bundles-toolbar']);
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/toolbar.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     less.refresh();
 
   });
 
-}(jQuery));
+}());
diff --git a/js/bundles/widgets.js b/js/bundles/widgets.js
index 9b46820..35a18ba 100644
--- a/js/bundles/widgets.js
+++ b/js/bundles/widgets.js
@@ -32,10 +32,10 @@ define([
   'mockup-patterns-querystring',
   'mockup-patterns-tinymce'
 ], function($, Registry, Base) {
-  "use strict";
+  'use strict';
 
   var PloneWidgets = Base.extend({
-    name: "plone-widgets",
+    name: 'plone-widgets',
     init: function() {
       var self = this;
     }
diff --git a/js/bundles/widgets_develop.js b/js/bundles/widgets_develop.js
index 0ccb272..662c149 100644
--- a/js/bundles/widgets_develop.js
+++ b/js/bundles/widgets_develop.js
@@ -1,5 +1,7 @@
+/* globals less:true, domready:true */
+
 (function() {
-  "use strict";
+  'use strict';
 
   domready(function() {
 
@@ -7,25 +9,25 @@
     script1.setAttribute('type', 'text/javascript');
     script1.setAttribute('src', '/++resource++mockup/js/config.js');
     script1.onload = function() {
-      requirejs.config({ baseUrl: '++resource++mockup/' });
-      if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0){
+      requirejs.config({ baseUrl: ' ++resource++mockup/' });
+      if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0) {
         require(['mockup-bundles-widgets']);
       } else {
         require(['mockup-bundles-widgets', 'mockup-iframe_init']);
       }
     };
-    document.getElementsByTagName("head")[0].appendChild(script1);
+    document.getElementsByTagName('head')[0].appendChild(script1);
 
     var style1 = document.createElement('style');
     style1.setAttribute('type', 'text/less');
     style1.innerHTML = '@import (less) "/++resource++mockup/less/widgets.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-    document.getElementsByTagName("head")[0].appendChild(style1);
+    document.getElementsByTagName('head')[0].appendChild(style1);
 
     if (document.querySelectorAll('[data-iframe="plone-toolbar"]').length !== 0) {
       var style2 = document.createElement('style');
       style2.setAttribute('type', 'text/less');
       style2.innerHTML = '@import (less) "/++resource++mockup/less/iframe_init.less"; @isBrowser: true; @pathPrefix: \'/++resource++mockup/less/\';';
-      document.getElementsByTagName("head")[0].appendChild(style2);
+      document.getElementsByTagName('head')[0].appendChild(style2);
     }
 
     less.refresh();
diff --git a/js/config.js b/js/config.js
index dbb3592..956e6fb 100644
--- a/js/config.js
+++ b/js/config.js
@@ -1,121 +1,123 @@
+/* globals module:true */
+
 (function() {
+  'use strict';
 
-var requirejsOptions = {
-  baseUrl: './',
-  optimize: 'uglify',
-  paths: {
-    'JSXTransformer': 'bower_components/react/JSXTransformer',
-    'ace': "bower_components/ace-builds/src/ace",
-    'ace-theme-monokai': "bower_components/ace-builds/src/theme-monokai",
-    'ace-mode-text': "bower_components/ace-builds/src/mode-text",
-    'backbone': 'bower_components/backbone/backbone',
-    'backbone.paginator': 'bower_components/backbone.paginator/lib/backbone.paginator',
-    'bootstrap-alert': 'bower_components/bootstrap/js/alert',
-    'bootstrap-collapse': 'bower_components/bootstrap/js/collapse',
-    'bootstrap-dropdown': 'bower_components/bootstrap/js/dropdown',
-    'bootstrap-tooltip': 'bower_components/bootstrap/js/tooltip',
-    'bootstrap-transition': 'bower_components/bootstrap/js/transition',
-    'docs-getting-started': 'GETTING_STARTED.md',
-    'docs-tutorial': 'TUTORIAL.md',
-    'docs-contribute': 'CONTRIBUTE.md',
-    'domready': 'bower_components/domready/ready',
-    'dropzone': "bower_components/dropzone/downloads/dropzone-amd-module",
-    'expect': 'bower_components/expect/expect',
-    'jqtree': "bower_components/jqtree/tree.jquery",
-    'jquery': 'bower_components/jquery/jquery',
-    'jquery.cookie': 'bower_components/jquery.cookie/jquery.cookie',
-    'jquery.event.drag': 'lib/jquery.event.drag',
-    'jquery.event.drop': 'lib/jquery.event.drop',
-    'jquery.form': 'bower_components/jquery-form/jquery.form',
-    'marked': 'bower_components/marked/lib/marked',
-    'mockup-bundles-barceloneta': 'js/bundles/barceloneta',
-    'mockup-bundles-docs': 'js/bundles/docs',
-    'mockup-bundles-plone': 'js/bundles/plone',
-    'mockup-bundles-structure': 'js/bundles/structure',
-    'mockup-bundles-tiles': 'js/bundles/widgets',
-    'mockup-bundles-toolbar': 'js/bundles/toolbar',
-    'mockup-bundles-widgets': 'js/bundles/widgets',
-    'mockup-docs': 'bower_components/mockup-core/js/docs/app',
-    'mockup-docs-navigation': 'bower_components/mockup-core/js/docs/navigation',
-    'mockup-docs-page': 'bower_components/mockup-core/js/docs/page',
-    'mockup-docs-pattern': 'bower_components/mockup-core/js/docs/pattern',
-    'mockup-docs-view': 'bower_components/mockup-core/js/docs/view',
-    'mockup-fakeserver': 'tests/fakeserver',
-    'mockup-iframe': 'js/iframe',
-    'mockup-iframe_init': 'js/iframe_init',
-    'mockup-patterns-accessibility': 'js/patterns/accessibility',
-    'mockup-patterns-ace': 'js/patterns/ace',
-    'mockup-patterns-autotoc': 'js/patterns/autotoc',
-    'mockup-patterns-backdrop': 'js/patterns/backdrop',
-    'mockup-patterns-base': 'bower_components/mockup-core/js/pattern',
-    'mockup-patterns-cookiedirective': 'js/patterns/cookiedirective',
-    'mockup-patterns-sortable': 'js/patterns/sortable',
-    'mockup-patterns-dropzone': 'js/patterns/dropzone',
-    'mockup-patterns-expose': 'js/patterns/expose',
-    'mockup-patterns-filemanager': 'js/patterns/filemanager/pattern',
-    'mockup-patterns-formautofocus': 'js/patterns/formautofocus',
-    'mockup-patterns-formunloadalert': 'js/patterns/formunloadalert',
-    'mockup-patterns-livesearch': 'js/patterns/livesearch',
-    'mockup-patterns-modal': 'js/patterns/modal',
-    'mockup-patterns-moment': 'js/patterns/moment',
-    'mockup-patterns-pickadate': 'js/patterns/pickadate',
-    'mockup-patterns-picture': 'js/patterns/picture',
-    'mockup-patterns-preventdoublesubmit': 'js/patterns/preventdoublesubmit',
-    'mockup-patterns-querystring': 'js/patterns/querystring',
-    'mockup-patterns-relateditems': 'js/patterns/relateditems',
-    'mockup-patterns-select2': 'js/patterns/select2',
-    'mockup-patterns-structure': 'js/patterns/structure/pattern',
-    'mockup-patterns-tablesorter': 'js/patterns/tablesorter',
-    'mockup-patterns-tinymce': 'js/patterns/tinymce/pattern',
-    'mockup-patterns-toggle': 'js/patterns/toggle',
-    'mockup-patterns-tooltip': 'js/patterns/tooltip',
-    'mockup-patterns-tree': 'js/patterns/tree',
-    'mockup-registry': 'bower_components/mockup-core/js/registry',
-    'mockup-router': 'js/router',
-    'mockup-utils': 'js/utils',
-    'moment': 'bower_components/moment/moment',
-    'picker': 'bower_components/pickadate/lib/picker',
-    'picker.date': 'bower_components/pickadate/lib/picker.date',
-    'picker.time': 'bower_components/pickadate/lib/picker.time',
-    'react': 'bower_components/react/react',
-    'select2': 'bower_components/select2/select2',
-    'sinon': 'bower_components/sinonjs/sinon',
-    'text': 'bower_components/requirejs-text/text',
-    'tinymce': 'lib/tinymce/tinymce.min',
-    'underscore': 'bower_components/lodash/dist/lodash.underscore'
-  },
-  shim: {
-    'JSXTransformer': { exports: 'window.JSXTransformer' },
-    'backbone': { exports: 'window.Backbone', deps: ['underscore', 'jquery'] },
-    'backbone.paginator': { exports: 'window.Backbone.Paginator', deps: ['backbone'] },
-    'bootstrap-alert': { deps: ['jquery'] },
-    'bootstrap-collapse': {exports: 'window.jQuery.fn.collapse.Constructor', deps: ['jquery']},
-    'bootstrap-dropdown': { deps: ['jquery'] },
-    'bootstrap-tooltip': { deps: ['jquery'] },
-    'bootstrap-transition': {exports: 'window.jQuery.support.transition', deps: ['jquery']},
-    'expect': {exports: 'window.expect'},
-    'jqtree': { deps: ['jquery'] },
-    'jquery.cookie': { deps: ['jquery'] },
-    'jquery.event.drag': { deps: ['jquery'] },
-    'jquery.event.drop': {
-      deps: ['jquery'],
-      exports: '$.drop'
+  var requirejsOptions = {
+    baseUrl: './',
+    optimize: 'uglify',
+    paths: {
+      'JSXTransformer': 'bower_components/react/JSXTransformer',
+      'ace': 'bower_components/ace-builds/src/ace',
+      'ace-theme-monokai': 'bower_components/ace-builds/src/theme-monokai',
+      'ace-mode-text': 'bower_components/ace-builds/src/mode-text',
+      'backbone': 'bower_components/backbone/backbone',
+      'backbone.paginator': 'bower_components/backbone.paginator/lib/backbone.paginator',
+      'bootstrap-alert': 'bower_components/bootstrap/js/alert',
+      'bootstrap-collapse': 'bower_components/bootstrap/js/collapse',
+      'bootstrap-dropdown': 'bower_components/bootstrap/js/dropdown',
+      'bootstrap-tooltip': 'bower_components/bootstrap/js/tooltip',
+      'bootstrap-transition': 'bower_components/bootstrap/js/transition',
+      'docs-getting-started': 'GETTING_STARTED.md',
+      'docs-tutorial': 'TUTORIAL.md',
+      'docs-contribute': 'CONTRIBUTE.md',
+      'domready': 'bower_components/domready/ready',
+      'dropzone': 'bower_components/dropzone/downloads/dropzone-amd-module',
+      'expect': 'bower_components/expect/expect',
+      'jqtree': 'bower_components/jqtree/tree.jquery',
+      'jquery': 'bower_components/jquery/jquery',
+      'jquery.cookie': 'bower_components/jquery.cookie/jquery.cookie',
+      'jquery.event.drag': 'lib/jquery.event.drag',
+      'jquery.event.drop': 'lib/jquery.event.drop',
+      'jquery.form': 'bower_components/jquery-form/jquery.form',
+      'marked': 'bower_components/marked/lib/marked',
+      'mockup-bundles-barceloneta': 'js/bundles/barceloneta',
+      'mockup-bundles-docs': 'js/bundles/docs',
+      'mockup-bundles-plone': 'js/bundles/plone',
+      'mockup-bundles-structure': 'js/bundles/structure',
+      'mockup-bundles-tiles': 'js/bundles/widgets',
+      'mockup-bundles-toolbar': 'js/bundles/toolbar',
+      'mockup-bundles-widgets': 'js/bundles/widgets',
+      'mockup-docs': 'bower_components/mockup-core/js/docs/app',
+      'mockup-docs-navigation': 'bower_components/mockup-core/js/docs/navigation',
+      'mockup-docs-page': 'bower_components/mockup-core/js/docs/page',
+      'mockup-docs-pattern': 'bower_components/mockup-core/js/docs/pattern',
+      'mockup-docs-view': 'bower_components/mockup-core/js/docs/view',
+      'mockup-fakeserver': 'tests/fakeserver',
+      'mockup-iframe': 'js/iframe',
+      'mockup-iframe_init': 'js/iframe_init',
+      'mockup-patterns-accessibility': 'js/patterns/accessibility',
+      'mockup-patterns-ace': 'js/patterns/ace',
+      'mockup-patterns-autotoc': 'js/patterns/autotoc',
+      'mockup-patterns-backdrop': 'js/patterns/backdrop',
+      'mockup-patterns-base': 'bower_components/mockup-core/js/pattern',
+      'mockup-patterns-cookiedirective': 'js/patterns/cookiedirective',
+      'mockup-patterns-sortable': 'js/patterns/sortable',
+      'mockup-patterns-dropzone': 'js/patterns/dropzone',
+      'mockup-patterns-expose': 'js/patterns/expose',
+      'mockup-patterns-filemanager': 'js/patterns/filemanager/pattern',
+      'mockup-patterns-formautofocus': 'js/patterns/formautofocus',
+      'mockup-patterns-formunloadalert': 'js/patterns/formunloadalert',
+      'mockup-patterns-livesearch': 'js/patterns/livesearch',
+      'mockup-patterns-modal': 'js/patterns/modal',
+      'mockup-patterns-moment': 'js/patterns/moment',
+      'mockup-patterns-pickadate': 'js/patterns/pickadate',
+      'mockup-patterns-picture': 'js/patterns/picture',
+      'mockup-patterns-preventdoublesubmit': 'js/patterns/preventdoublesubmit',
+      'mockup-patterns-querystring': 'js/patterns/querystring',
+      'mockup-patterns-relateditems': 'js/patterns/relateditems',
+      'mockup-patterns-select2': 'js/patterns/select2',
+      'mockup-patterns-structure': 'js/patterns/structure/pattern',
+      'mockup-patterns-tablesorter': 'js/patterns/tablesorter',
+      'mockup-patterns-tinymce': 'js/patterns/tinymce/pattern',
+      'mockup-patterns-toggle': 'js/patterns/toggle',
+      'mockup-patterns-tooltip': 'js/patterns/tooltip',
+      'mockup-patterns-tree': 'js/patterns/tree',
+      'mockup-registry': 'bower_components/mockup-core/js/registry',
+      'mockup-router': 'js/router',
+      'mockup-utils': 'js/utils',
+      'moment': 'bower_components/moment/moment',
+      'picker': 'bower_components/pickadate/lib/picker',
+      'picker.date': 'bower_components/pickadate/lib/picker.date',
+      'picker.time': 'bower_components/pickadate/lib/picker.time',
+      'react': 'bower_components/react/react',
+      'select2': 'bower_components/select2/select2',
+      'sinon': 'bower_components/sinonjs/sinon',
+      'text': 'bower_components/requirejs-text/text',
+      'tinymce': 'lib/tinymce/tinymce.min',
+      'underscore': 'bower_components/lodash/dist/lodash.underscore'
     },
-    'mockup-iframe_init': { deps: ['domready'] },
-    'picker.date': { deps: [ 'picker' ] },
-    'picker.time': { deps: [ 'picker' ] },
-    'sinon': {exports: 'window.sinon'},
-    'tinymce': { exports: 'window.tinyMCE', init: function () { this.tinyMCE.DOM.events.domLoaded = true; return this.tinyMCE; },
-    'underscore': { exports: 'window._' }
+    shim: {
+      'JSXTransformer': { exports: 'window.JSXTransformer' },
+      'backbone': { exports: 'window.Backbone', deps: ['underscore', 'jquery'] },
+      'backbone.paginator': { exports: 'window.Backbone.Paginator', deps: ['backbone'] },
+      'bootstrap-alert': { deps: ['jquery'] },
+      'bootstrap-collapse': {exports: 'window.jQuery.fn.collapse.Constructor', deps: ['jquery']},
+      'bootstrap-dropdown': { deps: ['jquery'] },
+      'bootstrap-tooltip': { deps: ['jquery'] },
+      'bootstrap-transition': {exports: 'window.jQuery.support.transition', deps: ['jquery']},
+      'expect': {exports: 'window.expect'},
+      'jqtree': { deps: ['jquery'] },
+      'jquery.cookie': { deps: ['jquery'] },
+      'jquery.event.drag': { deps: ['jquery'] },
+      'jquery.event.drop': {
+        deps: ['jquery'],
+        exports: '$.drop'
+      },
+      'mockup-iframe_init': { deps: ['domready'] },
+      'picker.date': { deps: [ 'picker' ] },
+      'picker.time': { deps: [ 'picker' ] },
+      'sinon': {exports: 'window.sinon'},
+      'tinymce': { exports: 'window.tinyMCE', init: function () { this.tinyMCE.DOM.events.domLoaded = true; return this.tinyMCE; }},
+      'underscore': { exports: 'window._' }
     }
-  }
-};
+  };
 
-if (typeof exports !== "undefined" && typeof module !== "undefined") {
-  module.exports = requirejsOptions;
-}
-if (typeof requirejs !== "undefined" && requirejs.config) {
-  requirejs.config(requirejsOptions);
-}
+  if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
+    module.exports = requirejsOptions;
+  }
+  if (typeof requirejs !== 'undefined' && requirejs.config) {
+    requirejs.config(requirejsOptions);
+  }
 
 }());
diff --git a/js/grunt.js b/js/grunt.js
index f5df5d2..f4495fb 100644
--- a/js/grunt.js
+++ b/js/grunt.js
@@ -1,351 +1,370 @@
-var extend = require('extend'),
-    karmaConfig = require('../node_modules/karma/lib/config'),
-    MockupGrunt = function (requirejsOptions) { this.init(requirejsOptions); };
+/* globals module:true */
 
-MockupGrunt.prototype = {
+(function() {
+  'use strict';
 
-  sections: {
-    requirejs: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.requirejs = this.gruntConfig.requirejs || {};
-        this.gruntConfig.requirejs[name] = this.gruntConfig.requirejs[name] || {};
-        this.gruntConfig.requirejs[name].options = this.gruntConfig.requirejs[name].options || {};
-        this.gruntConfig.requirejs[name].options = {
-          name: 'node_modules/requirejs/require.js',
-          include: ['mockup-bundles-' + name].concat(bundleOptions.extraInclude || []),
-          exclude: bundleOptions.exclude || [],
-          insertRequire: ['mockup-bundles-' + name],
-          out: bundleOptions.path + name + '.min.js'
-        };
-      }
-    },
-    uglify: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.uglify = this.gruntConfig.uglify || {};
-        this.gruntConfig.uglify[name] = this.gruntConfig.uglify[name] || {};
-        this.gruntConfig.uglify[name].files = this.gruntConfig.uglify[name].files || {};
-        this.gruntConfig.uglify[name].files[bundleOptions.path + name + '.js'] = [
-          'node_modules/grunt-contrib-less/node_modules/less/dist/less-1.6.1.js',
-          'bower_components/domready/ready.js',
-          'node_modules/requirejs/require.js',
-          'bower_components/jquery/jquery.js',
-          'js/bundles/' + name + '_develop.js'
-        ];
-      }
-    },
-    less: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.less = this.gruntConfig.less || {};
-        this.gruntConfig.less[name] = this.gruntConfig.less[name] || {};
-        this.gruntConfig.less[name].files = this.gruntConfig.less[name].files || {};
-        this.gruntConfig.less[name].files[bundleOptions.path+ name + '.min.css'] = 'less/' + name + '.less';
-      }
-    },
-    copy: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.copy = this.gruntConfig.copy || {};
-        this.gruntConfig.copy[name] = this.gruntConfig.copy[name] || {};
-        this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files || [];
-        this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files.concat([
-          { expand: true, cwd: 'bower_components/bootstrap/dist/fonts/', src: 'glyphicons-halflings-regular.*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-bootstrap-' + src; }},
-          { expand: true, cwd: 'lib/tinymce/skins/lightgray/fonts/', src: 'icomoon.*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-tinymce-' + src; }},
-          { expand: true, cwd: 'lib/tinymce/skins/lightgray/img/', src: 'loader.gif', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-tinymce-' + src; }},
-          { expand: true, cwd: 'bower_components/jqtree/', src: 'jqtree-circle.png', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-jqtree-' + src; }},
-          { expand: true, cwd: 'bower_components/select2/', src: 'select2*.png', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-select2-' + src; }},
-          { expand: true, cwd: 'bower_components/select2/', src: 'select2*.gif', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-select2-' + src; }},
-          { expand: true, cwd: 'bower_components/dropzone/downloads/images/', src: 'spritemap*', dest: bundleOptions.path,
-            rename: function(dest, src) { return dest + name + '-dropzone-' + src; }}
-        ]);
+  var extend = require('extend'),
+      karmaConfig = require('../node_modules/karma/lib/config'),
+      MockupGrunt = function (requirejsOptions) { this.init(requirejsOptions); };
+
+  MockupGrunt.prototype = {
+
+    sections: {
+      requirejs: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.requirejs = this.gruntConfig.requirejs || {};
+          this.gruntConfig.requirejs[name] = this.gruntConfig.requirejs[name] || {};
+          this.gruntConfig.requirejs[name].options = this.gruntConfig.requirejs[name].options || {};
+          this.gruntConfig.requirejs[name].options = {
+            name: 'node_modules/requirejs/require.js',
+            include: ['mockup-bundles-' + name].concat(bundleOptions.extraInclude || []),
+            exclude: bundleOptions.exclude || [],
+            insertRequire: ['mockup-bundles-' + name],
+            out: bundleOptions.path + name + '.min.js'
+          };
+        }
+      },
+      uglify: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.uglify = this.gruntConfig.uglify || {};
+          this.gruntConfig.uglify[name] = this.gruntConfig.uglify[name] || {};
+          this.gruntConfig.uglify[name].files = this.gruntConfig.uglify[name].files || {};
+          this.gruntConfig.uglify[name].files[bundleOptions.path + name + '.js'] = [
+            'node_modules/grunt-contrib-less/node_modules/less/dist/less-1.6.1.js',
+            'bower_components/domready/ready.js',
+            'node_modules/requirejs/require.js',
+            'bower_components/jquery/jquery.js',
+            'js/bundles/' + name + '_develop.js'
+          ];
+        }
+      },
+      less: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.less = this.gruntConfig.less || {};
+          this.gruntConfig.less[name] = this.gruntConfig.less[name] || {};
+          this.gruntConfig.less[name].files = this.gruntConfig.less[name].files || {};
+          this.gruntConfig.less[name].files[bundleOptions.path + name + '.min.css'] = 'less/' + name + '.less';
+        }
+      },
+      copy: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.copy = this.gruntConfig.copy || {};
+          this.gruntConfig.copy[name] = this.gruntConfig.copy[name] || {};
+          this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files || [];
+          this.gruntConfig.copy[name].files = this.gruntConfig.copy[name].files.concat([
+            {
+              expand: true, cwd: 'bower_components/bootstrap/dist/fonts/', src: 'glyphicons-halflings-regular.*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-bootstrap-' + src; }
+            }, {
+              expand: true, cwd: 'lib/tinymce/skins/lightgray/fonts/', src: 'icomoon.*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-tinymce-' + src; }
+            }, {
+              expand: true, cwd: 'lib/tinymce/skins/lightgray/img/', src: 'loader.gif', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-tinymce-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/jqtree/', src: 'jqtree-circle.png', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-jqtree-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/select2/', src: 'select2*.png', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-select2-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/select2/', src: 'select2*.gif', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-select2-' + src; }
+            }, {
+              expand: true, cwd: 'bower_components/dropzone/downloads/images/', src: 'spritemap*', dest: bundleOptions.path,
+              rename: function(dest, src) { return dest + name + '-dropzone-' + src; }
+            }
+          ]);
+        }
+      },
+      sed: {
+        registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+          this.gruntConfig.sed = this.gruntConfig.sed || {};
+          this.gruntConfig.sed[name + '-bootstrap-glyphicons'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'../bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular',
+            replacement: 'url(\'' + bundleOptions.url + '-bootstrap-glyphicons-halflings-regular'
+          };
+          this.gruntConfig.sed[name + '-dropzone-spritemap'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\("../images/spritemap',
+            replacement: 'url(\'' + bundleOptions.url + '-dropzone-spritemap'
+          };
+          this.gruntConfig.sed[name + '-select2-images'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'select2',
+            replacement: 'url(\'' + bundleOptions.url + '-select2-select2'
+          };
+          this.gruntConfig.sed[name + '-tinymce-icomoon'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'fonts/icomoon',
+            replacement: 'url(\'' + bundleOptions.url + '-tinymce-icomoon'
+          };
+          this.gruntConfig.sed[name + '-tinymce-loader'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(\'img/loader.gif',
+            replacement: 'url(\'' + bundleOptions.url + '-tinymce-loader.gif'
+          };
+          this.gruntConfig.sed[name + '-jqtree-circle'] = {
+            path: bundleOptions.path + name + '.min.css',
+            pattern: 'url\\(jqtree-circle.png',
+            replacement: 'url(\'' + bundleOptions.url + '-jqtree-jqtree-circle.png\''
+          };
+        }
       }
+
     },
-    sed: {
-      registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
-        this.gruntConfig.sed = this.gruntConfig.sed || {};
-        this.gruntConfig.sed[name + '-bootstrap-glyphicons'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'../bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular',
-          replacement: 'url(\'' + bundleOptions.url + '-bootstrap-glyphicons-halflings-regular'
-        };
-        this.gruntConfig.sed[name + '-dropzone-spritemap'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\("../images/spritemap',
-          replacement: 'url(\'' + bundleOptions.url + '-dropzone-spritemap'
-        };
-        this.gruntConfig.sed[name + '-select2-images'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'select2',
-          replacement: 'url(\'' + bundleOptions.url + '-select2-select2'
-        };
-        this.gruntConfig.sed[name + '-tinymce-icomoon'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'fonts/icomoon',
-          replacement: 'url(\'' + bundleOptions.url + '-tinymce-icomoon'
-        };
-        this.gruntConfig.sed[name + '-tinymce-loader'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(\'img/loader.gif',
-          replacement: 'url(\'' + bundleOptions.url + '-tinymce-loader.gif'
-        };
-        this.gruntConfig.sed[name + '-jqtree-circle'] = {
-          path: bundleOptions.path + name + '.min.css',
-          pattern: 'url\\(jqtree-circle.png',
-          replacement: 'url(\'' + bundleOptions.url + '-jqtree-jqtree-circle.png\''
-        };
-      }
-    }
+    init: function(requirejsOptions) {
+      this.requirejsOptions = requirejsOptions;
+      this.patterns = [];
+      this.bundles = {};
+      this.gruntConfig = {};
+      this.files = [
+        /*
+        * include initial framework (mocha and requirejs) with html5
+        * shims/shams/polyfills
+        */
+        'bower_components/es5-shim/es5-shim.js',
+        'bower_components/es5-shim/es5-sham.js',
+        'bower_components/console-polyfill/index.js',
+        'node_modules/mocha/mocha.js',
+        'node_modules/karma-mocha/lib/adapter.js',
+        'node_modules/requirejs/require.js',
+        'node_modules/karma-requirejs/lib/adapter.js',
+        /*
+        * include requirejs configuration
+        */
+        'js/config.js',
 
-  },
-  init: function(requirejsOptions) {
-    this.requirejsOptions = requirejsOptions;
-    this.patterns = [];
-    this.bundles = {};
-    this.gruntConfig = {};
-    this.files = [
-      /*
-      * include initial framework (mocha and requirejs) with html5
-      * shims/shams/polyfills
-      */
-      'bower_components/es5-shim/es5-shim.js',
-      'bower_components/es5-shim/es5-sham.js',
-      'bower_components/console-polyfill/index.js',
-      'node_modules/mocha/mocha.js',
-      'node_modules/karma-mocha/lib/adapter.js',
-      'node_modules/requirejs/require.js',
-      'node_modules/karma-requirejs/lib/adapter.js',
-      /*
-      * include requirejs configuration
-      */
-      'js/config.js',
+        /*
+        * include karma requirejs configuration
+        */
+        'tests/config.js',
+      ];
 
       /*
-      * include karma requirejs configuration
+      * provide (but not include) all scripts defined in requirejs's
+      * configuration
+      *
+      * also at the same time create a list of all patterns to be loaded with
+      * docs bundle
       */
-      'tests/config.js',
-    ];
-
-    /*
-    * provide (but not include) all scripts defined in requirejs's
-    * configuration
-    *
-    * also at the same time create a list of all patterns to be loaded with
-    * docs bundle
-    */
-    var path;
-    for (var key in this.requirejsOptions.paths) {
-      path = this.requirejsOptions.paths[key];
-      if (path.indexOf('.md') !== path.length - 3) {
-        this.files.push({ pattern: path + '.js', included: false });
-      }
-      if (key.indexOf('mockup-patterns-') === 0) {
-        this.patterns.push(key);
+      var path;
+      for (var key in this.requirejsOptions.paths) {
+        path = this.requirejsOptions.paths[key];
+        if (path.indexOf('.md') !== path.length - 3) {
+          this.files.push({ pattern: path + '.js', included: false });
+        }
+        if (key.indexOf('mockup-patterns-') === 0) {
+          this.patterns.push(key);
+        }
       }
-    }
 
-    /*
-    * provide (but not include) all files in "tests/" and "js/" folder
-    * those files will be loaded by requirejs at later points
-    */
-    this.files = this.files.concat([
-      {pattern: 'tests/example-resource*', included: false},
-      {pattern: 'tests/json/*.json', included: false},
-      {pattern: 'tests/fakeserver*', included: false},
-      {pattern: 'tests/*-test.js', included: false},
-      {pattern: 'tests/**/*-test.js', included: false},
-      {pattern: 'js/ui/**/*.js', included: false},
-      {pattern: 'js/ui/**/*.xml', included: false},
-      {pattern: 'js/patterns/structure/**/*.js', included: false},
-      {pattern: 'js/patterns/structure/**/*.xml', included: false},
-      {pattern: 'js/patterns/filemanager/**/*.xml', included: false},
-      {pattern: 'js/patterns/filemanager/**/*.js', included: false},
-      {pattern: 'js/patterns/tinymce/**/*.xml', included: false},
-      {pattern: 'js/patterns/tinymce/**/*.js', included: false},
-    ]);
+      /*
+      * provide (but not include) all files in "tests/" and "js/" folder
+      * those files will be loaded by requirejs at later points
+      */
+      this.files = this.files.concat([
+        {pattern: 'tests/example-resource*', included: false},
+        {pattern: 'tests/json/*.json', included: false},
+        {pattern: 'tests/fakeserver*', included: false},
+        {pattern: 'tests/*-test.js', included: false},
+        {pattern: 'tests/**/*-test.js', included: false},
+        {pattern: 'js/ui/**/*.js', included: false},
+        {pattern: 'js/ui/**/*.xml', included: false},
+        {pattern: 'js/patterns/structure/**/*.js', included: false},
+        {pattern: 'js/patterns/structure/**/*.xml', included: false},
+        {pattern: 'js/patterns/filemanager/**/*.xml', included: false},
+        {pattern: 'js/patterns/filemanager/**/*.js', included: false},
+        {pattern: 'js/patterns/tinymce/**/*.xml', included: false},
+        {pattern: 'js/patterns/tinymce/**/*.js', included: false},
+      ]);
 
 
-  },
-  registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
+    },
+    registerBundle: function(name, customGruntConfig, bundleOptions, sections) {
 
-    /*
-     * TODO: add description
-     */
-    extend(true, this.gruntConfig, customGruntConfig || {});
+      /*
+       * TODO: add description
+       */
+      extend(true, this.gruntConfig, customGruntConfig || {});
 
-    /*
-     * TODO: add description
-     */
-    bundleOptions = extend(true, {
-      path: 'build/',
-      url: '++resource++plone.app.' + name,
-      insertExtraRequires: []
-    }, bundleOptions || {});
+      /*
+       * TODO: add description
+       */
+      bundleOptions = extend(true, {
+        path: 'build/',
+        url: ' ++resource++plone.app.' + name,
+        insertExtraRequires: []
+      }, bundleOptions || {});
 
-    /*
-     * TODO: add description
-     */
-    sections = sections || ['requirejs', 'uglify', 'less', 'copy', 'sed'];
+      /*
+       * TODO: add description
+       */
+      sections = sections || ['requirejs', 'uglify', 'less', 'copy', 'sed'];
 
-    /*
-     * TODO: add description
-     */
-    for (var i = 0; i < sections.length; i++) {
-      if (this.sections[sections[i]]) {
-        this.sections[sections[i]].registerBundle.apply(this, [
-          name, customGruntConfig, bundleOptions, sections ]);
+      /*
+       * TODO: add description
+       */
+      for (var i = 0; i < sections.length; i = i + 1) {
+        if (this.sections[sections[i]]) {
+          this.sections[sections[i]].registerBundle.apply(
+            this,
+            [ name, customGruntConfig, bundleOptions, sections ]
+          );
+        }
       }
-    }
 
-    /*
-     * TODO: add description
-     */
-    var bundleTasks = [];
-    for (var j = 0; j < sections.length; j++) {
-      if (this.gruntConfig[sections[j]][name] !== {} && sections[j] !== 'sed') {
-        bundleTasks.push(sections[j] + ':' + name);
-      } else if (sections[j] === 'sed') {
-        for (var sedSection in this.gruntConfig.sed) {
-          if(this.gruntConfig.sed.hasOwnProperty(sedSection) && sedSection.indexOf(name) === 0){
-            bundleTasks.push('sed:' + sedSection);
+      /*
+       * TODO: add description
+       */
+      var bundleTasks = [];
+      for (var j = 0; j < sections.length; j = j + 1) {
+        if (this.gruntConfig[sections[j]][name] !== {} && sections[j] !== 'sed') {
+          bundleTasks.push(sections[j] + ':' + name);
+        } else if (sections[j] === 'sed') {
+          for (var sedSection in this.gruntConfig.sed) {
+            if (this.gruntConfig.sed.hasOwnProperty(sedSection) && sedSection.indexOf(name) === 0) {
+              bundleTasks.push('sed:' + sedSection);
+            }
           }
         }
       }
-    }
-    this.bundles[name] = bundleTasks;
-  },
-  initGrunt: function(grunt, customGruntConfig) {
-    extend(true, this.gruntConfig, customGruntConfig || {});
+      this.bundles[name] = bundleTasks;
+    },
+    initGrunt: function(grunt, customGruntConfig) {
+      extend(true, this.gruntConfig, customGruntConfig || {});
 
-    /*
-     * TODO: add description
-     */
-    var bundles = [];
-    for (var name in this.bundles) {
-      bundles.push('bundle-' + name);
-      grunt.registerTask('bundle-' + name, this.bundles[name]);
-    }
-    grunt.registerTask('test', [ 'jshint', 'karma:test' ]);
-    grunt.registerTask('test_once', [ 'jshint', 'karma:test_once' ]);
-    grunt.registerTask('test_dev', [ 'karma:test_dev' ]);
-    grunt.registerTask('test_ci', [ 'jshint', 'karma:test_ci'].concat(bundles));
+      /*
+       * TODO: add description
+       */
+      var bundles = [];
+      for (var name in this.bundles) {
+        bundles.push('bundle-' + name);
+        grunt.registerTask('bundle-' + name, this.bundles[name]);
+      }
+      grunt.registerTask('test', [ 'jshint', 'jscs', 'karma:test' ]);
+      grunt.registerTask('test_once', [ 'jshint', 'jscs', 'karma:testOnce' ]);
+      grunt.registerTask('test_dev', [ 'karma:testDev' ]);
+      grunt.registerTask('test_ci', [ 'jshint', 'jscs', 'karma:testCI'].concat(bundles));
 
-    /*
-     * TODO: add description
-     */
-    grunt.initConfig(extend(true, {
-      jshint: { all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
-      karma: {
-        options: {
-          basePath: './',
-          frameworks: [],
-          files: this.files,
-          preprocessors: { 'js/**/*.js': 'coverage' },
-          reporters: ['dots', 'progress', 'coverage'],
-          coverageReporter: { type : 'lcov', dir : 'coverage/' },
-          port: 9876,
-          colors: true,
-          logLevel: karmaConfig.DEBUG_INFO,
-          browserNoActivityTimeout: 200000,
-          autoWatch: true,
-          captureTimeout: 60000,
-          plugins: [
-            'karma-mocha',
-            'karma-coverage',
-            'karma-requirejs',
-            'karma-sauce-launcher',
-            'karma-chrome-launcher',
-            'karma-phantomjs-launcher',
-            'karma-junit-reporter'
-          ]
-        },
-        test: {
-          browsers: ['PhantomJS']
+      /*
+       * TODO: add description
+       */
+      grunt.initConfig(extend(true, {
+        jshint: { options: { jshintrc: '.jshintrc' }, all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
+        jscs: { options: { config: '.jscs.json' }, all: ['Gruntfile.js', 'js/**/*.js', 'tests/**/*.js'] },
+        karma: {
+          options: {
+            basePath: './',
+            frameworks: [],
+            files: this.files,
+            preprocessors: { 'js/**/*.js': 'coverage' },
+            reporters: ['dots', 'progress', 'coverage'],
+            coverageReporter: { type : 'lcov', dir : 'coverage/' },
+            port: 9876,
+            colors: true,
+            logLevel: karmaConfig.DEBUG_INFO,
+            browserNoActivityTimeout: 200000,
+            autoWatch: true,
+            captureTimeout: 60000,
+            plugins: [
+              'karma-mocha',
+              'karma-coverage',
+              'karma-requirejs',
+              'karma-sauce-launcher',
+              'karma-chrome-launcher',
+              'karma-phantomjs-launcher',
+              'karma-junit-reporter'
+            ]
+          },
+          test: {
+            browsers: ['PhantomJS']
+          },
+          testOnce: {
+            singleRun: true,
+            browsers: ['PhantomJS']
+          },
+          testDev: {
+            browsers: ['Chrome'],
+            preprocessors: {},
+            reporters: ['dots', 'progress'],
+            plugins: [
+              'karma-mocha',
+              'karma-requirejs',
+              'karma-chrome-launcher',
+            ]
+          },
+          testCI: {
+            singleRun: true,
+            port: 8080,
+            recordVideo: true,
+            reporters: ['junit', 'coverage', 'saucelabs'],
+            junitReporter: { outputFile: 'test-results.xml' },
+            sauceLabs: { testName: 'Mockup', startConnect: true },
+            browsers: [
+              'SL_Chrome',
+              //'SL_Firefox',
+              //'SL_Opera',
+              //'SL_Safari',
+              //'SL_IE_8',
+              //'SL_IE_9',
+              //'SL_IE_10',
+              //'SL_IE_11'
+              //'SL_IPhone',
+              //'SL_IPad',
+              //'SL_Android'
+            ],
+            customLaunchers: {
+              'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', platform: 'Windows 8', version: '31' },
+              'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', platform: 'Windows 8', version: '26' },
+              'SL_Opera': { base: 'SauceLabs', browserName: 'opera', platform: 'Windows 7', version: '12' },
+              'SL_Safari': { base: 'SauceLabs', browserName: 'safari', platform: 'Mac 10.8', version: '6' },
+              'SL_IE_8': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '8' },
+              'SL_IE_9': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2008', version: '9' },
+              'SL_IE_10': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2012', version: '10' },
+              'SL_IE_11': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' },
+              'SL_IPhone': { base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.8', version: '6.1' },
+              'SL_IPad': { base: 'SauceLabs', browserName: 'ipad', platform: 'OS X 10.8', version: '6.1' },
+              'SL_Android': { base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '4.0' }
+            }
+          }
         },
-        test_once: {
-          singleRun: true,
-          browsers: ['PhantomJS']
+        requirejs: {
+          options: this.requirejsOptions
         },
-        test_dev: {
-          browsers: ['Chrome'],
-          preprocessors: {},
-          reporters: ['dots', 'progress'],
-          plugins: [
-            'karma-mocha',
-            'karma-requirejs',
-            'karma-chrome-launcher',
-          ]
+        less: {
+          options: {
+            compress: true,
+            cleancss: false,
+            ieCompat: true,
+            paths: ['less']
+          }
         },
-        test_ci: {
-          singleRun: true,
-          port: 8080,
-          recordVideo: true,
-          reporters: ['junit', 'coverage', 'saucelabs'],
-          junitReporter: { outputFile: 'test-results.xml' },
-          sauceLabs: { testName: 'Mockup', startConnect: true },
-          browsers: [
-            'SL_Chrome',
-            //'SL_Firefox',
-            //'SL_Opera',
-            //'SL_Safari',
-            //'SL_IE_8',
-            //'SL_IE_9',
-            //'SL_IE_10',
-            //'SL_IE_11'
-            //'SL_IPhone',
-            //'SL_IPad',
-            //'SL_Android'
-          ],
-          customLaunchers: {
-            'SL_Chrome': { base: 'SauceLabs', browserName: 'chrome', platform: 'Windows 8', version: '31' },
-            'SL_Firefox': { base: 'SauceLabs', browserName: 'firefox', platform: 'Windows 8', version: '26' },
-            'SL_Opera': { base: 'SauceLabs', browserName: 'opera', platform: 'Windows 7', version: '12' },
-            'SL_Safari': { base: 'SauceLabs', browserName: 'safari', platform: 'Mac 10.8', version: '6' },
-            'SL_IE_8': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '8' },
-            'SL_IE_9': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2008', version: '9' },
-            'SL_IE_10': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 2012', version: '10' },
-            'SL_IE_11': { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' },
-            'SL_IPhone': { base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.8', version: '6.1' },
-            'SL_IPad': { base: 'SauceLabs', browserName: 'ipad', platform: 'OS X 10.8', version: '6.1' },
-            'SL_Android': { base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '4.0' }
+        sed: {
+          'bootstrap': {
+            path: 'node_modules/lcov-result-merger/index.js',
+            pattern: 'throw new Error\\(\'Unknown Prefix ',
+            replacement: '//throw// new Error(\'Unknown Prefix '
           }
         }
-      },
-      requirejs: {
-        options: this.requirejsOptions
-      },
-      less: {
-        options: {
-          compress: true,
-          cleancss: false,
-          ieCompat: true,
-          paths: ['less']
-        }
-      },
-      sed: {
-        'bootstrap': {
-          path: 'node_modules/lcov-result-merger/index.js',
-          pattern: 'throw new Error\\(\'Unknown Prefix ',
-          replacement: '//throw// new Error(\'Unknown Prefix '
-        }
-      }
-    }, this.gruntConfig));
+      }, this.gruntConfig));
 
-    /*
-     * TODO: add description
-     */
-    grunt.loadNpmTasks('grunt-contrib-copy');
-    grunt.loadNpmTasks('grunt-contrib-jshint');
-    grunt.loadNpmTasks('grunt-contrib-less');
-    grunt.loadNpmTasks('grunt-contrib-requirejs');
-    grunt.loadNpmTasks('grunt-contrib-uglify');
-    grunt.loadNpmTasks('grunt-karma');
-    grunt.loadNpmTasks('grunt-sed');
+      /*
+       * TODO: add description
+       */
+      grunt.loadNpmTasks('grunt-contrib-copy');
+      grunt.loadNpmTasks('grunt-contrib-jshint');
+      grunt.loadNpmTasks('grunt-contrib-less');
+      grunt.loadNpmTasks('grunt-contrib-requirejs');
+      grunt.loadNpmTasks('grunt-contrib-uglify');
+      grunt.loadNpmTasks('grunt-jscs-checker');
+      grunt.loadNpmTasks('grunt-karma');
+      grunt.loadNpmTasks('grunt-sed');
+
+    }
+  };
 
-  }
-};
+  module.exports = MockupGrunt;
 
-module.exports = MockupGrunt;
+})();
diff --git a/js/iframe.js b/js/iframe.js
index 1a5dc93..0fd8330 100644
--- a/js/iframe.js
+++ b/js/iframe.js
@@ -28,7 +28,7 @@
 define([
   'jquery'
 ], function($, undefined) {
-  "use strict";
+  'use strict';
 
   $.IFrame = function(iframe) { this._init(iframe); };
   $.IFrame.prototype = {
@@ -41,7 +41,7 @@ define([
       self.$el = $(iframe.el);
       self.window = window.parent;
       self.document = window.parent.document;
-      self.is_stretched = false;
+      self.isStretched = false;
 
       // # Handle clicks inside iframe
       $(document).on('click', function(e) {
@@ -60,9 +60,9 @@ define([
           }
 
           if (e.which === 1) {
-            self._same_window(url);
+            self._sameWindow(url);
           } else if (e.which === 2) {
-            self._new_window(url);
+            self._neWindow(url);
           }
 
         // if we click on empty part of iframe then shrink it
@@ -83,10 +83,10 @@ define([
     },
 
     // Abstract calls to window.parent so its easier to stub/mock in tests
-    _same_window: function(url) {
+    _sameWindow: function(url) {
       this.window.location.href = url;
     },
-    _new_window: function(url) {
+    _neWindow: function(url) {
       this.window.open(url);
     },
 
@@ -95,9 +95,9 @@ define([
     // Shrink current frame to the size that was before stretching it.
     shrink: function() {
       var self = this;
-      if (self.is_stretched) {
+      if (self.isStretched) {
         self.$el.trigger('shrink.iframe');
-        self.is_stretched = false;
+        self.isStretched = false;
         self.fit();
         self.$el.trigger('shrinked.iframe');
       }
@@ -109,9 +109,9 @@ define([
     // iframe object trasparent
     stretch: function() {
       var self = this;
-      if (!self.is_stretched) {
+      if (!self.isStretched) {
         self.$el.trigger('stretch.iframe');
-        self.is_stretched = true;
+        self.isStretched = true;
         self.$el.css({ height: $(self.document).height() });
         self.$el.trigger('stretched.iframe');
       }
@@ -123,13 +123,16 @@ define([
     // action (stretch or shrink)
     toggle: function() {
       var self = this;
-      if (!self.is_stretched) { self.stretch(); }
-      else { self.shrink(); }
+      if (!self.isStretched) {
+        self.stretch();
+      } else {
+        self.shrink();
+      }
     },
 
     fit: function() {
       var self = this;
-      if (!self.is_stretched) {
+      if (!self.isStretched) {
         self.$el.css({ height: $('body', document).height() });
         $('body', self.document).css('margin-top', $('body', document).height());
       } else {
diff --git a/js/iframe_init.js b/js/iframe_init.js
index 4e83433..d89dba9 100644
--- a/js/iframe_init.js
+++ b/js/iframe_init.js
@@ -27,228 +27,231 @@
 /*jshint scripturl:true */
 
 (function (definition) {
-"use strict";
+  'use strict';
+
   if (typeof define === 'function' && typeof define.amd === 'object') {
     define(['domready'], definition);
   } else {
     this.IFrame = definition(window.domready);
   }
+
 }(function(domready, undefined) {
-"use strict";
-
-// # IFrame Object
-window.IFrame = function(el) { this.init(el); };
-window.IFrame.prototype = {
-  add: function(el) {
-    var self = this, attr;
-
-    // make sure original element is hidden
-    el.setAttribute("style", "display:none;");
-
-    //
-    self.content += el.innerHTML;
-
-    // get options from original element
-    self.updateOption(el, 'name', 'noname_frame');
-    self.updateOption(el, 'title', '');
-    self.updateOption(el, 'doctype', '<!doctype html>');
-    self.updateOption(el, 'style', '');
-    self.updateOption(el, 'position', 'top');
-    self.updateOption(el, 'resources', '');
-    self.updateOption(el, 'styles', '');
-    self.updateOption(el, 'zindex', '500');
-
-  },
-  updateOption: function(el, name, _default) {
-    var self = this,
-        option_name = 'data-iframe-' + name;
-    if (name === 'name') {
-      option_name = 'data-iframe';
-    }
-    var value = el.getAttribute(option_name);
-    if (name === 'resources') {
-      if (value) {
-        value = value.split(';');
-        for (var i = 0; i < value.length; i += 1) {
-          var url = value[i].replace(/^\s+|\s+$/g, ''),
-              resource = '', attrs = {}, attr;
-
-          if (url.indexOf('?') !== -1) {
-            var url2 = url.slice(url.indexOf('?') + 1, url.length).split('&');
-            for (var j = 0; j < url2.length; j += 1) {
-              attr = url2[j].split('=');
-              if (attr[1][0] === "\"" || attr[1][0] === "'") {
-                attr[1] = attr[1].slice(1, attr[1].length - 1);
+  'use strict';
+
+  // # IFrame Object
+  window.IFrame = function(el) { this.init(el); };
+  window.IFrame.prototype = {
+    add: function(el) {
+      var self = this, attr;
+
+      // make sure original element is hidden
+      el.setAttribute('style', 'display:none;');
+
+      //
+      self.content += el.innerHTML;
+
+      // get options from original element
+      self.updateOption(el, 'name', 'noname_frame');
+      self.updateOption(el, 'title', '');
+      self.updateOption(el, 'doctype', '<!doctype html>');
+      self.updateOption(el, 'style', '');
+      self.updateOption(el, 'position', 'top');
+      self.updateOption(el, 'resources', '');
+      self.updateOption(el, 'styles', '');
+      self.updateOption(el, 'zindex', '500');
+
+    },
+    updateOption: function(el, name, _default) {
+      var self = this,
+          optionName = 'data-iframe-' + name;
+      if (name === 'name') {
+        optionName = 'data-iframe';
+      }
+      var value = el.getAttribute(optionName);
+      if (name === 'resources') {
+        if (value) {
+          value = value.split(';');
+          for (var i = 0; i < value.length; i += 1) {
+            var url = value[i].replace(/^\s+|\s+$/g, ''),
+                resource = '', attrs = {}, attr;
+
+            if (url.indexOf('?') !== -1) {
+              var url2 = url.slice(url.indexOf('?') + 1, url.length).split('&');
+              for (var j = 0; j < url2.length; j += 1) {
+                attr = url2[j].split('=');
+                if (attr[1][0] === '"' || attr[1][0] === '\'') {
+                  attr[1] = attr[1].slice(1, attr[1].length - 1);
+                }
+                attrs[attr[0]] = attr[1];
               }
-              attrs[attr[0]] = attr[1];
+              url = url.slice(0, url.indexOf('?'));
             }
-            url = url.slice(0, url.indexOf('?'));
-          }
 
-          if (url.slice(-3) === '.js') {
-            resource = window.document.createElement('script');
-            resource.src = url;
-            resource.type = 'text/javascript';
-            resource.async = false;
-          } else if (url.slice(-4) === '.css') {
-            resource = window.document.createElement('link');
-            resource.href = url;
-            resource.type = 'text/css';
-            resource.rel = 'stylesheet';
-          } else if (url.slice(-5) === '.less') {
-            resource = window.document.createElement('link');
-            resource.href = url;
-            resource.type = 'text/css';
-            resource.rel = 'stylesheet/less';
-          }
+            if (url.slice( -3 ) === '.js') {
+              resource = window.document.createElement('script');
+              resource.src = url;
+              resource.type = 'text/javascript';
+              resource.async = false;
+            } else if (url.slice( -4 ) === '.css') {
+              resource = window.document.createElement('link');
+              resource.href = url;
+              resource.type = 'text/css';
+              resource.rel = 'stylesheet';
+            } else if (url.slice( -5 ) === '.less') {
+              resource = window.document.createElement('link');
+              resource.href = url;
+              resource.type = 'text/css';
+              resource.rel = 'stylesheet/less';
+            }
 
-          if (resource !== '') {
-            for (attr in attrs) {
-              resource.setAttribute(attr, attrs[attr]);
+            if (resource !== '') {
+              for (attr in attrs) {
+                resource.setAttribute(attr, attrs[attr]);
+              }
+              self.resources += resource.outerHTML;
             }
-            self.resources += resource.outerHTML;
           }
         }
+      } else if (name === 'styles') {
+        if (value) {
+          var styleNode = window.document.createElement('style');
+          styleNode.type = 'text/css';
+          styleNode.textContent = value;
+          self.resources += styleNode.outerHTML;
+        }
       }
-    } else if (name === 'styles') {
       if (value) {
-        var style_node = window.document.createElement('style');
-        style_node.type = "text/css";
-        style_node.textContent = value;
-        self.resources += style_node.outerHTML;
+        self.options[name] = value;
+      } else if (self.options[name] === undefined) {
+        self.options[name] = _default;
       }
-    }
-    if (value) {
-      self.options[name] = value;
-    } else if (self.options[name] === undefined) {
-      self.options[name] = _default;
-    }
-  },
-  init: function(el) {
-    var self = this;
-
-    self.options = {};
-    self.content = '';
-    self.resources = '';
-    self.loaded = false;
-
-    self.add(el);
-
-    // Create iframe
-    var iframe = window.document.createElement('iframe');
-
-    iframe.setAttribute('frameBorder', '0');
-    iframe.setAttribute('border', '0');
-    iframe.setAttribute('allowTransparency', 'true');
-    iframe.setAttribute('scrolling', 'no');
-    iframe.setAttribute('id', self.options.name);
-    iframe.setAttribute('name', self.options.name);
-    iframe.setAttribute('style', 'display:none;');
-    iframe.setAttribute('src', 'javascript:false');
-
-    window.document.body.appendChild(iframe);
-
-    self.el = iframe;
-    self.window = iframe.contentWindow;
-    self.document = self.window.document;
-  },
-  open: function() {
-    var self = this;
-    self.document.open();
-    self.document.write(
-        self.options.doctype +
-        '<html>' +
-          '<head>' +
-            '<title>' + self.options.title + '</title>' +
-            '<meta http-equiv="X-UA-Compatible" content="IE=edge">' +
-          '</head>' +
-          '<body onload="parent.window.iframe[\'' +
-              self.options.name + '\'].load()">' +
-            self.content + self.resources +
-          '</body>' +
-        '</html>');
-    self.document.close();
-  },
-  load: function() {
-    var self = this;
-
-    // check if already loaded
-    if ( self.loaded === true ) {
-      return;
-    }
+    },
+    init: function(el) {
+      var self = this;
+
+      self.options = {};
+      self.content = '';
+      self.resources = '';
+      self.loaded = false;
+
+      self.add(el);
 
-    // mark iframe as loaded
-    self.loaded = true;
+      // Create iframe
+      var iframe = window.document.createElement('iframe');
 
-    self.document.body.setAttribute('style',
-        (self.document.body.getAttribute('style') || '') +
-        'background:transparent;');
+      iframe.setAttribute('frameBorder', '0');
+      iframe.setAttribute('border', '0');
+      iframe.setAttribute('allowTransparency', 'true');
+      iframe.setAttribute('scrolling', 'no');
+      iframe.setAttribute('id', self.options.name);
+      iframe.setAttribute('name', self.options.name);
+      iframe.setAttribute('style', 'display:none;');
+      iframe.setAttribute('src', 'javascript:false');
 
-    self.el.setAttribute('style', 'border:0;overflow:hidden;' +
+      window.document.body.appendChild(iframe);
+
+      self.el = iframe;
+      self.window = iframe.contentWindow;
+      self.document = self.window.document;
+    },
+    open: function() {
+      var self = this;
+      self.document.open();
+      self.document.write(
+          self.options.doctype +
+          '<html>' +
+            '<head>' +
+              '<title>' + self.options.title + '</title>' +
+              '<meta http-equiv="X-UA-Compatible" content="IE=edge">' +
+            '</head>' +
+            '<body onload="parent.window.iframe[\'' +
+                self.options.name + '\'].load()">' +
+              self.content + self.resources +
+            '</body>' +
+          '</html>'
+      );
+      self.document.close();
+    },
+    load: function() {
+      var self = this;
+
+      // check if already loaded
+      if ( self.loaded === true ) {
+        return;
+      }
+
+      // mark iframe as loaded
+      self.loaded = true;
+
+      self.document.body.setAttribute('style',
+        (self.document.body.getAttribute('style') || '') + 'background:transparent;'
+      );
+
+      self.el.setAttribute('style', 'border:0;overflow:hidden;' +
         'position:absolute;left:0px;position:fixed;overflow:hidden;' +
-        'width:100%;background-color:transparent;z-index:'+
-        self.options.zindex + ';' +self.options.style);
+        'width:100%;background-color:transparent;z-index:' +
+        self.options.zindex + ';' + self.options.style
+      );
 
-    self.el.setAttribute('style', self.el.getAttribute('style') +
-        'height:' + self.document.body.offsetHeight + 'px;');
+      self.el.setAttribute('style', self.el.getAttribute('style') +
+        'height:' + self.document.body.offsetHeight + 'px;'
+      );
 
-    if (self.options.position === 'top') {
-        self.el.setAttribute('style', self.el.getAttribute('style') +
-            'top:0px;');
+      if (self.options.position === 'top') {
+        self.el.setAttribute('style', self.el.getAttribute('style') + 'top:0px;');
         window.document.body.setAttribute('style',
-            (window.document.body.getAttribute('style') || '') +
-            ';border-top:0' +
-            ';margin-top:' + self.el.offsetHeight + 'px;');
+          (window.document.body.getAttribute('style') || '') +
+          ';border-top:0;margin-top:' + self.el.offsetHeight + 'px;'
+        );
 
-    } else if(self.options.position === 'bottom') {
-        self.el.setAttribute('style', self.el.getAttribute('style') +
-            'bottom:0px;');
+      } else if (self.options.position === 'bottom') {
+        self.el.setAttribute('style', self.el.getAttribute('style') + 'bottom:0px;');
         window.document.body.setAttribute('style',
-            (window.document.body.getAttribute('style') || '') +
-            ';border-bottom:0' +
-            ';margin-bottom:' + self.el.offsetHeight + 'px;');
-    }
+          (window.document.body.getAttribute('style') || '') +
+          ';border-bottom:0;margin-bottom:' + self.el.offsetHeight + 'px;'
+        );
+      }
 
-  }
-};
+    }
+  };
 
-// # Initialize
-window.iframe_initialize = function() {
-  var i,j, body, matching, iframe;
+  // # Initialize
+  window.iframeInitialize = function() {
+    var i,j, body, matching, iframe;
 
-  // find [data-iframe] elements in context
-  matching = [];
-  if (window.document.querySelectorAll !== undefined) {
-    matching = window.document.querySelectorAll('[data-iframe]');
-  } else {
-    var all = window.document.getElementsByTagName('*');
-    for (i = 0; i < all.length; i += 1) {
-      if (all[i].getAttribute('data-iframe')) {
-        matching.push(all[i]);
+    // find [data-iframe] elements in context
+    matching = [];
+    if (window.document.querySelectorAll !== undefined) {
+      matching = window.document.querySelectorAll('[data-iframe]');
+    } else {
+      var all = window.document.getElementsByTagName('*');
+      for (i = 0; i < all.length; i += 1) {
+        if (all[i].getAttribute('data-iframe')) {
+          matching.push(all[i]);
+        }
       }
     }
-  }
 
-  // initialize IFrame object for each of them
-  window.iframe = {};
-  for (j = 0; j < matching.length; j += 1) {
-    var name = matching[j].getAttribute('data-iframe');
-    if (window.iframe[name] === undefined) {
-      window.iframe[name] = new window.IFrame(matching[j]);
-    } else {
-      window.iframe[name].add(matching[j]);
+    // initialize IFrame object for each of them
+    window.iframe = {};
+    for (j = 0; j < matching.length; j += 1) {
+      var name = matching[j].getAttribute('data-iframe');
+      if (window.iframe[name] === undefined) {
+        window.iframe[name] = new window.IFrame(matching[j]);
+      } else {
+        window.iframe[name].add(matching[j]);
+      }
     }
-  }
-  for (iframe in window.iframe) {
-    if (window.iframe.hasOwnProperty(iframe)) {
-      window.iframe[iframe].open();
+    for (iframe in window.iframe) {
+      if (window.iframe.hasOwnProperty(iframe)) {
+        window.iframe[iframe].open();
+      }
     }
-  }
-};
+  };
 
-if (window.iframe_initialized !== true) {
-  window.iframe_initialized = true;
-  domready(window.iframe_initialize);
-}
+  if (window.iframeInitialized !== true) {
+    window.iframeInitialized = true;
+    domready(window.iframeInitialize);
+  }
 
 }));
diff --git a/js/patterns/accessibility.js b/js/patterns/accessibility.js
index e31a301..55fab53 100644
--- a/js/patterns/accessibility.js
+++ b/js/patterns/accessibility.js
@@ -59,10 +59,10 @@ define([
   'mockup-patterns-base',
   'jquery.cookie'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Accessibility = Base.extend({
-    name: "accessibility",
+    name: 'accessibility',
     defaults: {
       'smallbtn': null,
       'normalbtn': null,
@@ -72,13 +72,13 @@ define([
       if ($reset) {
         this.$el.removeClass('smallText').removeClass('largeText').
             removeClass('mediumText');
-        $.cookie('fontsize', $fontsize, { expires: 365, path:"/" });
+        $.cookie('fontsize', $fontsize, { expires: 365, path: '/' });
       }
       this.$el.addClass($fontsize);
     },
-    initBtn: function(btn){
+    initBtn: function(btn) {
       var self = this;
-      btn.el.click(function(e){
+      btn.el.click(function(e) {
         e.preventDefault();
         self.setBaseFontSize(btn.name + 'Text', 1);
       });
@@ -87,15 +87,15 @@ define([
       var self = this;
       var $fontsize = $.cookie('fontsize');
       if ($fontsize) {
-          self.setBaseFontSize($fontsize, 0);
+        self.setBaseFontSize($fontsize, 0);
       }
       var btns = ['smallbtn', 'normalbtn', 'largebtn'];
-      $.each(btns, function(idx, btn){
+      $.each(btns, function(idx, btn) {
         var btnName = btn.replace('btn', '');
         var btnSelector = self.options[btn];
-        if(btnSelector !== null){
+        if (btnSelector !== null) {
           var el = $(btnSelector, self.$el);
-          if(el){
+          if (el) {
             btn = {
               name: btnName,
               el: el
diff --git a/js/patterns/ace.js b/js/patterns/ace.js
index 110be64..8de1082 100644
--- a/js/patterns/ace.js
+++ b/js/patterns/ace.js
@@ -13,7 +13,7 @@
  *    readOnly(boolean): Read only editor. (false)
  *
  * Documentation:
- *    # Default 
+ *    # Default
  *
  *    {{ example-1 }}
  *
@@ -33,7 +33,7 @@
  * Example: example-2
  *    <pre class="pat-ace" data-pat-ace="mode:javascript;theme:dawn;">
  *    var foo = 'bar';
- *    function foobar(){
+ *    function foobar() {
  *      return foo;
  *    }
  *    </pre>
@@ -46,7 +46,7 @@
  *                       showGutter:false;
  *                       showPrintMargin:true;">
  *    var foo = 'bar';
- *    function foobar(){
+ *    function foobar() {
  *      return foo;
  *    }
  *    </pre>
@@ -77,10 +77,10 @@ define([
   'ace-theme-monokai',
   'ace-mode-text'
 ], function($, Base, utils, ace) {
-  "use strict";
+  'use strict';
 
   var AcePattern = Base.extend({
-    name: "ace",
+    name: 'ace',
     defaults: {
       theme: null,
       mode: 'text',
@@ -110,10 +110,10 @@ define([
       });
 
       self.editor = ace.edit(id);
-      if(self.options.theme){
+      if (self.options.theme) {
         self.setTheme(self.options.theme);
       }
-      self.editor.getSession().setMode("ace/mode/" + self.options.mode);
+      self.editor.getSession().setMode('ace/mode/' + self.options.mode);
       self.editor.getSession().setTabSize(parseInt(self.options.tabSize, 10));
       self.editor.getSession().setUseSoftTabs(utils.bool(self.options.softTabs));
       self.editor.getSession().setUseWrapMode(utils.bool(self.options.wrapMode));
@@ -121,9 +121,9 @@ define([
       self.editor.setShowPrintMargin(utils.bool(self.options.showPrintMargin));
       self.editor.setReadOnly(utils.bool(self.options.readOnly));
     },
-    setTheme: function(theme){
+    setTheme: function(theme) {
       var self = this;
-      self.editor.setTheme("ace/theme/" + theme);
+      self.editor.setTheme('ace/theme/' + theme);
     }
   });
 
diff --git a/js/patterns/autotoc.js b/js/patterns/autotoc.js
index 4700ee3..7659c1a 100644
--- a/js/patterns/autotoc.js
+++ b/js/patterns/autotoc.js
@@ -110,11 +110,9 @@ define([
 
       if (self.options.prependTo) {
         self.$toc.prependTo(self.options.prependTo);
-      }
-      else if (self.options.appendTo) {
+      } else if (self.options.appendTo) {
         self.$toc.appendTo(self.options.appendTo);
-      }
-      else{
+      } else {
         self.$toc.prependTo(self.$el);
       }
 
@@ -124,7 +122,7 @@ define([
 
       $(self.options.section, self.$el).addClass(self.options.classSectionName);
 
-      var as_tabs = self.$el.hasClass('autotabs');
+      var asTabs = self.$el.hasClass('autotabs');
 
       $(self.options.levels, self.$el).each(function(i) {
         var $level = $(this),
@@ -142,17 +140,14 @@ define([
           .on('click', function(e, doScroll) {
             e.stopPropagation();
             e.preventDefault();
-            self.$toc.children('.' + self.options.classActiveName).removeClass(
-              self.options.classActiveName);
-            self.$el.children('.' + self.options.classActiveName).removeClass(
-              self.options.classActiveName);
+            self.$toc.children('.' + self.options.classActiveName).removeClass(self.options.classActiveName);
+            self.$el.children('.' + self.options.classActiveName).removeClass(self.options.classActiveName);
             $(e.target).addClass(self.options.classActiveName);
-            $level.parents(self.options.section)
-                .addClass(self.options.classActiveName);
+            $level.parents(self.options.section).addClass(self.options.classActiveName);
             if (doScroll !== false &&
                 self.options.scrollDuration &&
                 $level &&
-                !as_tabs) {
+                !asTabs) {
               $('body,html').animate({
                 scrollTop: $level.offset().top
               }, self.options.scrollDuration, self.options.scrollEasing);
diff --git a/js/patterns/backdrop.js b/js/patterns/backdrop.js
index e961ced..969e993 100644
--- a/js/patterns/backdrop.js
+++ b/js/patterns/backdrop.js
@@ -35,14 +35,14 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Backdrop = Base.extend({
-    name: "backdrop",
+    name: 'backdrop',
     defaults: {
       zIndex: null,
       opacity: 0.8,
-      className: "backdrop",
+      className: 'backdrop',
       classActiveName: 'backdrop-active',
       closeOnEsc: true,
       closeOnClick: true
diff --git a/js/patterns/cookiedirective.js b/js/patterns/cookiedirective.js
index fda2be9..5562419 100644
--- a/js/patterns/cookiedirective.js
+++ b/js/patterns/cookiedirective.js
@@ -44,38 +44,37 @@ define([
   'mockup-patterns-base',
   'jquery.cookie'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var CookieDirective = Base.extend({
-    name: "cookiedirective",
+    name: 'cookiedirective',
     defaults: {
       'shouldEnable': true,
-      'shouldEnableMsg': "You should enable cookies to be able to login.",
-      'shouldEnableSelector': ".login",
+      'shouldEnableMsg': 'You should enable cookies to be able to login.',
+      'shouldEnableSelector': '.login',
       'shouldAsk': true,
-      'askPermissionMsg': "This site uses cookies to provide additional functionality, do you accept?",
-      'allowMsg': "Allow",
-      'denyMsg': "Deny",
-      'cookieName': "Allow_Cookies_For_Site"
+      'askPermissionMsg': 'This site uses cookies to provide additional functionality, do you accept?',
+      'allowMsg': 'Allow',
+      'denyMsg': 'Deny',
+      'cookieName': 'Allow_Cookies_For_Site'
     },
     cookiesEnabled: function() {
-      $.cookie("_cookiesEnabled", 1);
-      if (!$.cookie("_cookiesEnabled")) {
+      $.cookie('_cookiesEnabled', 1);
+      if (!$.cookie('_cookiesEnabled')) {
         return false;
       }
-      $.removeCookie("_cookiesEnabled");
+      $.removeCookie('_cookiesEnabled');
       return true;
     },
     acceptedCookies: function() {
       /*jshint eqeqeq:false */
       var cookie = $.cookie(this.options.cookieName);
-      if (cookie === undefined || cookie === null){
+      if (cookie === undefined || cookie === null) {
         return undefined;
       }
-      if (cookie == 1) {
+      if (cookie === 1) {
         return true;
-      }
-      else{
+      } else {
         return false;
       }
     },
@@ -100,39 +99,39 @@ define([
       self.options.shouldAsk = self.ensureBool(self.options.shouldAsk);
       if (self.options.shouldAsk) {
         var accepted = self.acceptedCookies();
-        if (accepted === undefined){
+        if (accepted === undefined) {
           var div = $('<div></div>')
             .addClass('cookiedirective');
-          var msg = $('<div><span>'+self.options.askPermissionMsg+'</span></div>')
+          var msg = $('<div><span>' + self.options.askPermissionMsg + '</span></div>')
             .addClass('cookiemsg');
-          var button_allow = $('<div><span>'+self.options.allowMsg+'</span></div>')
+          var buttonAllow = $('<div><span>' + self.options.allowMsg + '</span></div>')
             .addClass('cookieallowbutton')
             .addClass('btn')
             .on('click', function(e) {
-                self.acceptCookies();
-                self.$el.find('.cookiedirective').hide('slow');
-              });
-          var button_deny = $('<div><span>'+self.options.denyMsg+'</span></div>')
+              self.acceptCookies();
+              self.$el.find('.cookiedirective').hide('slow');
+            });
+          var buttonDeny = $('<div><span>' + self.options.denyMsg + '</span></div>')
             .addClass('cookiedenybutton')
             .addClass('btn')
             .on('click', function(e) {
-                self.denyCookies();
-                self.$el.find('.cookiedirective').hide('slow');
-              });
-          div.append(msg).append(button_allow).append(button_deny);
+              self.denyCookies();
+              self.$el.find('.cookiedirective').hide('slow');
+            });
+          div.append(msg).append(buttonAllow).append(buttonDeny);
           self.$el.prepend(div);
         }
       }
       self.options.shouldEnable = self.ensureBool(self.options.shouldEnable);
       if (self.options.shouldEnable) {
-        if (self.$el.find(self.options.shouldEnableSelector).size() > 0){
-          if (!self.cookiesEnabled()){
-            var new_div = $('<div></div>')
+        if (self.$el.find(self.options.shouldEnableSelector).size() > 0) {
+          if (!self.cookiesEnabled()) {
+            var newDiv = $('<div></div>')
               .addClass('shouldenablecookies');
-            var new_msg = $('<div><span>'+self.options.shouldEnableMsg+'</span></div>')
+            var newMsg = $('<div><span>' + self.options.shouldEnableMsg + '</span></div>')
               .addClass('shouldenablecookiesmsg');
-            new_div.append(new_msg).append(new_msg);
-            self.$el.prepend(new_div);
+            newDiv.append(newMsg).append(newMsg);
+            self.$el.prepend(newDiv);
           }
         }
       }
diff --git a/js/patterns/dropzone.js b/js/patterns/dropzone.js
index a485c5d..c2bdf58 100644
--- a/js/patterns/dropzone.js
+++ b/js/patterns/dropzone.js
@@ -7,7 +7,7 @@
  *    paramName(string): value for name attribute in the file input element ('file')
  *    uploadMultiple(boolean): condition value for multiple attribute in the file input element. If the value is 'true' and paramName is file, 'multiple=multiple' and 'name=file[]' will be added in the file input. (false)
  *    wrap(boolean): true or false for wrapping this element using the value of wrapperTemplate. If the value is 'inner', this element will wrap the wrapperTemplate value. (false)
- *    wrapperTemplate(string): HTML template for wrapping around with this element. ('<div class="dropzone-container"/>')
+ *    wrapperTemplate(string): HTML template for wrapping around with this element. ('<div class='dropzone-container"/>')
  *    resultTemplate(string): HTML template for the element that will contain file information. ('<div class="dz-notice"><p>Drop files here...</p></div><div class="dropzone-previews"/>')
  *    autoCleanResults(boolean): condition value for the file preview in div element to fadeout after file upload is completed. (false)
  *    previewsContainer(selector): JavaScript selector for file preview in div element. (.dropzone-previews)
@@ -72,6 +72,7 @@
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+ /* globals alert:true */
 
 define([
   'jquery',
@@ -79,17 +80,17 @@ define([
   'dropzone',
   'underscore'
 ], function($, Base, Dropzone, _) {
-  "use strict";
+  'use strict';
 
   /* we do not want this plugin to auto discover */
   Dropzone.autoDiscover = false;
 
   var DropzonePattern = Base.extend({
-    name: "dropzone",
+    name: 'dropzone',
     defaults: {
       url: null, // XXX MUST provide url to submit to OR be in a form
       className: 'dropzone',
-      paramName: "file",
+      paramName: 'file',
       uploadMultiple: false,
       clickable: false,
       wrap: false,
@@ -104,24 +105,24 @@ define([
     },
     init: function() {
       var self = this;
-      if(typeof(self.options.clickable) === "string"){
-        if(self.options.clickable === 'true'){
+      if (typeof(self.options.clickable) === 'string') {
+        if (self.options.clickable === 'true') {
           self.options.clickable = true;
         } else {
           self.options.clickable = false;
         }
       }
-      if(!self.options.url && self.$el[0].tagName === 'FORM'){
+      if (!self.options.url && self.$el[0].tagName === 'FORM') {
         var url = self.$el.attr('action');
-        if(!url){
+        if (!url) {
           // form without action, defaults to current url
           url = window.location.href;
         }
         self.options.url = url;
       }
       var $el = self.$el;
-      if(self.options.wrap){
-        if(self.options.wrap === 'inner'){
+      if (self.options.wrap) {
+        if (self.options.wrap === 'inner') {
           $el.wrapInner(self.options.wrapperTemplate);
           $el = $el.children().eq(0);
         } else {
@@ -130,7 +131,7 @@ define([
         }
       }
       $el.append('<div class="dz-notice"><p>Drop files here...</p></div>');
-      if(self.options.previewsContainer === '.dropzone-previews'){
+      if (self.options.previewsContainer === '.dropzone-previews') {
         $el.append(self.options.previewsTemplate);
       }
 
@@ -149,13 +150,13 @@ define([
       delete options.fileaddedClassName;
       delete options.useTus;
 
-      if(self.options.previewsContainer){
+      if (self.options.previewsContainer) {
         /*
          * if they have a select but it's not an id, let's make an id selector
          * so we can target the correct container. dropzone is weird here...
          */
         var $preview = $el.find(self.options.previewsContainer);
-        if($preview.length > 0){
+        if ($preview.length > 0) {
           options.previewsContainer = $preview[0];
         }
       }
@@ -165,9 +166,9 @@ define([
       self.$dropzone = $el;
 
 
-      if(autoClean){
-        self.dropzone.on('complete', function(file){
-          setTimeout(function(){
+      if (autoClean) {
+        self.dropzone.on('complete', function(file) {
+          setTimeout(function() {
             $(file.previewElement).fadeOut();
           }, 3000);
         });
@@ -175,25 +176,24 @@ define([
 
       /* customize file processing */
       var processing = false;
-      function process(){
+      function process() {
         processing = true;
-        if(self.dropzone.files.length === 0){
+        if (self.dropzone.files.length === 0) {
           processing = false;
           self.$dropzone.removeClass(fileaddedClassName);
           return;
         }
         var file = self.dropzone.files[0];
         var $preview = $(file.previewElement);
-        if([Dropzone.SUCCESS, Dropzone.ERROR,
-                              Dropzone.CANCELED].indexOf(file.status) !== -1){
+        if ([Dropzone.SUCCESS, Dropzone.ERROR, Dropzone.CANCELED].indexOf(file.status) !== -1) {
           // remove it
           self.dropzone.removeFile(file);
           process();
-        }else if(file.status !== Dropzone.UPLOADING){
+        } else if (file.status !== Dropzone.UPLOADING) {
           // start processing file
-          if(useTus && window.tus){
+          if (useTus && window.tus) {
             // use tus upload if installed
-            var $progress = $preview.find("[data-dz-uploadprogress]");
+            var $progress = $preview.find('[data-dz-uploadprogress]');
             file.status = Dropzone.UPLOADING;
             window.tus.upload(file, {
               endpoint: self.options.url,
@@ -201,46 +201,46 @@ define([
                 'FILENAME': file.name
               },
               chunkSize: 1024 * 1024 * 5 // 5mb chunk size
-            }).fail(function(){
+            }).fail(function() {
               alert('Error uploading with TUS resumable uploads');
               file.status = Dropzone.ERROR;
-            }).progress(function(e, bytesUploaded, bytesTotal){
+            }).progress(function(e, bytesUploaded, bytesTotal) {
               var percentage = (bytesUploaded / bytesTotal * 100);
               $progress.css('width', percentage + '%');
               $progress.parent().css('display', 'block');
               var $size = $preview.find('.dz-size');
               $size.html('uploading...<br />' + self.formatBytes(bytesUploaded) + ' / ' + self.formatBytes(bytesTotal));
-            }).done(function(url, file){
+            }).done(function(url, file) {
               file.status = Dropzone.SUCCESS;
               self.dropzone.emit('success', file);
               self.dropzone.emit('complete', file);
             });
-          }else{
+          } else {
             // otherwise, just use dropzone to process
             self.dropzone.processFile(file);
           }
           setTimeout(process, 100);
-        }else{
+        } else {
           // currently processing
           setTimeout(process, 100);
         }
       }
-      self.dropzone.on('addedfile', function(){
+      self.dropzone.on('addedfile', function() {
         self.$dropzone.addClass(fileaddedClassName);
-        setTimeout(function(){
-          if(!processing){
+        setTimeout(function() {
+          if (!processing) {
             process();
           }
         }, 100);
       });
     },
-    formatBytes: function(bytes){
+    formatBytes: function(bytes) {
       var kb = Math.round(bytes / 1024);
-      if(kb < 1024){
+      if (kb < 1024) {
         return kb + ' KiB';
       }
       var mb = Math.round(kb / 1024);
-      if(mb < 1024){
+      if (mb < 1024) {
         return mb + ' MB';
       }
       return Math.round(mb / 1024) + ' GB';
diff --git a/js/patterns/expose.js b/js/patterns/expose.js
index 4708b2a..401aaba 100644
--- a/js/patterns/expose.js
+++ b/js/patterns/expose.js
@@ -71,17 +71,17 @@ define([
   'mockup-patterns-base',
   'mockup-patterns-backdrop'
 ], function($, Base, Backdrop) {
-  "use strict";
+  'use strict';
 
   var Expose = Base.extend({
-    name: "expose",
+    name: 'expose',
     defaults: {
-      triggers: "focusin",
-      classActiveName: "active",
-      backdrop: "body",
+      triggers: 'focusin',
+      classActiveName: 'active',
+      backdrop: 'body',
       backdropZIndex: null,
-      backdropOpacity: "0.8",
-      backdropClassName: "backdrop",
+      backdropOpacity: '0.8',
+      backdropClassName: 'backdrop',
       backdropClassActiveName: 'backdrop-active',
       backdropCloseOnEsc: true,
       backdropCloseOnClick: true
diff --git a/js/patterns/filemanager/pattern.js b/js/patterns/filemanager/pattern.js
index 20b8c54..69779fc 100644
--- a/js/patterns/filemanager/pattern.js
+++ b/js/patterns/filemanager/pattern.js
@@ -33,10 +33,10 @@ define([
   'mockup-patterns-base',
   'js/patterns/filemanager/views/app'
 ], function($, Base, AppView) {
-  "use strict";
+  'use strict';
 
   var FileManager = Base.extend({
-    name: "filemanager",
+    name: 'filemanager',
     defaults: {
       aceConfig: {},
       dataTreeUrl: null,
@@ -47,13 +47,13 @@ define([
     },
     init: function() {
       var self = this;
-      if(self.options.dataTreeUrl !== null){
+      if (self.options.dataTreeUrl !== null) {
         self.options.treeConfig = $.extend(true, {}, self.treeConfig, {
           dataUrl: self.options.dataTreeUrl
         });
         self.appView = new AppView(self.options);
         self.$el.append(self.appView.render().el);
-      }else{
+      } else {
         self.$el.html('Must specify dataTreeUrl setting for pattern');
       }
     }
diff --git a/js/patterns/filemanager/views/app.js b/js/patterns/filemanager/views/app.js
index 42acbfa..c47eaf2 100644
--- a/js/patterns/filemanager/views/app.js
+++ b/js/patterns/filemanager/views/app.js
@@ -33,31 +33,31 @@ define([
   'mockup-patterns-ace',
   'text!js/patterns/filemanager/templates/app.xml'
 ], function($, _, Backbone, BaseView, DropZone, Tree, Ace, AppTemplate) {
-  "use strict";
+  'use strict';
 
   var AppView = BaseView.extend({
     tagName: 'div',
     className: 'filemanager',
     template: AppTemplate,
-    afterRender: function(){
+    afterRender: function() {
       var self = this;
       self.$tree = self.$('.tree');
       self.tree = new Tree(self.$tree, self.treeConfig);
 
-      if(self.uploadUrl){
+      if (self.uploadUrl) {
         self.dropzone = new DropZone(self.$el, {
           className: 'filemanager-dropzone',
           clickable: false,
           url: self.options.uploadUrl,
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             // XXX fill in here
           }
         }).dropzone;
-        self.dropzone.on('sending', function(){
+        self.dropzone.on('sending', function() {
           self.$el.addClass('dropping');
         });
-        self.dropzone.on('complete', function(){
+        self.dropzone.on('complete', function() {
           self.$el.removeClass('dropping');
         });
       }
diff --git a/js/patterns/formautofocus.js b/js/patterns/formautofocus.js
index 4483cbb..52d45c3 100644
--- a/js/patterns/formautofocus.js
+++ b/js/patterns/formautofocus.js
@@ -32,21 +32,20 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base, undefined) {
-  "use strict";
+  'use strict';
 
   var FormAutoFocus = Base.extend({
     name: 'formautofocus',
     defaults: {
-      condition: "div.error",
-      target: "div.error :input:not(.formTabs):visible:first",
-      always: ":input:not(.formTabs):visible:first"
+      condition: 'div.error',
+      target: 'div.error :input:not(.formTabs):visible:first',
+      always: ':input:not(.formTabs):visible:first'
     },
     init: function() {
       var self = this;
       if ($(self.options.condition, self.$el).size() !== 0) {
         $(self.options.target, self.$el).focus();
-      }
-      else{
+      } else {
         $(self.options.always, self.$el).focus();
       }
 
diff --git a/js/patterns/formunloadalert.js b/js/patterns/formunloadalert.js
index 29b7380..686c9c3 100644
--- a/js/patterns/formunloadalert.js
+++ b/js/patterns/formunloadalert.js
@@ -6,7 +6,7 @@
  *    message(string): Confirmation message to display when dirty form is being unloaded. (Discard changes? If you click OK, any changes you have made will be lost.)
  *
  * Documentation:
- *    # Example 
+ *    # Example
  *
  *    {{ example-1 }}
  *
@@ -46,15 +46,15 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function ($, Base) {
-  "use strict";
+  'use strict';
 
   var FormUnloadAlert = Base.extend({
-    name: "formunloadalert",
+    name: 'formunloadalert',
     _changed : false,       // Stores a listing of raised changes by their key
     _suppressed : false,     // whether or not warning should be suppressed
     defaults: {
-      message :  "Discard changes? If you click OK, " +
-                 "any changes you have made will be lost.",
+      message :  'Discard changes? If you click OK, ' +
+                 'any changes you have made will be lost.',
       // events on which to check for changes
       changingEvents: 'change keyup paste',
       // fields on which to check for changes
@@ -76,22 +76,22 @@ define([
       if ($modal.size() !== 0) {
         $modal.data('pattern-modal').on('hide', function(e) {
           var modal = $modal.data('pattern-modal');
-          if(modal){
-            modal._suppressHide = self._handle_unload.apply(self, e);
+          if (modal) {
+            modal._suppressHide = self._handleUnload.apply(self, e);
           }
         });
       } else {
-        $(window).on('beforeunload', function(e){
-          return self._handle_unload(e);
+        $(window).on('beforeunload', function(e) {
+          return self._handleUnload(e);
         });
       }
 
-      self.$el.on('submit', function(e){
+      self.$el.on('submit', function(e) {
         self._suppressed = true;
       });
 
     },
-    _handle_unload : function (e) {
+    _handleUnload : function (e) {
       var self = this;
       if (self._suppressed) {
         self._suppressed = false;
@@ -99,12 +99,12 @@ define([
       }
       if (self._changed) {
         var msg = self.options.message;
-        self._handle_msg(e,msg);
+        self._handleMsg(e,msg);
         $(window).trigger('messageset');
         return msg;
       }
     },
-    _handle_msg:  function(e,msg) {
+    _handleMsg:  function(e,msg) {
       (e || window.event).returnValue = msg;
     }
   });
diff --git a/js/patterns/livesearch.js b/js/patterns/livesearch.js
index 8684e35..4883355 100644
--- a/js/patterns/livesearch.js
+++ b/js/patterns/livesearch.js
@@ -66,10 +66,10 @@ define([
   'mockup-patterns-select2', // TODO: is this still a dependency
   'mockup-utils'
 ], function($, _, Base, Toggle, Select2, utils) {
-  "use strict";
+  'use strict';
 
   var Livesearch = Base.extend({
-    name: "livesearch",
+    name: 'livesearch',
     timeout: null,
     blurTimout: null,
     $results: null,
@@ -117,7 +117,7 @@ define([
         var self = this;
         if (self.options.positionToggleWithInput) {
           var top = self.$input.position().top + self.$input.outerHeight();
-          self.$toggle.css({'top': top+'px'});
+          self.$toggle.css({'top': top + 'px'});
         }
       }
     },
@@ -133,7 +133,7 @@ define([
         $.error('No url provided for livesearch results ' + self.$el);
       }
 
-      if(self.query.valid){
+      if (self.query.valid) {
         self.options.ajax = self.query.selectAjax();
       }
       else {
@@ -152,7 +152,7 @@ define([
       });
 
       self.$input.on('blur.livesearch.patterns', function(e) {
-        self.blurTimeout = window.setInterval(function(){
+        self.blurTimeout = window.setInterval(function() {
           self.hide();
           window.clearInterval(self.blurTimeout);
         }, self.options.blurDelay);
@@ -213,9 +213,9 @@ define([
         self.options.ajax.url,
         $.param(params),
         function(data) {
-          if(data.results !== undefined){
+          if (data.results !== undefined) {
             self.cache[term] = data.results;
-          }else{
+          } else {
             console.log('error from server returning result');
           }
 
@@ -227,13 +227,13 @@ define([
     applyTemplate: function(tpl, item) {
       var self = this;
       var template;
-      if (self.options[tpl+'TemplateSelector']) {
-        template = $(self.options[tpl+'TemplateSelector']).html();
+      if (self.options[tpl + 'TemplateSelector']) {
+        template = $(self.options[tpl + 'TemplateSelector']).html();
         if (!template) {
-          template = self.options[tpl+'Template'];
+          template = self.options[tpl + 'Template'];
         }
       } else {
-        template = self.options[tpl+'Template'];
+        template = self.options[tpl + 'Template'];
       }
       return _.template(template, item);
     },
@@ -259,7 +259,7 @@ define([
       var self = this;
       var html = '';
       if (data.length > 0) {
-        $.each(data, function(index, value){
+        $.each(data, function(index, value) {
           html += self.applyTemplate('result', value);
         });
       } else {
@@ -321,7 +321,7 @@ define([
       if (self.$toggle) {
         self.$toggle.removeClass(self.options.toggleClass);
       }
-      $('.'+className, self.$results).removeClass(className);
+      $('.' + className, self.$results).removeClass(className);
       self.trigger('hidden');
     },
 
@@ -332,7 +332,7 @@ define([
     _keyUp: function() {
       var self = this;
       var className = self.options.highlight;
-      var selected = $('.'+className, self.$results);
+      var selected = $('.' + className, self.$results);
 
       if (selected.length > 0) {
         if (selected.prev().length > 0) {
@@ -345,7 +345,7 @@ define([
     _keyDown: function() {
       var self = this;
       var className = self.options.highlight;
-      var selected = $('.'+className, self.$results);
+      var selected = $('.' + className, self.$results);
 
       if (selected.length === 0) {
         selected = self.items().first().addClass(className);
@@ -364,7 +364,7 @@ define([
     _keyEnter: function() {
       var self = this;
       var hl = self.options.highlight;
-      var target = self.$results.find('.'+hl)
+      var target = self.$results.find('.' + hl)
         .find('a').attr('href');
       if (self.options.isTest) {
         self.testTarget = target;
@@ -391,10 +391,10 @@ define([
           default:
             self.currentTerm = self.$input.val();
             if (self.$input.val().length >= self.options.minimumInputLength) {
-              self.timeout = window.setInterval(function(){
-                try{
+              self.timeout = window.setInterval(function() {
+                try {
                   self.search();
-                }catch(e){
+                } catch (e) {
                   console.log('error trying to search');
                   window.clearInterval(self.timeout);
                 }
diff --git a/js/patterns/modal.js b/js/patterns/modal.js
index db41063..48f2ae1 100644
--- a/js/patterns/modal.js
+++ b/js/patterns/modal.js
@@ -9,7 +9,7 @@
  *    title(string): A string to place in the modal header. If title is provided, titleSelector is not used. (null)
  *    titleSelector(string): Selector for an element to extract from the content provided to the modal and place in the modal header. ('h1:first')
  *    content(string): Selector for an element within the content provided to the modal to use as the modal body. ('#content')
- *    prependContent(string): Selector for elements within the content provided to the modal which will be collected and inserted, by default above, the modal content. This is useful for extracting things like alerts or status messages on forms and displaying them to the user after an AJAX response. ('.portalMessage') 
+ *    prependContent(string): Selector for elements within the content provided to the modal which will be collected and inserted, by default above, the modal content. This is useful for extracting things like alerts or status messages on forms and displaying them to the user after an AJAX response. ('.portalMessage')
  *    backdrop(string): Selector for the element upon which the Backdrop pattern should be initiated. The Backdrop is a full width mask that will be apply above the content behind the modal which is useful for highlighting the modal dialog to the user. ('body')
  *    backdropOptions(object): Look at options at backdrop pattern. ({ zIndex: "1040", opacity: "0.8", className: "backdrop", classActiveName: "backdrop-active", closeOnEsc: true, closeOnClick: true })
  *    buttons(string): Selector for matching elements, usually buttons, inputs or links, from the modal content to place in the modal footer. The original elements in the content will be hidden. ('.formControls > input[type="submit"]')
@@ -82,6 +82,7 @@
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+ /* globals confirm:true */
 
 define([
   'jquery',
@@ -93,24 +94,24 @@ define([
   'mockup-utils',
   'jquery.form'
 ], function($, _, Base, Backdrop, registry, Router, utils) {
-  "use strict";
+  'use strict';
 
   var Modal = Base.extend({
-    name: "modal",
+    name: 'modal',
     createModal: null,
     $model: null,
     defaults: {
-      width: "",
-      height: "",
+      width: '',
+      height: '',
       margin: 20,
-      position: "center middle", // format: "<horizontal> <vertical>" -- allowed values: top, bottom, left, right, center, middle
+      position: 'center middle', // format: '<horizontal> <vertical>' -- allowed values: top, bottom, left, right, center, middle
       triggers: [],
-      backdrop: "body", // Element to initiate the Backdrop on.
+      backdrop: 'body', // Element to initiate the Backdrop on.
       backdropOptions: {
-        zIndex: "1040",
-        opacity: "0.8",
-        className: "backdrop",
-        classActiveName: "backdrop-active",
+        zIndex: '1040',
+        opacity: '0.8',
+        className: 'backdrop',
+        classActiveName: 'backdrop-active',
         closeOnEsc: true,
         closeOnClick: true
       },
@@ -122,16 +123,16 @@ define([
       loadLinksWithinModal: true,
       prependContent: '.portalMessage',
       templateOptions: {
-        className: "modal fade",
-        classDialog: "modal-dialog",
-        classModal: "modal-content",
-        classHeaderName: "modal-header",
-        classBodyName: "modal-body",
-        classFooterName: "modal-footer",
-        classWrapperName: "modal-wrapper",
-        classWrapperInnerName: "modal-wrapper-inner",
-        classActiveName: "in",
-        classPrependName: "", // String, css class to be applied to the wrapper of the prepended content
+        className: 'modal fade',
+        classDialog: 'modal-dialog',
+        classModal: 'modal-content',
+        classHeaderName: 'modal-header',
+        classBodyName: 'modal-body',
+        classFooterName: 'modal-footer',
+        classWrapperName: 'modal-wrapper',
+        classWrapperInnerName: 'modal-wrapper-inner',
+        classActiveName: 'in',
+        classPrependName: '', // String, css class to be applied to the wrapper of the prepended content
         classContentName: '',  // String, class name to be applied to the content of the modal, useful for modal specific styling
         template: '' +
           '<div class="<%= options.className %>">' +
@@ -171,7 +172,7 @@ define([
         onTimeout: null,
         redirectOnResponse: false,
         redirectToUrl: function($action, response, options) {
-            var $base = $(/<base.*?(\/>|<\/base>)/im.exec(response)[0]);
+          var $base = $(/<base.*?(\/>|<\/base>)/im.exec(response)[0]);
           return $base.attr('href');
         }
       },
@@ -199,7 +200,7 @@ define([
           var patternKeys = _.union(_.keys(self.options.actionOptions), ['actions', 'actionOptions']);
           var patternOptions = $.extend(true, _.omit(options, patternKeys), self.options);
 
-          $(action, $('.'+options.templateOptions.classBodyName, $modal)).each(function(action) {
+          $(action, $('.' + options.templateOptions.classBodyName, $modal)).each(function(action) {
             var $action = $(this);
             $action.on(actionOptions.eventType, function(e) {
               e.stopPropagation();
@@ -248,7 +249,7 @@ define([
         }
 
         // We want to trigger the form submit event but NOT use the default
-        $form.on('submit', function(e){
+        $form.on('submit', function(e) {
           e.preventDefault();
         });
         $form.trigger('submit');
@@ -258,56 +259,56 @@ define([
           timeout: options.timeout,
           data: extraData,
           url: url,
-            error: function(xhr, textStatus, errorStatus) {
-              self.loading.hide();
-              if (textStatus === 'timeout' && options.onTimeout) {
-                options.onTimeout.apply(self, xhr, errorStatus);
-              // on "error", "abort", and "parsererror"
-              } else if (options.onError) {
-                options.onError(xhr, textStatus, errorStatus);
+          error: function(xhr, textStatus, errorStatus) {
+            self.loading.hide();
+            if (textStatus === 'timeout' && options.onTimeout) {
+              options.onTimeout.apply(self, xhr, errorStatus);
+            // on "error", "abort", and "parsererror"
+            } else if (options.onError) {
+              options.onError(xhr, textStatus, errorStatus);
+            } else {
+              console.log('error happened do something');
+            }
+            self.trigger('formActionError', [xhr, textStatus, errorStatus]);
+          },
+          success: function(response, state, xhr, form) {
+            self.loading.hide();
+            // if error is found (NOTE: check for both the portal errors
+            // and the form field-level errors)
+            if ($(options.error, response).size() !== 0 ||
+                $(options.formFieldError, response).size() !== 0) {
+              if (options.onFormError) {
+                options.onFormError(self, response, state, xhr, form);
               } else {
-                console.log('error happened do something');
-              }
-              self.trigger('formActionError', [xhr, textStatus, errorStatus]);
-            },
-            success: function(response, state, xhr, form) {
-              self.loading.hide();
-              // if error is found (NOTE: check for both the portal errors
-              // and the form field-level errors)
-              if ($(options.error, response).size() !== 0 ||
-                  $(options.formFieldError, response).size() !== 0) {
-                if (options.onFormError) {
-                  options.onFormError(self, response, state, xhr, form);
-                } else {
-                  self.redraw(response, patternOptions);
-                }
-                return;
+                self.redraw(response, patternOptions);
               }
+              return;
+            }
 
-              if (options.redirectOnResponse === true) {
-                if (typeof options.redirectToUrl === 'function') {
-                  window.parent.location.href = options.redirectToUrl.apply(self, [$action, response, options]);
-                } else {
-                  window.parent.location.href = options.redirectToUrl;
-                }
-                return; // cut out right here since we're changing url
+            if (options.redirectOnResponse === true) {
+              if (typeof options.redirectToUrl === 'function') {
+                window.parent.location.href = options.redirectToUrl.apply(self, [$action, response, options]);
+              } else {
+                window.parent.location.href = options.redirectToUrl;
               }
+              return; // cut out right here since we're changing url
+            }
 
-              if (options.onSuccess) {
-                options.onSuccess(self, response, state, xhr, form);
-              }
+            if (options.onSuccess) {
+              options.onSuccess(self, response, state, xhr, form);
+            }
 
-              if (options.displayInModal === true) {
-                self.redraw(response, patternOptions);
-              } else {
-                $action.trigger('destroy.modal.patterns');
-                // also calls hide
-                if (options.reloadWindowOnClose) {
-                  self.reloadWindow();
-                }
+            if (options.displayInModal === true) {
+              self.redraw(response, patternOptions);
+            } else {
+              $action.trigger('destroy.modal.patterns');
+              // also calls hide
+              if (options.reloadWindowOnClose) {
+                self.reloadWindow();
               }
-              self.trigger('formActionSuccess', [response, state, xhr, form]);
             }
+            self.trigger('formActionSuccess', [response, state, xhr, form]);
+          }
         });
       },
       handleLinkAction: function($action, options, patternOptions) {
@@ -368,11 +369,13 @@ define([
         var $raw = self.$raw.clone();
         // fix for IE9 bug (see http://bugs.jquery.com/ticket/10550)
         $('input:checked', $raw).each(function() {
-          if (this.setAttribute) this.setAttribute('checked', 'checked');
+          if (this.setAttribute) {
+            this.setAttribute('checked', 'checked');
+          }
         });
 
         // Object that will be passed to the template
-        var tpl_object = {
+        var tplObject = {
           title: '',
           prepend: '<div />',
           content: '',
@@ -383,27 +386,27 @@ define([
         // setup the Title
         if (options.title === null) {
           var $title = $(options.titleSelector, $raw);
-          tpl_object.title = $title.html();
+          tplObject.title = $title.html();
           $(options.titleSelector, $raw).remove();
         } else {
-          tpl_object.title = options.title;
+          tplObject.title = options.title;
         }
 
         // Grab items to to insert into the prepend area
         if (options.prependContent) {
-          tpl_object.prepend = $('<div />').append($(options.prependContent, $raw).clone()).html();
+          tplObject.prepend = $('<div />').append($(options.prependContent, $raw).clone()).html();
           $(options.prependContent, $raw).remove();
         }
 
         // Filter out the content if there is a selector provided
         if (options.content) {
-          tpl_object.content = $(options.content, $raw).html();
+          tplObject.content = $(options.content, $raw).html();
         } else {
-          tpl_object.content = $raw.html();
+          tplObject.content = $raw.html();
         }
 
         // Render html
-        self.$modal = $(_.template(self.options.templateOptions.template, tpl_object));
+        self.$modal = $(_.template(self.options.templateOptions.template, tplObject));
         self.$modalDialog = $('> .' + self.options.templateOptions.classDialog, self.$modal);
 
         // In most browsers, when you hit the enter key while a form element is focused
@@ -411,12 +414,12 @@ define([
         // but not when when the default submit button is hidden with 'display: none'.
         // The following code will work around this issue:
         $('form', self.$modal).on ('keydown', function (event) {
-            // ignore keys which are not enter, and ignore enter inside a textarea.
-            if (event.keyCode !== 13 || event.target.nodeName == 'TEXTAREA')
-                return;
-
-            event.preventDefault ();
-            $('input[type=submit], button[type=submit], button:not(type)', this).eq(0).trigger ('click');
+          // ignore keys which are not enter, and ignore enter inside a textarea.
+          if (event.keyCode !== 13 || event.target.nodeName === 'TEXTAREA') {
+            return;
+          }
+          event.preventDefault();
+          $('input[type=submit], button[type=submit], button:not(type)', this).eq(0).trigger('click');
         });
 
         // Setup buttons
@@ -561,13 +564,13 @@ define([
         container: self.$wrapperInner,
         backdrop: self.backdrop,
         wrapper: self.$wrapper,
-        zIndex: function(){
-          if(self.modalInitialized()){
+        zIndex: function() {
+          if (self.modalInitialized()) {
             var zIndex = self.$modal.css('zIndex');
-            if(zIndex){
+            if (zIndex) {
               return parseInt(zIndex, 10) + 1;
             }
-          }else{
+          } else {
             return 10005;
           }
         }
@@ -613,8 +616,8 @@ define([
       self.trigger('before-ajax');
       self.loading.show();
       self.ajaxXHR = $.ajax({
-          url: self.options.ajaxUrl,
-          type: self.options.ajaxType
+        url: self.options.ajaxUrl,
+        type: self.options.ajaxType
       }).done(function(response, textStatus, xhr) {
         self.ajaxXHR = undefined;
         self.loading.hide();
@@ -658,20 +661,20 @@ define([
       absRight = absLeft = absTop = absLeft = 'auto';
 
       // -- HORIZONTAL POSITION -----------------------------------------------
-      if(horpos === 'left') {
+      if (horpos === 'left') {
         absLeft = margin + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the left to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absLeft = '0px';
         }
         returnpos.left = absLeft;
       }
-      else if(horpos === 'right') {
+      else if (horpos === 'right') {
         absRight =  margin + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the right to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absRight = '0px';
         }
         returnpos.right = absRight;
@@ -682,27 +685,27 @@ define([
         absLeft = ((wrapperInnerWidth / 2) - (modalWidth / 2) - margin) + 'px';
         // if the width of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the left to simply be 0
-        if(modalWidth > wrapperInnerWidth) {
+        if (modalWidth > wrapperInnerWidth) {
           absLeft = '0px';
         }
         returnpos.left = absLeft;
       }
 
       // -- VERTICAL POSITION -------------------------------------------------
-      if(vertpos === 'top') {
+      if (vertpos === 'top') {
         absTop = margin + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the top to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absTop = '0px';
         }
         returnpos.top = absTop;
       }
-      else if(vertpos === 'bottom') {
+      else if (vertpos === 'bottom') {
         absBottom = margin + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the bottom to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absBottom = '0px';
         }
         returnpos.bottom = absBottom;
@@ -713,7 +716,7 @@ define([
         absTop = ((wrapperInnerHeight / 2) - (modalHeight / 2) - margin) + 'px';
         // if the height of the wrapper is smaller than the modal, and thus the
         // screen is smaller than the modal, force the top to simply be 0
-        if(modalHeight > wrapperInnerHeight) {
+        if (modalHeight > wrapperInnerHeight) {
           absTop = '0px';
         }
         returnpos.top = absTop;
@@ -721,7 +724,7 @@ define([
 
       return returnpos;
     },
-    modalInitialized: function(){
+    modalInitialized: function() {
       var self = this;
       return self.$modal !== null && self.$modal !== undefined;
     },
@@ -736,7 +739,7 @@ define([
       var self = this;
 
       // modal isn't initialized
-      if(!self.modalInitialized()) { return; }
+      if (!self.modalInitialized()) { return; }
 
       // clear out any previously set styling
       self.$modal.removeAttr('style');
@@ -746,7 +749,7 @@ define([
 
       // if backdrop wrapper is set on body, then wrapper should have height of
       // the window, so we can do scrolling of inner wrapper
-      if(self.$wrapper.parent().is('body')) {
+      if (self.$wrapper.parent().is('body')) {
         self.$wrapper.height($(window.parent).height());
       }
 
@@ -770,9 +773,11 @@ define([
       var wrapperInnerWidth = self.$wrapperInner.width();
       var wrapperInnerHeight = self.$wrapperInner.height();
 
-      var pos = self.findPosition(horpos, vertpos, margin, modalWidth, modalHeight,
-                                  wrapperInnerWidth, wrapperInnerHeight);
-      for(var key in pos) {
+      var pos = self.findPosition(
+        horpos, vertpos, margin, modalWidth, modalHeight,
+        wrapperInnerWidth, wrapperInnerHeight
+      );
+      for (var key in pos) {
         self.$modalDialog.css(key, pos[key]);
       }
     },
@@ -788,8 +793,7 @@ define([
     },
     _show: function() {
       var self = this;
-      self.render.apply(self,
-          [self.options]);
+      self.render.apply(self, [ self.options ]);
       self.trigger('show');
       self.backdrop.show();
       self.$wrapper.show();
@@ -813,8 +817,8 @@ define([
         self.ajaxXHR.abort();
       }
       self.trigger('hide');
-      if(self._suppressHide){
-        if(!confirm(self._suppressHide)){
+      if (self._suppressHide) {
+        if (!confirm(self._suppressHide)) {
           return;
         }
       }
diff --git a/js/patterns/moment.js b/js/patterns/moment.js
index c7d0aa9..b5762d1 100644
--- a/js/patterns/moment.js
+++ b/js/patterns/moment.js
@@ -92,7 +92,7 @@ define([
   'mockup-patterns-base',
   'moment'
 ], function($, Base, moment) {
-  "use strict";
+  'use strict';
 
   var Moment = Base.extend({
     name: 'moment',
@@ -102,34 +102,34 @@ define([
       // also available options are relative, calendar
       format: 'MMMM Do YYYY, h:mm:ss a'
     },
-    convert: function($el){
+    convert: function($el) {
       var self = this;
       var date = $el.attr('data-date');
-      if(!date){
+      if (!date) {
         date = $.trim($el.html());
       }
       date = moment(date);
-      if(!date.isValid()){
+      if (!date.isValid()) {
         return;
       }
-      if(self.options.format === 'relative'){
+      if (self.options.format === 'relative') {
         date = date.fromNow();
-      }else if(self.options.format === 'calendar'){
+      }else if (self.options.format === 'calendar') {
         date = date.calendar();
-      }else{
+      } else {
         date = date.format(self.options.format);
       }
-      if(date){
+      if (date) {
         $el.html(date);
       }
     },
     init: function() {
       var self = this;
-      if(self.options.selector){
-        self.$el.find(self.options.selector).each(function(){
+      if (self.options.selector) {
+        self.$el.find(self.options.selector).each(function() {
           self.convert($(this));
         });
-      }else{
+      } else {
         self.convert(self.$el);
       }
     }
diff --git a/js/patterns/pickadate.js b/js/patterns/pickadate.js
index c53d5fd..4ce24de 100644
--- a/js/patterns/pickadate.js
+++ b/js/patterns/pickadate.js
@@ -81,7 +81,7 @@ define([
   'picker.date',
   'picker.time'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var PickADate = Base.extend({
     name: 'pickadate',
diff --git a/js/patterns/picture.js b/js/patterns/picture.js
index 521978a..01fdfab 100644
--- a/js/patterns/picture.js
+++ b/js/patterns/picture.js
@@ -9,7 +9,7 @@
  *    # Responsive images pattern
  *
  *    This pattern loads the last image that fulfills the media-query
- *    criteria. When multiple pictures are displayed, it loads the images 
+ *    criteria. When multiple pictures are displayed, it loads the images
  *    within the visible viewport first. Will update images on resize event.
  *
  *    # Examples
@@ -61,10 +61,10 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Picture = Base.extend({
-    name: "picture",
+    name: 'picture',
     defaults: {
       alt: null,
       className: {
@@ -80,14 +80,14 @@ define([
     init: function() {
       var self = this,
           resizeHandler;
-      if (Picture.__queue_picture_patterns === undefined) {
-        Picture.__queue_picture_patterns = [];
+      if (Picture.__queuePicturePatterns === undefined) {
+        Picture.__queuePicturePatterns = [];
         $(window).on('queue.picture.patterns', function() {
-          if ($('.pat-picture').length === Picture.__queue_picture_patterns.length) {
-            $.each(Picture.__queue_picture_patterns, function(index, val) {
+          if ($('.pat-picture').length === Picture.__queuePicturePatterns.length) {
+            $.each(Picture.__queuePicturePatterns, function(index, val) {
               val.display();
             });
-            Picture.__queue_picture_patterns = [];
+            Picture.__queuePicturePatterns = [];
           }
         });
       }
@@ -105,9 +105,9 @@ define([
       var self = this;
 
       if (self.visible()) {
-        Picture.__queue_picture_patterns.unshift(self);
+        Picture.__queuePicturePatterns.unshift(self);
       } else {
-        Picture.__queue_picture_patterns.push(self);
+        Picture.__queuePicturePatterns.push(self);
       }
       self.trigger('queue');
     },
@@ -117,7 +117,7 @@ define([
           matches = [],
           $img = $('img', self.$el);
 
-      $('[' + self.options.attribute.src +']', self.$el).each(function() {
+      $('[' + self.options.attribute.src + ']', self.$el).each(function() {
         var $candidate = $(this);
         if (!$candidate.attr(self.options.attribute.media) ||
             self.matchMedia($candidate.attr(self.options.attribute.media))) {
@@ -167,12 +167,12 @@ define([
           fakeBody = document.createElement('body'),
           div = document.createElement('div');
 
-      div.id = "mq-test-1";
-      div.style.cssText = "position:absolute;top:-100em";
-      fakeBody.style.background = "none";
+      div.id = 'mq-test-1';
+      div.style.cssText = 'position:absolute;top:-100em';
+      fakeBody.style.background = 'none';
       fakeBody.appendChild(div);
 
-      div.innerHTML = "­<style media=\"" + mediaQuery + "\"> #mq-test-1 { width: 42px; }</style>";
+      div.innerHTML = '­<style media="' + mediaQuery + '"> #mq-test-1 { width: 42px; }</style>';
       docElem.insertBefore(fakeBody, refNode);
       bool = div.offsetWidth === 42;
       docElem.removeChild(fakeBody);
diff --git a/js/patterns/preventdoublesubmit.js b/js/patterns/preventdoublesubmit.js
index 22eca19..c6c3a7d 100644
--- a/js/patterns/preventdoublesubmit.js
+++ b/js/patterns/preventdoublesubmit.js
@@ -39,10 +39,10 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var PreventDoubleSubmit = Base.extend({
-    name: "preventdoublesubmit",
+    name: 'preventdoublesubmit',
     defaults: {
       message : 'You already clicked the submit button. ' +
                 'Do you really want to submit this form again?',
@@ -53,11 +53,11 @@ define([
       var self = this;
 
       // if this is not a form just return
-      if(!self.$el.is('form')){
+      if (!self.$el.is('form')) {
         return;
       }
 
-      $(':submit', self.$el).click(function(e){
+      $(':submit', self.$el).click(function(e) {
 
         // mark the button as clicked
         $(':submit').removeAttr('clicked');
@@ -66,7 +66,7 @@ define([
         // if submitting and no opt-out guardClassName is found
         // pop up confirmation dialog
         if ($(this).hasClass(self.options.guardClassName) &&
-              !$(this).hasClass(self.options.optOutClassName)){
+              !$(this).hasClass(self.options.optOutClassName)) {
           return self._confirm.call(self);
         }
 
diff --git a/js/patterns/querystring.js b/js/patterns/querystring.js
index f2a23df..318155a 100644
--- a/js/patterns/querystring.js
+++ b/js/patterns/querystring.js
@@ -28,7 +28,7 @@
  *    {{ example-1 }}
  *
  *    # Without Previews
- *    
+ *
  *    {{ example-2 }}
  *
  * Example: example-1
@@ -65,7 +65,7 @@ define([
   'mockup-patterns-pickadate',
   'select2'
 ], function($, Base, Select2, PickADate, undefined) {
-  "use strict";
+  'use strict';
 
   var Criteria = function() { this.init.apply(this, arguments); };
   Criteria.prototype = {
@@ -98,12 +98,12 @@ define([
               .appendTo($el);
 
       // Remove button
-      self.$remove = $('<div>'+self.options.remove+'</div>')
-              .addClass(self.options.classRemoveName)
-              .appendTo(self.$wrapper)
-              .on('click', function(e) {
-                self.remove();
-              });
+      self.$remove = $('<div>' + self.options.remove + '</div>')
+        .addClass(self.options.classRemoveName)
+        .appendTo(self.$wrapper)
+        .on('click', function(e) {
+          self.remove();
+        });
 
       // Index selection
       self.$index = $('<select><option></option></select>')
@@ -119,24 +119,26 @@ define([
           }
           self.indexGroups[options.group].append(
             $('<option/>')
-                .attr('value', value)
-                .html(options.title));
+              .attr('value', value)
+              .html(options.title)
+          );
         }
       });
 
       // attach index select to DOM
       self.$wrapper.append(
-          $('<div/>')
-              .addClass(self.options.classIndexName)
-              .append(self.$index));
+        $('<div/>')
+          .addClass(self.options.classIndexName)
+          .append(self.$index)
+      );
 
       // add blink (select2)
       self.$index
         .patternSelect2({
-            width: self.options.indexWidth,
-            placeholder: self.options.placeholder
+          width: self.options.indexWidth,
+          placeholder: self.options.placeholder
         })
-        .on("change", function(e) {
+        .on('change', function(e) {
           self.removeValue();
           self.createOperator(e.val);
           self.createClear();
@@ -168,14 +170,15 @@ define([
 
       // attach operators select to DOM
       self.$wrapper.append(
-          $('<div/>')
-              .addClass(self.options.classOperatorName)
-              .append(self.$operator));
+        $('<div/>')
+          .addClass(self.options.classOperatorName)
+          .append(self.$operator)
+      );
 
       // add blink (select2)
       self.$operator
         .patternSelect2({ width: '10em' })
-        .on("change", function(e) {
+        .on('change', function(e) {
           self.createValue(index);
           self.createClear();
           self.trigger('operator-changed');
@@ -204,7 +207,7 @@ define([
                 .addClass(self.options.classValueName + '-' + widget)
                 .val(value)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -214,22 +217,22 @@ define([
                 .appendTo($wrapper)
                 .patternPickadate({
                   time: false,
-                  date: { format: "dd/mm/yyyy" }
+                  date: { format: 'dd/mm/yyyy' }
                 })
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
       } else if (widget === 'DateRangeWidget') {
         var startwrap = $('<span/>').appendTo($wrapper);
         var startdt = $('<input type="text"/>')
-                        .addClass(self.options.classValueName + '-' + widget)
-                        .addClass(self.options.classValueName + '-' + widget + '-start')
-                        .appendTo(startwrap)
-                        .patternPickadate({
-                          time: false,
-                          date: { format: "dd/mm/yyyy" }
-                        });
+          .addClass(self.options.classValueName + '-' + widget)
+          .addClass(self.options.classValueName + '-' + widget + '-start')
+          .appendTo(startwrap)
+          .patternPickadate({
+            time: false,
+            date: { format: 'dd/mm/yyyy' }
+          });
         $wrapper.append(
           $('<span/>')
             .html(self.options.betweendt)
@@ -242,7 +245,7 @@ define([
                         .appendTo(endwrap)
                         .patternPickadate({
                           time: false,
-                          date: { format: "dd/mm/yyyy" }
+                          date: { format: 'dd/mm/yyyy' }
                         });
         $wrapper.find('.picker__input').change(function() {
           self.trigger('value-changed');
@@ -254,7 +257,7 @@ define([
                 .after($('<span/>').html(self.options.days))
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -262,7 +265,7 @@ define([
         self.$value = $('<input type="text"/>')
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -271,7 +274,7 @@ define([
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
                 .val(value)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
 
@@ -279,7 +282,7 @@ define([
         self.$value = $('<select/>').attr('multiple', true)
                 .addClass(self.options.classValueName + '-' + widget)
                 .appendTo($wrapper)
-                .change(function(){
+                .change(function() {
                   self.trigger('value-changed');
                 });
         if (self.indexes[index]) {
@@ -293,7 +296,7 @@ define([
         self.$value.patternSelect2({ width: '250px' });
       }
 
-      if(value !== undefined && typeof self.$value !== 'undefined') {
+      if (value !== undefined && typeof self.$value !== 'undefined') {
         self.$value.select2('val', value);
       }
 
@@ -334,8 +337,8 @@ define([
     removeValue: function() {
       var self = this;
       self.trigger('remove-value');
-      if(self.$value) {
-        if($.isArray(self.$value)) { // date ranges have 2 values
+      if (self.$value) {
+        if ($.isArray(self.$value)) { // date ranges have 2 values
           self.$value[0].parents('.querystring-criteria-value').remove();
         }
         else {
@@ -350,26 +353,26 @@ define([
 
       // index
       var ival = self.$index.select2('val');
-      if(ival === "") { // no index selected, no query
-        return "";
+      if (ival === '') { // no index selected, no query
+        return '';
       }
-      var istr = 'query.i:records='+ival;
+      var istr = 'query.i:records=' + ival;
 
       // operator
-      if(typeof self.$operator === "undefined") { // no operator, no query
-        return "";
+      if (typeof self.$operator === 'undefined') { // no operator, no query
+        return '';
       }
       var oval = self.$operator.val(),
-          ostr = 'query.o:records='+oval;
+          ostr = 'query.o:records=' + oval;
 
       // value(s)
       var vstrbase = 'query.v:records=',
           vstrlistbase = 'query.v:records:list=',
           vstr = [];
-      if(typeof self.$value === "undefined") {
+      if (typeof self.$value === 'undefined') {
         vstr.push(vstrbase);
       }
-      else if($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
+      else if ($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
         $.each(self.$value, function(i, v) {
           vstr.push(vstrlistbase + $(this).parent().find('.picker__input').val());
         });
@@ -385,38 +388,38 @@ define([
 
       // index
       var ival = self.$index.select2('val');
-      if(ival === "") { // no index selected, no query
-        return "";
+      if (ival === '') { // no index selected, no query
+        return '';
       }
 
       // operator
-      if(typeof self.$operator === "undefined") { // no operator, no query
-        return "";
+      if (typeof self.$operator === 'undefined') { // no operator, no query
+        return '';
       }
       var oval = self.$operator.val();
 
       // value(s)
       var varr = [];
-      if($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
+      if ($.isArray(self.$value)) { // handles only datepickers from the 'between' operator right now
         $.each(self.$value, function(i, v) {
           varr.push($(this).parent().find('.picker__input').val());
         });
       }
-      else if(typeof self.$value !== "undefined") {
+      else if (typeof self.$value !== 'undefined') {
         varr.push(self.$value.val());
       }
       var vval;
-      if(varr.length > 1) {
-        vval = '["'+varr.join('","')+'"]';
+      if (varr.length > 1) {
+        vval = '[j' + varr.join('","') + '"]';
       }
-      else if(varr.length === 1) {
+      else if (varr.length === 1) {
         vval = JSON.stringify(varr[0]);
       }
       else {
         vval = '""';
       }
 
-      return '{"i":"'+ival+'", "o":"'+oval+'", "v":'+vval+'}';
+      return '{"i":"' + ival + '", "o":"' + oval + '", "v":' + vval + '}';
     },
     trigger: function(name) {
       this.$wrapper.trigger(name + '-criteria.querystring.patterns', [ this ]);
@@ -464,23 +467,23 @@ define([
       // initialization can be detailed if by ajax
       self.initialized = false;
 
-      if(self.options.indexOptionsUrl){
+      if (self.options.indexOptionsUrl) {
         $.ajax({
           url: self.options.indexOptionsUrl,
-          success: function(data){
+          success: function(data) {
             self.options.indexes = data.indexes;
-            self.options.sortable_indexes = data.sortable_indexes;
+            self.options['sortable_indexes'] = data['sortable_indexes']; // jshint ignore:line
             self._init();
           },
-          error: function(xhr){
+          error: function(xhr) {
             // XXX handle this...
           }
         });
-      }else{
+      } else {
         self._init();
       }
     },
-    _init: function(){
+    _init: function() {
       var self = this;
       self.$criteriaWrapper = $('<div/>')
         .addClass(self.options.classWrapperName)
@@ -490,10 +493,10 @@ define([
         .addClass(self.options.classSortWrapperName)
         .appendTo(self.$wrapper);
 
-      if(self.options.showPreviews === 'false'){
+      if (self.options.showPreviews === 'false') {
         self.options.showPreviews = false;
       }
-      if(self.options.showPreviews){
+      if (self.options.showPreviews) {
         self.$previewWrapper = $('<div/>')
           .addClass(self.options.classPreviewWrapperName)
           .appendTo(self.$wrapper);
@@ -525,7 +528,7 @@ define([
       self.createSort();
 
       // add criteria preview pane to see results from criteria query
-      if(self.options.showPreviews){
+      if (self.options.showPreviews) {
         self.refreshPreviewEvent();
       }
       self.$el.trigger('initialized');
@@ -537,13 +540,13 @@ define([
             self.options.indexes, index, operator, value);
 
       criteria.on('remove', function(e) {
-        if (self.criterias[self.criterias.length-1] === criteria) {
+        if (self.criterias[self.criterias.length - 1] === criteria) {
           self.createCriteria();
         }
       });
 
       criteria.on('index-changed', function(e) {
-        if (self.criterias[self.criterias.length-1] === criteria) {
+        if (self.criterias[self.criterias.length - 1] === criteria) {
           self.createCriteria();
         }
       });
@@ -553,8 +556,8 @@ define([
         self.updateValue();
       };
 
-      criteria.on('remove', function(e, criteria){
-        if(self.criterias.indexOf(criteria) !== -1){
+      criteria.on('remove', function(e, criteria) {
+        if (self.criterias.indexOf(criteria) !== -1) {
           self.criterias.splice(self.criterias.indexOf(criteria), 1);
         }
         doupdates(e, criteria);
@@ -587,34 +590,31 @@ define([
       self.$sortOn = $('<select/>')
         .attr('name', 'sort_on')
         .appendTo(self.$sortWrapper)
-        .change(function(){
+        .change(function() {
           self.refreshPreviewEvent.call(self);
           $('[id$="sort_on"]', existingSortOn).val($(this).val());
         });
 
       self.$sortOn.append($('<option value="">No sorting</option>')); // default no sorting
-      for(var key in self.options.sortable_indexes) {
+      for (var key in self.options['sortable_indexes']) { // jshint ignore:line
         self.$sortOn.append(
           $('<option/>')
             .attr('value', key)
-            .html(self.options.indexes[key].title));
+            .html(self.options.indexes[key].title)
+        );
       }
       self.$sortOn.patternSelect2({width: 150});
 
-      self.$sortOrder = $("<input type='checkbox' />")
-                          .attr('name', 'sort_reversed:boolean')
-                          .change(function(){
-                            self.refreshPreviewEvent.call(self);
-                            if($(this).attr('checked') === "checked") {
-                              $('.option input[type="checkbox"]', existingSortOrder)
-                                .attr('checked', 'checked');
-                            }
-                            else {
-                              $('.option input[type="checkbox"]', existingSortOrder)
-                                .removeAttr('checked');
-                            }
-                          });
-
+      self.$sortOrder = $('<input type="checkbox" />')
+        .attr('name', 'sort_reversed:boolean')
+        .change(function() {
+          self.refreshPreviewEvent.call(self);
+          if ($(this).attr('checked') === 'checked') {
+            $('.option input[type="checkbox"]', existingSortOrder).attr('checked', 'checked');
+          } else {
+            $('.option input[type="checkbox"]', existingSortOrder).removeAttr('checked');
+          }
+        });
 
       $('<span/>')
         .addClass(self.options.classSortReverseName)
@@ -628,13 +628,13 @@ define([
 
       // if the form already contains the sort fields, hide them! Their values
       // will be synced back and forth between the querystring's form elements
-      if(existingSortOn.length >= 1 && existingSortOrder.length >= 1) {
-        var reversed = $('.option input[type="checkbox"]', existingSortOrder).attr('checked') === "checked";
-        var sort_on = $('[id$="-sort_on"]', existingSortOn).val();
-        if(reversed) {
+      if (existingSortOn.length >= 1 && existingSortOrder.length >= 1) {
+        var reversed = $('.option input[type="checkbox"]', existingSortOrder).attr('checked') === 'checked';
+        var sortOn = $('[id$="-sort_on"]', existingSortOn).val();
+        if (reversed) {
           self.$sortOrder.attr('checked', 'checked');
         }
-        self.$sortOn.select2('val', sort_on);
+        self.$sortOn.select2('val', sortOn);
         $(existingSortOn).hide();
         $(existingSortOrder).hide();
       }
@@ -642,31 +642,31 @@ define([
     refreshPreviewEvent: function() {
       var self = this;
 
-      if(!self.options.showPreviews){
+      if (!self.options.showPreviews) {
         return; // cut out of this if there are no previews available
       }
 
       /* TEMPORARY */
-      //if(typeof self._tmpcnt === "undefined") { self._tmpcnt = 0; }
+      //if (typeof self._tmpcnt === 'undefined') { self._tmpcnt = 0; }
       //self._tmpcnt++;
       /* /TEMPORARY */
 
-      if(typeof self._preview_xhr !== "undefined") {
-        self._preview_xhr.abort();
+      if (typeof self._previewXhr !== 'undefined') {
+        self._previewXhr.abort();
       }
       /*
-      if(typeof self._count_xhr !== "undefined") {
+      if (typeof self._count_xhr !== 'undefined') {
         self._count_xhr.abort();
       }
       */
-      if(typeof self.$previewPane !== "undefined") {
+      if (typeof self.$previewPane !== 'undefined') {
         self.$previewPane.remove();
       }
 
       var query = [], querypart;
       $.each(self.criterias, function(i, criteria) {
         querypart = criteria.buildQueryPart();
-        if(querypart !== "") {
+        if (querypart !== '') {
           query.push(criteria.buildQueryPart());
         }
       });
@@ -675,17 +675,17 @@ define([
         .addClass(self.options.classPreviewName)
         .appendTo(self.$previewWrapper);
 
-      if(query.length <= 0) {
+      if (query.length <= 0) {
         $('<div/>')
           .addClass(self.options.classPreviewCountWrapperName)
-          .html("No results to preview")
+          .html('No results to preview')
           .prependTo(self.$previewPane);
         return; // no query means nothing to send out requests for
       }
 
-      query.push('sort_on='+self.$sortOn.val());
+      query.push('sort_on=' + self.$sortOn.val());
       var sortorder = self.$sortOrder.attr('checked');
-      if(sortorder === "checked") {
+      if (sortorder === 'checked') {
         query.push('sort_order=reverse');
       }
 
@@ -697,15 +697,15 @@ define([
 
       /*
       self._count_xhr = $.get(self.options.previewCountURL + '?' + query.join('&'))
-          .done(function(data, stat){
+          .done(function(data, stat) {
             $('<div/>')
               .addClass(self.options.classPreviewCountWrapperName)
               .html(data)
               .prependTo(self.$previewPane);
           });
       */
-      self._preview_xhr = $.get(self.options.previewURL + '?' + query.join('&'))
-          .done(function(data, stat){
+      self._previewXhr = $.get(self.options.previewURL + '?' + query.join('&'))
+          .done(function(data, stat) {
             $('<div/>')
               .addClass(self.options.classPreviewResultsWrapperName)
               .html(data)
@@ -723,12 +723,12 @@ define([
       var criteriastrs = [];
       $.each(self.criterias, function(i, criteria) {
         var jsonstr = criteria.getJSONListStr();
-        if(jsonstr !== "") {
+        if (jsonstr !== '') {
           criteriastrs.push(jsonstr);
         }
       });
       var existing = self.$el.val();
-      var val = '['+criteriastrs.join(',')+']';
+      var val = '[' + criteriastrs.join(',') + ']';
       self.$el.val(val);
       self.$el.trigger('change');
     }
diff --git a/js/patterns/relateditems.js b/js/patterns/relateditems.js
index ee524ca..a93609c 100644
--- a/js/patterns/relateditems.js
+++ b/js/patterns/relateditems.js
@@ -93,18 +93,18 @@ define([
   'mockup-utils',
   'mockup-patterns-tree'
 ], function($, _, Base, Select2, utils, Tree) {
-  "use strict";
+  'use strict';
 
   var RelatedItems = Base.extend({
-    name: "relateditems",
+    name: 'relateditems',
     browsing: false,
     currentPath: null,
     defaults: {
       vocabularyUrl: null, // must be set to work
       width: '300px',
       multiple: true,
-      tokenSeparators: [",", " "],
-      separator: ",",
+      tokenSeparators: [',', ' '],
+      separator: ',',
       orderable: true,
       cache: true,
       mode: 'search', // possible values are search and browse
@@ -161,7 +161,7 @@ define([
       setupAjax: function() {
         // Setup the ajax object to use during requests
         var self = this;
-        if(self.query.valid){
+        if (self.query.valid) {
           return self.query.selectAjax();
         }
         return {};
@@ -170,25 +170,25 @@ define([
     applyTemplate: function(tpl, item) {
       var self = this;
       var template;
-      if (self.options[tpl+'TemplateSelector']) {
-        template = $(self.options[tpl+'TemplateSelector']).html();
+      if (self.options[tpl + 'TemplateSelector']) {
+        template = $(self.options[tpl + 'TemplateSelector']).html();
         if (!template) {
-          template = self.options[tpl+'Template'];
+          template = self.options[tpl + 'Template'];
         }
       } else {
-        template = self.options[tpl+'Template'];
+        template = self.options[tpl + 'Template'];
       }
       // let's give all the options possible to the template generation
       var options = $.extend(true, {}, self.options, item);
       options._item = item;
       return _.template(template, options);
     },
-    activateBrowsing: function(){
+    activateBrowsing: function() {
       var self = this;
       self.browsing = true;
       self.setBreadCrumbs();
     },
-    deactivateBrowsing: function(){
+    deactivateBrowsing: function() {
       var self = this;
       self.browsing = false;
       self.setBreadCrumbs();
@@ -212,8 +212,8 @@ define([
       var html;
       if (path === '/') {
         var searchText = '';
-        if(self.options.mode === 'search'){
-          searchText = '<em>'+self.options.searchAllText+'</em>';
+        if (self.options.mode === 'search') {
+          searchText = '<em>' + self.options.searchAllText + '</em>';
         }
         html = self.applyTemplate('breadCrumbs', {
           items: searchText,
@@ -232,7 +232,7 @@ define([
             itemsHtml = itemsHtml + self.applyTemplate('breadCrumb', item);
           }
         });
-        html = self.applyTemplate('breadCrumbs', {items:itemsHtml, searchText: self.options.searchText});
+        html = self.applyTemplate('breadCrumbs', {items: itemsHtml, searchText: self.options.searchText});
       }
       var $crumbs = $(html);
       $('a.crumb', $crumbs).on('click', function(e) {
@@ -247,9 +247,9 @@ define([
       var selectedNode = null;
       var treePattern = new Tree($tree, {
         data: [],
-        dataFilter: function(data){
+        dataFilter: function(data) {
           var nodes = [];
-          _.each(data.results, function(item){
+          _.each(data.results, function(item) {
             nodes.push({
               label: item.Title,
               id: item.UID,
@@ -259,36 +259,36 @@ define([
           return nodes;
         }
       });
-      treePattern.$el.bind('tree.select', function(e){
+      treePattern.$el.bind('tree.select', function(e) {
         var node = e.node;
-        if(node && !node._loaded){
+        if (node && !node._loaded) {
           self.currentPath = node.path;
           selectedNode = node;
           treePattern.$el.tree('loadDataFromUrl', self.treeQuery.getUrl(), node);
           node._loaded = true;
         }
       });
-      treePattern.$el.bind('tree.refresh', function(){
+      treePattern.$el.bind('tree.refresh', function() {
         /* the purpose of this is that when new data is loaded, the selected
          * node is cleared. This re-selects it as a user browses structure of site */
-        if(selectedNode){
+        if (selectedNode) {
           treePattern.$el.tree('selectNode', selectedNode);
         }
       });
-      $('a.pattern-relateditems-tree-cancel', $treeContainer).click(function(e){
+      $('a.pattern-relateditems-tree-cancel', $treeContainer).click(function(e) {
         e.preventDefault();
         $treeContainer.fadeOut();
         return false;
       });
 
-      $('a.pattern-relateditems-tree-itemselect', $treeContainer).click(function(e){
+      $('a.pattern-relateditems-tree-itemselect', $treeContainer).click(function(e) {
         e.preventDefault();
         self.browseTo(self.currentPath); // just browse to current path since it's set elsewhere
         $treeContainer.fadeOut();
         return false;
       });
 
-      $treeSelect.on('click', function(e){
+      $treeSelect.on('click', function(e) {
         e.preventDefault();
         self.browsing = true;
         self.currentPath = '/';
@@ -301,22 +301,22 @@ define([
     selectItem: function(item) {
       var self = this;
       self.trigger('selecting');
-      var data = self.$el.select2("data");
+      var data = self.$el.select2('data');
       data.push(item);
-      self.$el.select2("data", data);
+      self.$el.select2('data', data);
       item.selected = true;
       self.trigger('selected');
     },
     deselectItem: function(item) {
       var self = this;
       self.trigger('deselecting');
-      var data = self.$el.select2("data");
+      var data = self.$el.select2('data');
       _.each(data, function(obj, i) {
         if (obj.UID === item.UID) {
           data.splice(i, 1);
         }
       });
-      self.$el.select2("data", data);
+      self.$el.select2('data', data);
       item.selected = false;
       self.trigger('deselected');
     },
@@ -361,16 +361,16 @@ define([
       Select2.prototype.initializeOrdering.call(self);
 
       self.options.formatResult = function(item) {
-        if (!item.Type || _.indexOf(self.options.folderTypes, item.Type) === -1){
+        if (!item.Type || _.indexOf(self.options.folderTypes, item.Type) === -1) {
           item.folderish = false;
-        }else{
+        } else {
           item.folderish = true;
         }
 
         item.selectable = self.isSelectable(item);
 
         if (item.selected === undefined) {
-          var data = self.$el.select2("data");
+          var data = self.$el.select2('data');
           item.selected = false;
           _.each(data, function(obj) {
             if (obj.UID === item.UID) {
@@ -391,9 +391,9 @@ define([
             } else {
               self.selectItem(item);
               $parent.addClass('pattern-relateditems-active');
-              if(self.options.maximumSelectionSize > 0){
+              if (self.options.maximumSelectionSize > 0) {
                 var items = self.$select2.select2('data');
-                if(items.length >= self.options.maximumSelectionSize){
+                if (items.length >= self.options.maximumSelectionSize) {
                   self.$select2.select2('close');
                 }
               }
@@ -417,9 +417,11 @@ define([
           var ids = value.split(self.options.separator);
           self.query.search(
             'UID', 'plone.app.querystring.operation.list.contains', ids,
-            function(data){
+            function(data) {
               callback(data.results);
-          }, false);
+            },
+            false
+          );
         }
       };
 
@@ -438,15 +440,15 @@ define([
       self.$browsePath = $('<span class="pattern-relateditems-path" />');
       self.$container.prepend(self.$browsePath);
 
-      if(self.options.mode === 'search'){
+      if (self.options.mode === 'search') {
         self.deactivateBrowsing();
         self.browsing = false;
-      }else{
+      } else {
         self.activateBrowsing();
         self.browsing = true;
       }
 
-      self.$el.on("select2-selecting", function(event) {
+      self.$el.on('select2-selecting', function(event) {
         event.preventDefault();
       });
 
diff --git a/js/patterns/select2.js b/js/patterns/select2.js
index db92476..b846133 100644
--- a/js/patterns/select2.js
+++ b/js/patterns/select2.js
@@ -82,14 +82,14 @@ define([
   'jquery.event.drag',
   'jquery.event.drop'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var Select2 = Base.extend({
-    name: "select2",
+    name: 'select2',
     defaults: {
-      separator: ","
+      separator: ','
     },
-    initializeValues: function(){
+    initializeValues: function() {
       var self = this;
       // Init Selection ---------------------------------------------
       if (self.options.initialValues) {
@@ -106,7 +106,7 @@ define([
           if (typeof(self.options.initialValues) === 'string' && self.options.initialValues !== '') {
             // if default selection value starts with a '{', then treat the value as
             // a JSON object that needs to be parsed
-            if(self.options.initialValues[0] === '{') {
+            if (self.options.initialValues[0] === '{') {
               seldefaults = JSON.parse(self.options.initialValues);
             }
             // otherwise, treat the value as a list, separated by the defaults.separator value of
@@ -133,7 +133,7 @@ define([
         };
       }
     },
-    initializeTags: function(){
+    initializeTags: function() {
       var self = this;
       if (self.options.tags && typeof(self.options.tags) === 'string') {
         if (self.options.tags.substr(0, 1) === '[') {
@@ -144,33 +144,32 @@ define([
       }
 
       if (self.options.tags && !self.options.allowNewItems) {
-         self.options.data = $.map (self.options.tags, function (value, i) {
-             return { id: value, text: value };
-         });
-         self.options.multiple = true;
-         delete self.options.tags;
+        self.options.data = $.map (self.options.tags, function (value, i) {
+          return { id: value, text: value };
+        });
+        self.options.multiple = true;
+        delete self.options.tags;
       }
     },
-    initializeOrdering: function(){
+    initializeOrdering: function() {
       var self = this;
       if (self.options.orderable) {
-        var formatSelection = function(data, $container){
+        var formatSelection = function(data, $container) {
           return data ? data.text : undefined;
         };
-        if(self.options.formatSelection){
+        if (self.options.formatSelection) {
           formatSelection = self.options.formatSelection;
         }
 
         self.options.formatSelection = function(data, $container) {
           $container.parents('li')
-            .drag("start", function(e, dd) {
+            .drag('start', function(e, dd) {
               $(this).addClass('select2-choice-dragging');
-              self.$el.select2("onSortStart");
+              self.$el.select2('onSortStart');
               $.drop({
                 tolerance: function(event, proxy, target) {
                   var test = event.pageY > (target.top + target.height / 2);
-                  $.data(target.elem, "drop+reorder",
-                         test ? "insertAfter" : "insertBefore" );
+                  $.data(target.elem, 'drop+reorder', test ? 'insertAfter' : 'insertBefore' );
                   return this.contains(target, [event.pageX, event.pageY]);
                 }
               });
@@ -186,22 +185,22 @@ define([
                 left: dd.offsetX
               });
               var drop = dd.drop[0],
-                  method = $.data(drop || {}, "drop+reorder");
+                  method = $.data(drop || {}, 'drop+reorder');
 
               /* XXX Cannot use triple equals here */
-              if (drop && (drop != dd.current || method != dd.method)){
+              if (drop && (drop != dd.current || method != dd.method)) {
                 $(this)[method](drop);
                 dd.current = drop;
                 dd.method = method;
                 dd.update();
               }
             })
-            .drag("end", function(e, dd) {
+            .drag('end', function(e, dd) {
               $(this).removeClass('select2-choice-dragging');
-              self.$el.select2("onSortEnd");
+              self.$el.select2('onSortEnd');
               $( dd.proxy ).remove();
             })
-            .drop("init", function(e, dd ) {
+            .drop('init', function(e, dd ) {
               /*jshint eqeqeq:false */
               /* XXX Cannot use triple equals here */
               return (this == dd.drag) ? false: true;
@@ -210,12 +209,12 @@ define([
         };
       }
     },
-    initializeSelect2: function(){
+    initializeSelect2: function() {
       var self = this;
       self.$el.select2(self.options);
       self.$select2 = self.$el.parent().find('.select2-container');
       self.$el.parent().off('close.modal.patterns');
-      if(self.options.orderable){
+      if (self.options.orderable) {
         self.$select2.addClass('select2-orderable');
       }
     },
@@ -226,7 +225,7 @@ define([
             JSON.parse(self.options.allowNewItems) : true;
 
       if (self.options.ajax || self.options.vocabularyUrl) {
-        if(self.options.vocabularyUrl) {
+        if (self.options.vocabularyUrl) {
           self.options.multiple = true;
           self.options.ajax = self.options.ajax || {};
           self.options.ajax.url = self.options.vocabularyUrl;
@@ -240,34 +239,34 @@ define([
           };
         }
 
-        var query_term = '';
+        var queryTerm = '';
         self.options.ajax = $.extend({
           quietMillis: 300,
           data: function (term, page) {
-            query_term = term;
+            queryTerm = term;
             return {
               query: term,
-              page_limit: 10,
+              'page_limit': 10,
               page: page
             };
           },
           results: function (data, page) {
             var results = data.results;
             if (self.options.vocabularyUrl) {
-              var data_ids = [];
+              var dataIds = [];
               $.each(data.results, function(i, item) {
-                data_ids.push(item.id);
+                dataIds.push(item.id);
               });
               results = [];
 
-              var have_result = query_term === '' || $.inArray(query_term, data_ids) >= 0;
-              if (self.options.allowNewItems && !have_result) {
-                  results.push({id:query_term, text:query_term});
+              var haveResult = queryTerm === '' || $.inArray(queryTerm, dataIds) >= 0;
+              if (self.options.allowNewItems && !haveResult) {
+                results.push({id: queryTerm, text: queryTerm});
               }
 
-              if (have_result || self.options.allowNewItems) {
+              if (haveResult || self.options.allowNewItems) {
                 $.each(data.results, function(i, item) {
-                    results.push(item);
+                  results.push(item);
                 });
               }
             }
@@ -278,16 +277,13 @@ define([
         // Multiselects need to be converted to input[type=hidden]
         // for Select2
         var vals = self.$el.val() || [];
-        var options = $.map(self.$el.find('option'),
-                            function (o) {
-                                return {text: $(o).html(), id: o.value};
-                            });
+        var options = $.map(self.$el.find('option'), function (o) { return {text: $(o).html(), id: o.value}; });
         var $hidden = $('<input type="hidden" />');
         $hidden.val(vals.join(self.options.separator));
         $hidden.attr('class', self.$el.attr('class'));
         $hidden.attr('name', self.$el.attr('name'));
         $hidden.attr('id', self.$el.attr('id'));
-        self.$orig_el = self.$el;
+        self.$orig = self.$el;
         self.$el.replaceWith($hidden);
         self.$el = $hidden;
         self.options.data = options;
diff --git a/js/patterns/sortable.js b/js/patterns/sortable.js
index 8d65b7e..36c62e4 100644
--- a/js/patterns/sortable.js
+++ b/js/patterns/sortable.js
@@ -65,10 +65,10 @@ define([
   'jquery.event.drag',
   'jquery.event.drop'
 ], function($, Base, drag, drop) {
-  "use strict";
+  'use strict';
 
   var SortablePattern = Base.extend({
-    name: "sortable",
+    name: 'sortable',
     defaults: {
       selector: 'li',
       dragClass: 'item-dragging',
@@ -84,13 +84,12 @@ define([
         $(dragged).addClass(self.options.dragClass);
         drop({
           tolerance: function(event, proxy, target) {
-            if($(target.elem).closest(self.$el).length === 0){
+            if ($(target.elem).closest(self.$el).length === 0) {
               /* prevent dragging conflict over another drag area */
               return;
             }
             var test = event.pageY > (target.top + target.height / 2);
-            $.data(target.elem, "drop+reorder",
-                   test ? "insertAfter" : "insertBefore" );
+            $.data(target.elem, 'drop+reorder', test ? 'insertAfter' : 'insertBefore' );
             return this.contains(target, [event.pageX, event.pageY]);
           }
         });
@@ -107,9 +106,9 @@ define([
           left: dd.offsetX
         });
         var drop = dd.drop[0],
-            method = $.data(drop || {}, "drop+reorder");
+            method = $.data(drop || {}, 'drop+reorder');
         /* XXX Cannot use triple equals here */
-        if (method && drop && (drop != dd.current || method != dd.method)){
+        if (method && drop && (drop != dd.current || method != dd.method)) {
           $(this)[method](drop);
           dd.current = drop;
           dd.method = method;
@@ -120,7 +119,7 @@ define([
         var $el = $(this);
         $el.removeClass(self.options.dragClass);
         $(dd.proxy).remove();
-        if(self.options.drop){
+        if (self.options.drop) {
           self.options.drop($el, $el.index() - start);
         }
       })
diff --git a/js/patterns/structure/collections/result.js b/js/patterns/structure/collections/result.js
index 921d777..75bd323 100644
--- a/js/patterns/structure/collections/result.js
+++ b/js/patterns/structure/collections/result.js
@@ -29,32 +29,32 @@ define([
   'js/patterns/structure/models/result',
   'backbone.paginator'
 ], function(_, Backbone, Result) {
-"use strict";
+  'use strict';
 
   var ResultCollection = Backbone.Paginator.requestPager.extend({
     model: Result,
     queryHelper: null, // need to set
-    initialize: function(models, options){
+    initialize: function(models, options) {
       this.options = options;
       this.url = options.url;
       this.queryParser = options.queryParser;
       this.queryHelper = options.queryHelper;
       Backbone.Paginator.requestPager.prototype.initialize.apply(this, [models, options]);
     },
-    pager: function(){
+    pager: function() {
       this.trigger('pager');
       Backbone.Paginator.requestPager.prototype.pager.apply(this, []);
     },
-    paginator_core: {
+    'paginator_core': {
       // the type of the request (GET by default)
       type: 'GET',
       // the type of reply (jsonp by default)
       dataType: 'json',
-      url: function(){
+      url: function() {
         return this.url;
       }
     },
-    paginator_ui: {
+    'paginator_ui': {
       // the lowest page index your API allows to be accessed
       firstPage: 1,
       // which page should the paginator start from
@@ -63,15 +63,15 @@ define([
       // how many items per page should be shown
       perPage: 15
     },
-    server_api: {
-      query: function(){
+    'server_api': {
+      query: function() {
         return this.queryParser();
       },
-      batch: function(){
+      batch: function() {
         this.queryHelper.options.batchSize = this.perPage;
         return JSON.stringify(this.queryHelper.getBatch(this.currentPage));
       },
-      attributes: function(){
+      attributes: function() {
         return JSON.stringify(this.queryHelper.options.attributes);
       }
     },
@@ -80,7 +80,7 @@ define([
       var results = response.results;
       // XXX manually set sort order here since backbone will otherwise
       // do arbitrary sorting?
-      _.each(results, function(item, idx){
+      _.each(results, function(item, idx) {
         item._sort = idx;
       });
       return results;
diff --git a/js/patterns/structure/collections/selected.js b/js/patterns/structure/collections/selected.js
index eec85e8..2ea969c 100644
--- a/js/patterns/structure/collections/selected.js
+++ b/js/patterns/structure/collections/selected.js
@@ -27,21 +27,21 @@ define([
   'backbone',
   'js/patterns/structure/models/result'
 ], function(Backbone, Result) {
-"use strict";
+  'use strict';
 
   var SelectedCollection = Backbone.Collection.extend({
     model: Result,
-    removeResult: function(model){
+    removeResult: function(model) {
       return this.removeByUID(model.uid());
     },
-    removeByUID: function(uid){
+    removeByUID: function(uid) {
       var found = this.getByUID(uid);
-      if(found){
+      if (found) {
         this.remove(found);
       }
       return found;
     },
-    getByUID: function(uid){
+    getByUID: function(uid) {
       return this.findWhere({UID: uid});
     }
   });
diff --git a/js/patterns/structure/models/result.js b/js/patterns/structure/models/result.js
index 001c06d..d4eb707 100644
--- a/js/patterns/structure/models/result.js
+++ b/js/patterns/structure/models/result.js
@@ -24,16 +24,16 @@
 
 
 define(['backbone'], function(Backbone) {
-  "use strict";
+  'use strict';
 
   var Result = Backbone.Model.extend({
-    defaults: function(){
+    defaults: function() {
       return {
-        is_folderish: false,
-        review_state: ''
+        'is_folderish': false,
+        'review_state': ''
       };
     },
-    uid: function(){
+    uid: function() {
       return this.attributes.UID;
     }
   });
diff --git a/js/patterns/structure/pattern.js b/js/patterns/structure/pattern.js
index 81f140a..f09f758 100644
--- a/js/patterns/structure/pattern.js
+++ b/js/patterns/structure/pattern.js
@@ -54,7 +54,7 @@ define([
   'text!js/patterns/structure/templates/table.xml',
   'text!js/ui/templates/popover.xml'
 ], function($, Base, utils, AppView) {
-  "use strict";
+  'use strict';
 
   var Structure = Base.extend({
     name: 'structure',
@@ -66,10 +66,12 @@ define([
       contextInfoUrl: null, // for add new dropdown and other info
       setDefaultPageUrl: null,
       backdropSelector: '.modal', // Element upon which to apply backdrops used for popovers
-      attributes: ['UID', 'Title', 'Type', 'path', 'review_state',
-                   'ModificationDate', 'EffectiveDate', 'CreationDate',
-                   'is_folderish', 'Subject', 'getURL', 'id', 'exclude_from_nav',
-                   'getObjSize', 'last_comment_date', 'total_comments'],
+      attributes: [
+        'UID', 'Title', 'Type', 'path', 'review_state',
+        'ModificationDate', 'EffectiveDate', 'CreationDate',
+        'is_folderish', 'Subject', 'getURL', 'id', 'exclude_from_nav',
+        'getObjSize', 'last_comment_date', 'total_comments'
+      ],
       activeColumns: [
         'ModificationDate',
         'EffectiveDate',
diff --git a/js/patterns/structure/views/addmenu.js b/js/patterns/structure/views/addmenu.js
index 1cb1570..4188d96 100644
--- a/js/patterns/structure/views/addmenu.js
+++ b/js/patterns/structure/views/addmenu.js
@@ -22,6 +22,7 @@
 // Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 //
 
+/* global alert:true */
 
 define([
   'jquery',
@@ -33,19 +34,19 @@ define([
   'mockup-utils',
   'bootstrap-dropdown'
 ], function($, _, Backbone, ButtonGroup, ButtonView, Modal, utils) {
-  "use strict";
+  'use strict';
 
   var AddMenu = ButtonGroup.extend({
     title: 'Add',
     className: 'btn-group addnew',
     events: {
     },
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       ButtonGroup.prototype.initialize.apply(self, [options]);
-      self.app.on('context-info-loaded', function(data){
+      self.app.on('context-info-loaded', function(data) {
         self.$items.empty();
-        _.each(data.addButtons, function(item){
+        _.each(data.addButtons, function(item) {
           var view = new ButtonView({
             id: item.id,
             title: item.title,
@@ -57,14 +58,14 @@ define([
 
           wrap.append(view.el);
           self.$items.append(wrap);
-          view.$el.click(function(e){
+          view.$el.click(function(e) {
             self.buttonClicked.apply(self, [e, view]);
             return false;
           });
         });
       });
     },
-    buttonClicked: function(e, button){
+    buttonClicked: function(e, button) {
       var self = this;
       e.preventDefault();
       self.app.loading.show();
@@ -75,7 +76,7 @@ define([
         data: {
           '_authenticator': $('[name="_authenticator"]').val(),
         },
-        success: function(response){
+        success: function(response) {
           self.app.loading.hide();
           var modal = new Modal(self.$el, {
             html: utils.parseBodyTag(response),
@@ -91,14 +92,14 @@ define([
             },
             actions: {
               'input#form-buttons-save, .formControls input[name="form.button.save"]': {
-                onSuccess: function(modal, response, state, xhr, form){
+                onSuccess: function(modal, response, state, xhr, form) {
                   self.app.collection.pager();
-                  if(self.$items.is(':visible')){
+                  if (self.$items.is(':visible')) {
                     self.$dropdown.dropdown('toggle');
                   }
                   modal.hide();
                 },
-                onError: function(){
+                onError: function() {
                   alert('error on form');
                 }
               },
@@ -109,13 +110,13 @@ define([
           });
           modal.show();
         },
-        error: function(){
+        error: function() {
           // XXX handle error
           self.app.loading.hide();
         }
       });
     },
-    render: function(){
+    render: function() {
       var self = this;
       self.$el.empty();
 
diff --git a/js/patterns/structure/views/app.js b/js/patterns/structure/views/app.js
index 3c7250f..dce9794 100644
--- a/js/patterns/structure/views/app.js
+++ b/js/patterns/structure/views/app.js
@@ -54,7 +54,7 @@ define([
             WorkflowView, DeleteView, RenameView, RearrangeView, SelectionButtonView,
             PagingView, AddMenu, ColumnsView, TextFilterView, ResultCollection,
             SelectedCollection, DropZone, utils) {
-  "use strict";
+  'use strict';
 
   var DISABLE_EVENT = 'DISABLE';
 
@@ -85,12 +85,12 @@ define([
     status: '',
     statusType: 'warning',
     pasteOperation: null,
-    sort_on: 'getObjPositionInParent',
-    sort_order: 'ascending',
+    'sort_on': 'getObjPositionInParent',
+    'sort_order': 'ascending',
     additionalCriterias: [],
     pasteSelection: null,
     cookieSettingPrefix: '_fc_',
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       BaseView.prototype.initialize.apply(self, [options]);
       self.setAllCookieSettings();
@@ -101,21 +101,21 @@ define([
 
       self.collection = new ResultCollection([], {
         url: self.options.collectionUrl,
-        queryParser: function(){
+        queryParser: function() {
           var term = null;
-          if(self.toolbar){
+          if (self.toolbar) {
             term = self.toolbar.get('filter').term;
           }
-          var sort_on = self.sort_on;
-          if(!sort_on){
-            sort_on = 'getObjPositionInParent';
+          var sortOn = self['sort_on']; // jshint ignore:line
+          if (!sortOn) {
+            sortOn = 'getObjPositionInParent';
           }
           return JSON.stringify({
             criteria: self.queryHelper.getCriterias(term, {
               additionalCriterias: self.additionalCriterias
             }),
-            sort_on: sort_on,
-            sort_order: self.sort_order
+            'sort_on': sortOn,
+            'sort_order': self['sort_order'] // jshint ignore:line
           });
         },
         queryHelper: self.options.queryHelper
@@ -136,7 +136,7 @@ define([
       });
 
       self.buttonViews = {};
-      _.map(self.buttonViewMapping, function(ViewClass, key, list){
+      _.map(self.buttonViewMapping, function(ViewClass, key, list) {
         var name = key.split('.');
         var group = name[0];
         var buttonName = name[1];
@@ -155,7 +155,7 @@ define([
           self.toolbar.get('selected').enable();
           self.buttons.primary.enable();
           self.buttons.secondary.enable();
-          if(!self.pasteAllowed){
+          if (!self.pasteAllowed) {
             self.buttons.primary.get('paste').disable();
           }
         } else {
@@ -165,36 +165,37 @@ define([
         }
       }, self);
 
-      self.collection.on('sync', function(){
+      self.collection.on('sync', function() {
         // need to reload models inside selectedCollection so they get any
         // updated metadata
-        if(self.selectedCollection.models.length > 0){
+        if (self.selectedCollection.models.length > 0) {
           var uids = [];
-          self.selectedCollection.each(function(item){
+          self.selectedCollection.each(function(item) {
             uids.push(item.attributes.UID);
           });
           self.queryHelper.search(
             'UID', 'plone.app.querystring.operation.list.contains',
             uids,
-            function(data){
-              _.each(data.results, function(attributes){
+            function(data) {
+              _.each(data.results, function(attributes) {
                 var item = self.selectedCollection.getByUID(attributes.UID);
                 item.attributes = attributes;
               });
             },
-            false);
+            false
+          );
         }
 
-        if(self.contextInfoUrl){
+        if (self.contextInfoUrl) {
           $.ajax({
             url: self.getAjaxUrl(self.contextInfoUrl),
             dataType: 'json',
-            success: function(data){
+            success: function(data) {
               self.trigger('context-info-loaded', data);
             },
-            error: function(response){
+            error: function(response) {
               // XXX handle error?
-              if(response.status === 404){
+              if (response.status === 404) {
                 console.log('context info url not found');
               }
             }
@@ -203,71 +204,71 @@ define([
         self.loading.hide();
       });
 
-      self.collection.on('pager', function(){
+      self.collection.on('pager', function() {
         self.loading.show();
       });
 
       /* detect key events */
-      $(document).bind('keyup keydown', function(e){
+      $(document).bind('keyup keydown', function(e) {
         self.keyEvent = e;
       });
 
     },
-    inQueryMode: function(){
-      if(this.additionalCriterias.length > 0){
+    inQueryMode: function() {
+      if (this.additionalCriterias.length > 0) {
         return true;
       }
-      if(this.sort_on && this.sort_on !== 'getObjPositionInParent'){
+      if (this['sort_on'] && this['sort_on'] !== 'getObjPositionInParent') { // jshint ignore:line
         return true;
       }
-      if(this.sort_order !== 'ascending'){
+      if (this['sort_order'] !== 'ascending') { // jshint ignore:line
         return true;
       }
       return false;
     },
-    getSelectedUids: function(collection){
+    getSelectedUids: function(collection) {
       var self = this;
-      if(collection === undefined){
+      if (collection === undefined) {
         collection = self.selectedCollection;
       }
       var uids = [];
-      collection.each(function(item){
+      collection.each(function(item) {
         uids.push(item.uid());
       });
       return uids;
     },
-    getAjaxUrl: function(url){
+    getAjaxUrl: function(url) {
       return url.replace('{path}', this.options.queryHelper.getCurrentPath());
     },
-    defaultButtonClickEvent: function(button){
+    defaultButtonClickEvent: function(button) {
       var self = this;
       var data = null, callback = null;
 
-      if(button.url){
+      if (button.url) {
         self.loading.show();
         // handle ajax now
 
-        if(arguments.length > 1){
+        if (arguments.length > 1) {
           var arg1 = arguments[1];
-          if(!arg1.preventDefault){
+          if (!arg1.preventDefault) {
             data = arg1;
           }
         }
-        if(arguments.length > 2){
+        if (arguments.length > 2) {
           var arg2 = arguments[2];
-          if(typeof(arg2) === 'function'){
+          if (typeof(arg2) === 'function') {
             callback = arg2;
           }
         }
-        if(data === null){
+        if (data === null) {
           data = {};
         }
-        if(data.selection === undefined){
+        if (data.selection === undefined) {
           // if selection is overridden by another mechanism
           data.selection = JSON.stringify(self.getSelectedUids());
         }
         data._authenticator = $('input[name="_authenticator"]').val();
-        if(data.folder === undefined){
+        if (data.folder === undefined) {
           data.folder = self.options.queryHelper.getCurrentPath();
         }
 
@@ -276,42 +277,42 @@ define([
           url: url,
           type: 'POST',
           data: data,
-          success: function(data){
+          success: function(data) {
             self.ajaxSuccessResponse.apply(self, [data, callback]);
             self.loading.hide();
           },
-          error: function(response){
+          error: function(response) {
             self.ajaxErrorResponse.apply(self, [response, url]);
             self.loading.hide();
           }
         }, self);
       }
     },
-    ajaxSuccessResponse: function(data, callback){
+    ajaxSuccessResponse: function(data, callback) {
       var self = this;
-      if(data.status === 'success'){
+      if (data.status === 'success') {
         self.collection.reset();
       }
-      if(data.msg){
+      if (data.msg) {
         // give status message somewhere...
         self.setStatus(data.msg);
       }
-      if(callback !== null && callback !== undefined){
+      if (callback !== null && callback !== undefined) {
         callback(data);
       }
       self.collection.pager();
     },
-    ajaxErrorResponse: function(response, url){
+    ajaxErrorResponse: function(response, url) {
       var self = this;
-      if(response.status === 404){
+      if (response.status === 404) {
         window.alert('operation url "' + url + '" is not valid');
-      }else{
+      } else {
         window.alert('there was an error performing action');
       }
     },
-    pasteEvent: function(button, e, data){
+    pasteEvent: function(button, e, data) {
       var self = this;
-      if(data === undefined){
+      if (data === undefined) {
         data = {};
       }
       data = $.extend(true, {}, {
@@ -320,20 +321,20 @@ define([
       }, data);
       self.defaultButtonClickEvent(button, data);
     },
-    cutCopyClickEvent: function(button){
+    cutCopyClickEvent: function(button) {
       var self = this;
       var txt;
-      if(button.id === 'cut'){
+      if (button.id === 'cut') {
         txt = 'cut ';
         self.pasteOperation = 'cut';
-      }else{
+      } else {
         txt = 'copied ';
         self.pasteOperation = 'copy';
       }
 
       // clone selected items
       self.pasteSelection = new Backbone.Collection();
-      self.selectedCollection.each(function(item){
+      self.selectedCollection.each(function(item) {
         self.pasteSelection.add(item);
       });
       txt += 'selection';
@@ -341,7 +342,7 @@ define([
       self.pasteAllowed = true;
       self.buttons.primary.get('paste').enable();
     },
-    setupButtons: function(){
+    setupButtons: function() {
       var self = this;
       self.buttons = {};
       var items = [];
@@ -364,14 +365,14 @@ define([
         collection: this.selectedCollection
       }));
 
-      if(self.options.contextInfoUrl){
+      if (self.options.contextInfoUrl) {
         // only add menu if set
         items.push(new AddMenu({
           contextInfoUrl: self.options.contextInfoUrl,
           app: self
         }));
       }
-      if(self.options.rearrange){
+      if (self.options.rearrange) {
         var rearrangeButton = new ButtonView({
           id: 'rearrange',
           title: 'Rearrange',
@@ -385,15 +386,15 @@ define([
         items.push(rearrangeButton);
       }
 
-      _.each(_.pairs(this.options.buttonGroups), function(group){
+      _.each(_.pairs(this.options.buttonGroups), function(group) {
         var buttons = [];
-        _.each(group[1], function(button){
+        _.each(group[1], function(button) {
           button = new ButtonView(button);
           buttons.push(button);
           // bind click events now...
           var ev = self.buttonClickEvents[button.id];
-          if(ev !== DISABLE_EVENT){
-            if(ev === undefined){
+          if (ev !== DISABLE_EVENT) {
+            if (ev === undefined) {
               ev = 'defaultButtonClickEvent'; // default click event
             }
             button.on('button:click', self[ev], self);
@@ -406,14 +407,14 @@ define([
         });
         items.push(self.buttons[group[0]]);
       });
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         var uploadBtn = new ButtonView({
           title: 'Upload',
           context: 'success',
           icon: 'upload'
         });
         items.push(uploadBtn);
-        uploadBtn.on('button:click', function(){
+        uploadBtn.on('button:click', function() {
           // update because the url can change depending on the folder we're in.
           self.dropzone.options.url = self.getAjaxUrl(self.options.uploadUrl);
           self.dropzone.hiddenFileInput.click();
@@ -427,7 +428,7 @@ define([
         items: items
       });
     },
-    moveItem: function(id, delta, subset_ids){
+    moveItem: function(id, delta, subsetIds) {
       var self = this;
       $.ajax({
         url: this.getAjaxUrl(this.options.moveUrl),
@@ -436,42 +437,42 @@ define([
           delta: delta,
           id: id,
           _authenticator: $('[name="_authenticator"]').val(),
-          subset_ids: JSON.stringify(subset_ids)
+          subsetIds: JSON.stringify(subsetIds)
         },
         dataType: 'json',
-        success: function(data){
-          if(data.msg){
+        success: function(data) {
+          if (data.msg) {
             self.setStatus(data.msg);
-          }else if(data.status !== "success"){
+          }else if (data.status !== 'success') {
             // XXX handle error here with something?
             self.setStatus('error moving item');
           }
           self.collection.pager(); // reload it all
         },
-        error: function(data){
+        error: function(data) {
           self.setStatus('error moving item');
         }
       });
     },
-    setStatus: function(txt, type){
+    setStatus: function(txt, type) {
       this.status = txt;
-      if(type === undefined){
+      if (type === undefined) {
         type = 'warning';
       }
       this.statusType = type;
       this.$('.status').addClass(type).html(txt);
     },
-    render: function(){
+    render: function() {
       var self = this;
 
       self.$el.append(self.toolbar.render().el);
       self.$el.append(self.wellView.render().el);
       self.$el.append(self.columnsView.render().el);
-      if(self.rearrangeView){
+      if (self.rearrangeView) {
         self.$el.append(self.rearrangeView.render().el);
       }
 
-      _.each(self.buttonViews, function(view){
+      _.each(self.buttonViews, function(view) {
         self.$el.append(view.render().el);
       });
 
@@ -479,7 +480,7 @@ define([
       self.$el.append(self.pagingView.render().el);
 
       /* dropzone support */
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         self.dropzone = new DropZone(self.$el, {
           className: 'structure-dropzone',
           //clickable: false,
@@ -487,11 +488,11 @@ define([
           url: self.getAjaxUrl(self.options.uploadUrl),
           autoCleanResults: true,
           useTus: self.options.useTus,
-          success: function(){
+          success: function() {
             self.collection.pager();
           }
         }).dropzone;
-        self.dropzone.on('drop', function(){
+        self.dropzone.on('drop', function() {
           // because this can change depending on the folder we're in
           self.dropzone.options.url = self.getAjaxUrl(self.options.uploadUrl);
         });
@@ -508,29 +509,29 @@ define([
 
       return self;
     },
-    getCookieSetting: function(name, _default){
-      if(_default === undefined){
+    getCookieSetting: function(name, _default) {
+      if (_default === undefined) {
         _default = null;
       }
       var val;
-      try{
+      try {
         val = $.cookie(this.cookieSettingPrefix + name);
         val = $.parseJSON(val).value;
-      }catch(e){
+      } catch (e) {
         /* error parsing json, load default here now */
         return _default;
       }
-      if(val === undefined || val === null){
+      if (val === undefined || val === null) {
         return _default;
       }
       return val;
     },
-    setCookieSetting: function(name, val){
+    setCookieSetting: function(name, val) {
       $.cookie(this.cookieSettingPrefix + name,
                JSON.stringify({'value': val})
       );
     },
-    setAllCookieSettings: function(){
+    setAllCookieSettings: function() {
       this.activeColumns = this.getCookieSetting('activeColumns', this.activeColumns);
     }
   });
diff --git a/js/patterns/structure/views/columns.js b/js/patterns/structure/views/columns.js
index a2b3468..dc91f22 100644
--- a/js/patterns/structure/views/columns.js
+++ b/js/patterns/structure/views/columns.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-sortable'
 ], function($, _, Backbone, PopoverView, Sortable) {
-  "use strict";
+  'use strict';
 
   var ColumnsView = PopoverView.extend({
     className: 'popover columns',
@@ -47,19 +47,20 @@ define([
           '<input type="checkbox" value="<%- id %>"/>' +
           '<%- title %>' +
         '</label>' +
-      '</li>'),
+      '</li>'
+    ),
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       var self = this;
       PopoverView.prototype.render.call(this);
       self.$container = self.$('ul');
-      _.each(self.app.activeColumns, function(id){
+      _.each(self.app.activeColumns, function(id) {
         var $el = $(self.itemTemplate({
           title: self.app.availableColumns[id],
           id: id
@@ -67,7 +68,7 @@ define([
         $el.find('input')[0].checked = true;
         self.$container.append($el);
       });
-      _.each(_.omit(self.app.availableColumns, self.app.activeColumns), function(name, id){
+      _.each(_.omit(self.app.availableColumns, self.app.activeColumns), function(name, id) {
         var $el = $(self.itemTemplate({
           title: name,
           id: id
@@ -81,11 +82,11 @@ define([
 
       return this;
     },
-    applyButtonClicked: function(){
+    applyButtonClicked: function() {
       var self = this;
       this.hide();
       self.app.activeColumns = [];
-      self.$('input:checked').each(function(){
+      self.$('input:checked').each(function() {
         self.app.activeColumns.push($(this).val());
       });
       self.app.setCookieSetting('activeColumns', this.app.activeColumns);
diff --git a/js/patterns/structure/views/delete.js b/js/patterns/structure/views/delete.js
index 81e22e2..d6116da 100644
--- a/js/patterns/structure/views/delete.js
+++ b/js/patterns/structure/views/delete.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var DeleteView = PopoverView.extend({
     className: 'popover delete',
@@ -41,17 +41,17 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var self = this;
-      this.app.defaultButtonClickEvent(this.triggerView, {}, function(data){
+      this.app.defaultButtonClickEvent(this.triggerView, {}, function(data) {
         self.app.selectedCollection.reset();
       });
       this.hide();
diff --git a/js/patterns/structure/views/paging.js b/js/patterns/structure/views/paging.js
index 823205c..531f50e 100644
--- a/js/patterns/structure/views/paging.js
+++ b/js/patterns/structure/views/paging.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'text!js/patterns/structure/templates/paging.xml'
 ], function($, _, Backbone, PagingTemplate) {
-  "use strict";
+  'use strict';
 
 
   var PagingView = Backbone.View.extend({
@@ -63,36 +63,36 @@ define([
       this.$el.html(html);
       return this;
     },
-    getPages: function(data){
+    getPages: function(data) {
       var perPage = data.perPage;
       var totalPages = data.totalPages;
-      if(!totalPages){
+      if (!totalPages) {
         return [];
       }
       var currentPage = data.currentPage;
       var left = 1;
       var right = totalPages;
-      if(totalPages > this.maxPages){
+      if (totalPages > this.maxPages) {
         left = Math.max(1, Math.floor(currentPage - (this.maxPages / 2)));
         right = Math.min(left + this.maxPages, totalPages);
-        if((right - left) < this.maxPages){
+        if ((right - left) < this.maxPages) {
           left = left - Math.floor(this.maxPages / 2);
         }
       }
       var pages = [];
-      for(var i=left; i<=right; i=i+1){
+      for (var i = left; i <= right; i = i + 1) {
         pages.push(i);
       }
 
       /* add before and after */
-      if(pages[0] > 1){
-        if(pages[0] > 2){
+      if (pages[0] > 1) {
+        if (pages[0] > 2) {
           pages = ['...'].concat(pages);
         }
         pages = [1].concat(pages);
       }
-      if(pages[pages.length - 1] < (totalPages - 1)){
-        if(pages[pages.length - 2] < totalPages - 2){
+      if (pages[pages.length - 1] < (totalPages - 1)) {
+        if (pages[pages.length - 2] < totalPages - 2) {
           pages.push('...');
         }
         pages.push(totalPages);
diff --git a/js/patterns/structure/views/properties.js b/js/patterns/structure/views/properties.js
index bc0192c..7151309 100644
--- a/js/patterns/structure/views/properties.js
+++ b/js/patterns/structure/views/properties.js
@@ -1,6 +1,4 @@
-// Author: Nathan Van Gheem
-// Contact: nathan at vangheem.us
-// Version: 1.0
+// Author: Nathan Van Gheem Contact: nathan at vangheem.us Version: 1.0
 //
 // Description:
 //
@@ -31,7 +29,7 @@ define([
   'mockup-patterns-pickadate',
   'mockup-patterns-select2'
 ], function($, _, Backbone, PopoverView, PickADate, Select2) {
-  "use strict";
+  'use strict';
 
   var PropertiesView = PopoverView.extend({
     className: 'popover properties',
@@ -75,11 +73,11 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$effective = this.$('[name="effective"]');
       this.$expiration = this.$('[name="expiration"]');
@@ -100,7 +98,7 @@ define([
       this.expirationPickADate = new PickADate(this.$expiration);
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var data = {
         effectiveDate: this.effectivePickADate.$date.attr('value'),
         effectiveTime: this.effectivePickADate.$time.attr('value'),
@@ -110,16 +108,16 @@ define([
         contributors: JSON.stringify(this.$contributors.select2('data')),
         creators: JSON.stringify(this.$creators.select2('data'))
       };
-      if(this.$('[name="exclude-from-nav"]:checked').length > 0){
-        data.exclude_from_nav = this.$('[name="exclude-from-nav"]:checked').val();
+      if (this.$('[name="exclude-from-nav"]:checked').length > 0) {
+        data['exclude_from_nav'] = this.$('[name="exclude-from-nav"]:checked').val(); // jshint ignore:line
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!this.opened){
+      if (!this.opened) {
         return;
       }
       this.$effective.attr('value', '');
@@ -127,7 +125,7 @@ define([
       this.$copyright.html('');
       this.$creators.select2('data', []);
       this.$contributors.select2('data', []);
-      this.$exclude.each(function(){
+      this.$exclude.each(function() {
         this.checked = false;
       });
     }
diff --git a/js/patterns/structure/views/rearrange.js b/js/patterns/structure/views/rearrange.js
index a077e65..49d4655 100644
--- a/js/patterns/structure/views/rearrange.js
+++ b/js/patterns/structure/views/rearrange.js
@@ -28,7 +28,7 @@ define([
   'underscore',
   'js/ui/views/popover'
 ], function($, _, PopoverView) {
-  "use strict";
+  'use strict';
 
   var RearrangeView = PopoverView.extend({
     className: 'popover rearrange',
@@ -37,7 +37,7 @@ define([
       '<div class="form-group">' +
         '<label>What to rearrange on</label>' +
         '<select name="rearrange_on" class="form-control">' +
-          '<% _.each(rearrangeProperties, function(title, property){ %>' +
+          '<% _.each(rearrangeProperties, function(title, property) { %>' +
             '<option value="<%- property %>"><%- title %></option>' +
           '<% }); %>' +
         '</select>' +
@@ -55,23 +55,23 @@ define([
     events: {
       'click button': 'rearrangeButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
       this.options.rearrangeProperties = this.app.options.rearrange.properties;
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$rearrangeOn = this.$('[name="rearrange_on"]');
       this.$reversed = this.$('[name="reversed"]');
       return this;
     },
-    rearrangeButtonClicked: function(){
+    rearrangeButtonClicked: function() {
       var data = {
-        rearrange_on: this.$rearrangeOn.val(),
+        'rearrange_on': this.$rearrangeOn.val(),
         reversed: false
       };
-      if(this.$reversed[0].checked){
+      if (this.$reversed[0].checked) {
         data.reversed = true;
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
diff --git a/js/patterns/structure/views/rename.js b/js/patterns/structure/views/rename.js
index 9fe8037..792cf87 100644
--- a/js/patterns/structure/views/rename.js
+++ b/js/patterns/structure/views/rename.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var PropertiesView = PopoverView.extend({
     className: 'popover rename',
@@ -47,22 +47,23 @@ define([
           '<label>Short name</label>' +
           '<input class="form-control" name="newid" value="<%= id %>" />' +
         '</div>' +
-      '</div>'),
+      '</div>'
+    ),
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$items = this.$('.itemstoremove');
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var torename = [];
-      this.$items.find('.item').each(function(){
+      this.$items.find('.item').each(function() {
         var $item = $(this);
         torename.push({
           UID: $item.find('[name="UID"]').val(),
@@ -76,14 +77,14 @@ define([
       });
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!self.opened){
+      if (!self.opened) {
         return;
       }
       self.$items.empty();
-      self.app.selectedCollection.each(function(item){
+      self.app.selectedCollection.each(function(item) {
         self.$items.append(self.itemTemplate(item.toJSON()));
       });
     }
diff --git a/js/patterns/structure/views/selectionbutton.js b/js/patterns/structure/views/selectionbutton.js
index c854682..54e68fa 100644
--- a/js/patterns/structure/views/selectionbutton.js
+++ b/js/patterns/structure/views/selectionbutton.js
@@ -29,13 +29,12 @@ define([
   'underscore',
   'js/ui/views/button',
   'text!js/patterns/structure/templates/selection_button.xml'
-  ],
-  function($, Backbone, _, ButtonView, tpl_button) {
-  "use strict";
+], function($, Backbone, _, ButtonView, tplButton) {
+  'use strict';
 
   var SelectionButton = ButtonView.extend({
     collection: null,
-    template: tpl_button,
+    template: tplButton,
     initialize: function(options) {
       ButtonView.prototype.initialize.apply(this, [options]);
 
diff --git a/js/patterns/structure/views/selectionwell.js b/js/patterns/structure/views/selectionwell.js
index dca2d9f..1cdda50 100644
--- a/js/patterns/structure/views/selectionwell.js
+++ b/js/patterns/structure/views/selectionwell.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'text!js/patterns/structure/templates/selection_item.xml'
 ], function($, _, Backbone, PopoverView, ItemTemplate) {
-  "use strict";
+  'use strict';
 
   var WellView = PopoverView.extend({
     className: 'popover selected',
@@ -38,18 +38,19 @@ define([
                       '<a href="#" class=" remove-all">' +
                         '<span class="glyphicon glyphicon-remove-circle"></span> remove all</a>'),
     content: _.template(
-      '<% collection.each(function(item){ %>' +
-        '<%= item_template(item.toJSON()) %>' +
-      '<% }); %>'),
+      '<% collection.each(function(item) { %>' +
+      '<%= item_template(item.toJSON()) %>' +
+      '<% }); %>'
+    ),
     events: {
       'click a.remove': 'itemRemoved',
       'keyup input.filter': 'filterSelected',
       'click .remove-all': 'removeAll'
     },
-    initialize: function(options){
+    initialize: function(options) {
       PopoverView.prototype.initialize.apply(this, [options]);
       this.listenTo(this.collection, 'reset all add remove', this.render);
-      this.options.item_template = _.template(ItemTemplate);
+      this.options['item_template'] = _.template(ItemTemplate); // jshint ignore:line
     },
     render: function () {
       PopoverView.prototype.render.call(this);
@@ -58,11 +59,11 @@ define([
       }
       return this;
     },
-    itemRemoved: function(e){
+    itemRemoved: function(e) {
       e.preventDefault();
       var uid = $(e.currentTarget).data('uid');
       this.collection.removeByUID(uid);
-      if(this.collection.length !== 0){
+      if (this.collection.length !== 0) {
         // re-rendering causes it to close, reopen
         this.show();
       }
diff --git a/js/patterns/structure/views/table.js b/js/patterns/structure/views/table.js
index 7de4865..40c45f6 100644
--- a/js/patterns/structure/views/table.js
+++ b/js/patterns/structure/views/table.js
@@ -34,12 +34,12 @@ define([
   'mockup-patterns-moment'
 ], function($, _, Backbone, TableRowView, TableTemplate, BaseView, Sortable,
             Moment) {
-  "use strict";
+  'use strict';
 
   var TableView = BaseView.extend({
     tagName: 'div',
     template: _.template(TableTemplate),
-    initialize: function(options){
+    initialize: function(options) {
       var self = this;
       BaseView.prototype.initialize.apply(self, [options]);
       self.collection = self.app.collection;
@@ -48,20 +48,20 @@ define([
       self.listenTo(self.selectedCollection, 'remove', self.render);
       self.listenTo(self.selectedCollection, 'reset', self.render);
       self.collection.pager();
-      self.subset_ids = [];
+      self.subsetIds = [];
 
-      self.app.on('context-info-loaded', function(data){
+      self.app.on('context-info-loaded', function(data) {
         /* set default page info */
         var $defaultPage = self.$('[data-id="' + data.defaultPage + '"]');
-        if($defaultPage.length > 0){
+        if ($defaultPage.length > 0) {
           $defaultPage.find('td.title').prepend('<span>*</span> ');
           $defaultPage.addClass('default-page');
         }
         /* set breadcrumb title info */
         var crumbs = data.breadcrumbs;
-        if(crumbs && crumbs.length){
+        if (crumbs && crumbs.length) {
           var $crumbs = self.$('.breadcrumbs a.crumb');
-          _.each(crumbs, function(crumb, idx){
+          _.each(crumbs, function(crumb, idx) {
             $crumbs.eq(idx).html(crumb.title);
           });
         }
@@ -81,9 +81,9 @@ define([
         availableColumns: self.app.availableColumns
       }));
 
-      if(self.collection.length){
+      if (self.collection.length) {
         var container = self.$('tbody');
-        self.collection.each(function(result){
+        self.collection.each(function(result) {
           var view = (new TableRowView({
             model: result,
             app: self.app,
@@ -101,17 +101,17 @@ define([
       self.storeOrder();
       return this;
     },
-    breadcrumbClicked: function(e){
+    breadcrumbClicked: function(e) {
       e.preventDefault();
       var $el = $(e.target);
-      if($el[0].tagName !== 'A'){
+      if ($el[0].tagName !== 'A') {
         $el = $el.parent('a');
       }
       var path = '';
-      $($el.prevAll('a').get().reverse()).each(function(){
+      $($el.prevAll('a').get().reverse()).each(function() {
         var part = $(this).attr('data-path');
         path += part;
-        if(part !== '/'){
+        if (part !== '/') {
           path += '/';
         }
       });
@@ -132,10 +132,10 @@ define([
         this.$('.select-all').removeAttr('checked');
       }
     },
-    addReordering: function(){
+    addReordering: function() {
       var self = this;
       // if we have a custom query going on, we do not allow sorting.
-      if(self.app.inQueryMode()){
+      if (self.app.inQueryMode()) {
         self.app.setStatus('Can not order items while querying');
         self.$el.removeClass('order-support');
         return;
@@ -144,19 +144,19 @@ define([
       var dd = new Sortable(self.$('tbody'), {
         selector: 'tr',
         dragClass: 'structure-dragging',
-        drop: function($el, delta){
-          self.app.moveItem($el.attr('data-id'), delta, self.subset_ids);
+        drop: function($el, delta) {
+          self.app.moveItem($el.attr('data-id'), delta, self.subsetIds);
           self.storeOrder();
         }
       });
     },
-    storeOrder: function(){
+    storeOrder: function() {
       var self = this;
-      var subset_ids = [];
-      self.$('tbody tr.itemRow').each(function(idx){
-        subset_ids.push($(this).attr('data-id'));
+      var subsetIds = [];
+      self.$('tbody tr.itemRow').each(function(idx) {
+        subsetIds.push($(this).attr('data-id'));
       });
-      self.subset_ids = subset_ids;
+      self.subsetIds = subsetIds;
     }
   });
 
diff --git a/js/patterns/structure/views/tablerow.js b/js/patterns/structure/views/tablerow.js
index 6717b20..29ce67f 100644
--- a/js/patterns/structure/views/tablerow.js
+++ b/js/patterns/structure/views/tablerow.js
@@ -30,7 +30,7 @@ define([
   'text!js/patterns/structure/templates/tablerow.xml',
   'bootstrap-dropdown'
 ], function($, _, Backbone, TableRowTemplate) {
-  "use strict";
+  'use strict';
 
   var TableRowView = Backbone.View.extend({
     tagName: 'tr',
@@ -48,7 +48,7 @@ define([
       'click .openItem a': 'openClicked',
       'click .editItem a': 'editClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.options = options;
       this.app = options.app;
       this.selectedCollection = this.app.selectedCollection;
@@ -58,7 +58,7 @@ define([
       var self = this;
       var data = this.model.toJSON();
       data.selected = false;
-      if(this.selectedCollection.findWhere({UID: data.UID})){
+      if (this.selectedCollection.findWhere({UID: data.UID})) {
         data.selected = true;
       }
       data.attributes = self.model.attributes;
@@ -69,16 +69,16 @@ define([
       data.inQueryMode = self.app.inQueryMode();
       self.$el.html(self.template(data));
       var attrs = self.model.attributes;
-      self.$el.addClass('state-' + attrs.review_state).
-        addClass('type-' + attrs.Type);
-      if(attrs.is_folderish){
+      self.$el.addClass('state-' + attrs['review_state']).addClass('type-' + attrs.Type); // jshint ignore:line
+      if (attrs['is_folderish']) { // jshint ignore:line
         self.$el.addClass('folder');
       }
       self.$el.attr('data-path', data.path);
       self.$el.attr('data-UID', data.UID);
       self.$el.attr('data-id', data.id);
       self.$el.attr('data-type', data.Type);
-      self.$el.attr('data-folderish', data.is_folderish);
+      self.$el.attr('data-folderish', data['is_folderish']); // jshint ignore:line
+
       self.el.model = this.model;
 
       self.$dropdown = self.$('.dropdown-toggle');
@@ -86,27 +86,27 @@ define([
 
       return this;
     },
-    itemClicked: function(e){
+    itemClicked: function(e) {
       e.preventDefault();
       /* check if this should just be opened in new window */
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.ctrlKey){
+      if (keyEvent && keyEvent.ctrlKey) {
         this.openClicked(e);
-      }else if(this.model.attributes.is_folderish){
+      } else if (this.model.attributes['is_folderish']) { // jshint ignore:line
         // it's a folder, go down path and show in contents window.
         this.app.queryHelper.currentPath = this.model.attributes.path;
         // also switch to fix page in batch
         var collection = this.app.collection;
         collection.goTo(collection.information.firstPage);
-      }else{
+      } else {
         this.openClicked(e);
       }
     },
-    itemSelected: function(){
+    itemSelected: function() {
       var checkbox = this.$('input')[0];
-      if(checkbox.checked){
+      if (checkbox.checked) {
         this.app.selectedCollection.add(this.model);
-      }else{
+      } else {
         this.app.selectedCollection.removeResult(this.model);
       }
 
@@ -114,43 +114,43 @@ define([
 
       /* check for shift click now */
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.shiftKey && this.app.last_selected &&
-            this.app.last_selected.parentNode !== null){
-        var $el = $(this.app.last_selected);
-        var last_checked_index = $el.index();
-        var this_index = this.$el.index();
-        this.app.tableView.$('input[type="checkbox"]').each(function(){
+      if (keyEvent && keyEvent.shiftKey && this.app['last_selected'] && // jshint ignore:line
+            this.app['last_selected'].parentNode !== null) { // jshint ignore:line
+        var $el = $(this.app['last_selected']); // jshint ignore:line
+        var lastCheckedIndex = $el.index();
+        var thisIndex = this.$el.index();
+        this.app.tableView.$('input[type="checkbox"]').each(function() {
           $el = $(this);
           var index = $el.parents('tr').index();
-          if((index > last_checked_index && index < this_index) ||
-              (index < last_checked_index && index > this_index)){
+          if ((index > lastCheckedIndex && index < thisIndex) ||
+              (index < lastCheckedIndex && index > thisIndex)) {
             this.checked = checkbox.checked;
             var model = $(this).closest('tr')[0].model;
             var existing = selectedCollection.getByUID(model.attributes.UID);
-            if(this.checked){
-              if(!existing){
+            if (this.checked) {
+              if (!existing) {
                 selectedCollection.add(model);
               }
-            } else if(existing){
+            } else if (existing) {
               selectedCollection.remove(existing);
             }
           }
         });
 
       }
-      this.app.last_selected = this.el;
+      this.app['last_selected'] = this.el; // jshint ignore:line
     },
-    cutClicked: function(e){
+    cutClicked: function(e) {
       e.preventDefault();
       this.cutCopyClicked('cut');
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    copyClicked: function(e){
+    copyClicked: function(e) {
       e.preventDefault();
       this.cutCopyClicked('copy');
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    cutCopyClicked: function(operation){
+    cutCopyClicked: function(operation) {
       var self = this;
       self.app.pasteOperation = operation;
 
@@ -160,22 +160,22 @@ define([
       self.app.pasteAllowed = true;
       self.app.buttons.primary.get('paste').enable();
     },
-    pasteClicked: function(e){
+    pasteClicked: function(e) {
       e.preventDefault();
       this.app.pasteEvent(this.app.buttons.primary.get('paste'), e, {
         folder: this.model.attributes.path
       });
       this.app.collection.pager(); // reload to be able to now show paste button
     },
-    moveTopClicked: function(e){
+    moveTopClicked: function(e) {
       e.preventDefault();
       this.app.moveItem(this.model.attributes.id, 'top');
     },
-    moveBottomClicked: function(e){
+    moveBottomClicked: function(e) {
       e.preventDefault();
       this.app.moveItem(this.model.attributes.id, 'bottom');
     },
-    setDefaultPageClicked: function(e){
+    setDefaultPageClicked: function(e) {
       e.preventDefault();
       var self = this;
       $.ajax({
@@ -185,41 +185,41 @@ define([
           '_authenticator': $('[name="_authenticator"]').val(),
           'id': this.$active.attr('data-id')
         },
-        success: function(data){
+        success: function(data) {
           self.app.ajaxSuccessResponse.apply(self.app, [data]);
         },
-        error: function(data){
+        error: function(data) {
           self.app.ajaxErrorResponse.apply(self.app, [data]);
         }
       });
     },
-    getSelectedBaseUrl: function(){
+    getSelectedBaseUrl: function() {
       var self = this;
       return self.model.attributes.getURL;
     },
-    getWindow: function(){
+    getWindow: function() {
       var win = window;
       if (win.parent !== window) {
         win = win.parent;
       }
       return win;
     },
-    openUrl: function(url){
+    openUrl: function(url) {
       var self = this;
       var win = self.getWindow();
       var keyEvent = this.app.keyEvent;
-      if(keyEvent && keyEvent.ctrlKey){
+      if (keyEvent && keyEvent.ctrlKey) {
         win.open(url);
-      }else{
+      } else {
         win.location = url;
       }
     },
-    openClicked: function(e){
+    openClicked: function(e) {
       e.preventDefault();
       var self = this;
       self.openUrl(self.getSelectedBaseUrl() + '/view');
     },
-    editClicked: function(e){
+    editClicked: function(e) {
       e.preventDefault();
       var self = this;
       self.openUrl(self.getSelectedBaseUrl() + '/edit');
diff --git a/js/patterns/structure/views/tags.js b/js/patterns/structure/views/tags.js
index cc831a1..d126b1f 100644
--- a/js/patterns/structure/views/tags.js
+++ b/js/patterns/structure/views/tags.js
@@ -30,7 +30,7 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-select2'
 ], function($, _, Backbone, PopoverView, Select2) {
-  "use strict";
+  'use strict';
 
   var TagsView = PopoverView.extend({
     title: _.template('Add/Remove tags'),
@@ -49,13 +49,13 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       this.removeSelect2 = null;
       this.addSelect2 = null;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$remove = this.$('.toremove');
       this.$add = this.$('.toadd');
@@ -66,24 +66,24 @@ define([
       });
       return this;
     },
-    getSelect2Values: function($el){
+    getSelect2Values: function($el) {
       var values = [];
-      _.each($el.select2('data'), function(item){
+      _.each($el.select2('data'), function(item) {
         values.push(item.id);
       });
       return values;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       this.app.defaultButtonClickEvent(this.triggerView, {
         remove: JSON.stringify(this.getSelect2Values(this.$remove)),
         add: JSON.stringify(this.getSelect2Values(this.$add))
       });
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!this.opened){
+      if (!this.opened) {
         return;
       }
       // clear out
@@ -91,12 +91,12 @@ define([
       self.$remove.empty();
       self.$add.select2('data', []);
 
-      self.app.selectedCollection.each(function(item){
-        if(!item.attributes.Subject){
+      self.app.selectedCollection.each(function(item) {
+        if (!item.attributes.Subject) {
           return;
         }
-        _.each(item.attributes.Subject, function(tag){
-          if(self.$remove.find('[value="' + tag + '"]').length === 0){
+        _.each(item.attributes.Subject, function(tag) {
+          if (self.$remove.find('[value="' + tag + '"]').length === 0) {
             self.$remove.append('<option value="' + tag + '">' + tag + '</option>');
           }
         });
diff --git a/js/patterns/structure/views/textfilter.js b/js/patterns/structure/views/textfilter.js
index 40e658c..24fa369 100644
--- a/js/patterns/structure/views/textfilter.js
+++ b/js/patterns/structure/views/textfilter.js
@@ -32,17 +32,18 @@ define([
   'js/ui/views/popover',
   'mockup-patterns-querystring'
 ], function($, Backbone, _, BaseView, ButtonView, PopoverView, QueryString) {
-  "use strict";
+  'use strict';
 
   var TextFilterView = BaseView.extend({
     tagName: 'div',
     className: 'navbar-search form-search ui-offset-parent',
     template: _.template(
       '<div class="input-group">' +
-        '<input type="text" class="form-control search-query" placeholder="Filter">' +
-        '<span class="input-group-btn">' +
-        '</span>' +
-      '</div>'),
+      '<input type="text" class="form-control search-query" placeholder="Filter">' +
+      '<span class="input-group-btn">' +
+      '</span>' +
+      '</div>'
+    ),
     popoverContent: _.template(
       '<input class="pat-querystring" />'
     ),
@@ -52,11 +53,11 @@ define([
     term: null,
     timeoutId: null,
     keyupDelay: 300,
-    initialize: function(options){
+    initialize: function(options) {
       BaseView.prototype.initialize.apply(this, [options]);
       this.app = this.options.app;
     },
-    render: function(){
+    render: function() {
       this.$el.html(this.template({}));
       this.button = new ButtonView({
         title: 'Query'
@@ -73,30 +74,30 @@ define([
       this.$queryString = this.popover.$('input.pat-querystring');
       this.queryString = new QueryString(
         this.$queryString, {
-        indexOptionsUrl: this.app.options.indexOptionsUrl,
-        showPreviews: false
-      });
+          indexOptionsUrl: this.app.options.indexOptionsUrl,
+          showPreviews: false
+        });
       var self = this;
-      self.queryString.$el.on('change', function(){
-        if(self.timeoutId){
+      self.queryString.$el.on('change', function() {
+        if (self.timeoutId) {
           clearTimeout(self.timeoutId);
         }
-        self.timeoutId = setTimeout(function(){
+        self.timeoutId = setTimeout(function() {
           var criterias = $.parseJSON(self.$queryString.val());
           self.app.additionalCriterias = criterias;
           self.app.collection.pager();
         }, this.keyupDelay);
       });
-      self.queryString.$el.on('initialized', function(){
-        self.queryString.$sortOn.on('change', function(){
-          self.app.sort_on = self.queryString.$sortOn.val();
+      self.queryString.$el.on('initialized', function() {
+        self.queryString.$sortOn.on('change', function() {
+          self.app['sort_on'] = self.queryString.$sortOn.val(); // jshint ignore:line
           self.app.collection.pager();
         });
-        self.queryString.$sortOrder.change(function(){
-          if(self.queryString.$sortOrder[0].checked){
-            self.app.sort_order = 'reverse';
-          }else{
-            self.app.sort_order = 'ascending';
+        self.queryString.$sortOrder.change(function() {
+          if (self.queryString.$sortOrder[0].checked) {
+            self.app['sort_order'] = 'reverse'; // jshint ignore:line
+          } else {
+            self.app['sort_order'] = 'ascending'; // jshint ignore:line
           }
           self.app.collection.pager();
         });
@@ -105,10 +106,10 @@ define([
     },
     filter: function(event) {
       var self = this;
-      if(self.timeoutId){
+      if (self.timeoutId) {
         clearTimeout(self.timeoutId);
       }
-      self.timeoutId = setTimeout(function(){
+      self.timeoutId = setTimeout(function() {
         self.term = $(event.currentTarget).val();
         self.app.collection.pager();
       }, this.keyupDelay);
diff --git a/js/patterns/structure/views/workflow.js b/js/patterns/structure/views/workflow.js
index 4f45dd9..38d50e0 100644
--- a/js/patterns/structure/views/workflow.js
+++ b/js/patterns/structure/views/workflow.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/popover'
 ], function($, _, Backbone, PopoverView) {
-  "use strict";
+  'use strict';
 
   var WorkflowView = PopoverView.extend({
     className: 'popover workflow',
@@ -66,31 +66,31 @@ define([
     events: {
       'click button': 'applyButtonClicked'
     },
-    initialize: function(options){
+    initialize: function(options) {
       this.app = options.app;
       PopoverView.prototype.initialize.apply(this, [options]);
     },
-    render: function(){
+    render: function() {
       PopoverView.prototype.render.call(this);
       this.$comments = this.$('textarea');
       this.$transition = this.$('select');
       return this;
     },
-    applyButtonClicked: function(e){
+    applyButtonClicked: function(e) {
       var data = {
         comments: this.$comments.val(),
         transition: this.$transition.val()
       };
-      if(this.$('[name="recurse"]')[0].checked){
+      if (this.$('[name="recurse"]')[0].checked) {
         data.recurse = 'yes';
       }
       this.app.defaultButtonClickEvent(this.triggerView, data);
       this.hide();
     },
-    toggle: function(button, e){
+    toggle: function(button, e) {
       PopoverView.prototype.toggle.apply(this, [button, e]);
       var self = this;
-      if(!self.opened){
+      if (!self.opened) {
         return;
       }
       self.$comments.val('');
@@ -102,14 +102,12 @@ define([
           selection: JSON.stringify(self.app.getSelectedUids()),
           transitions: true
         },
-        success: function(data){
-          _.each(data.transitions, function(transition){
-            self.$transition.append(
-              '<option value="' + transition.id + '">' + transition.title +
-                '</option>');
+        success: function(data) {
+          _.each(data.transitions, function(transition) {
+            self.$transition.append('<option value="' + transition.id + '">' + transition.title + '</option>');
           });
         },
-        error: function(data){
+        error: function(data) {
           // XXX error handling...
           window.alert('error getting transition data');
         }
diff --git a/js/patterns/tablesorter.js b/js/patterns/tablesorter.js
index 71492fb..3d5a0ec 100644
--- a/js/patterns/tablesorter.js
+++ b/js/patterns/tablesorter.js
@@ -21,7 +21,7 @@
  *      guesses about it. It can turn out weird (try sorting on the "No Date"
  *      column).
  *
- *    # Example 
+ *    # Example
  *
  *    {{ example-1 }}
  *
@@ -92,32 +92,35 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base) {
-  "use strict";
+  'use strict';
 
   var TableSorter = Base.extend({
-    name: "tablesorter",
+    name: 'tablesorter',
     defaults: {},
-    sortabledataclass: function (cell){
+    sortabledataclass: function (cell) {
       var re, matches;
 
-      re = new RegExp("sortabledata-([^ ]*)","g");
+      re = new RegExp('sortabledata-([^ ]*)','g');
       matches = re.exec(cell.attr('class'));
-      if (matches) { return matches[1]; }
-        else { return null; }
+      if (matches) {
+        return matches[1];
+      } else {
+        return null;
+      }
     },
     sortable: function (cell) {
       var self = this;
-        // convert a cell into something sortable
+      // convert a cell into something sortable
 
       // use sortabledata-xxx cell class if it is defined
       var text = self.sortabledataclass(cell);
       if (text === null) { text = cell.text(); }
 
       // A number, but not a date?
-        if (text.charAt(4) !== '-' && text.charAt(7) !== '-' && !isNaN(parseFloat(text))) {
-            return parseFloat(text);
-        }
-        return text.toLowerCase();
+      if (text.charAt(4) !== '-' && text.charAt(7) !== '-' && !isNaN(parseFloat(text))) {
+        return parseFloat(text);
+      }
+      return text.toLowerCase();
     },
     sort: function ($this) {
       var self = this;
@@ -131,39 +134,39 @@ define([
 
       $($this).parent().find('th .sortdirection')
           .html('&#x2003;');
-      $($this).children('.sortdirection').html(
-          reverse ? '&#x25bc;': '&#x25b2;' );
+      $($this).children('.sortdirection').html( reverse ? '&#x25bc;': '&#x25b2;' );
 
       index = $($this).parent().children('th').index($this);
       data = [];
       usenumbers = true;
       tbody.find('tr').each(function() {
-          var cells, sortableitem;
-
-          cells = $(this).children('td');
-          sortableitem = self.sortable.apply(self, [cells.slice(index,index+1)]);
-          if (isNaN(sortableitem)) { usenumbers = false; }
-          data.push([
-              sortableitem,
-              // crude way to sort by surname and name after first choice
-              self.sortable.apply(self, [cells.slice(1,2)]),
-              self.sortable.apply(self, [cells.slice(0,1)]),
-              this]);
+        var cells, sortableitem;
+
+        cells = $(this).children('td');
+        sortableitem = self.sortable.apply(self, [cells.slice(index,index + 1)]);
+        if (isNaN(sortableitem)) { usenumbers = false; }
+        data.push([
+          sortableitem,
+          // crude way to sort by surname and name after first choice
+          self.sortable.apply(self, [cells.slice(1,2)]),
+          self.sortable.apply(self, [cells.slice(0,1)]),
+          this
+        ]);
       });
 
       if (data.length) {
-          if (usenumbers) {
-              data.sort(function(a,b) {return a[0]-b[0];});
-          } else {
-              data.sort();
-          }
-          if (reverse) { data.reverse(); }
-          table.attr('sorted', reverse ? '' : colnum);
-
-          // appending the tr nodes in sorted order will remove them from their old ordering
-          tbody.append($.map(data, function(a) { return a[3]; }));
-          // jquery :odd and :even are 0 based
-          tbody.each(self.setoddeven);
+        if (usenumbers) {
+          data.sort(function(a,b) { return a[0] - b[0]; });
+        } else {
+          data.sort();
+        }
+        if (reverse) { data.reverse(); }
+        table.attr('sorted', reverse ? '' : colnum);
+
+        // appending the tr nodes in sorted order will remove them from their old ordering
+        tbody.append($.map(data, function(a) { return a[3]; }));
+        // jquery :odd and :even are 0 based
+        tbody.each(self.setoddeven);
       }
     },
 
@@ -184,7 +187,7 @@ define([
       // the first one of the cells gets a up arrow instead.
       self.$el.find('thead th').append(blankarrow.clone())
           .css('cursor', 'pointer')
-          .on("click", function(e) {
+          .on('click', function(e) {
             self.sort.apply(self, [this]);
           });
 
diff --git a/js/patterns/tiles/texttile.js b/js/patterns/tiles/texttile.js
index 1615e22..97c7d81 100644
--- a/js/patterns/tiles/texttile.js
+++ b/js/patterns/tiles/texttile.js
@@ -3,6 +3,7 @@ define([
   'js/patterns/tiles/tiletype',
   'js/patterns/modalform'
 ], function($, TileType, ModalForm) {
+  'use strict';
 
   var TextTile = TileType.register('text', {
     actions: {
diff --git a/js/patterns/tiles/tile.js b/js/patterns/tiles/tile.js
index af4fcf5..f59a5a7 100644
--- a/js/patterns/tiles/tile.js
+++ b/js/patterns/tiles/tile.js
@@ -1,10 +1,11 @@
+
 define([
   'jquery',
   'js/patterns/base',
   'js/patterns/tiles/tiletype',
   'js/patterns/modalform.js'
 ], function($, Base, TileType) {
-  "use strict";
+  'use strict';
 
   // wire events to action buttons.
   //
@@ -20,13 +21,13 @@ define([
     $('> li > a', $el.actions).each(function(i, action) {
       var actionnames = [];
       $($(action).attr('class').split(' ')).each(function(i, classname) {
-        if(classname.substr(0, 7) === 'action-') {
+        if (classname.substr(0, 7) === 'action-') {
           actionnames.push(classname.substr(7, classname.length));
         }
       });
 
       $.each(actionnames, function(i, actionmethod) {
-        if($el.type.actions !== undefined && $el.type.actions[actionmethod] !== undefined) {
+        if ($el.type.actions !== undefined && $el.type.actions[actionmethod] !== undefined) {
           $(action).off('click').on('click', function(e) {
             e.preventDefault();
             e.stopPropagation();
@@ -57,7 +58,7 @@ define([
   //  ajaxType -- type to use for the jquery $.ajax call
   //
   var Tile = Base.extend({
-    name: "tile",
+    name: 'tile',
     defaults: {
       type: 'text',
       autoshow: true,
@@ -78,13 +79,13 @@ define([
       // Grab the element that should contain all the tile content, if it does
       // not exist, create it and append it to the tiles child list
       self.wrapper = $(self.options.innerWrapper);
-      if(self.wrapper.length <= 0) {
+      if (self.wrapper.length <= 0) {
         self.wrapper = $('<div/>').addClass(self.options.innerWrapper);
         self.$el.append(self.wrapper);
         $(self.wrapper).css('position', 'relative'); // to make sure the buttons are positioned correctly
       }
 
-      if(self.options.autoshow) {
+      if (self.options.autoshow) {
         self.show();
       }
     },
@@ -92,46 +93,44 @@ define([
     show: function() {
       var self = this;
 
-      if(self.options.forceload) {
+      if (self.options.forceload) {
         self.hide(); // get rid of all visible content in the tile
       }
 
       // tiles with content don't need to be dynamically loaded,
       // unless the tile has been marked as forced to load
-      if($(self.wrapper).html().trim() === "") {
+      if ($(self.wrapper).html().trim() === '') {
         // add actions
         $(self.wrapper).append(self.actions);
         hookupActions(self);
 
         // show actions on hover
         $('li > a', self.actions).off('hover').on('hover', function(e) {
-          if(self.actions.is(":visible")) {
+          if (self.actions.is(':visible')) {
             self.actions.show();
-          }
-          else {
+          } else {
             self.actions.hide();
           }
         });
         self.wrapper.off('hover').on('hover', function(e) {
-          if(self.actions.is(":visible")) {
+          if (self.actions.is(':visible')) {
             self.actions.hide();
-          }
-          else {
+          } else {
             self.actions.show();
           }
         });
 
         // load content
         self.ajaxXHR = $.ajax({
-            url: self.options.url,
-            type: self.options.ajaxType
+          url: self.options.url,
+          type: self.options.ajaxType
         }).done(function(response, textStatus, xhr) {
           self.ajaxXHR = undefined;
 
           var respcontent = (/<body[^>]*>((.|[\n\r])*)<\/body>/im)
-                              .exec(response)[0]
-                              .replace('<body', '<div')
-                              .replace('</body>', '</div>');
+            .exec(response)[0]
+            .replace('<body', '<div')
+            .replace('</body>', '</div>');
           var contentcore = $('#content', respcontent).html();
           $(self.wrapper).append(contentcore);
 
@@ -142,7 +141,8 @@ define([
     },
 
     hide: function() {
-      $(self.wrapper).html("");
+      var self = this;
+      $(self.wrapper).html('');
     }
   });
 
diff --git a/js/patterns/tiles/tiletype.js b/js/patterns/tiles/tiletype.js
index 9a5678b..aea35c3 100644
--- a/js/patterns/tiles/tiletype.js
+++ b/js/patterns/tiles/tiletype.js
@@ -2,7 +2,7 @@ define([
   'jquery',
   'js/patterns/modalform'
 ], function($, modalform) {
-  "use strict";
+  'use strict';
 
   var TileTypeBase = {
     init: function(name) {
@@ -12,7 +12,7 @@ define([
     },
 
     styleButtons: function(buttons) {
-      buttons.css("cssText", "color: #333333 !important;");
+      buttons.css('cssText', 'color: #333333 !important;');
       buttons.addClass('tile-button');
     },
 
@@ -27,7 +27,7 @@ define([
           actions = $('.tiletype-actions', el).clone();
 
       if (actions.size() === 0) {
-          actions = $('#tiletype-' + self.typeid + ' .tiletype-actions').clone();
+        actions = $('#tiletype-' + self.typeid + ' .tiletype-actions').clone();
       }
 
       self.styleActions(actions);
@@ -51,7 +51,8 @@ define([
 
     constructor.prototype = $.extend(
       base || TileTypeBase,
-      tiletype || {});
+      tiletype || {}
+    );
 
     return constructor;
   }
@@ -75,7 +76,7 @@ define([
     // tiletype -- optional object containing definitions for the tiletype instance
     // base -- optional base object to extend from
     register: function(name, tiletype, base) {
-      if(TypeRegistry[name] === undefined) {
+      if (TypeRegistry[name] === undefined) {
         TypeRegistry[name] = createTileType(name, tiletype, base);
       }
 
diff --git a/js/patterns/tinymce/links.js b/js/patterns/tinymce/links.js
index 2b9c164..4dd11da 100644
--- a/js/patterns/tinymce/links.js
+++ b/js/patterns/tinymce/links.js
@@ -36,32 +36,32 @@ define([
   'text!js/patterns/tinymce/templates/image.xml'
 ], function($, _, Base, RelatedItems, Modal, tinymce, DropZone,
             LinkTemplate, ImageTemplate) {
-  "use strict";
+  'use strict';
 
   var LinkType = Base.extend({
     defaults: {
       linkModal: null // required
     },
-    init: function(){
+    init: function() {
       this.linkModal = this.options.linkModal;
       this.tinypattern = this.options.tinypattern;
       this.tiny = this.tinypattern.tiny;
       this.dom = this.tiny.dom;
       this.$input = this.$el.find('input');
     },
-    value: function(){
+    value: function() {
       return this.$input.val();
     },
-    toUrl: function(){
+    toUrl: function() {
       return this.value();
     },
-    load: function(element){
+    load: function(element) {
       this.$input.attr('value', this.tiny.dom.getAttrib(element, 'data-val'));
     },
-    set: function(val){
+    set: function(val) {
       this.$input.attr('value', val);
     },
-    attributes: function(){
+    attributes: function() {
       return {
         'data-val': this.value()
       };
@@ -69,38 +69,38 @@ define([
   });
 
   var InternalLink = LinkType.extend({
-    init: function(){
+    init: function() {
       var self = this;
       LinkType.prototype.init.call(self);
       self.$input.addClass('pat-relateditems');
       self.createRelatedItems();
     },
-    createRelatedItems: function(){
+    createRelatedItems: function() {
       this.relatedItems = new RelatedItems(this.$input,
         this.linkModal.options.relatedItems);
     },
-    value: function(){
+    value: function() {
       var self = this;
       var val = self.$input.select2('data');
-      if(val && typeof(val) === 'object'){
+      if (val && typeof(val) === 'object') {
         val = val[0];
       }
       return val;
     },
-    toUrl: function(){
+    toUrl: function() {
       var value = this.value();
-      if(value){
+      if (value) {
         return this.tinypattern.generateUrl(value);
       }
       return null;
     },
-    load: function(element){
+    load: function(element) {
       var val = this.tiny.dom.getAttrib(element, 'data-val');
-      if(val){
+      if (val) {
         this.set(val);
       }
     },
-    set: function(val){
+    set: function(val) {
       // kill it and then reinitialize since select2 will load data then
       this.$input.select2('destroy');
       this.$input.attr('data-relateditems', undefined); // reset the pattern
@@ -108,9 +108,9 @@ define([
       this.$input.attr('value', val);
       this.createRelatedItems();
     },
-    attributes: function(){
+    attributes: function() {
       var val = this.value();
-      if(val){
+      if (val) {
         return {
           'data-val': val.UID
         };
@@ -121,34 +121,34 @@ define([
   });
 
   var ImageLink = InternalLink.extend({
-    toUrl: function(){
+    toUrl: function() {
       var value = this.value();
       return this.tinypattern.generateImageUrl(value, this.linkModal.$scale.val());
     }
   });
 
   var EmailLink = LinkType.extend({
-    toUrl: function(){
+    toUrl: function() {
       var self = this;
       var val = self.value();
-      if(val){
+      if (val) {
         var subject = self.getSubject();
         var href = 'mailto:' + val;
-        if(subject){
+        if (subject) {
           href += '?subject=' + subject;
         }
         return href;
       }
       return null;
     },
-    load: function(element){
+    load: function(element) {
       LinkType.prototype.load.apply(this, [element]);
       this.linkModal.$subject.val(this.tiny.dom.getAttrib(element, 'data-subject'));
     },
-    getSubject: function(){
+    getSubject: function() {
       return this.linkModal.$subject.val();
     },
-    attributes: function(){
+    attributes: function() {
       var attribs = LinkType.prototype.attributes.call(this);
       attribs['data-subject'] = this.getSubject();
       return attribs;
@@ -156,7 +156,7 @@ define([
   });
 
   var AnchorLink = LinkType.extend({
-    init: function(){
+    init: function() {
       var self = this;
       LinkType.prototype.init.call(self);
       self.$select = self.$el.find('select');
@@ -164,15 +164,15 @@ define([
       self.anchorData = [];
       self.populate();
     },
-    value: function(){
+    value: function() {
       var self = this;
       var val = self.$select.select2('data');
-      if(val && typeof(val) === 'object'){
+      if (val && typeof(val) === 'object') {
         val = val[0];
       }
       return val;
     },
-    populate: function(){
+    populate: function() {
       var self = this;
       self.$select.find('option').remove();
       self.anchorNodes = [];
@@ -180,13 +180,13 @@ define([
       var node, i, name, title;
 
       var nodes = self.tiny.dom.select('a.mceItemAnchor,img.mceItemAnchor,a.mce-item-anchor,img.mce-item-anchor');
-      for (i = 0; i < nodes.length; i=i+1) {
+      for (i = 0; i < nodes.length; i = i + 1) {
         node = nodes[i];
-        name = self.tiny.dom.getAttrib(node, "name");
-        if(!name){
-          name = self.tiny.dom.getAttrib(node, "id");
+        name = self.tiny.dom.getAttrib(node, 'name');
+        if (!name) {
+          name = self.tiny.dom.getAttrib(node, 'id');
         }
-        if (name !== "") {
+        if (name !== '') {
           self.anchorNodes.push(node);
           self.anchorData.push({name: name, title: name});
         }
@@ -194,65 +194,65 @@ define([
 
       nodes = self.tiny.dom.select(self.linkModal.options.anchorSelector);
       if (nodes.length > 0) {
-        for (i = 0; i < nodes.length; i=i+1) {
+        for (i = 0; i < nodes.length; i = i + 1) {
           node = nodes[i];
           title = $(node).text().replace(/^\s+|\s+$/g, '');
-          if (title==='') {
+          if (title === '') {
             continue;
           }
           name = title.toLowerCase().substring(0,1024);
           name = name.replace(/[^a-z0-9]/g, '-');
           /* okay, ugly, but we need to first check that this anchor isn't already available */
           var found = false;
-          for(i=0; i<self.anchorNodes.length; i=i+1){
+          for (i = 0; i < self.anchorNodes.length; i = i + 1) {
             var anode = self.anchorData[i];
-            if(anode.name === name){
+            if (anode.name === name) {
               found = true;
               // so it's also found, let's update the title to be more presentable
               anode.title = title;
               break;
             }
           }
-          if(!found){
-            self.anchorData.push({name: name, title:title, newAnchor: true});
+          if (!found) {
+            self.anchorData.push({name: name, title: title, newAnchor: true});
             self.anchorNodes.push(node);
           }
         }
       }
-      if(self.anchorNodes.length > 0){
-        for(i = 0; i < self.anchorData.length; i=i+1){
+      if (self.anchorNodes.length > 0) {
+        for(i = 0; i < self.anchorData.length; i = i + 1) {
           var data = self.anchorData[i];
-          self.$select.append("<option value='" + i + "'>" + data.title + '</option>');
+          self.$select.append('<option value="' + i + '">' + data.title + '</option>');
         }
       } else {
         self.$select.append('<option>No anchors found..</option>');
       }
     },
-    getIndex: function(name){
+    getIndex: function(name) {
       var self = this;
-      for(var i=0; i<self.anchorData.length; i=i+1){
+      for (var i = 0; i < self.anchorData.length; i = i + 1) {
         var data = self.anchorData[i];
-        if(data.name === name){
+        if (data.name === name) {
           return i;
         }
       }
       return 0;
     },
-    toUrl: function(){
+    toUrl: function() {
       var self = this;
       var val = self.value();
-      if(val){
+      if (val) {
         var index = parseInt(val, 10);
         var node = self.anchorNodes[index];
         var data = self.anchorData[index];
-        if(data.newAnchor){
+        if (data.newAnchor) {
           node.innerHTML = '<a name="' + data.name + '" class="mce-item-anchor"></a>' + node.innerHTML;
         }
         return '#' + data.name;
       }
       return null;
     },
-    set: function(val){
+    set: function(val) {
       var anchor = this.getIndex(val);
       this.$select.select2('data', '' + anchor);
     }
@@ -327,14 +327,14 @@ define([
       'externalImage': ImageTemplate
     },
 
-    template: function(data){
+    template: function(data) {
       return  _.template(this.linkTypeTemplateMapping[this.linkType])(data);
     },
 
-    init: function(){
+    init: function() {
       var self = this;
       self.tinypattern = self.options.tinypattern;
-      if(self.tinypattern.options.anchorSelector){
+      if (self.tinypattern.options.anchorSelector) {
         self.options.anchorSelector = self.tinypattern.options.anchorSelector;
       }
       self.tiny = self.tinypattern.tiny;
@@ -346,11 +346,11 @@ define([
         content: null,
         buttons: '.btn'
       });
-      self.modal.on('shown', function(e){
+      self.modal.on('shown', function(e) {
         self.modalShown.apply(self, [e]);
       });
     },
-    generateModalHtml: function(){
+    generateModalHtml: function() {
       var self = this;
       return self.template({
         text: self.options.text,
@@ -370,10 +370,10 @@ define([
         insertBtn: self.options.text.insertBtn
       });
     },
-    isImageMode: function(){
+    isImageMode: function() {
       return ['image', 'externalImage'].indexOf(this.linkType) !== -1;
     },
-    initElements: function(){
+    initElements: function() {
       var self = this;
       self.$target = $('select[name="target"]', self.modal.$modal);
       self.$button = $('.modal-footer input[name="insert"]', self.modal.$modal);
@@ -385,7 +385,7 @@ define([
       self.$scale = $('select[name="scale"]', self.modal.$modal);
 
       /* load up all the link types */
-      _.each(self.options.linkTypes, function(type){
+      _.each(self.options.linkTypes, function(type) {
         var $container = $('.linkType.' + type + ' .main', self.modal.$modal);
         self.linkTypes[type] = new self.options.linkTypeClassMapping[type]($container, {
           linkModal: self,
@@ -396,44 +396,44 @@ define([
       /* modal els */
       self.$linkTypes = $('.linkTypes', self.modal.$modal);
       var $linkType = self.$linkTypes.find('input[value="' + self.linkType + '"]');
-      if($linkType.length > 0){
+      if ($linkType.length > 0) {
         $linkType[0].checked = true;
       }
     },
-    getLinkUrl: function(){
+    getLinkUrl: function() {
       // get the url, only get one uid
       var self = this;
       return self.linkTypes[self.linkType].toUrl();
     },
-    getValue: function(){
+    getValue: function() {
       return this.linkTypes[this.linkType].value();
     },
-    updateAnchor: function(href){
+    updateAnchor: function(href) {
       var self = this;
       var target = self.$target.val();
       var title = self.$title.val();
       var data = $.extend(true, {}, {
         title: title ? title : null,
         target: target ? target : null,
-        "data-linkType": self.linkType,
+        'data-linkType': self.linkType,
         href: href
       }, self.linkTypes[self.linkType].attributes());
       self.tiny.execCommand('mceInsertLink', false, data);
     },
-    focusElement: function(elm){
+    focusElement: function(elm) {
       var self = this;
       self.tiny.focus();
       self.tiny.selection.select(elm);
       self.tiny.nodeChanged();
     },
-    updateImage: function(src){
+    updateImage: function(src) {
       var self = this;
       var data = $.extend(true, {}, {
         src: src,
         alt: self.$alt.val(),
         'class': 'image-' + self.$align.val(),
-        "data-linkType": self.linkType,
-        "data-scale": self.$scale.val()
+        'data-linkType': self.linkType,
+        'data-scale': self.$scale.val()
       }, self.linkTypes[self.linkType].attributes());
       if (self.imgElm && !self.imgElm.getAttribute('data-mce-object')) {
         data.width = self.dom.getAttrib(self.imgElm, 'width');
@@ -459,24 +459,24 @@ define([
       }
 
       waitLoad(self.imgElm);
-      if(self.imgElm.complete){
+      if (self.imgElm.complete) {
         self.focusElement(self.imgElm);
       }
     },
-    modalShown: function(e){
+    modalShown: function(e) {
       var self = this;
 
       self.initElements();
       self.initData();
 
-      self.$button.off('click').on('click', function(e){
+      self.$button.off('click').on('click', function(e) {
         e.preventDefault();
         e.stopPropagation();
         var href = self.getLinkUrl();
-        if(!href){
+        if (!href) {
           return; // just cut out if no url
         }
-        if(self.isImageMode()){
+        if (self.isImageMode()) {
           self.updateImage(href);
         } else {
           /* regular anchor */
@@ -484,35 +484,35 @@ define([
         }
         self.hide();
       });
-      $('.modal-footer input[name="cancel"]', self.modal.$modal).click(function(e){
+      $('.modal-footer input[name="cancel"]', self.modal.$modal).click(function(e) {
         e.preventDefault();
         self.hide();
       });
       self.setupDropzone();
     },
-    setupDropzone: function(){
+    setupDropzone: function() {
       var self = this;
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         self.dropzone = new DropZone(self.modal.$modal, {
           className: 'tinymce-dropzone',
           clickable: false,
           url: self.options.uploadUrl,
           wrap: 'inner',
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             self.tinypattern.fileUploaded($.parseJSON(data));
             self.hide();
           }
         });
       }
     },
-    show: function(){
+    show: function() {
       this.modal.show();
     },
-    hide: function(){
+    hide: function() {
       this.modal.hide();
     },
-    initData: function(){
+    initData: function() {
       var self = this;
 
       self.selection = self.tiny.selection;
@@ -522,60 +522,60 @@ define([
       self.anchorElm = self.dom.getParent(selectedElm, 'a[href]');
 
       var linkType;
-      if(self.isImageMode()){
-        if(self.imgElm.nodeName !== 'IMG'){
+      if (self.isImageMode()) {
+        if (self.imgElm.nodeName !== 'IMG') {
           // try finding elsewhere
-          if(self.anchorElm){
+          if (self.anchorElm) {
             var imgs = self.anchorElm.getElementsByTagName('img');
-            if(imgs.length > 0){
+            if (imgs.length > 0) {
               self.imgElm = imgs[0];
               self.focusElement(self.imgElm);
             }
           }
         }
-        if(self.imgElm.nodeName !== 'IMG'){
+        if (self.imgElm.nodeName !== 'IMG') {
           // okay, still no image, unset
           self.imgElm = null;
         }
-        if(self.imgElm){
+        if (self.imgElm) {
           var src = self.dom.getAttrib(self.imgElm, 'src');
           self.$alt.val(self.dom.getAttrib(self.imgElm, 'alt'));
           linkType = self.dom.getAttrib(self.imgElm, 'data-linktype');
-          if(linkType){
+          if (linkType) {
             self.linkType = linkType;
             self.linkTypes[self.linkType].load(self.imgElm);
             var scale = self.dom.getAttrib(self.imgElm, 'data-scale');
             self.$scale.val(scale);
-          }else if(src){
+          }else if (src) {
             self.guessImageLink(src);
           }
           var className = self.dom.getAttrib(self.imgElm, 'class');
           var klasses = className.split(' ');
-          for(var i=0; i<klasses.length; i=i+1){
+          for (var i = 0; i < klasses.length; i = i + 1) {
             var klass = klasses[i];
-            if(klass.indexOf('image-') !== -1){
+            if (klass.indexOf('image-') !== -1) {
               self.$align.val(klass.replace('image-', ''));
             }
           }
         }
-      }else if(self.anchorElm){
+      }else if (self.anchorElm) {
         self.focusElement(self.anchorElm);
         var href = '';
         href = self.dom.getAttrib(self.anchorElm, 'href');
         self.$target.val(self.dom.getAttrib(self.anchorElm, 'target'));
         self.$title.val(self.dom.getAttrib(self.anchorElm, 'title'));
         linkType = self.dom.getAttrib(self.anchorElm, 'data-linktype');
-        if(linkType){
+        if (linkType) {
           self.linkType = linkType;
           self.linkTypes[self.linkType].load(self.anchorElm);
-        }else if(href){
+        }else if (href) {
           self.guessAnchorLink(href);
         }
       }
     },
-    guessImageLink: function(src){
+    guessImageLink: function(src) {
       var self = this;
-      if(src.indexOf(self.options.prependToScalePart) !== -1){
+      if (src.indexOf(self.options.prependToScalePart) !== -1) {
         self.linkType = 'image';
         self.$scale.val(self.tinypattern.getScaleFromUrl(src));
         self.linkTypes.image.set(self.tinypattern.stripGeneratedUrl(src));
@@ -584,23 +584,23 @@ define([
         self.linkTypes.externalImage.set(src);
       }
     },
-    guessAnchorLink: function(href){
+    guessAnchorLink: function(href) {
       var self = this;
-      if(self.options.prependToUrl &&
-          href.indexOf(self.options.prependToUrl) !== -1){
+      if (self.options.prependToUrl &&
+          href.indexOf(self.options.prependToUrl) !== -1) {
         // XXX if using default configuration, it gets more difficult
         // here to detect internal urls so this might need to change...
         self.linkType = 'internal';
         self.linkTypes.internal.set(self.tinypattern.stripGeneratedUrl(href));
-      } else if(href.indexOf('mailto:') !== -1){
+      } else if (href.indexOf('mailto:') !== -1) {
         self.linkType = 'email';
-        var email = href.substring("mailto:".length, href.length);
+        var email = href.substring('mailto:'.length, href.length);
         var split = email.split('?subject=');
         self.linkTypes.email.set(split[0]);
-        if(split.length > 1){
+        if (split.length > 1) {
           self.$subject.val(decodeURIComponent(split[1]));
         }
-      } else if(href[0] === '#'){
+      } else if (href[0] === '#') {
         self.linkType = 'anchor';
         self.linkTypes.anchor.setRaw(href.substring(1));
       } else {
@@ -608,14 +608,14 @@ define([
         self.linkTypes.external.setRaw(href);
       }
     },
-    setSelectElement: function($el, val){
+    setSelectElement: function($el, val) {
       $el.find('option:selected').attr('selected', '');
-      if(val){
+      if (val) {
         // update
-        $el.find('option[value="' + val + '"]').attr('selected', "true");
+        $el.find('option[value="' + val + '"]').attr('selected', 'true');
       }
     },
-    reinitialize: function(){
+    reinitialize: function() {
       /*
        * This will probably be called before show is run.
        * It will overwrite the base html template given to
diff --git a/js/patterns/tinymce/pattern.js b/js/patterns/tinymce/pattern.js
index 8bc19f0..a4d635f 100644
--- a/js/patterns/tinymce/pattern.js
+++ b/js/patterns/tinymce/pattern.js
@@ -60,6 +60,8 @@ toolbar: "undo redo | styleselect | bold italic | alignleft aligncenter alignrig
  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+/*global alert:true */
+
 define([
   'jquery',
   'underscore',
@@ -80,7 +82,7 @@ define([
             AutoTOC, DropZone, dropzone,
             ResultTemplate, SelectionTemplate,
             utils, LinkModal, UploadModal) {
-  "use strict";
+  'use strict';
 
   var TinyMCE = Base.extend({
     name: 'tinymce',
@@ -131,23 +133,23 @@ define([
       linkableTypes: 'Document,Event,File,Folder,Image,News Item,Topic',
       tiny: {
         plugins: [
-          "advlist autolink lists charmap print preview anchor ploneupload",
-          "searchreplace visualblocks code fullscreen autoresize",
-          "insertdatetime media table contextmenu paste plonelink ploneimage"
+          'advlist autolink lists charmap print preview anchor ploneupload',
+          'searchreplace visualblocks code fullscreen autoresize',
+          'insertdatetime media table contextmenu paste plonelink ploneimage'
         ],
-        menubar: "edit table format tools view insert",
-        toolbar: "undo redo | styleselect | bold italic | " +
-                 "alignleft aligncenter alignright alignjustify | " +
-                 "bullist numlist outdent indent | " +
-                 "unlink plonelink ploneimage | ploneupload",
-        autoresize_max_height: 1500
+        menubar: 'edit table format tools view insert',
+        toolbar: 'undo redo | styleselect | bold italic | ' +
+                 'alignleft aligncenter alignright alignjustify | ' +
+                 'bullist numlist outdent indent | ' +
+                 'unlink plonelink ploneimage | ploneupload',
+        'autoresize_max_height': 1500
       },
-      rel_upload_path: null,
-      folder_url: null
+      'rel_upload_path': null,
+      'folder_url': null
     },
-    uploadFileClicked: function(){
+    uploadFileClicked: function() {
       var self = this;
-      if(self.uploadModal === null){
+      if (self.uploadModal === null) {
         var $el = $('<div/>').insertAfter(self.$el);
         self.uploadModal = new UploadModal($el,
           $.extend(true, {}, self.options, {
@@ -168,9 +170,9 @@ define([
         self.uploadModal.show();
       }
     },
-    addLinkClicked: function(){
+    addLinkClicked: function() {
       var self = this;
-      if(self.linkModal === null){
+      if (self.linkModal === null) {
         var $el = $('<div/>').insertAfter(self.$el);
         self.linkModal = new LinkModal($el,
           $.extend(true, {}, self.options, {
@@ -189,9 +191,9 @@ define([
         self.linkModal.show();
       }
     },
-    addImageClicked: function(){
+    addImageClicked: function() {
       var self = this;
-      if(self.imageModal === null){
+      if (self.imageModal === null) {
         var options = $.extend(true, {}, self.options, {
           tinypattern: self,
           linkTypes: ['image', 'externalImage'],
@@ -218,60 +220,60 @@ define([
         self.imageModal.show();
       }
     },
-    generateUrl: function(data){
+    generateUrl: function(data) {
       var self = this;
       var part = data[self.options.linkAttribute];
       return self.options.prependToUrl + part + self.options.appendToUrl;
     },
-    generateImageUrl: function(data, scale){
+    generateImageUrl: function(data, scale) {
       var self = this;
       var url = self.generateUrl(data);
       return url + self.options.prependToScalePart + scale + self.options.appendToScalePart;
     },
-    stripGeneratedUrl: function(url){
+    stripGeneratedUrl: function(url) {
       // to get original attribute back
       var self = this;
       url = url.split(self.options.prependToScalePart, 2)[0];
-      if(self.options.prependToUrl){
+      if (self.options.prependToUrl) {
         var parts = url.split(self.options.prependToUrl, 2);
-        if(parts.length === 2){
+        if (parts.length === 2) {
           url = parts[1];
         }
       }
-      if(self.options.appendToUrl){
+      if (self.options.appendToUrl) {
         url = url.split(self.options.appendToUrl)[0];
       }
       return url;
     },
-    getScaleFromUrl: function(url){
+    getScaleFromUrl: function(url) {
       var self = this;
       var split = url.split(self.options.prependToScalePart);
       var baseUrl = split[0];
-      if(split.length !== 2){
+      if (split.length !== 2) {
         // not valid scale, screw it
         return null;
       }
-      if(self.options.appendToScalePart){
+      if (self.options.appendToScalePart) {
         url = split[1].split(self.options.appendToScalePart)[0];
-      }else{
+      } else {
         url = split[1];
       }
-      if(url.indexOf('/image_') !== -1){
+      if (url.indexOf('/image_') !== -1) {
         url = url.split('/image_')[1];
       }
       return url;
     },
-    fileUploaded: function(data){
+    fileUploaded: function(data) {
       var self = this;
-      if(data === null){
+      if (data === null) {
         return; // bail, something is wrong here...
       }
       var filename = data.filename;
       var ext = filename.split('.');
-      ext = ext[ext.length-1].toLowerCase();
+      ext = ext[ext.length - 1].toLowerCase();
       var attr;
 
-      if(['png', 'jpg', 'gif', 'jpeg'].indexOf(ext) !== -1){
+      if (['png', 'jpg', 'gif', 'jpeg'].indexOf(ext) !== -1) {
         /* handle images different than others */
         attr = {
           src: self.generateImageUrl(data, 'thumb'),
@@ -281,7 +283,7 @@ define([
         self.tiny.insertContent(self.tiny.dom.createHTML('img', attr));
         var imgElm = self.tiny.dom.get('__mcenew');
         self.tiny.dom.setAttrib(imgElm, 'id', null);
-      }else{
+      } else {
         attr = {
           id: '__mcenew'
         };
@@ -292,8 +294,8 @@ define([
         self.tiny.dom.setHTML(aElm, filename);
       }
     },
-    fileUploadError: function(){
-      /* XXX need to be able to handle errors better? */
+    fileUploadError: function() {
+      /* TODO: need to be able to handle errors better? */
       alert('There was an error attempting to upload file. ' +
             'It is possible the file you are uploading is not allowed ' +
             'in the folder you are trying to add it to.');
@@ -305,32 +307,32 @@ define([
       var id = utils.setId(self.$el);
       var tinyOptions = self.options.tiny;
       tinyOptions.selector = '#' + id;
-      tinyOptions.addLinkClicked = function(){
+      tinyOptions.addLinkClicked = function() {
         self.addLinkClicked.apply(self, []);
       };
-      tinyOptions.addImageClicked = function(){
+      tinyOptions.addImageClicked = function() {
         self.addImageClicked.apply(self, []);
       };
       // XXX: disabled skin means it wont load css files which we already
       // include in widgets.min.css
       tinyOptions.skin = false;
 
-      self.options.relatedItems.generateImageUrl = function(data, scale){
+      self.options.relatedItems.generateImageUrl = function(data, scale) {
         // this is so, in our result and selection template, we can
         // access getting actual urls from related items
         return self.generateImageUrl.apply(self, [data, scale]);
       };
 
-      if(!self.options.base_url){
-        self.options.base_url = window.location.href;
+      if (!self.options['base_url']) { // jshint ignore:line
+        self.options['base_url'] = window.location.href; // jshint ignore:line
       }
-      if(self.options.rel_upload_path){
-        self.options.uploadUrl = self.options.folder_url + '/' + self.options.rel_upload_path;
+      if (self.options['rel_upload_path']) { // jshint ignore:line
+        self.options.uploadUrl = self.options['folder_url'] + '/' + self.options['rel_upload_path']; // jshint ignore:line
       } else {
         self.options.uploadUrl = null;
       }
 
-      if(self.options.uploadUrl){
+      if (self.options.uploadUrl) {
         /*
          * disable until it works better
          * can still upload via link and file overlays
@@ -341,16 +343,16 @@ define([
           url: self.options.uploadUrl,
           wrap: true,
           autoCleanResults: true,
-          success: function(e, data){
+          success: function(e, data) {
             self.fileUploaded($.parseJSON(data));
           },
-          error: function(){
+          error: function() {
             self.fileUploadError();
           }
         });
         */
 
-        tinyOptions.uploadFileClicked = function(){
+        tinyOptions.uploadFileClicked = function() {
           self.uploadFileClicked.apply(self, []);
         };
       } else {
@@ -363,18 +365,17 @@ define([
 
       /* fixes chrome at least,
        * still not working quite right in firefox
-      if(self.options.uploadUrl){
-        var events = ["drop", "dragstart", "dragend", "dragenter", "dragover",
-                      "dragleave"];
+      if (self.options.uploadUrl) {
+        var events = ['drop', 'dragstart', 'dragend', 'dragenter', 'dragover', 'dragleave'];
         var iframe = self.$el.prev().find('.mce-edit-area iframe');
         var win = $(window.frames[iframe.attr('id')]);
         var body = iframe.contents().find('body');
-        $.each(events, function(index, ev){
-          win.on(ev, function(e){
+        $.each(events, function(index, ev) {
+          win.on(ev, function(e) {
             self.dropzone.dropzone.emit(ev);
             console.log(ev);
           });
-          body.on(ev, function(e){
+          body.on(ev, function(e) {
             self.dropzone.dropzone.emit(ev);
             console.log(ev);
           });
@@ -385,7 +386,7 @@ define([
       /* tiny really should be doing this by default
        * but this fixes overlays not saving data */
       var $form = self.$el.parents('form');
-      $form.on('submit', function(){
+      $form.on('submit', function() {
         self.tiny.save();
       });
     }
diff --git a/js/patterns/tinymce/upload.js b/js/patterns/tinymce/upload.js
index 9afb1b6..91fc52a 100644
--- a/js/patterns/tinymce/upload.js
+++ b/js/patterns/tinymce/upload.js
@@ -39,7 +39,7 @@ define([
   'tinymce',
   'text!js/patterns/tinymce/templates/upload.xml'
 ], function($, _, Base, RelatedItems, Modal, tinymce, UploadTemplate) {
-  "use strict";
+  'use strict';
 
 
   tinymce.PluginManager.add('ploneimage', function(editor) {
@@ -85,11 +85,11 @@ define([
         file: 'File',
         uploadBtn: 'Upload',
         uploadLocationWarning: 'If you do not select a folder to upload to, ' +
-                               "the file will be uploaded to the current folder."
+                               'the file will be uploaded to the current folder.'
       }
     },
     template: _.template(UploadTemplate),
-    init: function(){
+    init: function() {
       var self = this;
       self.tinypattern = self.options.tinypattern;
       self.modal = new Modal(self.$el, {
@@ -103,17 +103,17 @@ define([
         content: null,
         buttons: '.btn'
       });
-      self.modal.on('shown', function(e){
+      self.modal.on('shown', function(e) {
         self.modalShown.apply(self, [e]);
       });
     },
-    show: function(){
+    show: function() {
       this.modal.show();
     },
-    hide: function(){
+    hide: function() {
       this.modal.hide();
     },
-    modalShown: function(){
+    modalShown: function() {
       var self = this;
       /* initialize elements so submit does the right thing.. */
       self.$uploadBtn = $('.modal-footer input[type="submit"]', self.modal.$modal);
@@ -122,15 +122,14 @@ define([
       self.$location = $('[name="location"]', self.modal.$modal);
       self.$location.addClass('pat-relateditems').patternRelateditems(self.options.relatedItems);
 
-      self.$form.on('submit', function(e){
+      self.$form.on('submit', function(e) {
         /* handle file upload */
         var locationData = self.$location.select2('data');
-        if(locationData.length > 0){
-          self.$form.attr('action',
-            locationData[0].getURL + '/' + self.options.rel_upload_path);
+        if (locationData.length > 0) {
+          self.$form.attr('action', locationData[0].getURL + '/' + self.options['rel_upload_path']); // jshint ignore:line
         }
         self.modal.loading.show();
-        self.$iframe.on('load', function(){
+        self.$iframe.on('load', function() {
           var response = self.$iframe.contents();
           self.modal.loading.hide();
           self.hide();
@@ -142,12 +141,12 @@ define([
         });
         self.$form[0].target = 'upload_target';
       });
-      self.$uploadBtn.on('click', function(e){
+      self.$uploadBtn.on('click', function(e) {
         e.preventDefault();
         self.$form.trigger('submit');
       });
     },
-    reinitialize: function(){
+    reinitialize: function() {
     }
   });
 
diff --git a/js/patterns/toggle.js b/js/patterns/toggle.js
index 1c41c61..59ae9bf 100644
--- a/js/patterns/toggle.js
+++ b/js/patterns/toggle.js
@@ -63,7 +63,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-4
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -80,7 +80,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-5
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -90,7 +90,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-6
  *    <div class="wrapper">
  *      <div class="myScope">
@@ -100,7 +100,7 @@
  *        <p class="targetElement label label-default">Hello World</p>
  *      </div>
  *    </div>
- *    
+ *
  * Example: example-7
  *    <div class="panel panel-default">
  *      <div class="panel-heading">
@@ -115,7 +115,7 @@
  *        </ul>
  *      </div>
  *    </div>
- *    
+ *
  *
  * License:
  *    Copyright (C) 2010 Plone Foundation
@@ -139,7 +139,7 @@ define([
   'jquery',
   'mockup-patterns-base'
 ], function($, Base, undefined) {
-  "use strict";
+  'use strict';
 
   var Toggle = Base.extend({
     name: 'toggle',
@@ -163,14 +163,11 @@ define([
 
       if (!self.options.target) {
         self.$target = self.$el;
-      }
-      else if(self.options.targetScope === 'global') {
+      } else if (self.options.targetScope === 'global') {
         self.$target = $(self.options.target);
-      }
-      else {
+      } else {
         //self.$target = self.$el[self.options.menu](self.options.target);
-        self.$target = self.$el.parents(
-          self.options.targetScope).first().find(self.options.target);
+        self.$target = self.$el.parents(self.options.targetScope).first().find(self.options.target);
       }
 
       if (!self.$target || self.$target.size() === 0) {
@@ -187,21 +184,18 @@ define([
       var self = this;
       var marked = false;
 
-      for (var i=0;i<this.$target.length;i+=1){
+      for (var i = 0; i < this.$target.length; i = i + 1) {
         if (self.options.attribute === 'class') {
-          if (this.$target.eq(i).hasClass(this.options.value)){
+          if (this.$target.eq(i).hasClass(this.options.value)) {
             marked = true;
-          }
-          else{
+          } else {
             marked = false;
             break;
           }
-        }
-        else{
-          if (this.$target.eq(i).attr(this.options.attribute) === this.options.value){
+        } else {
+          if (this.$target.eq(i).attr(this.options.attribute) === this.options.value) {
             marked = true;
-          }
-          else{
+          } else {
             marked = false;
             break;
           }
diff --git a/js/patterns/tooltip.js b/js/patterns/tooltip.js
index 67a9af8..84f772f 100644
--- a/js/patterns/tooltip.js
+++ b/js/patterns/tooltip.js
@@ -1,123 +1,122 @@
-/* Tooltip pattern.
- *
- * Options:
- *    event_enter(string): Event used to trigger tooltip. ('mouseenter')
- *    event_exit(string): Event used to dismiss tooltip. ('mouseleave')
- *
- * Documentation:
- *    # Directions
- *
- *    You can use this inside Plone or on any static page. Please check below
- *    for additional directions for non-Plone sites as there are some lines
- *    of code you need to add to the header of your webpage.
- *
- *    # Adding tooltip using Plone
- *
- *    - Make sure your viewing the page you want to add the tool tip too.
- *    - Log in
- *    - Create some text that you want to be the link that will reveal the
- *      tooltip.
- *    - Select the view html button
- *    - Find your text. and wrap that text with an href tag, and add a class
- *      and the href tag. 
- *    - It should look like < a class="pat-tooltip" href="#my-demo-tip"> My
- *      link text </a>
- *    - Choose Save
- *
- *    Now that we have added our link we now need to add our tooltip.
- *
- *    - Choose "edit"
- *    - Immediently following the link click to add some text and hit your 
- *      "return" key
- *    - Add the text that you want to be the tip.
- *    - Choose the "edit html" button
- *    - Find the tip text and wrap that text with a div tag, an ID tag and a
- *      class.
- *    - It should look like <div id="my-demo-tip" class="tooltips"> My Tip
- *      Text here </div>
- *    - Choose Save and test your tooltip.
- *
- *    Note: it's important that the href AND the ID be named exactly the same
- *    thing. This is what links them together.
- *
- *    # Example 
- *
- *    {{ example-1 }}
- *
- * Example: example-1
- *    <p href=".example-class" class="pat-tooltip">
- *      Hover over this line to see a tooltip
- *    </p>
- *    <p class="tooltips example-class">
- *      Setting the .example-class in the href makes this show up
- *    </p>
- *
- * License:
- *    Copyright (C) 2010 Plone Foundation
- *
- *    This program is free software; you can redistribute it and/or modify it
- *    under the terms of the GNU General Public License as published by the
- *    Free Software Foundation; either version 2 of the License.
- *
- *    This program is distributed in the hope that it will be useful, but
- *    WITHOUT ANY WARRANTY; without even the implied warranty of
- *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- *    Public License for more details.
- *
- *    You should have received a copy of the GNU General Public License along
- *    with this program; if not, write to the Free Software Foundation, Inc.,
- *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-define([
-  'jquery',
-  'mockup-patterns-base'
-], function($, Base, undefined) {
-  "use strict";
-
-  var ToolTip = Base.extend({
-    name: 'tooltip',
-    defaults: {
-      attribute: 'class',
-      event_enter: 'mouseenter',
-      event_exit: 'mouseleave'
-    },
-    init: function() {
-      var self = this;
-
-      self.on(self.options.event_enter, function(e) {
-        e.stopPropagation();
-        self.show.apply(self, [e]);
-      });
-      self.on(self.options.event_exit, function(e) {
-        e.stopPropagation();
-        self.hide.apply(self, [e]);
-      });
-
-    },
-    closest: function($el, selector) {
-        var $closest;
-        $.each($el.parents(), function(i, el) {
-            $closest = $(selector, el);
-            if ($closest.size() !== 0) {
-                return false;
-            }
-        });
-        return $closest;
-    },
-    show : function(e) {
-        var s = $(e.target).attr('href');
-        this.closest(this.$el, s).addClass('active');
-    },
-
-    hide : function(e) {
-        var s = $(e.target).attr('href');
-        this.closest(this.$el, s).removeClass('active');
-    }
-
-  });
-
-
-  return ToolTip;
-
-});
+/* Tooltip pattern.
+ *
+ * Options:
+ *    enterEvent(string): Event used to trigger tooltip. ('mouseenter')
+ *    exitEvent(string): Event used to dismiss tooltip. ('mouseleave')
+ *
+ * Documentation:
+ *    # Directions
+ *
+ *    You can use this inside Plone or on any static page. Please check below
+ *    for additional directions for non-Plone sites as there are some lines
+ *    of code you need to add to the header of your webpage.
+ *
+ *    # Adding tooltip using Plone
+ *
+ *    - Make sure your viewing the page you want to add the tool tip too.
+ *    - Log in
+ *    - Create some text that you want to be the link that will reveal the
+ *      tooltip.
+ *    - Select the view html button
+ *    - Find your text. and wrap that text with an href tag, and add a class
+ *      and the href tag.
+ *    - It should look like < a class="pat-tooltip" href="#my-demo-tip"> My
+ *      link text </a>
+ *    - Choose Save
+ *
+ *    Now that we have added our link we now need to add our tooltip.
+ *
+ *    - Choose "edit"
+ *    - Immediently following the link click to add some text and hit your
+ *      "return" key
+ *    - Add the text that you want to be the tip.
+ *    - Choose the "edit html" button
+ *    - Find the tip text and wrap that text with a div tag, an ID tag and a
+ *      class.
+ *    - It should look like <div id="my-demo-tip" class="tooltips"> My Tip
+ *      Text here </div>
+ *    - Choose Save and test your tooltip.
+ *
+ *    Note: it's important that the href AND the ID be named exactly the same
+ *    thing. This is what links them together.
+ *
+ *    # Example
+ *
+ *    {{ example-1 }}
+ *
+ * Example: example-1
+ *    <p href=".example-class" class="pat-tooltip">
+ *      Hover over this line to see a tooltip
+ *    </p>
+ *    <p class="tooltips example-class">
+ *      Setting the .example-class in the href makes this show up
+ *    </p>
+ *
+ * License:
+ *    Copyright (C) 2010 Plone Foundation
+ *
+ *    This program is free software; you can redistribute it and/or modify it
+ *    under the terms of the GNU General Public License as published by the
+ *    Free Software Foundation; either version 2 of the License.
+ *
+ *    This program is distributed in the hope that it will be useful, but
+ *    WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ *    Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License along
+ *    with this program; if not, write to the Free Software Foundation, Inc.,
+ *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+define([
+  'jquery',
+  'mockup-patterns-base'
+], function($, Base, undefined) {
+  'use strict';
+
+  var ToolTip = Base.extend({
+    name: 'tooltip',
+    defaults: {
+      attribute: 'class',
+      enterEvent: 'mouseenter',
+      exitEvent: 'mouseleave'
+    },
+    init: function() {
+      var self = this;
+
+      self.on(self.options.enterEvent, function(e) {
+        e.stopPropagation();
+        self.show.apply(self, [e]);
+      });
+      self.on(self.options.exitEvent, function(e) {
+        e.stopPropagation();
+        self.hide.apply(self, [e]);
+      });
+
+    },
+    closest: function($el, selector) {
+      var $closest;
+      $.each($el.parents(), function(i, el) {
+        $closest = $(selector, el);
+        if ($closest.size() !== 0) {
+          return false;
+        }
+      });
+      return $closest;
+    },
+    show : function(e) {
+      var s = $(e.target).attr('href');
+      this.closest(this.$el, s).addClass('active');
+    },
+
+    hide : function(e) {
+      var s = $(e.target).attr('href');
+      this.closest(this.$el, s).removeClass('active');
+    }
+
+  });
+
+  return ToolTip;
+
+});
diff --git a/js/patterns/tree.js b/js/patterns/tree.js
index 5fae458..8b5b765 100644
--- a/js/patterns/tree.js
+++ b/js/patterns/tree.js
@@ -1,15 +1,12 @@
 /* Tree pattern.
  *
- * Options:
- *    data(jSON): load data structure directly into tree (undefined)
- *    dataUrl(jSON): Load data from remote url (undefined)
- *    autoOpen(boolean): auto open tree contents (false)
- *    dragAndDrop(boolean): node drag and drop support (false)
- *    selectable(boolean): if nodes can be selectable (true)
- *    keyboardSupport(boolean): if keyboard naviation is allowed (true)
+ * Options: data(jSON): load data structure directly into tree (undefined)
+ * dataUrl(jSON): Load data from remote url (undefined) autoOpen(boolean): auto
+ * open tree contents (false) dragAndDrop(boolean): node drag and drop support
+ * (false) selectable(boolean): if nodes can be selectable (true)
+ * keyboardSupport(boolean): if keyboard naviation is allowed (true)
  *
- * Documentation:
- *    # JSON node data
+ * Documentation: # JSON node data
  *
  *    {{ example-1 }}
  *
@@ -22,30 +19,33 @@
  *    {{ example-3 }}
  *
  * Example: example-1
- *    <div class="pat-tree" data-pat-tree='data:[
- *      {"label": "node1",
- *       "children": [{
- *         "label": "child1"
- *        },{
- *         "label": "child2"
- *        }]
- *      },{
- *       "label": "node2",
- *       "children": [{
- *         "label": "child3"
- *        }]
- *      }];'>
- *    </div>
+ *    <div class="pat-tree"
+ *         data-pat-tree='data:[
+ *          { "label": "node1",
+ *            "children": [
+ *              { "label": "child1" },
+ *              { "label": "child2" }
+ *            ]
+ *          },
+ *          { "label": "node2",
+ *            "children": [
+ *              { "label": "child3" }
+ *            ]
+ *          }
+ *        ];'> </div>
  *
  * Example: example-2
  *    <div class="pat-tree"
- *        data-pat-tree="dataUrl:/tests/json/fileTree.json;autoOpen:true"></div>  
+ *         data-pat-tree="dataUrl:/tests/json/fileTree.json;
+ *                        autoOpen:true"></div>
  *
  * Example: example-3
- *    <div class="pat-tree" data-pat-tree="dataUrl:/tests/json/fileTree.json; dragAndDrop: true; autoOpen: true"></div>
+ *    <div class="pat-tree"
+ *         data-pat-tree="dataUrl:/tests/json/fileTree.json;
+ *                        dragAndDrop: true;
+ *                        autoOpen: true"></div>
  *
- * License:
- *    Copyright (C) 2010 Plone Foundation
+ * License: Copyright (C) 2010 Plone Foundation
  *
  *    This program is free software; you can redistribute it and/or modify it
  *    under the terms of the GNU General Public License as published by the
@@ -69,7 +69,7 @@ define([
   'mockup-utils',
   'jqtree'
 ], function($, _, Base, utils) {
-  "use strict";
+  'use strict';
 
   var Tree = Base.extend({
     name: 'tree',
@@ -82,21 +82,21 @@ define([
     init: function() {
       var self = this;
       /* convert all bool options */
-      for(var optionKey in self.options){
+      for (var optionKey in self.options) {
         var def = self.defaults[optionKey];
-        if(def !== undefined && typeof(def) === "boolean"){
+        if (def !== undefined && typeof(def) === 'boolean') {
           self.options[optionKey] = utils.bool(self.options[optionKey]);
         }
       }
 
-      if(self.options.dragAndDrop && self.options.onCanMoveTo === undefined){
-        self.options.onCanMoveTo = function(moved, target, position){
+      if (self.options.dragAndDrop && self.options.onCanMoveTo === undefined) {
+        self.options.onCanMoveTo = function(moved, target, position) {
           /* if not using folder option, just allow, otherwise, only allow if folder */
           return target.folder === undefined || target.folder === true;
         };
       }
 
-      if(self.options.data && typeof(self.options.data) === "string"){
+      if (self.options.data && typeof(self.options.data) === 'string') {
         self.options.data = $.parseJSON(self.options.data);
       }
       self.tree = self.$el.tree(self.options);
diff --git a/js/router.js b/js/router.js
index d55179c..e91eb1d 100644
--- a/js/router.js
+++ b/js/router.js
@@ -31,7 +31,7 @@ define([
   'underscore',
   'backbone'
 ], function($, _, Backbone) {
-  "use strict";
+  'use strict';
 
   var regexEscape = function(s) {
     return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
@@ -71,7 +71,7 @@ define([
           if (path.match(regex)) {
             hash = '!/' + action.patternName + ':' + action.id;
             var replaceWith = '';
-            if(action.expReplace){
+            if (action.expReplace) {
               replaceWith = action.expReplace;
             }
             newPath = path.replace(regex, replaceWith);
@@ -92,10 +92,10 @@ define([
       }
 
       if (hash !== undefined) {
-        this._change_location.apply(this, [newPath, hash]);
+        this._changeLocation.apply(this, [newPath, hash]);
       }
     },
-    _change_location: function(path, hash) {
+    _changeLocation: function(path, hash) {
       window.parent.location.hash = hash;
       window.parent.location.pathname = path;
     },
diff --git a/js/ui/views/base.js b/js/ui/views/base.js
index 75b48b6..c7a3b3d 100644
--- a/js/ui/views/base.js
+++ b/js/ui/views/base.js
@@ -26,8 +26,8 @@
 define([
   'underscore',
   'backbone'
-  ], function(_, Backbone) {
-  "use strict";
+], function(_, Backbone) {
+  'use strict';
 
   var BaseView = Backbone.View.extend({
     isUIView: true,
@@ -46,7 +46,7 @@ define([
       this.trigger('render', this);
       this.afterRender();
 
-      if(!this.$el.attr('id') && this.options.id){
+      if (!this.$el.attr('id') && this.options.id) {
         // apply id to element
         this.$el.attr('id', 'gen-' + this.options.id);
       }
diff --git a/js/ui/views/button.js b/js/ui/views/button.js
index 839d8a0..ece7a1c 100644
--- a/js/ui/views/button.js
+++ b/js/ui/views/button.js
@@ -29,9 +29,8 @@ define([
   'underscore',
   'js/ui/views/base',
   'bootstrap-tooltip'
-],
-  function($, Backbone, _, BaseView) {
-  "use strict";
+], function($, Backbone, _, BaseView) {
+  'use strict';
 
   var ButtonView = BaseView.extend({
     tagName: 'a',
@@ -62,7 +61,7 @@ define([
       }, this);
 
       this.on('render', function() {
-        if(this.context !== null){
+        if (this.context !== null) {
           this.$el.addClass('btn-' + this.context);
         }
 
@@ -72,15 +71,15 @@ define([
           });
           // XXX since tooltip triggers hidden
           // suppress so it plays nice with modals, backdrops, etc
-          this.$el.on('hidden', function(e){
-            if(e.type == 'hidden'){
+          this.$el.on('hidden', function(e) {
+            if (e.type === 'hidden') {
               e.stopPropagation();
             }
           });
         }
       }, this);
     },
-    handleClick: function(e){
+    handleClick: function(e) {
       e.preventDefault();
       if (!this.$el.is('.disabled')) {
         this.uiEventTrigger('click', this, e);
diff --git a/js/ui/views/buttongroup.js b/js/ui/views/buttongroup.js
index 5b731cd..35bfd44 100644
--- a/js/ui/views/buttongroup.js
+++ b/js/ui/views/buttongroup.js
@@ -27,8 +27,8 @@ define([
   'underscore',
   'backbone',
   'js/ui/views/container'
-  ], function(_, Backbone, ContainerView) {
-  "use strict";
+], function(_, Backbone, ContainerView) {
+  'use strict';
 
   var ButtonGroup = ContainerView.extend({
     tagName: 'div',
diff --git a/js/ui/views/container.js b/js/ui/views/container.js
index b9f340b..0db7995 100644
--- a/js/ui/views/container.js
+++ b/js/ui/views/container.js
@@ -29,7 +29,7 @@ define([
   'backbone',
   'js/ui/views/base'
 ], function($, _, Backbone, BaseView) {
-  "use strict";
+  'use strict';
 
   var Container = BaseView.extend({
     id: '',
@@ -58,12 +58,12 @@ define([
       if (this.itemContainer !== null) {
         $container = $(this.itemContainer, this.$el);
         if ($container.length === 0) {
-          throw "Item Container element not found.";
+          throw 'Item Container element not found.';
         }
       } else {
         $container = this.$el;
       }
-      _.each(this.items, function(view){
+      _.each(this.items, function(view) {
         if (view.appendInContainer === true) {
           $container.append(view.render().$el);
         } else {
@@ -95,14 +95,14 @@ define([
         });
       });
     },
-    get: function(id){
+    get: function(id) {
       // Remove the recursive part because it was confusing if two children had the
       // same id
       return _.findWhere(this.items, {'id': id});
     },
     add: function(item) {
       if (item.id !== undefined && this.get(item.id)) {
-        throw "Another item with the same `id` already exists.";
+        throw 'Another item with the same `id` already exists.';
       }
       this.items.push(item);
     }
diff --git a/js/ui/views/popover.js b/js/ui/views/popover.js
index 3116f55..a09b516 100644
--- a/js/ui/views/popover.js
+++ b/js/ui/views/popover.js
@@ -31,7 +31,7 @@ define([
   'mockup-patterns-backdrop',
   'text!js/ui/templates/popover.xml',
 ], function($, _, Backbone, ContainerView, Backdrop, PopoverTemplate) {
-  "use strict";
+  'use strict';
 
   var PopoverView = ContainerView.extend({
     tagName: 'div',
@@ -44,7 +44,7 @@ define([
     triggerEvents: {
       'button:click': 'toggle'
     },
-    placement: "bottom",
+    placement: 'bottom',
     events: {
     },
     opened: false,
@@ -54,10 +54,10 @@ define([
     $backdrop: null,
     useBackdrop: true,
     backdropOptions: {
-      zIndex: "1009",
-      opacity: "0.4",
-      className: "backdrop backdrop-popover",
-      classActiveName: "backdrop-active",
+      zIndex: '1009',
+      opacity: '0.4',
+      className: 'backdrop backdrop-popover',
+      classActiveName: 'backdrop-active',
       closeOnEsc: false,
       closeOnClick: true
     },
@@ -80,14 +80,14 @@ define([
         }, this);
       }
     },
-    getPosition: function(){
+    getPosition: function() {
       var $el = this.triggerView.$el;
       return $.extend({}, {
         width: $el[0].offsetWidth,
         height: $el[0].offsetHeight
       }, $el.offset());
     },
-    show: function(){
+    show: function() {
       var pos = this.getPosition();
       var $tip = this.$el, tp, placement, actualWidth, actualHeight;
 
@@ -117,19 +117,19 @@ define([
       this.applyPlacement(tp, placement);
 
       this.setBackdrop();
-      if(this.useBackdrop === true){
+      if (this.useBackdrop === true) {
         this.backdrop.show();
       }
 
       this.opened = true;
 
-      if(this.triggerView){
+      if (this.triggerView) {
         this.triggerView.$el.addClass('active');
       }
 
       this.uiEventTrigger('show', this);
     },
-    applyPlacement: function(offset, placement){
+    applyPlacement: function(offset, placement) {
       var $el = this.$el,
         $tip = this.$el,
         width = $tip[0].offsetWidth,
@@ -154,7 +154,7 @@ define([
       if (placement === 'bottom' || placement === 'top') {
         delta = 0;
 
-        if (offset.left < 0){
+        if (offset.left < 0) {
           delta = offset.left * -2;
           offset.left = 0;
           $el.offset(offset);
@@ -174,18 +174,18 @@ define([
     },
     positionArrow: function(delta, dimension, position) {
       var $arrow = this.$('.arrow');
-      $arrow.css(position, delta ? (50 * (1 - delta / dimension) + "%") : '');
+      $arrow.css(position, delta ? (50 * (1 - delta / dimension) + '%') : '');
     },
-    hide: function(){
+    hide: function() {
       this.opened = false;
       this.$el.removeClass('active');
-      if(this.triggerView){
+      if (this.triggerView) {
         this.triggerView.$el.removeClass('active');
       }
       this.uiEventTrigger('hide', this);
     },
-    toggle: function(button, e){
-      if(this.opened){
+    toggle: function(button, e) {
+      if (this.opened) {
         this.hide();
       } else {
         this.show();
diff --git a/js/ui/views/toolbar.js b/js/ui/views/toolbar.js
index 18c3533..8b00699 100644
--- a/js/ui/views/toolbar.js
+++ b/js/ui/views/toolbar.js
@@ -28,7 +28,7 @@ define([
   'backbone',
   'js/ui/views/container'
 ], function(_, Backbone, ContainerView) {
-  "use strict";
+  'use strict';
 
   var Toolbar = ContainerView.extend({
     tagName: 'div',
diff --git a/js/utils.js b/js/utils.js
index bec7107..8005a0b 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -29,9 +29,9 @@
 define([
   'jquery'
 ], function($) {
-  "use strict";
+  'use strict';
 
-  var QueryHelper = function(options){
+  var QueryHelper = function(options) {
     /* if pattern argument provided, it can implement the interface of:
       *    - browsing: boolean if currently browsing
       *    - currentPath: string of current path to apply to search if browsing
@@ -50,7 +50,7 @@ define([
     };
     self.options = $.extend({}, defaults, options);
     self.pattern = self.options.pattern;
-    if(self.pattern === undefined || self.pattern === null){
+    if (self.pattern === undefined || self.pattern === null) {
       self.pattern = {
         browsing: false,
         basePath: '/'
@@ -59,46 +59,46 @@ define([
 
     if (self.options.url && !self.options.vocabularyUrl) {
       self.options.vocabularyUrl = self.options.url;
-    }else if(self.pattern.vocabularyUrl){
+    } else if (self.pattern.vocabularyUrl) {
       self.options.vocabularyUrl = self.pattern.vocabularyUrl;
     }
-    if(self.options.vocabularyUrl !== undefined &&
-        self.options.vocabularyUrl !== null){
+    if (self.options.vocabularyUrl !== undefined &&
+        self.options.vocabularyUrl !== null) {
       self.valid = true;
-    }else{
+    } else {
       self.valid = false;
     }
 
-    self.getCurrentPath = function(){
+    self.getCurrentPath = function() {
       var pattern = self.pattern;
       var currentPath;
       /* If currentPath is set on the QueryHelper object, use that first.
        * Then, check on the pattern.
        * Finally, see if it is a function and call it if it is.
        */
-      if(self.currentPath){
+      if (self.currentPath) {
         currentPath = self.currentPath;
-      }else{
+      } else {
         currentPath = pattern.currentPath;
       }
-      if(typeof(currentPath) === 'function'){
+      if (typeof(currentPath) === 'function') {
         currentPath = currentPath();
       }
       var path = currentPath;
-      if(!path){
-        if(pattern.basePath){
+      if (!path) {
+        if (pattern.basePath) {
           path = pattern.basePath;
-        }else if(pattern.options.basePath){
+        } else if (pattern.options.basePath) {
           path = pattern.options.basePath;
-        }else{
+        } else {
           path = '/';
         }
       }
       return path;
     };
 
-    self.getCriterias = function(term, options){
-      if(options === undefined){
+    self.getCriterias = function(term, options) {
+      if (options === undefined) {
         options = {};
       }
       options = $.extend({}, {
@@ -107,10 +107,10 @@ define([
       }, options);
 
       var criterias = [];
-      if(options.useBaseCriteria){
+      if (options.useBaseCriteria) {
         criterias = self.options.baseCriteria.slice(0);
       }
-      if(term){
+      if (term) {
         term += '*';
         criterias.push({
           i: self.options.searchParam,
@@ -118,7 +118,7 @@ define([
           v: term
         });
       }
-      if(self.pattern.browsing){
+      if (self.pattern.browsing) {
         criterias.push({
           i: 'path',
           o: 'plone.app.querystring.operation.string.path',
@@ -129,8 +129,8 @@ define([
       return criterias;
     };
 
-    self.getBatch = function(page){
-      if(!page){
+    self.getBatch = function(page) {
+      if (!page) {
         page = 1;
       }
       return {
@@ -139,7 +139,7 @@ define([
       };
     };
 
-    self.selectAjax = function(){
+    self.selectAjax = function() {
       return {
         url: self.options.vocabularyUrl,
         dataType: 'JSON',
@@ -155,35 +155,35 @@ define([
       };
     };
 
-    self.getUrl = function(){
+    self.getUrl = function() {
       var url = self.options.vocabularyUrl;
-      if(url.indexOf('?') === -1){
+      if (url.indexOf('?') === -1) {
         url += '?';
-      }else{
+      } else {
         url += '&';
       }
       return url + $.param(self.getQueryData());
     };
 
-    self.getQueryData = function(term, page){
+    self.getQueryData = function(term, page) {
       var data = {
         query: JSON.stringify({
           criteria: self.getCriterias(term)
         }),
         attributes: JSON.stringify(self.options.attributes)
       };
-      if(page){
+      if (page) {
         data.batch = JSON.stringify(self.getBatch(page));
       }
       return data;
     };
 
-    self.search = function(term, operation, value, callback, useBaseCriteria){
-      if(useBaseCriteria === undefined){
+    self.search = function(term, operation, value, callback, useBaseCriteria) {
+      if (useBaseCriteria === undefined) {
         useBaseCriteria = true;
       }
       var criteria = [];
-      if(useBaseCriteria){
+      if (useBaseCriteria) {
         criteria = self.options.baseCriteria.slice(0);
       }
       criteria.push({
@@ -206,7 +206,7 @@ define([
     return self;
   };
 
-  var ProgressIndicator = function(options){
+  var ProgressIndicator = function(options) {
     /*
      * Options:
      *   className(string): Defaults to "progress-indicator"
@@ -226,21 +226,21 @@ define([
       wrapper: null,
       zIndex: 10005 // can be a function
     };
-    if(!options){
+    if (!options) {
       options = {};
     }
     self.options = $.extend({}, defaults, options);
-    if(self.options.container === null){
+    if (self.options.container === null) {
       self.options.container = $('body');
     }
     self.$loading = $('> .' + self.options.className, self.options.container);
-    if (self.$loading.size() === 0){
+    if (self.$loading.size() === 0) {
       self.$loading = $('<div/>').hide()
         .addClass(self.options.className)
         .appendTo(self.options.container);
     }
     self.$wrapper = self.options.wrapper;
-    if(self.$wrapper === null){
+    if (self.$wrapper === null) {
       self.$wrapper = self.options.container;
     }
 
@@ -249,7 +249,7 @@ define([
         closable = true;
       }
 
-      if(self.options.backdrop){
+      if (self.options.backdrop) {
         self.options.backdrop.closeOnClick = closable;
         self.options.backdrop.closeOnEsc = closable;
         self.options.backdrop.init();
@@ -257,7 +257,7 @@ define([
 
       self.$wrapper.parent().css('overflow', 'hidden');
       self.$wrapper.show();
-      if(self.options.backdrop){
+      if (self.options.backdrop) {
         self.options.backdrop.show();
       }
       self.$loading.show();
@@ -266,8 +266,8 @@ define([
 
     self.position = function() {
       self.$loading.css({
-        'margin-left': self.$wrapper.width()/2 - self.$loading.width()/2,
-        'margin-top': self.$wrapper.height()/2 - self.$loading.height()/2,
+        'margin-left': self.$wrapper.width() / 2 - self.$loading.width() / 2,
+        'margin-top': self.$wrapper.height() / 2 - self.$loading.height() / 2,
         'position': 'absolute',
         'bottom': '0',
         'left': '0',
@@ -275,13 +275,13 @@ define([
         'top': '0'
       });
       var zIndex = self.options.zIndex;
-      if(typeof(zIndex) === 'function'){
+      if (typeof(zIndex) === 'function') {
         zIndex = zIndex();
       }
       self.$loading.css('zIndex', zIndex);
     };
 
-    self.hide = function(){
+    self.hide = function() {
       self.$loading.hide();
       self.$wrapper.parent().css('overflow', '');
     };
@@ -291,16 +291,16 @@ define([
 
   return {
 
-    parseBodyTag: function(txt){
+    parseBodyTag: function(txt) {
       return $((/<body[^>]*>((.|[\n\r])*)<\/body>/im).exec(txt)[0]
           .replace('<body', '<div').replace('</body>', '</div>')).eq(0).html();
     },
-    setId: function($el, prefix){
-      if(prefix === undefined){
+    setId: function($el, prefix) {
+      if (prefix === undefined) {
         prefix = 'id';
       }
       var id = $el.attr('id');
-      if(id === undefined){
+      if (id === undefined) {
         id = prefix + (Math.floor((1 + Math.random()) * 0x10000)
           .toString(16).substring(1));
       } else {
@@ -311,8 +311,8 @@ define([
       $el.attr('id', id);
       return id;
     },
-    bool: function(val){
-      if(typeof(val) === 'string'){
+    bool: function(val) {
+      if (typeof(val) === 'string') {
         val = $.trim(val).toLowerCase();
       }
       return ['true', true, 1].indexOf(val) !== -1;
diff --git a/package.json b/package.json
index 1385cb7..36231f3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
-  "name": "plone-mockup",
-  "version": "1.4.0",
+  "name": "mockup",
+  "version": "1.6.0",
   "description": "Collection of Plone CMS Core Patterns",
   "homepage": "http://plone.github.io/mockup",
   "devDependencies": {
@@ -14,6 +14,7 @@
     "grunt-contrib-less": "~0.9.0",
     "grunt-contrib-requirejs": "~0.4.1",
     "grunt-contrib-uglify": "~0.3.2",
+    "grunt-jscs-checker": "~0.4.0",
     "grunt-karma": "~0.7.2",
     "grunt-sed": "~0.1.1",
     "karma": "~0.11.13",
diff --git a/package.nix b/package.nix
index 6f0d2ec..f1b8b4f 100644
--- a/package.nix
+++ b/package.nix
@@ -210,7 +210,7 @@
     buildInputs =
       (self.nativeDeps."archiver" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
       self.by-version."zip-stream"."0.1.4"
       self.by-version."lazystream"."0.1.0"
       self.by-version."file-utils"."0.1.5"
@@ -566,8 +566,8 @@
       self.by-version."decompress-zip"."0.0.4"
       self.by-version."fstream"."0.1.25"
       self.by-version."fstream-ignore"."0.0.7"
-      self.by-version."glob"."3.2.8"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."glob"."3.2.9"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."handlebars"."1.0.12"
       self.by-version."inquirer"."0.3.5"
       self.by-version."junk"."0.2.2"
@@ -611,7 +611,7 @@
     buildInputs =
       (self.nativeDeps."bower-config" or []);
     deps = [
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."mout"."0.6.0"
       self.by-version."optimist"."0.6.1"
       self.by-version."osenv"."0.0.3"
@@ -634,7 +634,7 @@
     buildInputs =
       (self.nativeDeps."bower-config" or []);
     deps = [
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."mout"."0.6.0"
       self.by-version."optimist"."0.6.1"
       self.by-version."osenv"."0.0.3"
@@ -677,7 +677,7 @@
       (self.nativeDeps."bower-json" or []);
     deps = [
       self.by-version."deep-extend"."0.2.8"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."intersect"."0.0.3"
     ];
     peerDependencies = [
@@ -719,7 +719,7 @@
     deps = [
       self.by-version."async"."0.2.10"
       self.by-version."bower-config"."0.4.5"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."lru-cache"."2.3.1"
       self.by-version."request"."2.27.0"
       self.by-version."request-replay"."0.2.0"
@@ -803,7 +803,7 @@
     buildInputs =
       (self.nativeDeps."cardinal" or []);
     deps = [
-      self.by-version."redeyed"."0.4.2"
+      self.by-version."redeyed"."0.4.4"
       self.by-version."ansicolors"."0.2.1"
     ];
     peerDependencies = [
@@ -968,7 +968,7 @@
     buildInputs =
       (self.nativeDeps."cli" or []);
     deps = [
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -1073,6 +1073,25 @@
     ];
     passthru.names = [ "colors" ];
   };
+  by-spec."colors"."0.6.0-1" =
+    self.by-version."colors"."0.6.0-1";
+  by-version."colors"."0.6.0-1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-colors-0.6.0-1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/colors/-/colors-0.6.0-1.tgz";
+        name = "colors-0.6.0-1.tgz";
+        sha1 = "6dbb68ceb8bc60f2b313dcc5ce1599f06d19e67a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."colors" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "colors" ];
+  };
   by-spec."colors"."0.x.x" =
     self.by-version."colors"."0.6.2";
   by-version."colors"."0.6.2" = lib.makeOverridable self.buildNodePackage {
@@ -1133,6 +1152,26 @@
     ];
     passthru.names = [ "commander" ];
   };
+  by-spec."commander"."1.2.0" =
+    self.by-version."commander"."1.2.0";
+  by-version."commander"."1.2.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-commander-1.2.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/commander/-/commander-1.2.0.tgz";
+        name = "commander-1.2.0.tgz";
+        sha1 = "fd5713bfa153c7d6cc599378a5ab4c45c535029e";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."commander" or []);
+    deps = [
+      self.by-version."keypress"."0.1.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "commander" ];
+  };
   by-spec."commander"."2.0.0" =
     self.by-version."commander"."2.0.0";
   by-version."commander"."2.0.0" = lib.makeOverridable self.buildNodePackage {
@@ -1195,7 +1234,7 @@
       self.by-version."mkdirp"."0.3.5"
       self.by-version."js-yaml"."2.1.3"
       self.by-version."osenv"."0.0.3"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
     ];
     peerDependencies = [
     ];
@@ -1528,7 +1567,7 @@
       self.by-version."mkpath"."0.1.0"
       self.by-version."binary"."0.3.0"
       self.by-version."touch"."0.0.2"
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
       self.by-version."nopt"."2.1.2"
     ];
     peerDependencies = [
@@ -1725,7 +1764,7 @@
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."1.5.0"
       self.by-version."esutils"."1.0.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -1747,21 +1786,21 @@
     deps = [
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."0.0.4"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
     passthru.names = [ "escodegen" ];
   };
-  by-spec."escodegen"."1.0.x" =
-    self.by-version."escodegen"."1.0.1";
-  by-version."escodegen"."1.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "escodegen-1.0.1";
+  by-spec."escodegen"."1.1.x" =
+    self.by-version."escodegen"."1.1.0";
+  by-version."escodegen"."1.1.0" = lib.makeOverridable self.buildNodePackage {
+    name = "escodegen-1.1.0";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/escodegen/-/escodegen-1.0.1.tgz";
-        name = "escodegen-1.0.1.tgz";
-        sha1 = "84c92c4a07440271b90e6b78e620973bf721226e";
+        url = "http://registry.npmjs.org/escodegen/-/escodegen-1.1.0.tgz";
+        name = "escodegen-1.1.0.tgz";
+        sha1 = "c663923f6e20aad48d0c0fa49f31c6d4f49360cf";
       })
     ];
     buildInputs =
@@ -1770,12 +1809,31 @@
       self.by-version."esprima"."1.0.4"
       self.by-version."estraverse"."1.5.0"
       self.by-version."esutils"."1.0.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
     passthru.names = [ "escodegen" ];
   };
+  by-spec."esprima"."1.0.3" =
+    self.by-version."esprima"."1.0.3";
+  by-version."esprima"."1.0.3" = lib.makeOverridable self.buildNodePackage {
+    name = "esprima-1.0.3";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/esprima/-/esprima-1.0.3.tgz";
+        name = "esprima-1.0.3.tgz";
+        sha1 = "7bdb544f95526d424808654d3b8fbe928650c0fe";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."esprima" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "esprima" ];
+  };
   by-spec."esprima"."1.0.x" =
     self.by-version."esprima"."1.0.4";
   by-version."esprima"."1.0.4" = lib.makeOverridable self.buildNodePackage {
@@ -1797,8 +1855,6 @@
   };
   by-spec."esprima"."~ 1.0.2" =
     self.by-version."esprima"."1.0.4";
-  by-spec."esprima"."~1.0.0" =
-    self.by-version."esprima"."1.0.4";
   by-spec."esprima"."~1.0.2" =
     self.by-version."esprima"."1.0.4";
   by-spec."esprima"."~1.0.4" =
@@ -1901,7 +1957,7 @@
     ];
     passthru.names = [ "eventemitter2" ];
   };
-  by-spec."exit"."~0.1.1" =
+  by-spec."exit"."0.1.x" =
     self.by-version."exit"."0.1.2";
   by-version."exit"."0.1.2" = lib.makeOverridable self.buildNodePackage {
     name = "node-exit-0.1.2";
@@ -1920,6 +1976,8 @@
     ];
     passthru.names = [ "exit" ];
   };
+  by-spec."exit"."~0.1.1" =
+    self.by-version."exit"."0.1.2";
   by-spec."extend"."~1.2.1" =
     self.by-version."extend"."1.2.1";
   by-version."extend"."1.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -1957,7 +2015,7 @@
       self.by-version."lodash"."2.1.0"
       self.by-version."iconv-lite"."0.2.11"
       self.by-version."rimraf"."2.2.6"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
       self.by-version."minimatch"."0.2.14"
       self.by-version."findup-sync"."0.1.2"
       self.by-version."isbinaryfile"."0.1.9"
@@ -1981,7 +2039,7 @@
       (self.nativeDeps."fileset" or []);
     deps = [
       self.by-version."minimatch"."0.2.14"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -2127,7 +2185,7 @@
     deps = [
       self.by-version."rimraf"."2.2.6"
       self.by-version."mkdirp"."0.3.5"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."inherits"."2.0.1"
     ];
     peerDependencies = [
@@ -2194,7 +2252,28 @@
       (self.nativeDeps."glob" or []);
     deps = [
       self.by-version."minimatch"."0.2.14"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
+      self.by-version."inherits"."2.0.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "glob" ];
+  };
+  by-spec."glob"."3.2.7" =
+    self.by-version."glob"."3.2.7";
+  by-version."glob"."3.2.7" = lib.makeOverridable self.buildNodePackage {
+    name = "node-glob-3.2.7";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/glob/-/glob-3.2.7.tgz";
+        name = "glob-3.2.7.tgz";
+        sha1 = "275f39a0eee805694790924f36eac38e1db6d802";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."glob" or []);
+    deps = [
+      self.by-version."minimatch"."0.2.14"
       self.by-version."inherits"."2.0.1"
     ];
     peerDependencies = [
@@ -2202,14 +2281,14 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob"."3.x" =
-    self.by-version."glob"."3.2.8";
-  by-version."glob"."3.2.8" = lib.makeOverridable self.buildNodePackage {
-    name = "node-glob-3.2.8";
+    self.by-version."glob"."3.2.9";
+  by-version."glob"."3.2.9" = lib.makeOverridable self.buildNodePackage {
+    name = "node-glob-3.2.9";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/glob/-/glob-3.2.8.tgz";
-        name = "glob-3.2.8.tgz";
-        sha1 = "5506f4311721bcc618c7d8dba144188750307073";
+        url = "http://registry.npmjs.org/glob/-/glob-3.2.9.tgz";
+        name = "glob-3.2.9.tgz";
+        sha1 = "56af2289aa43d07d7702666480373eb814d91d40";
       })
     ];
     buildInputs =
@@ -2223,7 +2302,7 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob".">= 3.1.4" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.1.21" =
     self.by-version."glob"."3.1.21";
   by-version."glob"."3.1.21" = lib.makeOverridable self.buildNodePackage {
@@ -2247,11 +2326,11 @@
     passthru.names = [ "glob" ];
   };
   by-spec."glob"."~3.2.1" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.2.6" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."glob"."~3.2.7" =
-    self.by-version."glob"."3.2.8";
+    self.by-version."glob"."3.2.9";
   by-spec."graceful-fs"."~1.1" =
     self.by-version."graceful-fs"."1.1.14";
   by-version."graceful-fs"."1.1.14" = lib.makeOverridable self.buildNodePackage {
@@ -2291,14 +2370,14 @@
     passthru.names = [ "graceful-fs" ];
   };
   by-spec."graceful-fs"."~2.0.0" =
-    self.by-version."graceful-fs"."2.0.1";
-  by-version."graceful-fs"."2.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "node-graceful-fs-2.0.1";
+    self.by-version."graceful-fs"."2.0.2";
+  by-version."graceful-fs"."2.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-graceful-fs-2.0.2";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.1.tgz";
-        name = "graceful-fs-2.0.1.tgz";
-        sha1 = "7fd6e0a4837c35d0cc15330294d9584a3898cf84";
+        url = "http://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.2.tgz";
+        name = "graceful-fs-2.0.2.tgz";
+        sha1 = "26806eaca4bff8fc5dbc935e696135792175c46f";
       })
     ];
     buildInputs =
@@ -2310,7 +2389,7 @@
     passthru.names = [ "graceful-fs" ];
   };
   by-spec."graceful-fs"."~2.0.1" =
-    self.by-version."graceful-fs"."2.0.1";
+    self.by-version."graceful-fs"."2.0.2";
   by-spec."growl"."1.7.x" =
     self.by-version."growl"."1.7.0";
   by-version."growl"."1.7.0" = lib.makeOverridable self.buildNodePackage {
@@ -2432,7 +2511,7 @@
     buildInputs =
       (self.nativeDeps."grunt-contrib-jshint" or []);
     deps = [
-      self.by-version."jshint"."2.4.3"
+      self.by-version."jshint"."2.4.4"
     ];
     peerDependencies = [
       self.by-version."grunt"."0.4.2"
@@ -2465,36 +2544,36 @@
   };
   "grunt-contrib-less" = self.by-version."grunt-contrib-less"."0.9.0";
   by-spec."grunt-contrib-requirejs"."~0.4.1" =
-    self.by-version."grunt-contrib-requirejs"."0.4.1";
-  by-version."grunt-contrib-requirejs"."0.4.1" = lib.makeOverridable self.buildNodePackage {
-    name = "node-grunt-contrib-requirejs-0.4.1";
+    self.by-version."grunt-contrib-requirejs"."0.4.3";
+  by-version."grunt-contrib-requirejs"."0.4.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-contrib-requirejs-0.4.3";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.1.tgz";
-        name = "grunt-contrib-requirejs-0.4.1.tgz";
-        sha1 = "862ba167141b8a8f36af5444feab3272bb8cf4bd";
+        url = "http://registry.npmjs.org/grunt-contrib-requirejs/-/grunt-contrib-requirejs-0.4.3.tgz";
+        name = "grunt-contrib-requirejs-0.4.3.tgz";
+        sha1 = "ac243dc312af5c85cd095169da1b3177bfe89c59";
       })
     ];
     buildInputs =
       (self.nativeDeps."grunt-contrib-requirejs" or []);
     deps = [
-      self.by-version."requirejs"."2.1.10"
+      self.by-version."requirejs"."2.1.11"
     ];
     peerDependencies = [
       self.by-version."grunt"."0.4.2"
     ];
     passthru.names = [ "grunt-contrib-requirejs" ];
   };
-  "grunt-contrib-requirejs" = self.by-version."grunt-contrib-requirejs"."0.4.1";
+  "grunt-contrib-requirejs" = self.by-version."grunt-contrib-requirejs"."0.4.3";
   by-spec."grunt-contrib-uglify"."~0.3.2" =
-    self.by-version."grunt-contrib-uglify"."0.3.2";
-  by-version."grunt-contrib-uglify"."0.3.2" = lib.makeOverridable self.buildNodePackage {
-    name = "node-grunt-contrib-uglify-0.3.2";
+    self.by-version."grunt-contrib-uglify"."0.3.3";
+  by-version."grunt-contrib-uglify"."0.3.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-contrib-uglify-0.3.3";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.3.2.tgz";
-        name = "grunt-contrib-uglify-0.3.2.tgz";
-        sha1 = "865b00ae0d11d1f5fafca3967c9b099f8929684b";
+        url = "http://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.3.3.tgz";
+        name = "grunt-contrib-uglify-0.3.3.tgz";
+        sha1 = "91f04d2ae0984c8bdf73ae6ee23f13cd5c44f0af";
       })
     ];
     buildInputs =
@@ -2509,7 +2588,32 @@
     ];
     passthru.names = [ "grunt-contrib-uglify" ];
   };
-  "grunt-contrib-uglify" = self.by-version."grunt-contrib-uglify"."0.3.2";
+  "grunt-contrib-uglify" = self.by-version."grunt-contrib-uglify"."0.3.3";
+  by-spec."grunt-jscs-checker"."~0.4.0" =
+    self.by-version."grunt-jscs-checker"."0.4.0";
+  by-version."grunt-jscs-checker"."0.4.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-grunt-jscs-checker-0.4.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/grunt-jscs-checker/-/grunt-jscs-checker-0.4.0.tgz";
+        name = "grunt-jscs-checker-0.4.0.tgz";
+        sha1 = "aac281242fc5f40fed511d751a807f3b6a4fe0ac";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."grunt-jscs-checker" or []);
+    deps = [
+      self.by-version."hooker"."0.2.3"
+      self.by-version."jscs"."1.3.0"
+      self.by-version."lodash.assign"."2.4.1"
+      self.by-version."vow"."0.4.1"
+    ];
+    peerDependencies = [
+      self.by-version."grunt"."0.4.2"
+    ];
+    passthru.names = [ "grunt-jscs-checker" ];
+  };
+  "grunt-jscs-checker" = self.by-version."grunt-jscs-checker"."0.4.0";
   by-spec."grunt-karma"."~0.7.2" =
     self.by-version."grunt-karma"."0.7.2";
   by-version."grunt-karma"."0.7.2" = lib.makeOverridable self.buildNodePackage {
@@ -2758,7 +2862,7 @@
       self.by-version."domhandler"."2.1.0"
       self.by-version."domutils"."1.1.6"
       self.by-version."domelementtype"."1.1.1"
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -2843,7 +2947,7 @@
       (self.nativeDeps."ibrik" or []);
     deps = [
       self.by-version."coffee-script-redux"."2.0.0-beta4"
-      self.by-version."istanbul"."0.2.4"
+      self.by-version."istanbul"."0.2.5"
       self.by-version."optimist"."0.6.1"
       self.by-version."escodegen"."1.2.0"
       self.by-version."mkdirp"."0.3.5"
@@ -2998,21 +3102,21 @@
     passthru.names = [ "isbinaryfile" ];
   };
   by-spec."istanbul"."*" =
-    self.by-version."istanbul"."0.2.4";
-  by-version."istanbul"."0.2.4" = lib.makeOverridable self.buildNodePackage {
-    name = "istanbul-0.2.4";
+    self.by-version."istanbul"."0.2.5";
+  by-version."istanbul"."0.2.5" = lib.makeOverridable self.buildNodePackage {
+    name = "istanbul-0.2.5";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/istanbul/-/istanbul-0.2.4.tgz";
-        name = "istanbul-0.2.4.tgz";
-        sha1 = "faaaa400f2cf652c3dc8b3d9484b44a5528e3a04";
+        url = "http://registry.npmjs.org/istanbul/-/istanbul-0.2.5.tgz";
+        name = "istanbul-0.2.5.tgz";
+        sha1 = "c6e5e5e2632ae7f208b4322dd69082bb76771ea4";
       })
     ];
     buildInputs =
       (self.nativeDeps."istanbul" or []);
     deps = [
       self.by-version."esprima"."1.0.4"
-      self.by-version."escodegen"."1.0.1"
+      self.by-version."escodegen"."1.1.0"
       self.by-version."handlebars"."1.3.0"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."nopt"."2.1.2"
@@ -3022,7 +3126,7 @@
       self.by-version."abbrev"."1.0.4"
       self.by-version."wordwrap"."0.0.2"
       self.by-version."resolve"."0.6.1"
-      self.by-version."js-yaml"."3.0.1"
+      self.by-version."js-yaml"."3.0.2"
     ];
     peerDependencies = [
     ];
@@ -3099,14 +3203,14 @@
     passthru.names = [ "jedediah" ];
   };
   by-spec."js-yaml"."3.x" =
-    self.by-version."js-yaml"."3.0.1";
-  by-version."js-yaml"."3.0.1" = lib.makeOverridable self.buildNodePackage {
-    name = "js-yaml-3.0.1";
+    self.by-version."js-yaml"."3.0.2";
+  by-version."js-yaml"."3.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "js-yaml-3.0.2";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/js-yaml/-/js-yaml-3.0.1.tgz";
-        name = "js-yaml-3.0.1.tgz";
-        sha1 = "76405fea5bce30fc8f405d48c6dca7f0a32c6afe";
+        url = "http://registry.npmjs.org/js-yaml/-/js-yaml-3.0.2.tgz";
+        name = "js-yaml-3.0.2.tgz";
+        sha1 = "9937865f8e897a5e894e73c2c5cf2e89b32eb771";
       })
     ];
     buildInputs =
@@ -3161,15 +3265,43 @@
     ];
     passthru.names = [ "js-yaml" ];
   };
+  by-spec."jscs"."~1.3.0" =
+    self.by-version."jscs"."1.3.0";
+  by-version."jscs"."1.3.0" = lib.makeOverridable self.buildNodePackage {
+    name = "jscs-1.3.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/jscs/-/jscs-1.3.0.tgz";
+        name = "jscs-1.3.0.tgz";
+        sha1 = "b3b7cffd634f96dd70963eb94901fc21c521a9e5";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."jscs" or []);
+    deps = [
+      self.by-version."esprima"."1.0.3"
+      self.by-version."vow"."0.3.9"
+      self.by-version."vow-fs"."0.2.3"
+      self.by-version."colors"."0.6.0-1"
+      self.by-version."commander"."1.2.0"
+      self.by-version."minimatch"."0.2.12"
+      self.by-version."glob"."3.2.7"
+      self.by-version."xmlbuilder"."1.1.2"
+      self.by-version."strip-json-comments"."0.1.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "jscs" ];
+  };
   by-spec."jshint"."~2.4.0" =
-    self.by-version."jshint"."2.4.3";
-  by-version."jshint"."2.4.3" = lib.makeOverridable self.buildNodePackage {
-    name = "jshint-2.4.3";
+    self.by-version."jshint"."2.4.4";
+  by-version."jshint"."2.4.4" = lib.makeOverridable self.buildNodePackage {
+    name = "jshint-2.4.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/jshint/-/jshint-2.4.3.tgz";
-        name = "jshint-2.4.3.tgz";
-        sha1 = "1beb074b4d9f817773bb5aa16882fd67164c216a";
+        url = "http://registry.npmjs.org/jshint/-/jshint-2.4.4.tgz";
+        name = "jshint-2.4.4.tgz";
+        sha1 = "4162238314c649f987752651e8e064e30a68706e";
       })
     ];
     buildInputs =
@@ -3181,6 +3313,7 @@
       self.by-version."minimatch"."0.2.14"
       self.by-version."htmlparser2"."3.3.0"
       self.by-version."console-browserify"."0.1.6"
+      self.by-version."exit"."0.1.2"
     ];
     peerDependencies = [
     ];
@@ -3260,7 +3393,7 @@
       self.by-version."di"."0.0.1"
       self.by-version."socket.io"."0.9.16"
       self.by-version."chokidar"."0.8.1"
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
       self.by-version."minimatch"."0.2.14"
       self.by-version."http-proxy"."0.10.4"
       self.by-version."optimist"."0.6.1"
@@ -3270,11 +3403,11 @@
       self.by-version."colors"."0.6.2"
       self.by-version."lodash"."2.4.1"
       self.by-version."mime"."1.2.11"
-      self.by-version."log4js"."0.6.10"
+      self.by-version."log4js"."0.6.12"
       self.by-version."useragent"."2.0.7"
-      self.by-version."graceful-fs"."2.0.1"
+      self.by-version."graceful-fs"."2.0.2"
       self.by-version."connect"."2.12.0"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -3417,7 +3550,7 @@
     ];
     peerDependencies = [
       self.by-version."karma"."0.11.14"
-      self.by-version."requirejs"."2.1.10"
+      self.by-version."requirejs"."2.1.11"
     ];
     passthru.names = [ "karma-requirejs" ];
   };
@@ -3436,7 +3569,7 @@
     buildInputs =
       (self.nativeDeps."karma-sauce-launcher" or []);
     deps = [
-      self.by-version."wd"."0.2.10"
+      self.by-version."wd"."0.2.11"
       self.by-version."sauce-connect-launcher"."0.2.2"
       self.by-version."q"."0.9.7"
       self.by-version."saucelabs"."0.1.1"
@@ -3487,6 +3620,25 @@
     ];
     passthru.names = [ "kew" ];
   };
+  by-spec."keypress"."0.1.x" =
+    self.by-version."keypress"."0.1.0";
+  by-version."keypress"."0.1.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-keypress-0.1.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz";
+        name = "keypress-0.1.0.tgz";
+        sha1 = "4a3188d4291b66b4f65edb99f806aa9ae293592a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."keypress" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "keypress" ];
+  };
   by-spec."lazystream"."~0.1.0" =
     self.by-version."lazystream"."0.1.0";
   by-version."lazystream"."0.1.0" = lib.makeOverridable self.buildNodePackage {
@@ -3501,7 +3653,7 @@
     buildInputs =
       (self.nativeDeps."lazystream" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -3540,7 +3692,7 @@
     buildInputs =
       (self.nativeDeps."lcov-result-merger" or []);
     deps = [
-      self.by-version."glob"."3.2.8"
+      self.by-version."glob"."3.2.9"
     ];
     peerDependencies = [
     ];
@@ -3562,10 +3714,10 @@
       (self.nativeDeps."less" or []);
     deps = [
       self.by-version."mime"."1.2.11"
-      self.by-version."request"."2.33.0"
+      self.by-version."request"."2.34.0"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."clean-css"."2.0.8"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
     ];
     peerDependencies = [
     ];
@@ -3685,6 +3837,120 @@
     ];
     passthru.names = [ "lodash" ];
   };
+  by-spec."lodash._basebind"."~2.4.1" =
+    self.by-version."lodash._basebind"."2.4.1";
+  by-version."lodash._basebind"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basebind-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz";
+        name = "lodash._basebind-2.4.1.tgz";
+        sha1 = "e940b9ebdd27c327e0a8dab1b55916c5341e9575";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basebind" or []);
+    deps = [
+      self.by-version."lodash._basecreate"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basebind" ];
+  };
+  by-spec."lodash._basecreate"."~2.4.1" =
+    self.by-version."lodash._basecreate"."2.4.1";
+  by-version."lodash._basecreate"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreate-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz";
+        name = "lodash._basecreate-2.4.1.tgz";
+        sha1 = "f8e6f5b578a9e34e541179b56b8eeebf4a287e08";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreate" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash.noop"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreate" ];
+  };
+  by-spec."lodash._basecreatecallback"."~2.4.1" =
+    self.by-version."lodash._basecreatecallback"."2.4.1";
+  by-version."lodash._basecreatecallback"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreatecallback-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz";
+        name = "lodash._basecreatecallback-2.4.1.tgz";
+        sha1 = "7d0b267649cb29e7a139d0103b7c11fae84e4851";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreatecallback" or []);
+    deps = [
+      self.by-version."lodash.bind"."2.4.1"
+      self.by-version."lodash.identity"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash.support"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreatecallback" ];
+  };
+  by-spec."lodash._basecreatewrapper"."~2.4.1" =
+    self.by-version."lodash._basecreatewrapper"."2.4.1";
+  by-version."lodash._basecreatewrapper"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._basecreatewrapper-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz";
+        name = "lodash._basecreatewrapper-2.4.1.tgz";
+        sha1 = "4d31f2e7de7e134fbf2803762b8150b32519666f";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._basecreatewrapper" or []);
+    deps = [
+      self.by-version."lodash._basecreate"."2.4.1"
+      self.by-version."lodash.isobject"."2.4.1"
+      self.by-version."lodash._setbinddata"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._basecreatewrapper" ];
+  };
+  by-spec."lodash._createwrapper"."~2.4.1" =
+    self.by-version."lodash._createwrapper"."2.4.1";
+  by-version."lodash._createwrapper"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._createwrapper-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz";
+        name = "lodash._createwrapper-2.4.1.tgz";
+        sha1 = "51d6957973da4ed556e37290d8c1a18c53de1607";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._createwrapper" or []);
+    deps = [
+      self.by-version."lodash._basebind"."2.4.1"
+      self.by-version."lodash._basecreatewrapper"."2.4.1"
+      self.by-version."lodash.isfunction"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._createwrapper" ];
+  };
   by-spec."lodash._isnative"."~2.4.1" =
     self.by-version."lodash._isnative"."2.4.1";
   by-version."lodash._isnative"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3723,6 +3989,27 @@
     ];
     passthru.names = [ "lodash._objecttypes" ];
   };
+  by-spec."lodash._setbinddata"."~2.4.1" =
+    self.by-version."lodash._setbinddata"."2.4.1";
+  by-version."lodash._setbinddata"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._setbinddata-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz";
+        name = "lodash._setbinddata-2.4.1.tgz";
+        sha1 = "f7c200cd1b92ef236b399eecf73c648d17aa94d2";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._setbinddata" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+      self.by-version."lodash.noop"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._setbinddata" ];
+  };
   by-spec."lodash._shimkeys"."~2.4.1" =
     self.by-version."lodash._shimkeys"."2.4.1";
   by-version."lodash._shimkeys"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3743,6 +4030,68 @@
     ];
     passthru.names = [ "lodash._shimkeys" ];
   };
+  by-spec."lodash._slice"."~2.4.1" =
+    self.by-version."lodash._slice"."2.4.1";
+  by-version."lodash._slice"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash._slice-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz";
+        name = "lodash._slice-2.4.1.tgz";
+        sha1 = "745cf41a53597b18f688898544405efa2b06d90f";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash._slice" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash._slice" ];
+  };
+  by-spec."lodash.assign"."~2.4.1" =
+    self.by-version."lodash.assign"."2.4.1";
+  by-version."lodash.assign"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.assign-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz";
+        name = "lodash.assign-2.4.1.tgz";
+        sha1 = "84c39596dd71181a97b0652913a7c9675e49b1aa";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.assign" or []);
+    deps = [
+      self.by-version."lodash._basecreatecallback"."2.4.1"
+      self.by-version."lodash.keys"."2.4.1"
+      self.by-version."lodash._objecttypes"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.assign" ];
+  };
+  by-spec."lodash.bind"."~2.4.1" =
+    self.by-version."lodash.bind"."2.4.1";
+  by-version."lodash.bind"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.bind-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz";
+        name = "lodash.bind-2.4.1.tgz";
+        sha1 = "5d19fa005c8c4d236faf4742c7b7a1fcabe29267";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.bind" or []);
+    deps = [
+      self.by-version."lodash._createwrapper"."2.4.1"
+      self.by-version."lodash._slice"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.bind" ];
+  };
   by-spec."lodash.defaults"."~2.4.1" =
     self.by-version."lodash.defaults"."2.4.1";
   by-version."lodash.defaults"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3764,6 +4113,44 @@
     ];
     passthru.names = [ "lodash.defaults" ];
   };
+  by-spec."lodash.identity"."~2.4.1" =
+    self.by-version."lodash.identity"."2.4.1";
+  by-version."lodash.identity"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.identity-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz";
+        name = "lodash.identity-2.4.1.tgz";
+        sha1 = "6694cffa65fef931f7c31ce86c74597cf560f4f1";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.identity" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.identity" ];
+  };
+  by-spec."lodash.isfunction"."~2.4.1" =
+    self.by-version."lodash.isfunction"."2.4.1";
+  by-version."lodash.isfunction"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.isfunction-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz";
+        name = "lodash.isfunction-2.4.1.tgz";
+        sha1 = "2cfd575c73e498ab57e319b77fa02adef13a94d1";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.isfunction" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.isfunction" ];
+  };
   by-spec."lodash.isobject"."~2.4.1" =
     self.by-version."lodash.isobject"."2.4.1";
   by-version."lodash.isobject"."2.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -3806,6 +4193,45 @@
     ];
     passthru.names = [ "lodash.keys" ];
   };
+  by-spec."lodash.noop"."~2.4.1" =
+    self.by-version."lodash.noop"."2.4.1";
+  by-version."lodash.noop"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.noop-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz";
+        name = "lodash.noop-2.4.1.tgz";
+        sha1 = "4fb54f816652e5ae10e8f72f717a388c7326538a";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.noop" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.noop" ];
+  };
+  by-spec."lodash.support"."~2.4.1" =
+    self.by-version."lodash.support"."2.4.1";
+  by-version."lodash.support"."2.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-lodash.support-2.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz";
+        name = "lodash.support-2.4.1.tgz";
+        sha1 = "320e0b67031673c28d7a2bb5d9e0331a45240515";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."lodash.support" or []);
+    deps = [
+      self.by-version."lodash._isnative"."2.4.1"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "lodash.support" ];
+  };
   by-spec."log-driver"."1.2.1" =
     self.by-version."log-driver"."1.2.1";
   by-version."log-driver"."1.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -3826,14 +4252,14 @@
     passthru.names = [ "log-driver" ];
   };
   by-spec."log4js"."~0.6.3" =
-    self.by-version."log4js"."0.6.10";
-  by-version."log4js"."0.6.10" = lib.makeOverridable self.buildNodePackage {
-    name = "node-log4js-0.6.10";
+    self.by-version."log4js"."0.6.12";
+  by-version."log4js"."0.6.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-log4js-0.6.12";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/log4js/-/log4js-0.6.10.tgz";
-        name = "log4js-0.6.10.tgz";
-        sha1 = "3a47a2551dc6362672901b73f7f47aee6310f785";
+        url = "http://registry.npmjs.org/log4js/-/log4js-0.6.12.tgz";
+        name = "log4js-0.6.12.tgz";
+        sha1 = "ef806ec669ea3fc7bf5be92a95891fb67517e642";
       })
     ];
     buildInputs =
@@ -3841,7 +4267,7 @@
     deps = [
       self.by-version."async"."0.1.15"
       self.by-version."semver"."1.1.4"
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
     ];
     peerDependencies = [
     ];
@@ -3972,6 +4398,27 @@
     self.by-version."mime"."1.2.11";
   by-spec."mime"."~1.2.9" =
     self.by-version."mime"."1.2.11";
+  by-spec."minimatch"."0.2.12" =
+    self.by-version."minimatch"."0.2.12";
+  by-version."minimatch"."0.2.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-minimatch-0.2.12";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/minimatch/-/minimatch-0.2.12.tgz";
+        name = "minimatch-0.2.12.tgz";
+        sha1 = "ea82a012ac662c7ddfaa144f1c147e6946f5dafb";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."minimatch" or []);
+    deps = [
+      self.by-version."lru-cache"."2.5.0"
+      self.by-version."sigmund"."1.0.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "minimatch" ];
+  };
   by-spec."minimatch"."0.x" =
     self.by-version."minimatch"."0.2.14";
   by-version."minimatch"."0.2.14" = lib.makeOverridable self.buildNodePackage {
@@ -4006,14 +4453,14 @@
   by-spec."minimatch"."~0.2.9" =
     self.by-version."minimatch"."0.2.14";
   by-spec."minimist"."~0.0.1" =
-    self.by-version."minimist"."0.0.7";
-  by-version."minimist"."0.0.7" = lib.makeOverridable self.buildNodePackage {
-    name = "node-minimist-0.0.7";
+    self.by-version."minimist"."0.0.8";
+  by-version."minimist"."0.0.8" = lib.makeOverridable self.buildNodePackage {
+    name = "node-minimist-0.0.8";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/minimist/-/minimist-0.0.7.tgz";
-        name = "minimist-0.0.7.tgz";
-        sha1 = "dc4c620253c542eda0d2eb91c3c6a971a11e63e7";
+        url = "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
+        name = "minimist-0.0.8.tgz";
+        sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
       })
     ];
     buildInputs =
@@ -4174,7 +4621,7 @@
     buildInputs =
       (self.nativeDeps."multiparty" or []);
     deps = [
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
       self.by-version."stream-counter"."0.2.0"
     ];
     peerDependencies = [
@@ -4297,6 +4744,25 @@
     ];
     passthru.names = [ "next-tick" ];
   };
+  by-spec."node-uuid"."1.4.0" =
+    self.by-version."node-uuid"."1.4.0";
+  by-version."node-uuid"."1.4.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-node-uuid-1.4.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.0.tgz";
+        name = "node-uuid-1.4.0.tgz";
+        sha1 = "07f9b2337572ff6275c775e1d48513f3a45d7a65";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."node-uuid" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "node-uuid" ];
+  };
   by-spec."node-uuid"."~1.4.0" =
     self.by-version."node-uuid"."1.4.1";
   by-version."node-uuid"."1.4.1" = lib.makeOverridable self.buildNodePackage {
@@ -4338,6 +4804,26 @@
     passthru.names = [ "nomnom" ];
   };
   by-spec."nopt"."2" =
+    self.by-version."nopt"."2.2.0";
+  by-version."nopt"."2.2.0" = lib.makeOverridable self.buildNodePackage {
+    name = "nopt-2.2.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/nopt/-/nopt-2.2.0.tgz";
+        name = "nopt-2.2.0.tgz";
+        sha1 = "3d106676f3607ac466af9bf82bd707b1501d3bd5";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."nopt" or []);
+    deps = [
+      self.by-version."abbrev"."1.0.4"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "nopt" ];
+  };
+  by-spec."nopt"."2.1.x" =
     self.by-version."nopt"."2.1.2";
   by-version."nopt"."2.1.2" = lib.makeOverridable self.buildNodePackage {
     name = "nopt-2.1.2";
@@ -4357,8 +4843,6 @@
     ];
     passthru.names = [ "nopt" ];
   };
-  by-spec."nopt"."2.1.x" =
-    self.by-version."nopt"."2.1.2";
   by-spec."nopt"."~1.0.10" =
     self.by-version."nopt"."1.0.10";
   by-version."nopt"."1.0.10" = lib.makeOverridable self.buildNodePackage {
@@ -4402,7 +4886,7 @@
       self.by-version."once"."1.1.1"
       self.by-version."mkdirp"."0.3.5"
       self.by-version."osenv"."0.0.3"
-      self.by-version."nopt"."2.1.2"
+      self.by-version."nopt"."2.2.0"
       self.by-version."semver"."1.1.4"
       self.by-version."ini"."1.1.0"
     ];
@@ -4501,7 +4985,7 @@
       (self.nativeDeps."optimist" or []);
     deps = [
       self.by-version."wordwrap"."0.0.2"
-      self.by-version."minimist"."0.0.7"
+      self.by-version."minimist"."0.0.8"
     ];
     peerDependencies = [
     ];
@@ -4714,14 +5198,14 @@
     passthru.names = [ "proto-list" ];
   };
   by-spec."punycode".">=0.2.0" =
-    self.by-version."punycode"."1.2.3";
-  by-version."punycode"."1.2.3" = lib.makeOverridable self.buildNodePackage {
-    name = "node-punycode-1.2.3";
+    self.by-version."punycode"."1.2.4";
+  by-version."punycode"."1.2.4" = lib.makeOverridable self.buildNodePackage {
+    name = "node-punycode-1.2.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/punycode/-/punycode-1.2.3.tgz";
-        name = "punycode-1.2.3.tgz";
-        sha1 = "b4e304471082d783c73b3bafabf2fd9b6a486266";
+        url = "http://registry.npmjs.org/punycode/-/punycode-1.2.4.tgz";
+        name = "punycode-1.2.4.tgz";
+        sha1 = "54008ac972aec74175def9cba6df7fa9d3918740";
       })
     ];
     buildInputs =
@@ -4874,14 +5358,14 @@
     passthru.names = [ "read" ];
   };
   by-spec."readable-stream"."1.0" =
-    self.by-version."readable-stream"."1.0.25";
-  by-version."readable-stream"."1.0.25" = lib.makeOverridable self.buildNodePackage {
-    name = "node-readable-stream-1.0.25";
+    self.by-version."readable-stream"."1.0.26";
+  by-version."readable-stream"."1.0.26" = lib.makeOverridable self.buildNodePackage {
+    name = "node-readable-stream-1.0.26";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.25.tgz";
-        name = "readable-stream-1.0.25.tgz";
-        sha1 = "df19f64e6f74fd37ecf9d3ab8dbf1e2d11c9a045";
+        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.26.tgz";
+        name = "readable-stream-1.0.26.tgz";
+        sha1 = "12a9c4415f6a85374abe18b7831ba52d43105766";
       })
     ];
     buildInputs =
@@ -4894,18 +5378,18 @@
     passthru.names = [ "readable-stream" ];
   };
   by-spec."readable-stream"."~1.0.2" =
-    self.by-version."readable-stream"."1.0.25";
+    self.by-version."readable-stream"."1.0.26";
   by-spec."readable-stream"."~1.0.24" =
-    self.by-version."readable-stream"."1.0.25";
+    self.by-version."readable-stream"."1.0.26";
   by-spec."readable-stream"."~1.1.8" =
-    self.by-version."readable-stream"."1.1.10";
-  by-version."readable-stream"."1.1.10" = lib.makeOverridable self.buildNodePackage {
-    name = "node-readable-stream-1.1.10";
+    self.by-version."readable-stream"."1.1.11";
+  by-version."readable-stream"."1.1.11" = lib.makeOverridable self.buildNodePackage {
+    name = "node-readable-stream-1.1.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.10.tgz";
-        name = "readable-stream-1.1.10.tgz";
-        sha1 = "d4dc2e5319e9c90d1e71c69390ef62cd90827f65";
+        url = "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.11.tgz";
+        name = "readable-stream-1.1.11.tgz";
+        sha1 = "76ae0d88df2ac36c59e7c205e0cafc81c57bc07d";
       })
     ];
     buildInputs =
@@ -4920,16 +5404,16 @@
     passthru.names = [ "readable-stream" ];
   };
   by-spec."readable-stream"."~1.1.9" =
-    self.by-version."readable-stream"."1.1.10";
+    self.by-version."readable-stream"."1.1.11";
   by-spec."redeyed"."~0.4.0" =
-    self.by-version."redeyed"."0.4.2";
-  by-version."redeyed"."0.4.2" = lib.makeOverridable self.buildNodePackage {
-    name = "node-redeyed-0.4.2";
+    self.by-version."redeyed"."0.4.4";
+  by-version."redeyed"."0.4.4" = lib.makeOverridable self.buildNodePackage {
+    name = "node-redeyed-0.4.4";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/redeyed/-/redeyed-0.4.2.tgz";
-        name = "redeyed-0.4.2.tgz";
-        sha1 = "f0133b990cb972bdbcf2d2dce0aec36595f419bc";
+        url = "http://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz";
+        name = "redeyed-0.4.4.tgz";
+        sha1 = "37e990a6f2b21b2a11c2e6a48fd4135698cba97f";
       })
     ];
     buildInputs =
@@ -5013,14 +5497,14 @@
     passthru.names = [ "request" ];
   };
   by-spec."request".">=2.12.0" =
-    self.by-version."request"."2.33.0";
-  by-version."request"."2.33.0" = lib.makeOverridable self.buildNodePackage {
-    name = "node-request-2.33.0";
+    self.by-version."request"."2.34.0";
+  by-version."request"."2.34.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-request-2.34.0";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/request/-/request-2.33.0.tgz";
-        name = "request-2.33.0.tgz";
-        sha1 = "5167878131726070ec633752ea230a2379dc65ff";
+        url = "http://registry.npmjs.org/request/-/request-2.34.0.tgz";
+        name = "request-2.34.0.tgz";
+        sha1 = "b5d8b9526add4a2d4629f4d417124573996445ae";
       })
     ];
     buildInputs =
@@ -5076,6 +5560,35 @@
   };
   by-spec."request"."~2.33.0" =
     self.by-version."request"."2.33.0";
+  by-version."request"."2.33.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-request-2.33.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/request/-/request-2.33.0.tgz";
+        name = "request-2.33.0.tgz";
+        sha1 = "5167878131726070ec633752ea230a2379dc65ff";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."request" or []);
+    deps = [
+      self.by-version."qs"."0.6.6"
+      self.by-version."json-stringify-safe"."5.0.0"
+      self.by-version."forever-agent"."0.5.2"
+      self.by-version."node-uuid"."1.4.1"
+      self.by-version."mime"."1.2.11"
+      self.by-version."tough-cookie"."0.12.1"
+      self.by-version."form-data"."0.1.2"
+      self.by-version."tunnel-agent"."0.3.0"
+      self.by-version."http-signature"."0.10.0"
+      self.by-version."oauth-sign"."0.3.0"
+      self.by-version."hawk"."1.0.0"
+      self.by-version."aws-sign2"."0.5.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "request" ];
+  };
   by-spec."request-progress"."~0.3.0" =
     self.by-version."request-progress"."0.3.1";
   by-version."request-progress"."0.3.1" = lib.makeOverridable self.buildNodePackage {
@@ -5117,14 +5630,14 @@
     passthru.names = [ "request-replay" ];
   };
   by-spec."requirejs"."~2.1" =
-    self.by-version."requirejs"."2.1.10";
-  by-version."requirejs"."2.1.10" = lib.makeOverridable self.buildNodePackage {
-    name = "requirejs-2.1.10";
+    self.by-version."requirejs"."2.1.11";
+  by-version."requirejs"."2.1.11" = lib.makeOverridable self.buildNodePackage {
+    name = "requirejs-2.1.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/requirejs/-/requirejs-2.1.10.tgz";
-        name = "requirejs-2.1.10.tgz";
-        sha1 = "1e1d7f608790e532a422c6199dad2abe15484b54";
+        url = "http://registry.npmjs.org/requirejs/-/requirejs-2.1.11.tgz";
+        name = "requirejs-2.1.11.tgz";
+        sha1 = "0eafaa6b46ca9b5b1e13406f119c020190a24442";
       })
     ];
     buildInputs =
@@ -5136,10 +5649,10 @@
     passthru.names = [ "requirejs" ];
   };
   by-spec."requirejs"."~2.1.0" =
-    self.by-version."requirejs"."2.1.10";
+    self.by-version."requirejs"."2.1.11";
   by-spec."requirejs"."~2.1.10" =
-    self.by-version."requirejs"."2.1.10";
-  "requirejs" = self.by-version."requirejs"."2.1.10";
+    self.by-version."requirejs"."2.1.11";
+  "requirejs" = self.by-version."requirejs"."2.1.11";
   by-spec."resolve"."0.5.x" =
     self.by-version."resolve"."0.5.1";
   by-version."resolve"."0.5.1" = lib.makeOverridable self.buildNodePackage {
@@ -5492,14 +6005,14 @@
     passthru.names = [ "socket.io-client" ];
   };
   by-spec."source-map"."0.1.x" =
-    self.by-version."source-map"."0.1.31";
-  by-version."source-map"."0.1.31" = lib.makeOverridable self.buildNodePackage {
-    name = "node-source-map-0.1.31";
+    self.by-version."source-map"."0.1.33";
+  by-version."source-map"."0.1.33" = lib.makeOverridable self.buildNodePackage {
+    name = "node-source-map-0.1.33";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz";
-        name = "source-map-0.1.31.tgz";
-        sha1 = "9f704d0d69d9e138a81badf6ebb4fde33d151c61";
+        url = "http://registry.npmjs.org/source-map/-/source-map-0.1.33.tgz";
+        name = "source-map-0.1.33.tgz";
+        sha1 = "c659297a73af18c073b0aa2e7cc91e316b5c570c";
       })
     ];
     buildInputs =
@@ -5512,13 +6025,13 @@
     passthru.names = [ "source-map" ];
   };
   by-spec."source-map".">= 0.1.2" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.30" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.31" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."source-map"."~0.1.7" =
-    self.by-version."source-map"."0.1.31";
+    self.by-version."source-map"."0.1.33";
   by-spec."stream-counter"."~0.2.0" =
     self.by-version."stream-counter"."0.2.0";
   by-version."stream-counter"."0.2.0" = lib.makeOverridable self.buildNodePackage {
@@ -5533,7 +6046,7 @@
     buildInputs =
       (self.nativeDeps."stream-counter" or []);
     deps = [
-      self.by-version."readable-stream"."1.1.10"
+      self.by-version."readable-stream"."1.1.11"
     ];
     peerDependencies = [
     ];
@@ -5596,6 +6109,25 @@
     ];
     passthru.names = [ "strip-ansi" ];
   };
+  by-spec."strip-json-comments"."0.1.1" =
+    self.by-version."strip-json-comments"."0.1.1";
+  by-version."strip-json-comments"."0.1.1" = lib.makeOverridable self.buildNodePackage {
+    name = "strip-json-comments-0.1.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.1.tgz";
+        name = "strip-json-comments-0.1.1.tgz";
+        sha1 = "eb5a750bd4e8dc82817295a115dc11b63f01d4b0";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."strip-json-comments" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "strip-json-comments" ];
+  };
   by-spec."sudo-block"."~0.2.0" =
     self.by-version."sudo-block"."0.2.1";
   by-version."sudo-block"."0.2.1" = lib.makeOverridable self.buildNodePackage {
@@ -5729,7 +6261,7 @@
     buildInputs =
       (self.nativeDeps."tough-cookie" or []);
     deps = [
-      self.by-version."punycode"."1.2.3"
+      self.by-version."punycode"."1.2.4"
     ];
     peerDependencies = [
     ];
@@ -5826,7 +6358,7 @@
       (self.nativeDeps."uglify-js" or []);
     deps = [
       self.by-version."async"."0.2.10"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
       self.by-version."optimist"."0.3.7"
     ];
     peerDependencies = [
@@ -5848,7 +6380,7 @@
       (self.nativeDeps."uglify-js" or []);
     deps = [
       self.by-version."async"."0.2.10"
-      self.by-version."source-map"."0.1.31"
+      self.by-version."source-map"."0.1.33"
       self.by-version."optimist"."0.3.7"
       self.by-version."uglify-to-browserify"."1.0.2"
     ];
@@ -5913,6 +6445,25 @@
     ];
     passthru.names = [ "underscore" ];
   };
+  by-spec."underscore".">=1.5.x" =
+    self.by-version."underscore"."1.6.0";
+  by-version."underscore"."1.6.0" = lib.makeOverridable self.buildNodePackage {
+    name = "node-underscore-1.6.0";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz";
+        name = "underscore-1.6.0.tgz";
+        sha1 = "8b38b10cacdef63337b8b24e4ff86d45aea529a8";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."underscore" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "underscore" ];
+  };
   by-spec."underscore"."~1.4.3" =
     self.by-version."underscore"."1.4.4";
   by-spec."underscore"."~1.4.4" =
@@ -6044,15 +6595,116 @@
     ];
     passthru.names = [ "vargs" ];
   };
+  by-spec."vow"."0.3.9" =
+    self.by-version."vow"."0.3.9";
+  by-version."vow"."0.3.9" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.3.9";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.3.9.tgz";
+        name = "vow-0.3.9.tgz";
+        sha1 = "c9b67ac7ed4911a49ad5af23ebf7f4392e835d74";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow".">= 0.3.9" =
+    self.by-version."vow"."0.4.1";
+  by-version."vow"."0.4.1" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.4.1";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.4.1.tgz";
+        name = "vow-0.4.1.tgz";
+        sha1 = "97c816578b2547d59083898bd65a1bff6c016454";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow"."~0.3.9" =
+    self.by-version."vow"."0.3.12";
+  by-version."vow"."0.3.12" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-0.3.12";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow/-/vow-0.3.12.tgz";
+        name = "vow-0.3.12.tgz";
+        sha1 = "ca631885e2c8bfa4d5ae38daa125f8f71f379903";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow" or []);
+    deps = [
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow" ];
+  };
+  by-spec."vow"."~0.4.1" =
+    self.by-version."vow"."0.4.1";
+  by-spec."vow-fs"."0.2.3" =
+    self.by-version."vow-fs"."0.2.3";
+  by-version."vow-fs"."0.2.3" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-fs-0.2.3";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow-fs/-/vow-fs-0.2.3.tgz";
+        name = "vow-fs-0.2.3.tgz";
+        sha1 = "ac8c942c30175f91210f0202d3c27730a0ad9fbe";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow-fs" or []);
+    deps = [
+      self.by-version."node-uuid"."1.4.0"
+      self.by-version."vow-queue"."0.0.2"
+      self.by-version."vow"."0.3.12"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "vow-fs" ];
+  };
+  by-spec."vow-queue"."0.0.2" =
+    self.by-version."vow-queue"."0.0.2";
+  by-version."vow-queue"."0.0.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-vow-queue-0.0.2";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/vow-queue/-/vow-queue-0.0.2.tgz";
+        name = "vow-queue-0.0.2.tgz";
+        sha1 = "deba6cfc2a82d6061d10eb3a12fad63a8e6bb64d";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."vow-queue" or []);
+    deps = [
+    ];
+    peerDependencies = [
+      self.by-version."vow"."0.3.12"
+    ];
+    passthru.names = [ "vow-queue" ];
+  };
   by-spec."wd"."~0.2.8" =
-    self.by-version."wd"."0.2.10";
-  by-version."wd"."0.2.10" = lib.makeOverridable self.buildNodePackage {
-    name = "wd-0.2.10";
+    self.by-version."wd"."0.2.11";
+  by-version."wd"."0.2.11" = lib.makeOverridable self.buildNodePackage {
+    name = "wd-0.2.11";
     src = [
       (fetchurl {
-        url = "http://registry.npmjs.org/wd/-/wd-0.2.10.tgz";
-        name = "wd-0.2.10.tgz";
-        sha1 = "c4ac58eff5f32cc8e79e8f272a4c365c4240a68e";
+        url = "http://registry.npmjs.org/wd/-/wd-0.2.11.tgz";
+        name = "wd-0.2.11.tgz";
+        sha1 = "27889d290facf3d19e050b3c789f2e852ca03f10";
       })
     ];
     buildInputs =
@@ -6156,6 +6808,26 @@
     ];
     passthru.names = [ "xmlbuilder" ];
   };
+  by-spec."xmlbuilder"."1.1.2" =
+    self.by-version."xmlbuilder"."1.1.2";
+  by-version."xmlbuilder"."1.1.2" = lib.makeOverridable self.buildNodePackage {
+    name = "node-xmlbuilder-1.1.2";
+    src = [
+      (fetchurl {
+        url = "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-1.1.2.tgz";
+        name = "xmlbuilder-1.1.2.tgz";
+        sha1 = "83873690df07061a4e65340ea0b899c1b9c86e23";
+      })
+    ];
+    buildInputs =
+      (self.nativeDeps."xmlbuilder" or []);
+    deps = [
+      self.by-version."underscore"."1.6.0"
+    ];
+    peerDependencies = [
+    ];
+    passthru.names = [ "xmlbuilder" ];
+  };
   by-spec."xmlhttprequest"."1.4.2" =
     self.by-version."xmlhttprequest"."1.4.2";
   by-version."xmlhttprequest"."1.4.2" = lib.makeOverridable self.buildNodePackage {
@@ -6227,7 +6899,7 @@
     buildInputs =
       (self.nativeDeps."zip-stream" or []);
     deps = [
-      self.by-version."readable-stream"."1.0.25"
+      self.by-version."readable-stream"."1.0.26"
       self.by-version."lodash.defaults"."2.4.1"
     ];
     peerDependencies = [
diff --git a/tests/config.js b/tests/config.js
index 2798c6d..14591d0 100644
--- a/tests/config.js
+++ b/tests/config.js
@@ -1,19 +1,21 @@
 var tests = Object.keys(window.__karma__.files).filter(function (file) {
-    if (window.__karma__.config.args.pattern) {
-      return (new RegExp(window.__karma__.config.args.pattern + "-test.js$")).test(file);
-    }
-    return (/\-test\.js$/).test(file);
+  'use strict';
+
+  if (window.__karma__.config.args.pattern) {
+    return (new RegExp(window.__karma__.config.args.pattern + '-test.js$')).test(file);
+  }
+  return (/\-test\.js$/).test(file);
 });
 
 requirejs.config({
-    // Karma serves files from '/base'
-    baseUrl: '/base',
+  // Karma serves files from '/base'
+  baseUrl: '/base',
 
-    // ask Require.js to load these files (all our tests)
-    deps: tests,
+  // ask Require.js to load these files (all our tests)
+  deps: tests,
 
-    // start test run, once Require.js is done
-    callback: window.__karma__.start
+  // start test run, once Require.js is done
+  callback: window.__karma__.start
 });
 
 window.DEBUG = true;
diff --git a/tests/fakeserver.js b/tests/fakeserver.js
index ad1bcf4..fdc305d 100644
--- a/tests/fakeserver.js
+++ b/tests/fakeserver.js
@@ -3,19 +3,19 @@ define([
   'jquery',
   'underscore'
 ], function(sinon, $, _) {
-  "use strict";
+  'use strict';
 
   function getQueryVariable(url, variable) {
     var query = url.split('?')[1];
-    if(query === undefined){
+    if (query === undefined) {
       return null;
     }
     var vars = query.split('&');
     for (var i = 0; i < vars.length; i += 1) {
-        var pair = vars[i].split('=');
-        if (decodeURIComponent(pair[0]) === variable) {
-            return decodeURIComponent(pair[1]);
-        }
+      var pair = vars[i].split('=');
+      if (decodeURIComponent(pair[0]) === variable) {
+        return decodeURIComponent(pair[1]);
+      }
     }
     return null;
   }
@@ -34,7 +34,7 @@ define([
   server.autoRespond = true;
   server.autoRespondAfter = 200;
 
-  server.respondWith("GET", /select2-test\.json/, function (xhr, id) {
+  server.respondWith('GET', /select2-test\.json/, function (xhr, id) {
     var items = [
       {id: 'red', text: 'Red'},
       {id: 'green', text: 'Green'},
@@ -42,85 +42,97 @@ define([
       {id: 'orange', text: 'Orange'},
       {id: 'yellow', text: 'Yellow'}
     ];
-    xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+    xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
       total: items.length,
       results: items
     }));
   });
 
-  server.respondWith("GET", /search\.json/, function (xhr, id) {
+  server.respondWith('GET', /search\.json/, function (xhr, id) {
     var items = [
       {
-        "UID": "123sdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: '123sdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf1123asZ",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf1123asZ',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf1231as",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf1231as',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf12231451",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf12231451',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf1235dsd",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf1235dsd',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasd345345f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasd345345f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdf465",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdf465',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooaewrwsdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooaewrwsdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasd123f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasd123f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdas123f",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdas123f',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       },
       {
-        "UID": "fooasdfasdfsdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "News"
+        UID: 'fooasdfasdfsdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'News'
       },
       {
-        "UID": "fooasdfasdf",
-        "getURL": "http://localhost:8081/news/aggregator",
-        "Type": "Collection", "Description": "Site News",
-        "Title": "Another Item"
+        UID: 'fooasdfasdf',
+        getURL: 'http://localhost:8081/news/aggregator',
+        Type: 'Collection',
+        Description: 'Site News',
+        Title: 'Another Item'
       }
     ];
 
@@ -134,13 +146,13 @@ define([
     } else {
       if (batch) {
         var start, end;
-        start = (batch.page-1) * batch.size;
+        start = (batch.page - 1) * batch.size;
         end = start + batch.size;
         results = items.slice(start, end);
       }
     }
 
-    xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+    xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
       total: results.length,
       results: results
     }));
@@ -153,52 +165,52 @@ define([
   var possibleNames = ['Page', 'News Item', 'Info', 'Blog Item'];
   var possibleTags = ['one', 'two', 'three', 'four'];
 
-  function generateUID(size){
-    if(!size){
+  function generateUID(size) {
+    if (!size) {
       size = 30;
     }
-    var text = "";
-    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+    var text = '';
+    var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 
-    for(var i=0; i<size; i=i+1){
+    for (var i = 0; i < size; i = i + 1) {
       text += possible.charAt(Math.floor(Math.random() * possible.length));
     }
     return text;
   }
-  for(var pathi=0; pathi<basePaths.length; pathi=pathi+1){
+  for (var pathi = 0; pathi < basePaths.length; pathi = pathi + 1) {
     var basePath = basePaths[pathi];
-    for(var i=0; i<1000; i=i+1){
+    for (var j = 0; j < 1000; j = j + 1) {
       randomItems.push({
         UID: generateUID(),
-        Title: possibleNames[Math.floor(Math.random()*possibleNames.length)] + ' ' + i,
+        Title: possibleNames[Math.floor(Math.random() * possibleNames.length)] + ' ' + j,
         path: basePath + generateUID(8),
-        Type: "Document"
+        Type: 'Document'
       });
     }
   }
 
   server.respondWith(/relateditems-test\.json/, function(xhr, id) {
     var searchables = [
-      {"UID": "jasdlfdlkdkjasdf", "Title": "Some Image", "path": "/test.png", "Type": "Image"},
-      {"UID": "asdlfkjasdlfkjasdf", "Title": "News", "path": "/news", "Type": "Folder"},
-      {"UID": "124asdfasasdaf34", "Title": "About", "path": "/about", "Type": "Folder"},
-      {"UID": "asdf1234", "Title": "Projects", "path": "/projects", "Type": "Folder"},
-      {"UID": "asdf1234gsad", "Title": "Contact", "path": "/contact", "Type": "Document"},
-      {"UID": "asdv34sdfs", "Title": "Privacy Policy", "path": "/policy", "Type": "Document"},
-      {"UID": "asdfasdf234sdf", "Title": "Our Process", "path": "/our-process", "Type": "Folder"},
-      {"UID": "asdhsfghyt45", "Title": "Donate", "path": "/donate-now", "Type": "Document"},
+      {UID: 'jasdlfdlkdkjasdf', Title: 'Some Image', path: '/test.png', Type: 'Image'},
+      {UID: 'asdlfkjasdlfkjasdf', Title: 'News', path: '/news', Type: 'Folder'},
+      {UID: '124asdfasasdaf34', Title: 'About', path: '/about', Type: 'Folder'},
+      {UID: 'asdf1234', Title: 'Projects', path: '/projects', Type: 'Folder'},
+      {UID: 'asdf1234gsad', Title: 'Contact', path: '/contact', Type: 'Document'},
+      {UID: 'asdv34sdfs', Title: 'Privacy Policy', path: '/policy', Type: 'Document'},
+      {UID: 'asdfasdf234sdf', Title: 'Our Process', path: '/our-process', Type: 'Folder'},
+      {UID: 'asdhsfghyt45', Title: 'Donate', path: '/donate-now', Type: 'Document'},
       // about
-      {"UID": "gfn5634f", "Title": "About Us", "path": "/about/about-us", "Type": "Document"},
-      {"UID": "45dsfgsdcd", "Title": "Philosophy", "path": "/about/philosophy", "Type": "Document"},
-      {"UID": "dfgsdfgj675", "Title": "Staff", "path": "/about/staff", "Type": "Folder"},
-      {"UID": "sdfbsfdh345", "Title": "Board of Directors", "path": "/about/board-of-directors", "Type": "Document"},
+      {UID: 'gfn5634f', Title: 'About Us', path: '/about/about-us', Type: 'Document'},
+      {UID: '45dsfgsdcd', Title: 'Philosophy', path: '/about/philosophy', Type: 'Document'},
+      {UID: 'dfgsdfgj675', Title: 'Staff', path: '/about/staff', Type: 'Folder'},
+      {UID: 'sdfbsfdh345', Title: 'Board of Directors', path: '/about/board-of-directors', Type: 'Document'},
       // staff
-      {"UID": "asdfasdf9sdf", "Title": "Mike", "path": "/about/staff/mike", "Type": "Document"},
-      {"UID": "cvbcvb82345", "Title": "Joe", "path": "/about/staff/joe", "Type": "Document"}
+      {UID: 'asdfasdf9sdf', Title: 'Mike', path: '/about/staff/mike', Type: 'Document'},
+      {UID: 'cvbcvb82345', Title: 'Joe', path: '/about/staff/joe', Type: 'Document'}
     ];
     searchables = searchables.concat(randomItems);
 
-    var addSomeData = function(list){
+    var addSomeData = function(list) {
       /* add getURL value, review_state, modification, creation */
       var dates = [
         'January 1, 2011',
@@ -207,22 +219,22 @@ define([
         'April 1, 2012',
         'May 20, 2013'
       ];
-      for(var i=0; i<list.length; i=i+1){
+      for (var i = 0; i < list.length; i = i + 1) {
         var data = list[i];
         data.getURL = window.location.origin + data.path;
-        data.review_state = ['published', 'private', 'review'][Math.floor(Math.random()*3)];
-        data.CreationDate = dates[Math.floor(Math.random()*dates.length)];
-        data.ModificationDate = dates[Math.floor(Math.random()*dates.length)];
-        data.EffectiveDate = dates[Math.floor(Math.random()*dates.length)];
+        data['review_state'] = ['published', 'private', 'review'][Math.floor(Math.random() * 3)];  // jshint ignore:line
+        data.CreationDate = dates[Math.floor(Math.random() * dates.length)];
+        data.ModificationDate = dates[Math.floor(Math.random() * dates.length)];
+        data.EffectiveDate = dates[Math.floor(Math.random() * dates.length)];
         data.Subject = [
-          possibleTags[Math.floor(Math.random()*possibleTags.length)],
-          possibleTags[Math.floor(Math.random()*possibleTags.length)]
+          possibleTags[Math.floor(Math.random() * possibleTags.length)],
+          possibleTags[Math.floor(Math.random() * possibleTags.length)]
         ];
         data.id = data.Title.replace(' ', '-').toLowerCase();
-        if(data.Type === 'Folder'){
-          data.is_folderish = true;
-        }else{
-          data.is_folderish = false;
+        if (data.Type === 'Folder') {
+          data['is_folderish'] = true;  // jshint ignore:line
+        } else {
+          data['is_folderish'] = false;  // jshint ignore:line
         }
       }
     };
@@ -234,24 +246,24 @@ define([
     // grab the page number and number of items per page -- note, page is 1-based from Select2
     var batch = getQueryVariable(xhr.url, 'batch');
     var page = 1;
-    var page_size = 10;
-    if(batch){
+    var pageSize = 10;
+    if (batch) {
       batch = $.parseJSON(batch);
       page = batch.page;
-      page_size = batch.size;
+      pageSize = batch.size;
     }
     page = page - 1;
 
     var query = getQueryVariable(xhr.url, 'query');
     var path = null;
     var term = '';
-    if(query){
+    if (query) {
       query = $.parseJSON(query);
-      for(var i=0; i<query.criteria.length; i=i+1){
+      for (var i = 0; i < query.criteria.length; i = i + 1) {
         var criteria = query.criteria[i];
-        if(criteria.i === 'path'){
+        if (criteria.i === 'path') {
           path = criteria.v.split('::')[0];
-        }else{
+        } else {
           term = criteria.v;
         }
       }
@@ -260,23 +272,23 @@ define([
     // this seach is for basically searching the entire hierarchy -- this IS NOT the browse "search"
     function search(items, term) {
       results = [];
-      if (term === undefined){
+      if (term === undefined) {
         return searchables;
       }
       _.each(items, function(item) {
         var q;
         var keys = (item.UID + ' ' + item.Title + ' ' + item.path + ' ' + item.Type).toLowerCase();
-        if(typeof(term) === 'object'){
-          for(var i=0; i<term.length; i=i+1){
+        if (typeof(term) === 'object') {
+          for (var i = 0; i < term.length; i = i + 1) {
             q = term[i].toLowerCase();
-            if (keys.indexOf(q) > -1){
+            if (keys.indexOf(q) > -1) {
               results.push(item);
               break;
             }
           }
-        }else{
+        } else {
           q = term.toLowerCase().replace('*', '');
-          if (keys.indexOf(q) > -1){
+          if (keys.indexOf(q) > -1) {
             results.push(item);
           }
         }
@@ -285,16 +297,16 @@ define([
 
     function browse(items, q, p) {
       results = [];
-      var path = p.substring(0, p.length-1);
+      var path = p.substring(0, p.length - 1);
       var splitPath = path.split('/');
       var fromPath = [];
       _.each(items, function(item) {
         var itemSplit = item.path.split('/');
-        if (item.path.indexOf(path) === 0 && itemSplit.length-1 === splitPath.length) {
+        if (item.path.indexOf(path) === 0 && itemSplit.length - 1 === splitPath.length) {
           fromPath.push(item);
         }
       });
-      if (q === undefined){
+      if (q === undefined) {
         return fromPath;
       }
       search(fromPath, q);
@@ -305,83 +317,88 @@ define([
       search(searchables, term);
     }
 
-    xhr.respond(200, { "Content-Type": "application/json" },
+    xhr.respond(200, { 'Content-Type': 'application/json' },
       JSON.stringify({
-        "total": results.length,
-        "results": results.slice(page*page_size, (page*page_size)+(page_size-1))
-    }));
+        total: results.length,
+        results: results.slice(page * pageSize, (page * pageSize) + (pageSize - 1))
+      })
+    );
   });
 
-  server.respondWith("GET", /something\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Content from AJAX</h1>'+
-'    <p>Ah, it is a rock, though. Should beat everything.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Content from AJAX</h1>' +
+    '<p>Ah, it is a rock, though. Should beat everything.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /something-link\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Content from AJAX with a link</h1>'+
-'    <p>Ah, it is a rock, though. Should beat <a href="something-else.html">link</a> everything.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something-link\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Content from AJAX with a link</h1>' +
+    '<p>Ah, it is a rock, though. Should beat <a href="something-else.html">link</a> everything.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /something-else\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Something else</h1>'+
-'    <p>We loaded a link.</p>'+
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /something-else\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Something else</h1>' +
+    '<p>We loaded a link.</p>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
-  server.respondWith("GET", /modal-form\.html/,
-                                [200, { "Content-Type": "text/html" },
-                                 ''+
-'    <html> '+
-'    <head></head>'+
-'    <body> '+
-'    <div id="content">'+
-'    <h1>Modal with Form</h1>'+
-'    <p>This modal contains a form.</p>'+
-'    <form method="POST" action="/modal-submit.html">' +
-'      <label for="name">Name:</label><input type="text" name="name" />' +
-'      <div class="formControls"> ' +
-'        <input type="submit" class="btn btn-primary" value="Submit" name="submit" />' +
-'      </div> '+
-'    </form>' +
-'    </body> '+
-'    </html>']);
+  server.respondWith('GET', /modal-form\.html/, [
+    200,
+    { 'Content-Type': 'text/html' },
+    '<html> ' +
+    '<head></head>' +
+    '<body> ' +
+    '<div id="content">' +
+    '<h1>Modal with Form</h1>' +
+    '<p>This modal contains a form.</p>' +
+    '<form method="POST" action="/modal-submit.html">' +
+    '  <label for="name">Name:</label><input type="text" name="name" />' +
+    '  <div class="formControls"> ' +
+    '    <input type="submit" class="btn btn-primary" value="Submit" name="submit" />' +
+    '  </div> ' +
+    '</form>' +
+    '</body> ' +
+    '</html>'
+  ]);
 
   server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
-    var name = getQueryVariable('?'+xhr.requestBody, 'name');
-    xhr.respond(200, {"content-Type": "text/html"},
-      '<html> '+
-      '  <head></head>'+
-      '  <body> '+
-      '    <div id="content">'+
-      '      <h1>Hello, '+_.escape(name)+'</h1>'+
-      '      <p>Thanks!</p>'+
-      '  </body> '+
+    var name = getQueryVariable('?' + xhr.requestBody, 'name');
+    xhr.respond(200, {'content-Type': 'text/html'},
+      '<html> ' +
+      '  <head></head>' +
+      '  <body> ' +
+      '    <div id="content">' +
+      '      <h1>Hello, ' + _.escape(name) + '</h1>' +
+      '      <p>Thanks!</p>' +
+      '  </body> ' +
       '</html>'
     );
   });
 
   server.respondWith('POST', /upload/, function(xhr, id) {
-    xhr.respond(200, {"content-Type": "application/json"},
+    xhr.respond(200, {'content-Type': 'application/json'},
       JSON.stringify({
         url: 'http://localhost:8000/blah.png',
         uid: 'sldlfkjsldkjlskdjf',
@@ -395,11 +412,11 @@ define([
 
   server.respondWith('GET', /portal_factory\/@@querybuilder_html_results/, function(xhr, id) {
     var content = $('#querystring-example-results').text();
-    xhr.respond(200, {"content-Type": "text/html"}, content);
+    xhr.respond(200, {'content-Type': 'text/html'}, content);
   });
   server.respondWith('GET', /portal_factory\/@@querybuildernumberofresults/, function(xhr, id) {
     var content = $('#querystring-number-results-example-results').text();
-    xhr.respond(200, {"content-Type": "text/html"}, content);
+    xhr.respond(200, {'content-Type': 'text/html'}, content);
   });
 
   var basicActions = [
@@ -417,102 +434,102 @@ define([
   ];
 
   var actionData = {
-    '/copy': function(xhr){
+    '/copy': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: selection.length + ' items copied'
       };
     },
-    '/cut': function(xhr){
+    '/cut': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: selection.length + ' items cut'
       };
     },
-    '/paste': function(xhr){
+    '/paste': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'pasted ' + selection.length + ' items'
       };
     },
-    '/order': function(xhr){
+    '/order': function(xhr) {
       return {
-        status: "success",
+        status: 'success',
         msg: 'Folder ordering set'
       };
     },
-    '/tags': function(xhr){
+    '/tags': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Tags updated for ' + selection.length + ' items'
       };
     },
-    '/properties': function(xhr){
+    '/properties': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Properties updated for ' + selection.length + ' items'
       };
     },
-    '/rename': function(xhr){
+    '/rename': function(xhr) {
       var torename = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'torename'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Renamed ' + torename.length + ' items'
       };
     },
-    '/workflow': function(xhr){
+    '/workflow': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
-      if(xhr.requestBody.indexOf('transitions') !== -1){
+      if (xhr.requestBody.indexOf('transitions') !== -1) {
         var transitions = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'transitions'));
         // get possible transitions...
         return {
-          "status": "success",
-          "transitions": [{
-            id: "publish",
-            title: "Publish"
-          },{
-            id: "retract",
-            title: "Retract"
+          status: 'success',
+          transitions: [{
+            id: 'publish',
+            title: 'Publish'
+          }, {
+            id: 'retract',
+            title: 'Retract'
           }]
         };
-      }else{
+      } else {
         return {
-          status: "success",
+          status: 'success',
           msg: 'Workflow updated for ' + selection.length + ' items'
         };
       }
     },
-    '/delete': function(xhr){
+    '/delete': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Deleted ' + selection.length + ' items'
       };
     },
-    '/rearrange': function(xhr){
+    '/rearrange': function(xhr) {
       var selection = JSON.parse(getQueryVariable('?' + xhr.requestBody, 'selection'));
       return {
-        status: "success",
+        status: 'success',
         msg: 'Rearranged items'
       };
     }
   };
 
-  _.each(basicActions, function(action){
+  _.each(basicActions, function(action) {
     server.respondWith('POST', action, function(xhr, id) {
       server.autoRespondAfter = 200;
       var data = {
-          "status": "success"
+        status: 'success'
       };
-      if(actionData[action]){
+      if (actionData[action]) {
         data = actionData[action](xhr);
       }
-      xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify(data));
+      xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify(data));
     });
   });
 
diff --git a/tests/iframe-test.js b/tests/iframe-test.js
index 25cb660..a3d37a1 100644
--- a/tests/iframe-test.js
+++ b/tests/iframe-test.js
@@ -3,46 +3,46 @@ define([
   'jquery',
   'mockup-iframe'
 ], function(expect, $, IFrame, undefined) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
 
-  describe("Registry", function () {
+  describe('Registry', function () {
     beforeEach(function() {
       this.iframe = new $.IFrame({
         el: $('<div><p>some</p><a href="#">some link</a></div>').appendTo('body'),
         position: 'top'
       });
-      this.iframe._window_location = function() {};
-      this.iframe._window_open = function() {};
+      this.iframe._windowLocation = function() {};
+      this.iframe._windowOpen = function() {};
     });
     afterEach(function() {
       this.iframe.$el.remove();
     });
-    it("simple stretch and shrink", function() {
-      var initial_height = this.iframe.$el.height();
+    it('simple stretch and shrink', function() {
+      var initialHeight = this.iframe.$el.height();
 
-      expect(initial_height).to.not.equal(0);
+      expect(initialHeight).to.not.equal(0);
 
       this.iframe.stretch();
-      expect(initial_height).to.be.below(this.iframe.$el.height());
+      expect(initialHeight).to.be.below(this.iframe.$el.height());
 
       this.iframe.shrink();
-      expect(initial_height).to.be.equal(this.iframe.$el.height());
+      expect(initialHeight).to.be.equal(this.iframe.$el.height());
 
       this.iframe.toggle();
-      expect(initial_height).to.be.above(this.iframe.$el.height());
+      expect(initialHeight).to.be.above(this.iframe.$el.height());
 
       this.iframe.toggle();
-      expect(initial_height).to.be.equal(this.iframe.$el.height());
+      expect(initialHeight).to.be.equal(this.iframe.$el.height());
     });
 
   });
 });
 
-//    "defult handling of clicks inside iframe": function() {
-//      var stub_location = this.stub($.iframe, '_window_location'),
-//          stub_open = this.stub($.iframe, '_window_open');
+//    'defult handling of clicks inside iframe': function() {
+//      var stub_location = this.stub($.iframe, '_windowLocation'),
+//          stub_open = this.stub($.iframe, '_windowOpen');
 //
 //      $('a', $.iframe.$el).trigger({ type: 'click', which: 1 });  // left click
 //      $('a', $.iframe.$el).trigger({ type: 'click', which: 2 });  // middle click
@@ -52,14 +52,14 @@ define([
 //      assert.callOrder(stub_location, stub_open);
 //    },
 //
-//    "custom handling of clicks inside iframe": function() {
+//    'custom handling of clicks inside iframe': function() {
 //      $.iframe.registerAction(
 //        function(e, iframe) { return true; },
 //        function(e, iframe) { assert(true); });
 //      $('p', $.iframe.$el).trigger({ type: 'click' });
 //    },
 //
-//    "when iframe is stretch click can also happen on html element": function() {
+//    'when iframe is stretch click can also happen on html element': function() {
 //      $.iframe.registerAction(
 //        function(e, iframe) { return true; },
 //        function(e, iframe) { assert(true); });
diff --git a/tests/iframe_init-test.js b/tests/iframe_init-test.js
index 7a9a79d..9bd1a39 100644
--- a/tests/iframe_init-test.js
+++ b/tests/iframe_init-test.js
@@ -2,7 +2,7 @@ define([
   'expect',
   'mockup-iframe_init'
 ], function(expect) {
-  "use strict";
+  'use strict';
 
 
   // ======================================================================= //
@@ -11,7 +11,7 @@ define([
 
   function createElement(name, resources, content, extra) {
 
-    var el = document.createElement("div");
+    var el = document.createElement('div');
     el.setAttribute('data-iframe', name);
     el.setAttribute('data-iframe-resources', resources);
 
@@ -55,27 +55,27 @@ define([
                   getPropertyValue(property);
     }
 
-    return "";
+    return '';
   }
 
   function onLoad(done, iframes, callable) {
 
-    var iframes_loaded;
+    var iframesLoaded;
 
     function onLoadInner() {
 
       if (iframes.loaded !== undefined) {
-        iframes_loaded = iframes.loaded;
+        iframesLoaded = iframes.loaded;
       } else {
-        iframes_loaded = true;
+        iframesLoaded = true;
         for (var i = 0; i < iframes.length; i += 1) {
-          if (iframes_loaded === false || iframes[i].loaded === false) {
-            iframes_loaded = false;
+          if (iframesLoaded === false || iframes[i].loaded === false) {
+            iframesLoaded = false;
           }
         }
       }
 
-      if (iframes_loaded === true) {
+      if (iframesLoaded === true) {
         callable();
         done();
         return;
@@ -95,11 +95,12 @@ define([
 
   window.mocha.setup('bdd');
 
-  describe("iframe.js", function() {
+  describe('iframe.js', function() {
     beforeEach(function() {
       this.el = createElement('example',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-          '<p>example content</p>');
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
     });
     afterEach(function() {
       removeElements(document.getElementsByTagName('iframe'));
@@ -118,157 +119,165 @@ define([
         }
       }
     });
-    it("checks html of generated iframe", function(done) {
-      window.iframe_initialize();
+    it('checks html of generated iframe', function(done) {
+      window.iframeInitialize();
       onLoad(done, window.iframe.example, function() {
-        var iframe_el = window.iframe.example.el,
-            iframe_doc = window.iframe.example.document;
+        var iframeEl = window.iframe.example.el,
+            iframeDocument = window.iframe.example.document;
 
         expect(document.getElementsByTagName('iframe').length).to.equal(1);
-        expect(iframe_doc.body.childNodes.length).to.equal(3);
-        expect(iframe_doc.getElementsByTagName('p').length).to.equal(1);
-        expect(iframe_doc.getElementsByTagName('p')[0].innerHTML).to.equal('example content');
+        expect(iframeDocument.body.childNodes.length).to.equal(3);
+        expect(iframeDocument.getElementsByTagName('p').length).to.equal(1);
+        expect(iframeDocument.getElementsByTagName('p')[0].innerHTML).to.equal('example content');
 
-        var link = iframe_doc.getElementsByTagName('link')[0];
-        expect(iframe_doc.getElementsByTagName('link').length ).to.equal(1);
+        var link = iframeDocument.getElementsByTagName('link')[0];
+        expect(iframeDocument.getElementsByTagName('link').length ).to.equal(1);
         expect(link.getAttribute('href') ).to.equal('/base/tests/example-resource.css');
         expect(link.getAttribute('type') ).to.equal('text/css');
         expect(link.getAttribute('rel') ).to.equal('stylesheet');
 
-        var script = iframe_doc.getElementsByTagName('script')[0];
-        expect(iframe_doc.getElementsByTagName('script').length ).to.equal(1);
+        var script = iframeDocument.getElementsByTagName('script')[0];
+        expect(iframeDocument.getElementsByTagName('script').length ).to.equal(1);
         expect(script.getAttribute('src') ).to.equal('/base/tests/example-resource.js');
         expect(script.getAttribute('type') ).to.equal('text/javascript');
 
-        expect(iframe_el.getAttribute('frameBorder') ).to.equal('0');
-        expect(iframe_el.getAttribute('border') ).to.equal('0');
-        expect(iframe_el.getAttribute('allowTransparency') ).to.equal('true');
-        expect(iframe_el.getAttribute('scrolling') ).to.equal('no');
-        expect(iframe_el.getAttribute('id') ).to.equal('example');
-        expect(iframe_el.getAttribute('name') ).to.equal('example');
-        expect(iframe_el.getAttribute('style').indexOf('height:0px') ).to.equal(-1);
+        expect(iframeEl.getAttribute('frameBorder') ).to.equal('0');
+        expect(iframeEl.getAttribute('border') ).to.equal('0');
+        expect(iframeEl.getAttribute('allowTransparency') ).to.equal('true');
+        expect(iframeEl.getAttribute('scrolling') ).to.equal('no');
+        expect(iframeEl.getAttribute('id') ).to.equal('example');
+        expect(iframeEl.getAttribute('name') ).to.equal('example');
+        expect(iframeEl.getAttribute('style').indexOf('height:0px') ).to.equal( -1 );
 
-        expect(window.iframe.example.el ).to.equal(iframe_el);
+        expect(window.iframe.example.el ).to.equal(iframeEl);
 
         // TODO: test updateOption method
         // TODO: test add method
       });
     });
-    it("less resources", function(done) {
+    it('less resources', function(done) {
       expect(document.getElementsByTagName('iframe').length).to.equal(0);
       createElement('example2', '/base/tests/example-resource.less');
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(2);
 
-        var iframe2_doc = window.iframe.example2.document,
-            link = iframe2_doc.getElementsByTagName('link')[0];
+        var iframe2Document = window.iframe.example2.document,
+            link = iframe2Document.getElementsByTagName('link')[0];
 
-        expect(iframe2_doc.getElementsByTagName('link').length).to.equal(1);
+        expect(iframe2Document.getElementsByTagName('link').length).to.equal(1);
         expect(link.getAttribute('href')).to.equal('/base/tests/example-resource.less');
         expect(link.getAttribute('type')).to.equal('text/css');
         expect(link.getAttribute('rel')).to.equal('stylesheet/less');
       });
     });
-    it("z-index can be custom", function(done) {
+    it('z-index can be custom', function(done) {
       createElement('example2', '', '', {'data-iframe-zindex': '1000'});
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(getElementStyle(window.iframe.example2.el, 'z-index')).to.equal('1000');
       });
     });
-    it("height of empty iframe should be 0px", function(done) {
+    it('height of empty iframe should be 0px', function(done) {
       createElement('example2', '', '');
-      window.iframe_initialize();
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(getElementStyle(window.iframe.example2.el, 'height')).to.equal('0px');
       });
     });
-    it("2 elements gets content into DIFFERENT iframe", function(done) {
-      createElement('example3',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              '<p>example content</p>');
-      window.iframe_initialize();
+    it('2 elements gets content into DIFFERENT iframe', function(done) {
+      createElement(
+        'example3',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example3 ], function() {
+        window.iframe.example,
+        window.iframe.example3
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(2);
       });
     });
-    it("2 elements gets content into SAME iframe", function(done) {
-      createElement('example',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              '<p>example content</p>');
-      window.iframe_initialize();
+    it('2 elements gets content into SAME iframe', function(done) {
+      createElement(
+        'example',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>example content</p>'
+      );
+      window.iframeInitialize();
       onLoad(done, window.iframe.example, function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(1);
       });
     });
-    it("Bottom-aligned iFrame does not add to height", function(done) {
-      createElement('example_top',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              "<p>I'm on top of the world!</p>",
-              { 'data-iframe-position': 'top' });
-      createElement('example_bottom',
-          '/base/tests/example-resource.js;/base/tests/example-resource.css',
-              "<p>I'm.......<br/><br/><br/>Not.</p>",
-              { 'data-iframe-position': 'bottom' });
-      window.iframe_initialize();
+    it('Bottom-aligned iFrame does not add to height', function(done) {
+      createElement(
+        'exampletop',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>I\'m on top of the world!</p>',
+        { 'data-iframe-position': 'top' }
+      );
+      createElement(
+        'examplebottom',
+        '/base/tests/example-resource.js;/base/tests/example-resource.css',
+        '<p>I\'m.......<br/><br/><br/>Not.</p>',
+        { 'data-iframe-position': 'bottom' }
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example_top,
-          window.iframe.example_bottom ], function() {
-
+        window.iframe.example,
+        window.iframe.exampletop,
+        window.iframe.examplebottom
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
 
         //TODO
-        expect(window.iframe.example_top.el.offsetHeight <
-               window.iframe.example_bottom.el.offsetHeight).to.equal(true);
-
-        expect(window.iframe.example_top.el.offsetHeight + 'px').to.equal(
-            getElementStyle(document.body, 'margin-top'));
-        expect(window.iframe.example_bottom.el.offsetHeight + 'px').to.equal(
-            getElementStyle(document.body, 'margin-bottom'));
+        expect(window.iframe.exampletop.el.offsetHeight <
+               window.iframe.examplebottom.el.offsetHeight).to.equal(true);
 
+        expect(window.iframe.exampletop.el.offsetHeight + 'px')
+          .to.equal(getElementStyle(document.body, 'margin-top'));
+        expect(window.iframe.examplebottom.el.offsetHeight + 'px')
+          .to.equal(getElementStyle(document.body, 'margin-bottom'));
       });
     });
-    it("CSS Styles only apply to inner document", function(done) {
-      createElement('example_pink', '',
-              "<h1>I'm a pink title</h1>",
-              { 'data-iframe-styles': 'h1 { background-color: pink; }' });
-      window.iframe_initialize();
+    it('CSS Styles only apply to inner document', function(done) {
+      createElement(
+        'examplepink', '',
+        '<h1>I\'m a pink title</h1>',
+        { 'data-iframe-styles': 'h1 { background-color: pink; }' }
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example_pink ], function() {
-
+        window.iframe.example,
+        window.iframe.examplepink
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
-
-        expect(
-          getElementStyle(window.iframe.example_pink.document.getElementsByTagName('h1')[0], 'background-color')).to.not.equal(
-          getElementStyle(document.getElementsByTagName('h1')[0], 'background-color')
-          );
-
+        expect(getElementStyle(window.iframe.examplepink.document.getElementsByTagName('h1')[0], 'background-color'))
+          .to.not.equal(getElementStyle(document.getElementsByTagName('h1')[0], 'background-color'));
       });
     });
-    it("extra attributes passed via url", function(done) {
-      createElement('example2',
-          '/base/tests/example-resource.js?data-main="example";');
-      window.iframe_initialize();
+    it('extra attributes passed via url', function(done) {
+      createElement(
+        'example2',
+        '/base/tests/example-resource.js?data-main="example";'
+      );
+      window.iframeInitialize();
       onLoad(done, [
-          window.iframe.example,
-          window.iframe.example2 ], function() {
-
+        window.iframe.example,
+        window.iframe.example2
+      ], function() {
         expect(document.getElementsByTagName('iframe').length).to.equal(3);
-
-        expect(window.iframe.example2.document
-                  .getElementsByTagName('script')[0]
-                  .getAttribute('data-main')).to.equal('example');
+        expect(window.iframe.example2.document.getElementsByTagName('script')[0].getAttribute('data-main')).to.equal('example');
       });
     });
   });
diff --git a/tests/pattern-accessibility-test.js b/tests/pattern-accessibility-test.js
index 8040a22..405ec03 100644
--- a/tests/pattern-accessibility-test.js
+++ b/tests/pattern-accessibility-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-accessibility'
 ], function(expect, $, registry, Accessibility) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Accessibility
   ========================== */
 
-  describe("Accessibility", function () {
+  describe('Accessibility', function () {
     beforeEach(function() {
       $.removeCookie('fontsize');
       this.$el = $('' +
@@ -23,40 +23,39 @@ define([
           '<a id="btn3" />' +
         '</div>');
     });
-    it("test cookie remains set", function() {
+    it('test cookie remains set', function() {
       var accessibility = new Accessibility(this.$el);
       expect($.cookie('fontsize')).to.be.equal(undefined);
-      accessibility.setBaseFontSize("smallText", 1);
+      accessibility.setBaseFontSize('smallText', 1);
       expect($.cookie('fontsize')).to.be.equal('smallText');
     });
-    it("test class is set", function() {
+    it('test class is set', function() {
       var accessibility = new Accessibility(this.$el);
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
-      expect(this.$el.hasClass("largeText")).to.be.equal(false);
-      accessibility.setBaseFontSize("smallText", 1);
-      expect(this.$el.hasClass("smallText")).to.be.equal(true);
-      expect(this.$el.hasClass("largeText")).to.be.equal(false);
-      accessibility.setBaseFontSize("largeText", 1);
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
-      expect(this.$el.hasClass("largeText")).to.be.equal(true);
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
+      expect(this.$el.hasClass('largeText')).to.be.equal(false);
+      accessibility.setBaseFontSize('smallText', 1);
+      expect(this.$el.hasClass('smallText')).to.be.equal(true);
+      expect(this.$el.hasClass('largeText')).to.be.equal(false);
+      accessibility.setBaseFontSize('largeText', 1);
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
+      expect(this.$el.hasClass('largeText')).to.be.equal(true);
     });
-    it("test class is set if a cookie is found", function() {
-      $.cookie('fontsize', "smallText");
-      expect(this.$el.hasClass("smallText")).to.be.equal(false);
+    it('test class is set if a cookie is found', function() {
+      $.cookie('fontsize', 'smallText');
+      expect(this.$el.hasClass('smallText')).to.be.equal(false);
       registry.scan(this.$el);
-      expect(this.$el.hasClass("smallText")).to.be.equal(true);
+      expect(this.$el.hasClass('smallText')).to.be.equal(true);
     });
-    it("test setting small font size with button works", function(){
+    it('test setting small font size with button works', function() {
       // add pattern to anchor
-      this.$el.attr("data-pat-accessibility", "smallbtn: #btn1");
+      this.$el.attr('data-pat-accessibility', 'smallbtn: #btn1');
       registry.scan(this.$el);
       $('#btn1', this.$el).trigger('click');
       expect(this.$el.hasClass('smallText')).to.be.equal(true);
     });
-    it("test setting large font size with button works", function(){
+    it('test setting large font size with button works', function() {
       // add pattern to anchor
-      this.$el.attr("data-pat-accessibility",
-        "largebtn: #btn3; smallbtn: #btn1");
+      this.$el.attr('data-pat-accessibility', 'largebtn: #btn3; smallbtn: #btn1');
       registry.scan(this.$el);
       $('#btn3', this.$el).trigger('click');
       expect(this.$el.hasClass('largeText')).to.be.equal(true);
diff --git a/tests/pattern-autotoc-test.js b/tests/pattern-autotoc-test.js
index a0c4928..fb721bc 100644
--- a/tests/pattern-autotoc-test.js
+++ b/tests/pattern-autotoc-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-autotoc'
 ], function(expect, $, Registry, AutoTOC) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,7 +14,7 @@ define([
    TEST: AutoTOC
   ========================== */
 
-  describe("AutoTOC", function () {
+  describe('AutoTOC', function () {
     beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-autotoc">' +
@@ -38,7 +38,7 @@ define([
     afterEach(function() {
       this.$el.remove();
     });
-    it("by default creates TOC from h1/h2/h3", function() {
+    it('by default creates TOC from h1/h2/h3', function() {
       expect($('> nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(1);
@@ -48,56 +48,56 @@ define([
       expect($('> nav > a.autotoc-level-3', this.$el).size()).to.equal(1);
       expect($('> nav > a.autotoc-level-4', this.$el).size()).to.equal(0);
     });
-    it("can be used as jQuery plugin as well", function () {
+    it('can be used as jQuery plugin as well', function () {
       expect($('> nav', this.$el).size()).to.equal(0);
       this.$el.patternAutotoc();
       expect($('> nav', this.$el).size()).to.equal(1);
     });
-    it("can have custom levels", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1");
+    it('can have custom levels', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1');
       expect($('> nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(1);
       expect($('> nav > a.autotoc-level-1', this.$el).size()).to.equal(4);
       expect($('> nav > a.autotoc-level-2', this.$el).size()).to.equal(0);
     });
-    it("can be appended anywhere", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1;appendTo:.placeholder");
+    it('can be appended anywhere', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1;appendTo:.placeholder');
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(1);
-      expect($('div.placeholder', this.$el).children().eq(0).attr('id')).to.equal("first-elem");
-      expect($('div.placeholder', this.$el).children().eq(1).attr('class')).to.equal("autotoc-nav");
+      expect($('div.placeholder', this.$el).children().eq(0).attr('id')).to.equal('first-elem');
+      expect($('div.placeholder', this.$el).children().eq(1).attr('class')).to.equal('autotoc-nav');
     });
-    it("can be prepended anywhere", function() {
-      this.$el.attr("data-pat-autotoc", "levels: h1;prependTo:.placeholder");
+    it('can be prepended anywhere', function() {
+      this.$el.attr('data-pat-autotoc', 'levels: h1;prependTo:.placeholder');
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(0);
       Registry.scan(this.$el);
       expect($('> nav', this.$el).size()).to.equal(0);
       expect($('div.placeholder > nav', this.$el).size()).to.equal(1);
-      expect($('div.placeholder', this.$el).children().eq(0).attr('class')).to.equal("autotoc-nav");
-      expect($('div.placeholder', this.$el).children().eq(1).attr('id')).to.equal("first-elem");
+      expect($('div.placeholder', this.$el).children().eq(0).attr('class')).to.equal('autotoc-nav');
+      expect($('div.placeholder', this.$el).children().eq(1).attr('id')).to.equal('first-elem');
     });
-    it("custom className", function() {
+    it('custom className', function() {
       this.$el.attr('data-pat-autotoc', 'className:SOMETHING');
       Registry.scan(this.$el);
       expect(this.$el.hasClass('SOMETHING')).to.equal(true);
     });
-    it("scrolls to content", function(done) {
+    it('scrolls to content', function(done) {
       Registry.scan(this.$el);
       expect($(document).scrollTop()).to.equal(0);
-      if (navigator.userAgent.search("PhantomJS") >= 0) {
-          // TODO Make this test work in PhantomJS as well as Chrome
-          //      See https://github.com/ariya/phantomjs/issues/10162
-          done();
+      if (navigator.userAgent.search('PhantomJS') >= 0) {
+        // TODO Make this test work in PhantomJS as well as Chrome
+        //      See https://github.com/ariya/phantomjs/issues/10162
+        done();
       }
-      $("> nav > a.autotoc-level-1", this.$el).last()
+      $('> nav > a.autotoc-level-1', this.$el).last()
         .on('clicked.autodoc.patterns', function() {
           var documentOffset = Math.round($(document).scrollTop());
-          var headingOffset = Math.round($("#autotoc-item-autotoc-8", this.$el).offset().top);
+          var headingOffset = Math.round($('#autotoc-item-autotoc-8', this.$el).offset().top);
           expect(documentOffset).to.equal(headingOffset);
           done();
         })
diff --git a/tests/pattern-backdrop-test.js b/tests/pattern-backdrop-test.js
index ef0d215..7514197 100644
--- a/tests/pattern-backdrop-test.js
+++ b/tests/pattern-backdrop-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-backdrop'
 ], function(expect, $, registry, Backdrop) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Backdrop
   ========================== */
 
-  describe("Backdrop", function() {
-    it("default behaviour", function() {
+  describe('Backdrop', function() {
+    it('default behaviour', function() {
       var $el = $('<div></div>'),
           backdrop = new Backdrop($el);
       expect($('.backdrop', $el).size()).to.equal(1);
@@ -29,7 +29,7 @@ define([
       expect($el.hasClass('backdrop-active')).to.equal(false);
       backdrop.show();
       expect($el.hasClass('backdrop-active')).to.equal(true);
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 50;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.equal(true);
diff --git a/tests/pattern-cookiedirective-test.js b/tests/pattern-cookiedirective-test.js
index 6577f72..834dc6c 100644
--- a/tests/pattern-cookiedirective-test.js
+++ b/tests/pattern-cookiedirective-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-cookiedirective'
 ], function(expect, $, registry, CookieDirective) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,10 +13,10 @@ define([
    TEST: CookieDirective
   ========================== */
 
-  describe("CookieDirective", function () {
+  describe('CookieDirective', function () {
     beforeEach(function() {
-      $.removeCookie("Allow_Cookies_For_Site");
-      $.removeCookie("_cookiesEnabled");
+      $.removeCookie('Allow_Cookies_For_Site');
+      $.removeCookie('_cookiesEnabled');
       this.$el = $('' +
         '<div class="pat-cookiedirective"' +
         '     data-pat-cookiedirective="shouldAsk: true;' +
@@ -24,119 +24,117 @@ define([
         '  <div class="login"></div>' +
         '</div>');
     });
-    it("test ask permission shows", function() {
+    it('test ask permission shows', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(1);
     });
-    it("test ask permission can be hidden", function() {
+    it('test ask permission can be hidden', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
-      this.$el.attr("data-pat-cookiedirective", "shouldAsk: false");
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false');
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission don't show if replied yes", function() {
+    it('test ask permission don\'t show if replied yes', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       $.cookie('Allow_Cookies_For_Site', 1);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission don't show if replied no", function() {
+    it('test ask permission don\'t show if replied no', function() {
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       $.cookie('Allow_Cookies_For_Site', 0);
       registry.scan(this.$el);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
     });
-    it("test ask permission allow button", function() {
+    it('test ask permission allow button', function() {
       var cookie = $.cookie('Allow_Cookies_For_Site');
-      if(cookie === null){
+      if (cookie === null) {
         cookie = undefined;
       }
       expect(cookie).to.be.equal(undefined);
       registry.scan(this.$el);
       this.$el.find('.cookieallowbutton').trigger('click');
-      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal("1");
+      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal('1');
       expect(this.$el.find('.cookiedirective').is(':hidden')).to.be.equal(true);
     });
-    it("test ask permission deny button", function() {
+    it('test ask permission deny button', function() {
       var cookie = $.cookie('Allow_Cookies_For_Site');
-      if(cookie === null){
+      if (cookie === null) {
         cookie = undefined;
       }
       expect(cookie).to.be.equal(undefined);
       registry.scan(this.$el);
       this.$el.find('.cookiedenybutton').trigger('click');
-      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal("0");
+      expect($.cookie('Allow_Cookies_For_Site'), this.$el).to.equal('0');
       expect(this.$el.find('.cookiedirective').is(':hidden')).to.be.equal(true);
     });
-    it("test ask permission customizable", function() {
-      this.$el.attr("data-pat-cookiedirective",
-        "askPermissionMsg: Test askPermissionMsg;" +
-        "allowMsg: Test allowMsg;" +
-        "denyMsg: Test denyMsg");
+    it('test ask permission customizable', function() {
+      this.$el.attr('data-pat-cookiedirective',
+        'askPermissionMsg: Test askPermissionMsg;' +
+        'allowMsg: Test allowMsg;' +
+        'denyMsg: Test denyMsg'
+      );
       registry.scan(this.$el);
-      expect(this.$el.find('.cookiemsg').text()).to.equal("Test askPermissionMsg");
-      expect(this.$el.find('.cookieallowbutton').text()).to.equal("Test allowMsg");
-      expect(this.$el.find('.cookiedenybutton').text()).to.equal("Test denyMsg");
+      expect(this.$el.find('.cookiemsg').text()).to.equal('Test askPermissionMsg');
+      expect(this.$el.find('.cookieallowbutton').text()).to.equal('Test allowMsg');
+      expect(this.$el.find('.cookiedenybutton').text()).to.equal('Test denyMsg');
 
     });
-    it("test enable cookies shows", function() {
+    it('test enable cookies shows', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective", "shouldAsk: false");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(1);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("test enable cookies can be hidden", function() {
+    it('test enable cookies can be hidden', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldAsk: false; shouldEnable: false");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldAsk: false; shouldEnable: false');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("show enable cookies and ask permission", function() {
+    it('show enable cookies and ask permission', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       expect(this.$el.find('.cookiedirective').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(1);
       expect(this.$el.find('.cookiedirective').size()).to.equal(1);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("test enable cookies shouldn't show if selector is not found", function() {
+    it('test enable cookies shouldn\'t show if selector is not found', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldEnableSelector: .another-login; denyMsg: Test denyMsg");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldEnableSelector: .another-login; denyMsg: Test denyMsg');
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       registry.scan(this.$el);
       expect(this.$el.find('.shouldenablecookies').size()).to.equal(0);
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
-    it("show enable cookies message customizable", function() {
+    it('show enable cookies message customizable', function() {
       // Override the cookie function with something that returns undefined
-      $.__old__cookie = $.cookie;
-      $.cookie = function (){return undefined;};
-      this.$el.attr("data-pat-cookiedirective",
-        "shouldEnableMsg: Test shouldEnableMsg");
+      $.__oldCookie = $.cookie;
+      $.cookie = function() { return undefined; };
+      this.$el.attr('data-pat-cookiedirective', 'shouldEnableMsg: Test shouldEnableMsg');
       registry.scan(this.$el);
-      expect(this.$el.find('.shouldenablecookiesmsg').text()).to.equal("Test shouldEnableMsg");
+      expect(this.$el.find('.shouldenablecookiesmsg').text()).to.equal('Test shouldEnableMsg');
       // Restore cookie function
-      $.cookie = $.__old__cookie;
+      $.cookie = $.__oldCookie;
     });
   });
 
diff --git a/tests/pattern-dropzone-test.js b/tests/pattern-dropzone-test.js
index d7cd748..d39867a 100644
--- a/tests/pattern-dropzone-test.js
+++ b/tests/pattern-dropzone-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-dropzone'
 ], function(expect, $, registry, Dropzone) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Dropzone
   ========================== */
 
-  describe("Dropzone", function () {
-    describe("Div", function () {
+  describe('Dropzone', function () {
+    describe('Div', function () {
       beforeEach(function() {
         this.$el = $('' +
           '<div>' +
@@ -115,8 +115,8 @@ define([
         //TODO
       });
     });
-    
-    describe("Form", function () {
+
+    describe('Form', function () {
       beforeEach(function() {
         this.$el = $('' +
           '<div>' +
diff --git a/tests/pattern-expose-test.js b/tests/pattern-expose-test.js
index df063ab..c9f5f15 100644
--- a/tests/pattern-expose-test.js
+++ b/tests/pattern-expose-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-expose'
 ], function(expect, $, registry, Expose) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,8 +13,8 @@ define([
    TEST: Expose
   ========================== */
 
-  describe("Expose", function() {
-    it("default behaivour", function() {
+  describe('Expose', function() {
+    it('default behaivour', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <form class="pat-expose" data-pat-expose="backdrop: #body">' +
@@ -27,7 +27,7 @@ define([
       $('input', $el).focusin();
       expect($('form', $el).css('z-index')).to.equal('1041');
       expect($el.hasClass('backdrop-active')).to.equal(true);
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 27;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.equal(false);
diff --git a/tests/pattern-formautofocus-test.js b/tests/pattern-formautofocus-test.js
index cb40a69..406db72 100644
--- a/tests/pattern-formautofocus-test.js
+++ b/tests/pattern-formautofocus-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-formautofocus'
 ], function(expect, $, registry, FormAutoFocus) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: FormAutoFocus
   ========================== */
 
-  describe("FormAutoFocus", function() {
+  describe('FormAutoFocus', function() {
     beforeEach(function() {
       // We are including another form to the DOM, just to be sure we focus
       // inside the form that actually has the pattern
@@ -31,7 +31,7 @@ define([
     afterEach(function() {
       this.$el.remove();
     });
-    it("when the condition is met, focus on the first one", function(done) {
+    it('when the condition is met, focus on the first one', function(done) {
       var $el = $('' +
         '<div>' +
         ' <form class="pat-formautofocus">' +
@@ -55,7 +55,7 @@ define([
       registry.scan($el);
       $el.remove();
     });
-    it("when the condition is not met, focus on the first input", function(done) {
+    it('when the condition is not met, focus on the first input', function(done) {
       var $el = $('' +
         '<div>' +
         ' <form class="pat-formautofocus">' +
diff --git a/tests/pattern-formunloadalert-test.js b/tests/pattern-formunloadalert-test.js
index 459d55a..280ece8 100644
--- a/tests/pattern-formunloadalert-test.js
+++ b/tests/pattern-formunloadalert-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-formunloadalert'
 ], function(expect, $, registry, FormUnloadAlert) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: FormUnloadAlert
   ========================== */
 
-  describe("FormUnloadAlert", function() {
+  describe('FormUnloadAlert', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<form class="pat-formunloadalert">' +
@@ -42,8 +42,8 @@ define([
       expect(pattern._changed).to.be.equal(true);
 
       $('a', this.$el)
-        .on('click', function(e){
-          var returnedString = pattern._handle_unload(pattern, e);
+        .on('click', function(e) {
+          var returnedString = pattern._handleUnload(pattern, e);
           var returnValue = e.returnValue;
           if (e.returnValue === undefined) {
             // If we are testing in a Safari based browser, e.g. PhantomJS
@@ -71,14 +71,14 @@ define([
       $select.trigger('change');
       expect(pattern._changed).to.be.equal(true);
 
-      $(this.$el).on('submit', function(e){
-        var returnedString = pattern._handle_unload(pattern, e);
+      $(this.$el).on('submit', function(e) {
+        var returnedString = pattern._handleUnload(pattern, e);
         var returnValue = e.returnValue;
         if (e.returnValue === undefined) {
-            // If we are testing in a Safari based browser, e.g. PhantomJS
-            // then e.returnValue is not set, it just reads the string for
-            // dialog message
-            returnValue = returnedString;
+          // If we are testing in a Safari based browser, e.g. PhantomJS
+          // then e.returnValue is not set, it just reads the string for
+          // dialog message
+          returnValue = returnedString;
         }
         expect(returnValue).to.not.equal(pattern.options.message);
         // Need to prevent action from doing it's default thing otherwise
@@ -88,18 +88,18 @@ define([
       });
       $(this.$el).trigger('submit');
     });
-    it('shows the right message on beforeunload event', function(done){
+    it('shows the right message on beforeunload event', function(done) {
       registry.scan(this.$el);
-      var returnValue = "";
+      var returnValue = '';
       // current instance of the pattern
       var pattern = this.$el.data('pattern-formunloadalert');
       var $select = $('select', this.$el);
 
-      // Override the _handle_msg of the pattern as we need to
+      // Override the _handleMsg of the pattern as we need to
       // get the msg string out somehow, and there's no way to
       // do this that I can find after triggering beforeunload
 
-      pattern._handle_msg = function(e, msg) {
+      pattern._handleMsg = function(e, msg) {
         // Set the msg into a variable that we can actually read
         returnValue = msg;
       };
@@ -108,15 +108,14 @@ define([
       $select.trigger('change');
       expect(pattern._changed).to.be.equal(true);
 
-      $(window)
-        .on('messageset.formunloadalert.patterns', function(){
+      $(window).on('messageset.formunloadalert.patterns', function() {
         expect(returnValue).to.equal(pattern.options.message);
         done();
       });
       // Trigger the beforeunload event
       $(window).trigger('beforeunload');
     });
-    it("doesn't interfere if there's no form", function() {
+    it('doesn\'t interfere if there\'s no form', function() {
       this.$el = $('' +
         '<div class="pat-formunloadalert">' +
         ' <select name="aselect">' +
diff --git a/tests/pattern-livesearch-test.js b/tests/pattern-livesearch-test.js
index 8794690..98041d0 100644
--- a/tests/pattern-livesearch-test.js
+++ b/tests/pattern-livesearch-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-livesearch'
 ], function(expect, $, sinon, registry, Livesearch) {
-  "use strict";
+  'use strict';
 
   var errormsg;
   window.mocha.setup({globals: ['setTimeout', 'setInterval', 'clearTimeout', 'clearInterval']});
@@ -17,7 +17,7 @@ define([
   ========================== */
 
   describe('Livesearch', function() {
-    beforeEach(function(){
+    beforeEach(function() {
 
       this._error = $.error;
       $.error = function(msg) {
@@ -30,49 +30,50 @@ define([
 
       function getQueryVariable(url, variable) {
         var query = url.split('?')[1];
-        if(query === undefined){
+        if (query === undefined) {
           return null;
         }
         var vars = query.split('&');
         for (var i = 0; i < vars.length; i += 1) {
-            var pair = vars[i].split('=');
-            if (decodeURIComponent(pair[0]) === variable) {
-                return decodeURIComponent(pair[1]);
-            }
+          var pair = vars[i].split('=');
+          if (decodeURIComponent(pair[0]) === variable) {
+            return decodeURIComponent(pair[1]);
+          }
         }
         return null;
       }
-      this.server.respondWith("GET", /search.json/, function (xhr, id) {
+      this.server.respondWith('GET', /search.json/, function (xhr, id) {
         var items = [
           {
-            "UID": "123sdfasdf",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: '123sdfasdf',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection',
+            Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf1123asZ",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'fooasdfasdf1123asZ',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           },
           {
-            "UID": "fooasdfasdf1231as",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: 'fooasdfasdf1231as',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf12231451",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'fooasdfasdf12231451',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           },
           {
-            "UID": "sdfsdkfo12231451",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "Type": "Collection", "Description": "Site News",
-            "Title": "Another Item"
+            UID: 'sdfsdkfo12231451',
+            getURL: 'http://localhost:8081/news/aggregator',
+            Type: 'Collection', Description: 'Site News',
+            Title: 'Another Item'
           }
         ];
 
@@ -84,14 +85,14 @@ define([
         } else {
           if (batch) {
             var start, end;
-            start = (batch.page-1) * batch.size;
+            start = (batch.page - 1) * batch.size;
             end = start + batch.size;
             results = items.slice(start, end);
           } else {
             results = items;
           }
         }
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: results.length,
           results: results
         }));
@@ -104,20 +105,20 @@ define([
       this.server.restore();
 
       this.$el.remove();
-      $.error= this._error;
+      $.error = this._error;
       errormsg = undefined;
 
     });
 
     it('test default elements', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -130,14 +131,14 @@ define([
     });
 
     it('keyboard navigation and selection', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json; isTest: true">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json; isTest: true">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -229,14 +230,14 @@ define([
     });
 
     it('user help is shown indicating how many chars to type', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -260,14 +261,14 @@ define([
     });
 
     it('no results found message', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -286,14 +287,14 @@ define([
     });
 
     it('searching message is displayed', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -303,7 +304,7 @@ define([
       d.which = 68;
 
       $input.val('123').trigger(d);
-      this.clock.tick(pattern.options.delay+5);
+      this.clock.tick(pattern.options.delay + 5);
 
       expect(pattern.$results.text()).to.contain('Searching...');
 
@@ -311,15 +312,15 @@ define([
     });
 
     it('template from selector', function() {
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
               'data-pat-livesearch="url:/search.json;' +
-          '                          #tpl_livesearch">'+
-          ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-          ' <div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+          '                          #tpl_livesearch">' +
+          ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+          ' <div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
       var tpl = $('<script type="text/template" id="tpl_livesearch">' +
         '<li class="pattern-livesearch-result pattern-livesearch-type-<%= Type %>">' +
@@ -331,7 +332,7 @@ define([
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
 
-      var $input= pattern.$input;
+      var $input = pattern.$input;
       $input.val('abcd').trigger('keyup');
 
       this.clock.tick(1000);
@@ -339,20 +340,20 @@ define([
       var $results = pattern.items();
 
       expect($results.length).to.be.greaterThan(1);
-      expect($results.first().text().indexOf('Site News')).to.be.greaterThan(-1);
+      expect($results.first().text().indexOf('Site News')).to.be.greaterThan( -1 );
 
       $el.remove();
       tpl.remove();
     });
 
-    it('log error msg if there is no input field', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json">'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('log error msg if there is no input field', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json">' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -361,15 +362,15 @@ define([
       $el.remove();
     });
 
-    it('log error msg if there is no url', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="">'+
-            ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('log error msg if there is no url', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="">' +
+            ' <input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -378,15 +379,15 @@ define([
       $el.remove();
     });
 
-    it('hide search result if clicking somewhere', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json;">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('hide search result if clicking somewhere', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json;">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
@@ -398,15 +399,15 @@ define([
 
     });
 
-    it('show cached result', function(){
-      var $el = $(''+
-          '<div class="pat-livesearch"'+
-              'data-pat-livesearch="url:/search.json; isTest: true">'+
-            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />'+
-            '<div class="pattern-livesearch-container">'+
-              '<div class="pattern-livesearch-results">'+
-              '</div>'+
-            '</div>'+
+    it('show cached result', function() {
+      var $el = $('' +
+          '<div class="pat-livesearch"' +
+              'data-pat-livesearch="url:/search.json; isTest: true">' +
+            '<input type="text" class="pattern-livesearch-input" placeholder="Search" />' +
+            '<div class="pattern-livesearch-container">' +
+              '<div class="pattern-livesearch-results">' +
+              '</div>' +
+            '</div>' +
           '</div>').appendTo('body');
 
       var pattern = $('.pat-livesearch').patternLivesearch().data('patternLivesearch');
diff --git a/tests/pattern-modal-test.js b/tests/pattern-modal-test.js
index 43c81d5..0fd52bb 100644
--- a/tests/pattern-modal-test.js
+++ b/tests/pattern-modal-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-modal'
 ], function(expect, $, sinon, registry, Modal) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,46 +14,49 @@ define([
    TEST: Modal
   ========================== */
 
-  describe("Modal", function() {
-    beforeEach(function(){
+  describe('Modal', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
       this.server.respondWith(/patterns-modal-load-via-ajax/, function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "text/html" }, '' +
+        xhr.respond(200, { 'Content-Type': 'text/html' }, '' +
           '<html><body>' +
           '<div id="content">Exampel</div>' +
-          '</body></html>');
+          '</body></html>'
+        );
       });
 
-      this.server.respondWith("GET", /modal-form\.html/, function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "text/html" },
-          '<html>'+
-          '<head></head>'+
-          '<body>'+
-          '<div id="content">'+
-          '<h1>Modal with Form</h1>'+
-          '<p>This modal contains a form.</p>'+
+      this.server.respondWith('GET', /modal-form\.html/, function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'text/html' },
+          '<html>' +
+          '<head></head>' +
+          '<body>' +
+          '<div id="content">' +
+          '<h1>Modal with Form</h1>' +
+          '<p>This modal contains a form.</p>' +
           '<form method="POST" action="/modal-submit.html">' +
           '  <label for="name">Name:</label><input type="text" name="name" />' +
           '  <div class="formControls"> ' +
           '    <input type="submit" class="btn btn-primary" value="Submit" name="save" />' +
-          '  </div>'+
+          '  </div>' +
           '</form>' +
-          '</body>'+
-          '</html>');
-        });
-
-        this.server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
-          xhr.respond(200, {"content-Type": "text/html"},
-            '<html> '+
-            '  <head></head>'+
-            '  <body> '+
-            '    <div id="content">'+
-            '      <h1>Form submitted</h1>'+
-            '      <p>Thanks!</p>'+
-            '  </body> '+
-            '</html>');
-        });
+          '</body>' +
+          '</html>'
+        );
+      });
+
+      this.server.respondWith('POST', /modal-submit\.html/, function(xhr, id) {
+        xhr.respond(200, {'content-Type': 'text/html'},
+          '<html> ' +
+          '  <head></head>' +
+          '  <body> ' +
+          '    <div id="content">' +
+          '      <h1>Form submitted</h1>' +
+          '      <p>Thanks!</p>' +
+          '  </body> ' +
+          '</html>'
+        );
+      });
     });
 
     afterEach(function() {
@@ -61,7 +64,7 @@ define([
       this.server.restore();
     });
 
-    it("default behaviour", function() {
+    it('default behaviour', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <a class="pat-modal" href="#target"' +
@@ -87,7 +90,7 @@ define([
       expect($('.modal .modal-body', $el).size()).to.equal(1);
       expect($('.modal .modal-footer', $el).size()).to.equal(1);
 
-      var keydown = $.Event("keydown");
+      var keydown = $.Event('keydown');
       keydown.keyCode = 27;
       $(document).trigger(keydown);
       expect($el.hasClass('backdrop-active')).to.be.equal(false);
@@ -96,7 +99,7 @@ define([
       $el.remove();
     });
 
-    it("customize modal on show event", function() {
+    it('customize modal on show event', function() {
       var $el = $('' +
         '<div id="body">' +
         ' <a class="pat-modal" href="#target"' +
@@ -107,43 +110,49 @@ define([
       $('a', $el)
         .patternModal()
         .on('show.modal.patterns', function(e) {
-            var modal = $(this).data('pattern-modal');
-            $('.modal-header', modal.$modal).prepend($('<h3>New Title</h3>'));
-          })
+          var modal = $(this).data('pattern-modal');
+          $('.modal-header', modal.$modal).prepend($('<h3>New Title</h3>'));
+        })
         .click();
       expect($('.modal .modal-header h3', $el).text()).to.equal('New Title');
 
       $el.remove();
     });
 
-    it("load modal content via ajax", function(done) {
+    it('load modal content via ajax', function(done) {
       $('<a class="pat-modal" />')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           expect(true).to.be.equal(true);
           done();
-      }).click();
+        })
+        .click();
     });
 
-    it("redirects to base urls", function(done){
+    it('redirects to base urls', function(done) {
       $('<a class="pat-modal" />')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           var modal = $(this).data('pattern-modal');
-          expect(modal.defaults.actionOptions.redirectToUrl('ignore',
-              '<html><head><base href="testurl"></base></head></html>')).to.equal('testurl');
-          expect(modal.defaults.actionOptions.redirectToUrl('ignore',
-              '<html><head><base href="testurl" /></head></html>')).to.equal('testurl');
+          expect(modal.defaults.actionOptions.redirectToUrl(
+            'ignore',
+            '<html><head><base href="testurl"></base></head></html>'
+          )).to.equal('testurl');
+          expect(modal.defaults.actionOptions.redirectToUrl(
+            'ignore',
+            '<html><head><base href="testurl" /></head></html>'
+          )).to.equal('testurl');
           done();
-      }).click();
+        })
+        .click();
     });
 
-    it("handles forms and form submits", function(done) {
+    it('handles forms and form submits', function(done) {
       var server = this.server;
       $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
         .appendTo('body')
         .patternModal()
-        .on('show.modal.patterns', function(e){
+        .on('show.modal.patterns', function(e) {
           var $input = $('.pattern-modal-buttons').find('input');
           expect($input.size()).to.equal(1);
           $input.click();
@@ -159,27 +168,27 @@ define([
       server.respond(); // XXX could not get autorespond to work
     });
 
-    it("handles form submits with enter key", function(done) {
-        var server = this.server;
-        $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
-            .appendTo('body')
-            .patternModal()
-            .on('show.modal.patterns', function(e){
-                var event = $.Event ('keydown');
-                event.which = event.keyCode = 13;
-                $('.modal form').trigger (event);
-                server.respond();
-            })
-            .on('formActionSuccess.modal.patterns', function() {
-                var title = $('.modal-header').find('h3').text();
-                expect(title).to.equal('Form submitted');
-                done();
-            })
-            .click();
-        server.respond();
+    it('handles form submits with enter key', function(done) {
+      var server = this.server;
+      $('<a href="modal-form.html" class="pat-modal" >Foo</a>')
+        .appendTo('body')
+        .patternModal()
+        .on('show.modal.patterns', function(e) {
+          var event = $.Event ('keydown');
+          event.which = event.keyCode = 13;
+          $('.modal form').trigger (event);
+          server.respond();
+        })
+        .on('formActionSuccess.modal.patterns', function() {
+          var title = $('.modal-header').find('h3').text();
+          expect(title).to.equal('Form submitted');
+          done();
+        })
+        .click();
+      server.respond();
     });
 
-    describe("modal positioning (findPosition) ", function() {
+    describe('modal positioning (findPosition) ', function() {
       //
       // -- CHANGE POSITION ONLY ----------------------------------------------
       //
diff --git a/tests/pattern-moment-test.js b/tests/pattern-moment-test.js
index edd4f37..f048895 100644
--- a/tests/pattern-moment-test.js
+++ b/tests/pattern-moment-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-moment'
 ], function(expect, $, registry, Moment) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,40 +13,33 @@ define([
    TEST: Moment
   ========================== */
 
-  describe("Moment", function () {
+  describe('Moment', function () {
     beforeEach(function() {
     });
-    it("test parse relative", function() {
+    it('test parse relative', function() {
       var date = new Date();
       date.setMinutes(date.getMinutes() + 2);
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:relative">' + date + '</div>');
+      var $el = $('<div class="pat-moment" data-pat-moment="format:relative">' + date + '</div>');
       registry.scan($el);
       expect($el.html()).to.equal('in 2 minutes');
     });
-    it("test parse calendar", function() {
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:calendar">2012-10-02 14:30</div>');
+    it('test parse calendar', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar">2012-10-02 14:30</div>');
       registry.scan($el);
       expect($el.html()).to.equal('10/02/2012');
     });
-    it("test parse custom", function() {
-      var $el = $('<div class="pat-moment"' +
-        'data-pat-moment="format:YYYY">2012-10-02 14:30</div>');
+    it('test parse custom', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY">2012-10-02 14:30</div>');
       registry.scan($el);
       expect($el.html()).to.equal('2012');
     });
-    it("test parse custom", function() {
-      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY;selector:*">' +
-        '<div>2012-10-02 14:30</div>' +
-      '</div>');
+    it('test parse custom', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:YYYY;selector:*"><div>2012-10-02 14:30</div></div>');
       registry.scan($el);
       expect($el.find('div').html()).to.equal('2012');
     });
-    it("test parse no date", function() {
-      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar">' +
-        '<div></div>' +
-      '</div>');
+    it('test parse no date', function() {
+      var $el = $('<div class="pat-moment" data-pat-moment="format:calendar"><div></div></div>');
       registry.scan($el);
       expect($el.find('div').html()).to.equal('');
     });
diff --git a/tests/pattern-pickadate-test.js b/tests/pattern-pickadate-test.js
index d6b6ba8..159847b 100644
--- a/tests/pattern-pickadate-test.js
+++ b/tests/pattern-pickadate-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-pickadate'
 ], function(expect, $, registry, PickADate) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: PickADate
   ========================== */
 
-  describe("PickADate", function() {
+  describe('PickADate', function() {
 
     beforeEach(function() {
       this.$el = $('<div><input class="pat-pickadate" /></div>');
diff --git a/tests/pattern-picture-test.js b/tests/pattern-picture-test.js
index d712639..0840cf1 100644
--- a/tests/pattern-picture-test.js
+++ b/tests/pattern-picture-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-picture'
 ], function(expect, $, registry, Toggle) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,30 +13,31 @@ define([
    TEST: Picture
   ========================== */
 
-  describe("Picture", function() {
+  describe('Picture', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-picture" ' +
         '     data-pat-picture="alt:Alternative text;">' +
         '   <div data-src="http://placehold.it/480x320"></div> ' +
         '   <div data-src="http://placehold.it/640x427" data-media="(min-width: 480px)"></div>' +
-        '</div>').appendTo('body');
+        '</div>'
+      ).appendTo('body');
     });
     afterEach(function() {
       this.$el.remove();
     });
-    it("create responsive image widget", function() {
+    it('create responsive image widget', function() {
       expect($('img', this.$el).size()).to.equal(0);
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
     });
-    it("test alternative text is recorded", function() {
+    it('test alternative text is recorded', function() {
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
       expect($('img', this.$el).attr('alt')).to.equal('Alternative text');
     });
     /*
-    it("test state change classes", function() {
+    it('test state change classes', function() {
       registry.scan(this.$el);
       var img = $('img', this.$el);
       expect($('img', this.$el).size()).to.equal(1);
@@ -44,7 +45,7 @@ define([
       expect(img.attr('class')).to.equal('test-error');
     });
     // Chrome and friends don't allow resizing except in popups
-    it("resize window to see media query in action", function() {
+    it('resize window to see media query in action', function() {
       registry.scan(this.$el);
       expect($('img', this.$el).size()).to.equal(1);
       window.resizeTo(640, 480);
diff --git a/tests/pattern-preventdoublesubmit-test.js b/tests/pattern-preventdoublesubmit-test.js
index 9fffaf6..65d4c1d 100644
--- a/tests/pattern-preventdoublesubmit-test.js
+++ b/tests/pattern-preventdoublesubmit-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-preventdoublesubmit'
 ], function(expect, $, registry, PreventDoubleSubmit) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,17 +13,17 @@ define([
    TEST: PreventDoubleSubmit
   ========================== */
 
-  describe("PreventDoubleSubmit", function() {
+  describe('PreventDoubleSubmit', function() {
     beforeEach(function() {
       var self = this;
       // mock up `_confirm` func
-      self._old_confirm = PreventDoubleSubmit.prototype._confirm;
+      self._oldConfirm = PreventDoubleSubmit.prototype._confirm;
       PreventDoubleSubmit.prototype._confirm = function() {
         this.confirmed = true;
       };
     });
     afterEach(function() {
-      PreventDoubleSubmit.prototype._confirm = this._old_confirm;
+      PreventDoubleSubmit.prototype._confirm = this._oldConfirm;
     });
     it('prevent form to be submitted twice', function() {
       var $el = $('' +
@@ -40,29 +40,29 @@ define([
 
       var guardKlass = 'submitting';
       var optOutKlass = 'allowMultiSubmit';
-      var get_confirmed = function(el) {
+      var getConfirmed = function(el) {
         return el.data('pattern-preventdoublesubmit').confirmed;
       };
-      var reset_confirmed = function(el) {
+      var resetConfirmed = function(el) {
         el.data('pattern-preventdoublesubmit').confirmed = undefined;
       };
 
       var $b1 = $('#b1', $el);
       var $b2 = $('#b2', $el);
 
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
       $b1.trigger('click');
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
       expect($b1.hasClass(guardKlass)).to.be.equal(true);
       $b1.trigger('click');
-      expect(get_confirmed($el)).to.be.equal(true);
+      expect(getConfirmed($el)).to.be.equal(true);
 
       // reset confirmed flag
-      reset_confirmed($el);
+      resetConfirmed($el);
 
       $b2.trigger('click');
       expect($b2.hasClass(guardKlass)).to.be.equal(true);
-      expect(get_confirmed($el)).to.be.equal(undefined);
+      expect(getConfirmed($el)).to.be.equal(undefined);
 
     });
   });
diff --git a/tests/pattern-relateditems-test.js b/tests/pattern-relateditems-test.js
index a70c122..e008bce 100644
--- a/tests/pattern-relateditems-test.js
+++ b/tests/pattern-relateditems-test.js
@@ -1,11 +1,12 @@
 define([
   'expect',
   'jquery',
+  'underscore',
   'sinon',
   'mockup-registry',
   'mockup-patterns-relateditems'
-], function(expect, $, sinon, registry, RelatedItems) {
-  "use strict";
+], function(expect, $, _, sinon, registry, RelatedItems) {
+  'use strict';
 
   window.mocha.setup('bdd').globals(['jQuery*']);
   $.fx.off = true;
@@ -14,52 +15,52 @@ define([
    TEST: Related Items
   ========================== */
 
-  describe("Related Items", function() {
-    beforeEach(function(){
+  describe('Related Items', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
       function getQueryVariable(url, variable) {
         var query = url.split('?')[1];
-        if(query === undefined){
+        if (query === undefined) {
           return null;
         }
         var vars = query.split('&');
         for (var i = 0; i < vars.length; i += 1) {
-            var pair = vars[i].split('=');
-            if (decodeURIComponent(pair[0]) === variable) {
-                return decodeURIComponent(pair[1]);
-            }
+          var pair = vars[i].split('=');
+          if (decodeURIComponent(pair[0]) === variable) {
+            return decodeURIComponent(pair[1]);
+          }
         }
         return null;
       }
       this.server.respondWith(/relateditems-test.json/, function(xhr, id) {
         var root = [
-          {"UID": "jasdlfdlkdkjasdf", "Title": "Some Image", "path": "/test.png", "Type": "Image"},
-          {"UID": "asdlfkjasdlfkjasdf", "Title": "News", "path": "/news", "Type": "Folder"},
-          {"UID": "124asdfasasdaf34", "Title": "About", "path": "/about", "Type": "Folder"},
-          {"UID": "asdf1234", "Title": "Projects", "path": "/projects", "Type": "Folder"},
-          {"UID": "asdf1234gsad", "Title": "Contact", "path": "/contact", "Type": "Document"},
-          {"UID": "asdv34sdfs", "Title": "Privacy Policy", "path": "/policy", "Type": "Document"},
-          {"UID": "asdfasdf234sdf", "Title": "Our Process", "path": "/our-process", "Type": "Folder"},
-          {"UID": "asdhsfghyt45", "Title": "Donate", "path": "/donate-now", "Type": "Document"},
+          {UID: 'jasdlfdlkdkjasdf', Title: 'Some Image', path: '/test.png', Type: 'Image'},
+          {UID: 'asdlfkjasdlfkjasdf', Title: 'News', path: '/news', Type: 'Folder'},
+          {UID: '124asdfasasdaf34', Title: 'About', path: '/about', Type: 'Folder'},
+          {UID: 'asdf1234', Title: 'Projects', path: '/projects', Type: 'Folder'},
+          {UID: 'asdf1234gsad', Title: 'Contact', path: '/contact', Type: 'Document'},
+          {UID: 'asdv34sdfs', Title: 'Privacy Policy', path: '/policy', Type: 'Document'},
+          {UID: 'asdfasdf234sdf', Title: 'Our Process', path: '/our-process', Type: 'Folder'},
+          {UID: 'asdhsfghyt45', Title: 'Donate', path: '/donate-now', Type: 'Document'},
         ];
         var about = [
-          {"UID": "gfn5634f", "Title": "About Us", "path": "/about/about-us", "Type": "Document"},
-          {"UID": "45dsfgsdcd", "Title": "Philosophy", "path": "/about/philosophy", "Type": "Document"},
-          {"UID": "dfgsdfgj675", "Title": "Staff", "path": "/about/staff", "Type": "Folder"},
-          {"UID": "sdfbsfdh345", "Title": "Board of Directors", "path": "/about/board-of-directors", "Type": "Document"}
+          {UID: 'gfn5634f', Title: 'About Us', path: '/about/about-us', Type: 'Document'},
+          {UID: '45dsfgsdcd', Title: 'Philosophy', path: '/about/philosophy', Type: 'Document'},
+          {UID: 'dfgsdfgj675', Title: 'Staff', path: '/about/staff', Type: 'Folder'},
+          {UID: 'sdfbsfdh345', Title: 'Board of Directors', path: '/about/board-of-directors', Type: 'Document'}
         ];
 
         var staff = [
-          {"UID": "asdfasdf9sdf", "Title": "Mike", "path": "/about/staff/mike", "Type": "Document"},
-          {"UID": "cvbcvb82345", "Title": "Joe", "path": "/about/staff/joe", "Type": "Document"}
+          {UID: 'asdfasdf9sdf', Title: 'Mike', path: '/about/staff/mike', Type: 'Document'},
+          {UID: 'cvbcvb82345', Title: 'Joe', path: '/about/staff/joe', Type: 'Document'}
         ];
         var searchables = about.concat(root).concat(staff);
 
-        var addUrls = function(list){
+        var addUrls = function(list) {
           /* add getURL value */
-          for(var i=0; i<list.length; i=i+1){
+          for(var i = 0; i < list.length; i = i + 1) {
             var data = list[i];
             data.getURL = window.location.origin + data.path;
           }
@@ -73,24 +74,24 @@ define([
         // grab the page number and number of items per page -- note, page is 1-based from Select2
         var batch = getQueryVariable(xhr.url, 'batch');
         var page = 1;
-        var page_size = 10;
-        if(batch){
+        var pageSize = 10;
+        if (batch) {
           batch = $.parseJSON(batch);
           page = batch.page;
-          page_size = batch.size;
+          pageSize = batch.size;
         }
         page = page - 1;
 
         var query = getQueryVariable(xhr.url, 'query');
         var path = null;
         var term = '';
-        if(query){
+        if (query) {
           query = $.parseJSON(query);
-          for(var i=0; i<query.criteria.length; i=i+1){
+          for (var i = 0; i < query.criteria.length; i = i + 1) {
             var criteria = query.criteria[i];
-            if(criteria.i === 'path'){
+            if (criteria.i === 'path') {
               path = criteria.v.split('::')[0];
-            }else{
+            } else {
               term = criteria.v;
             }
           }
@@ -99,23 +100,23 @@ define([
         // this seach is for basically searching the entire hierarchy -- this IS NOT the browse "search"
         function search(items, term) {
           results = [];
-          if (term === undefined){
+          if (term === undefined) {
             return searchables;
           }
           _.each(items, function(item) {
             var q;
             var keys = (item.UID + ' ' + item.Title + ' ' + item.path + ' ' + item.Type).toLowerCase();
-            if(typeof(term) === 'object'){
-              for(var i=0; i<term.length; i=i+1){
+            if (typeof(term) === 'object') {
+              for (var i = 0; i < term.length; i = i + 1) {
                 q = term[i].toLowerCase();
-                if (keys.indexOf(q) > -1){
+                if (keys.indexOf(q) > -1) {
                   results.push(item);
                   break;
                 }
               }
-            }else{
+            } else {
               q = term.toLowerCase();
-              if (keys.indexOf(q) > -1){
+              if (keys.indexOf(q) > -1) {
                 results.push(item);
               }
             }
@@ -124,16 +125,16 @@ define([
 
         function browse(items, q, p) {
           results = [];
-          var path = p.substring(0, p.length-1);
+          var path = p.substring(0, p.length - 1);
           var splitPath = path.split('/');
           var fromPath = [];
           _.each(items, function(item) {
             var itemSplit = item.path.split('/');
-            if (item.path.indexOf(path) === 0 && itemSplit.length-1 === splitPath.length) {
+            if (item.path.indexOf(path) === 0 && itemSplit.length - 1 === splitPath.length) {
               fromPath.push(item);
             }
           });
-          if (q === undefined){
+          if (q === undefined) {
             return fromPath;
           }
           search(fromPath, q);
@@ -144,15 +145,16 @@ define([
           search(searchables, term);
         }
 
-        xhr.respond(200, { "Content-Type": "application/json" },
+        xhr.respond(200, { 'Content-Type': 'application/json' },
           JSON.stringify({
-            "total": results.length,
-            "results": results.slice(page*page_size, (page*page_size)+(page_size-1))
-        }));
+            total: results.length,
+            results: results.slice(page * pageSize, (page * pageSize) + (pageSize - 1))
+          })
+        );
       });
     });
 
-    it('test initialize', function(){
+    it('test initialize', function() {
       var $el = $('' +
         '<div>' +
         ' <input class="pat-relateditems"' +
@@ -160,7 +162,7 @@ define([
         '                          vocabularyUrl: /relateditems-test.json" />' +
         '</div>').appendTo('body');
       var pattern = $('.pat-relateditems', $el).patternRelateditems().data('patternRelateditems');
-      
+
       expect($('.select2-container-multi', $el)).to.have.length(1);
       expect($('.pattern-relateditems-container', $el)).to.have.length(1);
       expect($('.pattern-relateditems-path', $el)).to.have.length(1);
@@ -218,7 +220,7 @@ define([
       expect(pattern.$el.select2('val')).to.have.length(0);
 
       // // Need to simulate a backspace to remove the selected item: below doesn't work
-      // var backspaceEvent = $.Event("keydown");
+      // var backspaceEvent = $.Event('keydown');
       // backspaceEvent.ctrlKey = false;
       // backspaceEvent.which = 8;
       // $('.select2-search-field input').trigger( backspaceEvent );
diff --git a/tests/pattern-select2-test.js b/tests/pattern-select2-test.js
index d2f96bf..b58a36d 100644
--- a/tests/pattern-select2-test.js
+++ b/tests/pattern-select2-test.js
@@ -5,7 +5,7 @@ define([
   'mockup-registry',
   'mockup-patterns-select2'
 ], function(expect, $, sinon, registry, Select2) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -14,19 +14,19 @@ define([
    TEST: Select2
   ========================== */
 
-  describe("Select2", function() {
-    beforeEach(function(){
+  describe('Select2', function() {
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /select2-ajax\.json/, function (xhr, id) {
+      this.server.respondWith('GET', /select2-ajax\.json/, function (xhr, id) {
         var items = [
           {id: 'red', text: 'Red'},
           {id: 'blue', text: 'Blue'},
           {id: 'yellow', text: 'Yellow'}
         ];
 
-        xhr.respond(200, {"Content-Type": "application/json"}, JSON.stringify({
+        xhr.respond(200, {'Content-Type': 'application/json'}, JSON.stringify({
           total: items.length,
           results: items
         }));
@@ -53,198 +53,200 @@ define([
     });
 
     it('init value map/tags from JSON string', function() {
-        var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
-        $el.patternSelect2({tags: '["Red", "Yellow"]',
-                            initialValues: '{"Red": "RedTEXT", "Yellow": "YellowTEXT"}'
-        });
-        var $choices = $('.select2-choices li');
-        expect($choices.size()).to.equal(2);
+      var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
+      $el.patternSelect2({
+        tags: '["Red", "Yellow"]',
+        initialValues: '{"Red": "RedTEXT", "Yellow": "YellowTEXT"}'
+      });
+      var $choices = $('.select2-choices li');
+      expect($choices.size()).to.equal(2);
     });
 
     it('init value map from string', function() {
-        var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
-        $el.patternSelect2({tags: '["Red", "Yellow"]',
-                            initialValues: 'Yellow: YellowTEXT, Red: RedTEXT'
-        });
-        var $choices = $('.select2-choices li');
-        expect($choices.size()).to.equal(2);
-        var $red_choice = $choices.eq(0);
-        expect($red_choice.find('div').text()).to.equal('RedTEXT');
+      var $el = $('<input class="pat-select2" value="Red" />').appendTo('body');
+      $el.patternSelect2({
+        tags: '["Red", "Yellow"]',
+        initialValues: 'Yellow: YellowTEXT, Red: RedTEXT'
+      });
+      var $choices = $('.select2-choices li');
+      expect($choices.size()).to.equal(2);
+      var $redChoice = $choices.eq(0);
+      expect($redChoice.find('div').text()).to.equal('RedTEXT');
     });
 
     it('init value map', function() {
-        var $el = $(
-        '<div>' +
-        ' <input class="pat-select2"' +
-        '        data-pat-select2="{' +
-        '          "tags": "Red,Yellow,Blue",' +
-        '          "initialValues": {' +
-        '            "Yellow": "YellowTEXT",' +
-        '            "Red": "RedTEXT"' +
-        '          }' +
-        '        }"' +
-        '        value="Yellow,Red"/>' +
-        '</div>');
+      var $el = $(
+      '<div>' +
+      ' <input class="pat-select2"' +
+      '        data-pat-select2="{' +
+      '          "tags": "Red,Yellow,Blue",' +
+      '          "initialValues": {' +
+      '            "Yellow": "YellowTEXT",' +
+      '            "Red": "RedTEXT"' +
+      '          }' +
+      '        }"' +
+      '        value="Yellow,Red"/>' +
+      '</div>');
 
-        registry.scan($el);
-        expect($('.select2-choices li', $el).size()).to.equal(3);
+      registry.scan($el);
+      expect($('.select2-choices li', $el).size()).to.equal(3);
     });
 
     it('ajax vocabulary url configuration', function() {
-        var $el = $(
-        '<input class="pat-select2"' +
-        '       data-pat-select2="vocabularyUrl: select2-users-vocabulary"' +
-        '       />');
-
-        registry.scan($el);
-        var select2 = $el.data('pattern-select2');
-        expect(select2.options.ajax.url).to.equal("select2-users-vocabulary");
+      var $el = $(
+      '<input class="pat-select2"' +
+      '       data-pat-select2="vocabularyUrl: select2-users-vocabulary"' +
+      '       />');
+
+      registry.scan($el);
+      var select2 = $el.data('pattern-select2');
+      expect(select2.options.ajax.url).to.equal('select2-users-vocabulary');
     });
 
     it('displays the vocabulary when clicking an empty checkbox', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="placeholder:Search for a Value;' +
-          '                     vocabularyUrl: /select2-ajax.json;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var clock = sinon.useFakeTimers();
-        $('.select2-input').click();
-        clock.tick(1000);
-
-        $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(3);
-        expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
-        expect($results.first().text()).to.be.equal('Red');
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="placeholder:Search for a Value;' +
+        '                     vocabularyUrl: /select2-ajax.json;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var clock = sinon.useFakeTimers();
+      $('.select2-input').click();
+      clock.tick(1000);
+
+      $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(3);
+      expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
+      expect($results.first().text()).to.be.equal('Red');
     });
 
     it('prepends the query term to the selection', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="placeholder:Search for a Value;' +
-          '                     vocabularyUrl: /select2-ajax.json;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(4);
-        expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
-        expect($results.first().text()).to.be.equal('AAA');
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="placeholder:Search for a Value;' +
+        '                     vocabularyUrl: /select2-ajax.json;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(4);
+      expect($results.first().hasClass('select2-highlighted')).to.be.equal(true);
+      expect($results.first().text()).to.be.equal('AAA');
     });
 
     it('sets up orderable tags', function() {
-        var $el = $(
+      var $el = $(
         '<div>' +
         ' <input class="pat-select2"' +
         '        data-pat-select2="orderable: true; tags: Red,Yellow,Blue"' +
         '        value="Red"' +
         '        />' +
         '</div>'
-        );
+      );
 
-        registry.scan($el);
-        expect($('.select2-container', $el).hasClass('select2-orderable')).to.be.equal(true);
+      registry.scan($el);
+      expect($('.select2-container', $el).hasClass('select2-orderable')).to.be.equal(true);
     });
 
     it('handles orderable tag drag events', function() {
-        var $el = $(
+      var $el = $(
         '<div>' +
         ' <input class="pat-select2"' +
         '        data-pat-select2="orderable: true; tags: Red,Yellow,Blue"' +
         '        value="Yellow,Red"' +
         '        />' +
         '</div>'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-
-        var $results = $('li.select2-search-choice');
-        expect($results.size()).to.equal(2);
-        expect($.trim($results.eq(0).text())).to.equal('Yellow');
-        expect($.trim($results.eq(1).text())).to.equal('Red');
-
-        var first_elem = $results.eq(0);
-        var second_elem = $results.eq(1);
-        // css class is set and proxy is created when starting to drag
-        expect($('li.dragging').size()).to.equal(0);
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(false);
-
-        first_elem.trigger($.Event('dragstart'));
-
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(true);
-        var $proxy = $('li.dragging');
-        expect($proxy.size()).to.equal(1);
-
-        // css position is updated while dragging
-        first_elem.trigger($.Event('drag'), {proxy: $proxy,
-                                             drop: [],
-                                             offsetX: 10,
-                                             offsetY: 0
-                                            });
-        expect($proxy.css('top')).to.equal('0px');
-        expect($proxy.css('left')).to.equal('10px');
-
-        // css class is removed and proxy is deleted when dragging stops
-        first_elem.trigger($.Event('dragend'), {proxy: $proxy});
-        expect(first_elem.hasClass('select2-choice-dragging')).to.equal(false);
-        expect($('li.dragging').size()).to.equal(0);
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+
+      var $results = $('li.select2-search-choice');
+      expect($results.size()).to.equal(2);
+      expect($.trim($results.eq(0).text())).to.equal('Yellow');
+      expect($.trim($results.eq(1).text())).to.equal('Red');
+
+      var firstElem = $results.eq(0);
+      var secondElem = $results.eq(1);
+      // css class is set and proxy is created when starting to drag
+      expect($('li.dragging').size()).to.equal(0);
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(false);
+
+      firstElem.trigger($.Event('dragstart'));
+
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(true);
+      var $proxy = $('li.dragging');
+      expect($proxy.size()).to.equal(1);
+
+      // css position is updated while dragging
+      firstElem.trigger($.Event('drag'), {
+        proxy: $proxy,
+        drop: [],
+        offsetX: 10,
+        offsetY: 0
+      });
+      expect($proxy.css('top')).to.equal('0px');
+      expect($proxy.css('left')).to.equal('10px');
+
+      // css class is removed and proxy is deleted when dragging stops
+      firstElem.trigger($.Event('dragend'), {proxy: $proxy});
+      expect(firstElem.hasClass('select2-choice-dragging')).to.equal(false);
+      expect($('li.dragging').size()).to.equal(0);
     });
 
     it('does not allow new items to be added', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="tags: Red,Yellow,Blue;' +
-          '                     allowNewItems: false;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var $no_results = $('li.select2-no-results');
-        expect($no_results.size()).to.equal(1);
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="tags: Red,Yellow,Blue;' +
+        '                     allowNewItems: false;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var $noResults = $('li.select2-no-results');
+      expect($noResults.size()).to.equal(1);
     });
 
     it('does not allow new items to be added when using ajax', function() {
-        $('<input type="hidden" class="pat-select2"' +
-          '    data-pat-select2="vocabularyUrl: /select2-ajax.json;' +
-          '                     allowNewItems: false;' +
-          '                     width:20em" />'
-        ).appendTo('body');
-        var pattern = $('.pat-select2').patternSelect2();
-        var clock = sinon.useFakeTimers();
-        var $input = $('.select2-input');
-        $input.click().val('AAA');
-        var keyup = $.Event('keyup-change');
-        $input.trigger(keyup);
-        clock.tick(1000);
-
-        var $results = $('li.select2-result-selectable');
-        expect($results.size()).to.equal(0);
-
-        var $no_results = $('li.select2-no-results');
-        expect($no_results.size()).to.equal(1);
+      $('<input type="hidden" class="pat-select2"' +
+        '    data-pat-select2="vocabularyUrl: /select2-ajax.json;' +
+        '                     allowNewItems: false;' +
+        '                     width:20em" />'
+      ).appendTo('body');
+      var pattern = $('.pat-select2').patternSelect2();
+      var clock = sinon.useFakeTimers();
+      var $input = $('.select2-input');
+      $input.click().val('AAA');
+      var keyup = $.Event('keyup-change');
+      $input.trigger(keyup);
+      clock.tick(1000);
+
+      var $results = $('li.select2-result-selectable');
+      expect($results.size()).to.equal(0);
+
+      var $noResults = $('li.select2-no-results');
+      expect($noResults.size()).to.equal(1);
     });
 
-    it('HTML multiple select widget converted to hidden inuput, before applying select2',
-       function() {
-        var $el = $(
+    it('HTML multiple select widget converted to hidden inuput, before applying select2', function() {
+      var $el = $(
         '<div>' +
         ' <select multiple class="pat-select2" id="test-select2" name="test-name"' +
         '         data-pat-select2="{"orderable": true, "multiple": true, "separator": ";"}">' +
@@ -253,18 +255,19 @@ define([
         '   <option value="3" selected>Three</value>' +
         '   <option value="4">Four</value>' +
         ' </select>' +
-        '</div>');
+        '</div>'
+      );
 
-        registry.scan($el);
-        expect($('#test-select2', $el).is('input')).to.equal(true);
-        expect($('#test-select2', $el).attr('type')).to.equal('hidden');
-        expect($('#test-select2', $el).attr('class')).to.equal('pat-select2 select2-offscreen');
-        expect($('#test-select2', $el).attr('name')).to.equal('test-name');
-        expect($('#test-select2', $el).val()).to.equal('1;3');
-        var $results = $('li.select2-search-choice', $el);
-        expect($results.size()).to.equal(2);
-        expect($.trim($results.eq(0).text())).to.equal('One');
-        expect($.trim($results.eq(1).text())).to.equal('Three');
+      registry.scan($el);
+      expect($('#test-select2', $el).is('input')).to.equal(true);
+      expect($('#test-select2', $el).attr('type')).to.equal('hidden');
+      expect($('#test-select2', $el).attr('class')).to.equal('pat-select2 select2-offscreen');
+      expect($('#test-select2', $el).attr('name')).to.equal('test-name');
+      expect($('#test-select2', $el).val()).to.equal('1;3');
+      var $results = $('li.select2-search-choice', $el);
+      expect($results.size()).to.equal(2);
+      expect($.trim($results.eq(0).text())).to.equal('One');
+      expect($.trim($results.eq(1).text())).to.equal('Three');
     });
 
   });
diff --git a/tests/pattern-sortable-test.js b/tests/pattern-sortable-test.js
index 4313377..8949ea3 100644
--- a/tests/pattern-sortable-test.js
+++ b/tests/pattern-sortable-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-sortable'
 ], function(expect, $, registry, Sortable) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Toggle
   ========================== */
 
-  describe("Sortable", function() {
+  describe('Sortable', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<ul class="pat-sortable">' +
@@ -28,7 +28,7 @@ define([
       this.$el.remove();
     });
 
-    it("adds class on drag start", function() {
+    it('adds class on drag start', function() {
       var sortable = new Sortable(this.$el);
       var $todrag = this.$el.find('li').eq(0);
       $todrag.trigger('dragstart');
diff --git a/tests/pattern-structure-test.js b/tests/pattern-structure-test.js
index a19ec83..dc3f7f5 100644
--- a/tests/pattern-structure-test.js
+++ b/tests/pattern-structure-test.js
@@ -5,22 +5,22 @@ define([
   'mockup-patterns-structure',
   'sinon',
 ], function(expect, $, registry, Structure, sinon) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
   function getQueryVariable(url, variable) {
     var query = url.split('?')[1];
-    if(query === undefined){
+    if (query === undefined) {
       return null;
     }
     var vars = query.split('&');
     for (var i = 0; i < vars.length; i += 1) {
-        var pair = vars[i].split('=');
-        if (decodeURIComponent(pair[0]) === variable) {
-            return decodeURIComponent(pair[1]);
-        }
+      var pair = vars[i].split('=');
+      if (decodeURIComponent(pair[0]) === variable) {
+        return decodeURIComponent(pair[1]);
+      }
     }
     return null;
   }
@@ -29,8 +29,8 @@ define([
    /* ==========================
    TEST: Structure
   ========================== */
-  describe("Structure", function() {
-    beforeEach(function(){
+  describe('Structure', function() {
+    beforeEach(function() {
       this.$el = $('' +
         '<div class="pat-structure" ' +
              'data-pat-structure="vocabularyUrl:/data.json;' +
@@ -46,55 +46,56 @@ define([
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /data.json/, function (xhr, id) {
+      this.server.respondWith('GET', /data.json/, function (xhr, id) {
         var batch = JSON.parse(getQueryVariable(xhr.url, 'batch'));
         var start = 0;
         var end = 15;
-        if(batch){
-          start = (batch.page-1) * batch.size;
+        if (batch) {
+          start = (batch.page - 1) * batch.size;
           end = start + batch.size;
         }
         var items = [];
-        for(var i=start; i<end; i++){
+        for (var i = start; i < end; i = i + 1) {
           items.push({
-            "UID": "123sdfasdf" + i,
-            "getURL": "http://localhost:8081/item" + i,
-            "path": '/item' + i,
-            "Type": "Page " + i, "Description": "page",
-            "Title": "Page " + i,
+            UID: '123sdfasdf' + i,
+            getURL: 'http://localhost:8081/item' + i,
+            path: '/item' + i,
+            Type: 'Page ' + i,
+            Description: 'page',
+            Title: 'Page ' + i,
             'review_state': 'published',
             'is_folderish': false,
-            'Subject': [],
-            'id': 'item' + i
+            Subject: [],
+            id: 'item' + i
           });
         }
 
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: 100,
           results: items
         }));
       });
-      this.server.respondWith("POST", '/rearrange', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          status: "success",
+      this.server.respondWith('POST', '/rearrange', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          status: 'success',
           msg: 'rearranged'
         }));
       });
-      this.server.respondWith("POST", '/paste', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          status: "success",
+      this.server.respondWith('POST', '/paste', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          status: 'success',
           msg: 'pasted'
         }));
       });
-      this.server.respondWith("GET", '/contextInfo.json', function (xhr, id) {
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
-          "addButtons": [{
-            "id": "page",
-            "title": "Page",
-            "url": "/addpage"
+      this.server.respondWith('GET', '/contextInfo.json', function (xhr, id) {
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
+          addButtons: [{
+            id: 'page',
+            title: 'Page',
+            url: '/addpage'
           },{
-            "id": "folder",
-            "title": "Folder"
+            id: 'folder',
+            title: 'Folder'
           }]
         }));
       });
@@ -102,7 +103,7 @@ define([
       this.clock = sinon.useFakeTimers();
     });
 
-    afterEach(function(){
+    afterEach(function() {
       this.server.restore();
       this.clock.restore();
     });
@@ -118,7 +119,7 @@ define([
       var cb = this.$el.find('.itemRow td.selection input').eq(0);
       cb[0].checked = true;
       cb.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('1');
+      expect(this.$el.find('#selected').html()).to.contain('1');
     });
 
     it('remove item from selection well', function() {
@@ -128,7 +129,7 @@ define([
       $item1[0].checked = true;
       $item1.trigger('change');
       this.$el.find('.items.popover-content a.remove').trigger('click').trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('0');
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
     it('remove all from selection well', function() {
@@ -140,9 +141,9 @@ define([
       var $item2 = this.$el.find('.itemRow td.selection input').eq(1);
       $item2[0].checked = true;
       $item2.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('2');
+      expect(this.$el.find('#selected').html()).to.contain('2');
       this.$el.find('.popover.selected a.remove-all').trigger('click');
-      expect(this.$el.find("#selected").html()).to.contain('0');
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
     it('paging', function() {
@@ -166,7 +167,7 @@ define([
     });
 
     it('test paging does not apply overflow hidden to parent', function() {
-      /* 
+      /*
        * very odd here, overflow hidden is getting applied by something after
        * the table of results is re-rendered with new data
        */
@@ -242,7 +243,7 @@ define([
       var $item = this.$el.find('table th .select-all');
       $item[0].checked = true;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('15');
+      expect(this.$el.find('#selected').html()).to.contain('15');
 
     });
 
@@ -253,11 +254,10 @@ define([
       var $item = this.$el.find('table th .select-all');
       $item[0].checked = true;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('15');
+      expect(this.$el.find('#selected').html()).to.contain('15');
       $item[0].checked = false;
       $item.trigger('change');
-      expect(this.$el.find("#selected").html()).to.contain('0');
-
+      expect(this.$el.find('#selected').html()).to.contain('0');
     });
 
   });
diff --git a/tests/pattern-tablesorter-test.js b/tests/pattern-tablesorter-test.js
index a55085c..cedbf27 100644
--- a/tests/pattern-tablesorter-test.js
+++ b/tests/pattern-tablesorter-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-tablesorter'
 ], function(expect, $, registry, Tablesorter) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,51 +13,51 @@ define([
    TEST: TableSorter
   ========================== */
 
-  describe("TableSorter", function () {
+  describe('TableSorter', function () {
     beforeEach(function() {
-      this.$el = $('' +
-        '<table class="pat-tablesorter">'+
-        '   <thead>'+
-        '     <tr>'+
-        '       <th>First Name</th>'+
-        '       <th>Last Name</th>'+
-        '       <th>Number</th>'+
-        '     </tr>'+
-        '   </thead>'+
-        '   <tbody>'+
-        '     <tr>'+
-        '       <td>AAA</td>'+
-        '       <td>ZZZ</td>'+
-        '       <td>3</td>'+
-        '     </tr>'+
-        '     <tr>'+
-        '       <td>BBB</td>'+
-        '       <td>YYY</td>'+
-        '       <td>1</td>'+
-        '     </tr>'+
-        '     <tr>'+
-        '       <td>CCC</td>'+
-        '       <td>XXX</td>'+
-        '       <td>2</td>'+
-        '     </tr>'+
-        '   </tbody>'+
+      this.$el = $ ('' +
+        '<table class="pat-tablesorter">' +
+        '   <thead>' +
+        '     <tr>' +
+        '       <th>First Name</th>' +
+        '       <th>Last Name</th>' +
+        '       <th>Number</th>' +
+        '     </tr>' +
+        '   </thead>' +
+        '   <tbody>' +
+        '     <tr>' +
+        '       <td>AAA</td>' +
+        '       <td>ZZZ</td>' +
+        '       <td>3</td>' +
+        '     </tr>' +
+        '     <tr>' +
+        '       <td>BBB</td>' +
+        '       <td>YYY</td>' +
+        '       <td>1</td>' +
+        '     </tr>' +
+        '     <tr>' +
+        '       <td>CCC</td>' +
+        '       <td>XXX</td>' +
+        '       <td>2</td>' +
+        '     </tr>' +
+        '   </tbody>' +
         ' </table>');
     });
-    it("test headers have the sort arrow", function() {
+    it('test headers have the sort arrow', function() {
       registry.scan(this.$el);
       expect(this.$el.find('.sortdirection').size()).to.equal(3);
     });
-    it("test sort by second column", function() {
+    it('test sort by second column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(1).trigger("click");
+      this.$el.find('thead th').eq(1).trigger('click');
 
-      var should_be = ["CCC", "BBB", "AAA"];
+      var shouldBe = ['CCC', 'BBB', 'AAA'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
@@ -69,17 +69,17 @@ define([
       expect(trs.eq(2).hasClass('even')).to.be.equal(false);
 
     });
-    it("test sort by third column", function() {
+    it('test sort by third column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(2).trigger("click");
+      this.$el.find('thead th').eq(2).trigger('click');
 
-      var should_be = ["BBB", "CCC", "AAA"];
+      var shouldBe = ['BBB', 'CCC', 'AAA'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
@@ -91,22 +91,22 @@ define([
       expect(trs.eq(2).hasClass('even')).to.be.equal(false);
 
     });
-    it("test several sorts and finally back to first column", function() {
+    it('test several sorts and finally back to first column', function() {
       registry.scan(this.$el);
-      this.$el.find('thead th').eq(2).trigger("click");
-      this.$el.find('thead th').eq(3).trigger("click");
-      this.$el.find('thead th').eq(2).trigger("click");
-      this.$el.find('thead th').eq(1).trigger("click");
-      this.$el.find('thead th').eq(3).trigger("click");
-      this.$el.find('thead th').eq(1).trigger("click");
+      this.$el.find('thead th').eq(2).trigger('click');
+      this.$el.find('thead th').eq(3).trigger('click');
+      this.$el.find('thead th').eq(2).trigger('click');
+      this.$el.find('thead th').eq(1).trigger('click');
+      this.$el.find('thead th').eq(3).trigger('click');
+      this.$el.find('thead th').eq(1).trigger('click');
 
-      var should_be = ["AAA", "BBB", "CCC"];
+      var shouldBe = ['AAA', 'BBB', 'CCC'];
       var elem;
-      for (var i=0;i<should_be.length;i+=1){
+      for (var i = 0; i < shouldBe.length; i += 1) {
         // We are checking first td of each tr of tbody, just to see the
         // order
-        elem = this.$el.find('tbody tr td').eq(i*3);
-        expect(elem.text()).to.equal(should_be[i]);
+        elem = this.$el.find('tbody tr td').eq(i * 3);
+        expect(elem.text()).to.equal(shouldBe[i]);
       }
 
       var trs = this.$el.find('tbody tr');
diff --git a/tests/pattern-tinymce-test.js b/tests/pattern-tinymce-test.js
index 0bc8b70..45d0314 100644
--- a/tests/pattern-tinymce-test.js
+++ b/tests/pattern-tinymce-test.js
@@ -6,78 +6,80 @@ define([
   'tinymce',
   'mockup-patterns-tinymce'
 ], function(expect, $, sinon, registry, tinymce, TinyMCE) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  var createTinymce = function(options){
-    if(options === undefined){
+  var createTinymce = function(options) {
+    if (options === undefined) {
       options = {};
     }
-    var $el = $(
-      '<textarea class="pat-tinymce">' +
-      '</textarea>').appendTo('body');
+    var $el = $('<textarea class="pat-tinymce"></textarea>').appendTo('body');
 
     return new TinyMCE($el, options);
   };
 
-  describe("TinyMCE", function() {
-    afterEach(function(){
+  describe('TinyMCE', function() {
+    afterEach(function() {
       $('body').empty();
     });
 
-    beforeEach(function(){
+    beforeEach(function() {
       this.server = sinon.fakeServer.create();
       this.server.autoRespond = true;
 
-      this.server.respondWith("GET", /data.json/, function (xhr, id) {
+      this.server.respondWith('GET', /data.json/, function (xhr, id) {
         var items = [
           {
-            "UID": "123sdfasdf",
-            "getURL": "http://localhost:8081/news/aggregator",
-            "path": '/news/aggregator',
-            "Type": "Collection", "Description": "Site News",
-            "Title": "News"
+            UID: '123sdfasdf',
+            getURL: 'http://localhost:8081/news/aggregator',
+            path: '/news/aggregator',
+            Type: 'Collection',
+            Description: 'Site News',
+            Title: 'News'
           },
           {
-            "UID": "fooasdfasdf1123asZ",
-            'path': '/about',
-            "getURL": "http://localhost:8081/about",
-            "Type": "Page", "Description": "About",
-            "Title": "About"
+            UID: 'fooasdfasdf1123asZ',
+            path: '/about',
+            getURL: 'http://localhost:8081/about',
+            Type: 'Page',
+            Description: 'About',
+            Title: 'About'
           },
         ];
 
-        if(xhr.url.indexOf('123sdfasdf') !== -1){
+        if (xhr.url.indexOf('123sdfasdf') !== -1) {
           // ajax request for this one val
           items.pop();
         }
-        xhr.respond(200, { "Content-Type": "application/json" }, JSON.stringify({
+        xhr.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({
           total: items.length,
           results: items
         }));
       });
     });
 
-    it('creates tinymce', function(){
+    it('creates tinymce', function() {
       var $el = $(
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect($el.children().length).to.be.greaterThan(1);
       tinymce.get(0).remove();
     });
 
-    it('maintains an initial textarea value', function(){
+    it('maintains an initial textarea value', function() {
       var $el = $(
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '    foobar' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect(tinymce.get(0).getContent()).to.be.equal('<p>foobar</p>');
     });
@@ -87,22 +89,24 @@ define([
        '<div>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</div>').appendTo('body');
+       '</div>'
+      ).appendTo('body');
       registry.scan($el);
       expect(tinymce.get(0).buttons).to.have.keys('plonelink', 'ploneimage');
     });
 
-    it('on form submit, save data to form', function(){
+    it('on form submit, save data to form', function() {
       var $container = $(
        '<form>' +
        '  <textarea class="pat-tinymce">' +
        '  </textarea>' +
-       '</form>').appendTo('body');
+       '</form>'
+      ).appendTo('body');
 
       var $el = $container.find('textarea');
       var tinymce = new TinyMCE($el);
       tinymce.tiny.setContent('<p>foobar</p>');
-      $container.submit(function(e){
+      $container.submit(function(e) {
         e.preventDefault();
       });
       $container.trigger('submit');
@@ -110,7 +114,7 @@ define([
       expect($el.val()).to.equal('<p>foobar</p>');
     });
 
-    it('auto adds image on upload', function(){
+    it('auto adds image on upload', function() {
       var tinymce = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -123,10 +127,8 @@ define([
       expect(tinymce.tiny.getContent()).to.contain('resolveuid/foobar');
 
     });
-    it('auto adds link on file upload', function(){
-      var $el = $(
-       '<textarea class="pat-tinymce">' +
-       '</textarea>').appendTo('body');
+    it('auto adds link on file upload', function() {
+      var $el = $('<textarea class="pat-tinymce"></textarea>').appendTo('body');
 
       var tinymce = new TinyMCE($el);
 
@@ -138,7 +140,7 @@ define([
 
     });
 
-    it('test create correct url from metadata', function(){
+    it('test create correct url from metadata', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -148,7 +150,7 @@ define([
       };
       expect(tiny.generateUrl(data)).to.equal('resolveuid/foobar');
     });
-    it('test creates correct url from metadata with append', function(){
+    it('test creates correct url from metadata with append', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -159,7 +161,7 @@ define([
       };
       expect(tiny.generateUrl(data)).to.equal('resolveuid/foobar.html');
     });
-    it('test parses correct attribute from url', function(){
+    it('test parses correct attribute from url', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID'
@@ -167,7 +169,7 @@ define([
       expect(tiny.stripGeneratedUrl('resolveuid/foobar')).to.equal('foobar');
     });
 
-    it('test parses correct attribute from url with appended value', function(){
+    it('test parses correct attribute from url with appended value', function() {
       var tiny = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -176,28 +178,28 @@ define([
       expect(tiny.stripGeneratedUrl('resolveuid/foobar/@@view')).to.equal('foobar');
     });
 
-    it('test get scale from url', function(){
+    it('test get scale from url', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/'
       });
       expect(pattern.getScaleFromUrl('foobar/somescale/foobar')).to.equal('foobar');
     });
 
-    it('test get scale return null if invalid', function(){
+    it('test get scale return null if invalid', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/'
       });
       expect(pattern.getScaleFromUrl('foobar')).to.equal(null);
     });
 
-    it('get scale handles edge case of image_ for plone', function(){
+    it('get scale handles edge case of image_ for plone', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale'
       });
       expect(pattern.getScaleFromUrl('foobar/somescale/image_large')).to.equal('large');
     });
 
-    it('get scale with appended option', function(){
+    it('get scale with appended option', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale/',
         appendToScalePart: '/@@view'
@@ -205,7 +207,7 @@ define([
       expect(pattern.getScaleFromUrl('foobar/somescale/large/@@view')).to.equal('large');
     });
 
-    it('get scale handles edge case of image_ for plone', function(){
+    it('get scale handles edge case of image_ for plone', function() {
       var pattern = createTinymce({
         prependToScalePart: '/somescale'
       });
@@ -213,7 +215,7 @@ define([
     });
 
 
-    it('test add link', function(){
+    it('test add link', function() {
       var pattern = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -231,7 +233,7 @@ define([
       });
       expect(pattern.linkModal.getLinkUrl()).to.equal('resolveuid/foobar');
     });
-    it('test add external link', function(){
+    it('test add external link', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       var modal = pattern.linkModal;
@@ -239,14 +241,14 @@ define([
       modal.linkTypes.external.$input.attr('value', 'http://foobar');
       expect(pattern.linkModal.getLinkUrl()).to.equal('http://foobar');
     });
-    it('test add email link', function(){
+    it('test add email link', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       pattern.linkModal.linkType = 'email';
       pattern.linkModal.linkTypes.email.$input.attr('value', 'foo at bar.com');
       expect(pattern.linkModal.getLinkUrl()).to.equal('mailto:foo at bar.com');
     });
-    it('test add image link', function(){
+    it('test add image link', function() {
       var pattern = createTinymce({
         prependToUrl: 'resolveuid/',
         linkAttribute: 'UID',
@@ -262,11 +264,10 @@ define([
 
       pattern.imageModal.linkType = 'image';
       pattern.imageModal.$scale.find('[value="thumb"]')[0].selected = true;
-      expect(pattern.imageModal.getLinkUrl()).to.equal(
-        'resolveuid/foobar/@@images/image/thumb');
+      expect(pattern.imageModal.getLinkUrl()).to.equal('resolveuid/foobar/@@images/image/thumb');
     });
 
-    it('test adds data attributes', function(){
+    it('test adds data attributes', function() {
       var pattern = createTinymce();
 
       pattern.addLinkClicked();
@@ -283,7 +284,7 @@ define([
       expect(pattern.tiny.getContent()).to.contain('data-linktype="internal"');
     });
 
-    it('test loading link also sets up related items correctly', function(){
+    it('test loading link also sets up related items correctly', function() {
       var pattern = createTinymce({
         relatedItems: {
           vocabularyUrl: '/data.json'
@@ -294,18 +295,18 @@ define([
 
       pattern.linkModal.linkTypes.internal.set('123sdfasdf');
       var val = pattern.linkModal.linkTypes.internal.$input.select2('data');
-      /* XXX ajax not loading quickly enough here... 
+      /* XXX ajax not loading quickly enough here...
       expect(val.UID).to.equal('123sdfasdf');
       */
     });
 
-    it('test create upload file modal', function(){
+    it('test create upload file modal', function() {
       var pattern = createTinymce();
       pattern.uploadFileClicked();
       expect(pattern.uploadModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen upload file modal', function(){
+    it('test reopen upload file modal', function() {
       var pattern = createTinymce();
       pattern.uploadFileClicked();
       pattern.uploadModal.hide();
@@ -314,7 +315,7 @@ define([
       expect(pattern.uploadModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen add link modal', function(){
+    it('test reopen add link modal', function() {
       var pattern = createTinymce();
       pattern.addLinkClicked();
       pattern.linkModal.hide();
@@ -323,7 +324,7 @@ define([
       expect(pattern.linkModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test reopen add image modal', function(){
+    it('test reopen add image modal', function() {
       var pattern = createTinymce();
       pattern.addImageClicked();
       pattern.imageModal.hide();
@@ -332,44 +333,39 @@ define([
       expect(pattern.imageModal.modal.$modal.is(':visible')).to.equal(true);
     });
 
-    it('test loads existing link external values', function(){
+    it('test loads existing link external values', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a href="foobar" data-linktype="external" data-val="foobar">foobar</a>');
+      pattern.tiny.setContent('<a href="foobar" data-linktype="external" data-val="foobar">foobar</a>');
 
-      pattern.tiny.selection.select(
-        pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
+      pattern.tiny.selection.select(pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.external.$input.val()).to.equal('foobar');
     });
 
-    it('test loads existing link email values', function(){
+    it('test loads existing link email values', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a href="mailto:foo at bar.com" data-linktype="email" data-val="foo at bar.com">foobar</a>');
+      pattern.tiny.setContent('<a href="mailto:foo at bar.com" data-linktype="email" data-val="foo at bar.com">foobar</a>');
 
-      pattern.tiny.selection.select(
-        pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
+      pattern.tiny.selection.select(pattern.tiny.dom.getRoot().getElementsByTagName('a')[0]);
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.email.$input.val()).to.equal('foo at bar.com');
     });
 
-    it('test anchor link adds existing anchors to list', function(){
+    it('test anchor link adds existing anchors to list', function() {
       var pattern = createTinymce();
 
-      pattern.tiny.setContent(
-        '<a class="mceItemAnchor" name="foobar"></a>');
+      pattern.tiny.setContent('<a class="mceItemAnchor" name="foobar"></a>');
 
       pattern.addLinkClicked();
 
       expect(pattern.linkModal.linkTypes.anchor.anchorNodes.length).to.equal(1);
     });
 
-    it('test anchor link adds anchors from option', function(){
+    it('test anchor link adds anchors from option', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
@@ -379,7 +375,7 @@ define([
       expect(pattern.linkModal.linkTypes.anchor.anchorNodes.length).to.equal(1);
     });
 
-    it('test anchor get index', function(){
+    it('test anchor get index', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
@@ -389,7 +385,7 @@ define([
       expect(pattern.linkModal.linkTypes.anchor.getIndex('foobar')).to.equal(1);
     });
 
-    it('test anchor get url', function(){
+    it('test anchor get url', function() {
       var pattern = createTinymce({
         anchorSelector: 'h1'
       });
diff --git a/tests/pattern-toggle-test.js b/tests/pattern-toggle-test.js
index c3ef7ea..97e7f23 100644
--- a/tests/pattern-toggle-test.js
+++ b/tests/pattern-toggle-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-toggle'
 ], function(expect, $, registry, Toggle) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,7 +13,7 @@ define([
    TEST: Toggle
   ========================== */
 
-  describe("Toggle", function() {
+  describe('Toggle', function() {
     beforeEach(function() {
       this.$el = $('' +
         '<div id="body">' +
@@ -31,9 +31,9 @@ define([
       this.$el.remove();
     });
 
-    it("by default toggles on click event", function() { 
+    it('by default toggles on click event', function() {
       expect($('.toggled', this.$el).size()).to.equal(0);
-      
+
       // scan dom for patterns
       registry.scan(this.$el);
       expect($('.toggled', this.$el).size()).to.equal(0);
@@ -43,224 +43,223 @@ define([
       expect($('.toggled', this.$el).size()).to.equal(0);
     });
 
-    it("can also listen to custom event", function() {
-     $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; event: customEvent');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     registry.scan(this.$el);
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     $('.pat-toggle', this.$el).trigger('customEvent');
-     expect($('.toggled', this.$el).size()).to.equal(1);
+    it('can also listen to custom event', function() {
+      $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; event: customEvent');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      registry.scan(this.$el);
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      $('.pat-toggle', this.$el).trigger('customEvent');
+      expect($('.toggled', this.$el).size()).to.equal(1);
     });
 
-    it("can also toggle custom element attribute", function() {
-     $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; attribute: rel');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
-     registry.scan(this.$el);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     $('.pat-toggle', this.$el).trigger('click');
-     expect($('.toggled', this.$el).size()).to.equal(0);
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(1);
-     $('.pat-toggle', this.$el).trigger('click');
-     expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+    it('can also toggle custom element attribute', function() {
+      $('.pat-toggle', this.$el).attr('data-pat-toggle', 'target: #target; targetScope: #body; value: toggled; attribute: rel');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+      registry.scan(this.$el);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      $('.pat-toggle', this.$el).trigger('click');
+      expect($('.toggled', this.$el).size()).to.equal(0);
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(1);
+      $('.pat-toggle', this.$el).trigger('click');
+      expect($('[rel="toggled"]', this.$el).size()).to.equal(0);
     });
 
-    it("toggle multiple targets", function() {
+    it('toggle multiple targets', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target"></div>' +
-       '  </div>' +
-       '  <div class="target"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target"></div>' +
+        '  </div>' +
+        '  <div class="target"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("if some elements already marked, mark all with first click", function() {
+    it('if some elements already marked, mark all with first click', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target toggled"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target toggled"></div>' +
-       '  </div>' +
-       '  <div class="target toggled"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(3);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target toggled"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target toggled"></div>' +
+        '  </div>' +
+        '  <div class="target toggled"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(3);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("if all elements already marked, unmark all with first click", function() {
+    it('if all elements already marked, unmark all with first click', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target toggled"></div>' +
-       '    </div>' +
-       '    <div class="target toggled"></div>' +
-       '    <div class="target toggled"></div>' +
-       '  </div>' +
-       '  <div class="target toggled"></div>' +
-       '  <div class="target toggled"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(5);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target toggled"></div>' +
+        '    </div>' +
+        '    <div class="target toggled"></div>' +
+        '    <div class="target toggled"></div>' +
+        '  </div>' +
+        '  <div class="target toggled"></div>' +
+        '  <div class="target toggled"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(5);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should also be able to mark the toggle itself", function() {
+    it('should also be able to mark the toggle itself', function() {
       var $el = $('' +
-       '<div id="body">' +
-       '  <div>' +
-       '    <div>' +
-       '      <div>' +
-       '        <a class="pat-toggle target"' +
-       '          data-pat-toggle="target: .target;' +
-       '                           targetScope: #body;' +
-       '                           value: toggled">Button</a>' +
-       '      </div>' +
-       '      <div class="target"></div>' +
-       '    </div>' +
-       '    <div class="target"></div>' +
-       '    <div class="target"></div>' +
-       '  </div>' +
-       '  <div class="target"></div>' +
-       '  <div class="target"></div>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(6);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+        '<div id="body">' +
+        '  <div>' +
+        '    <div>' +
+        '      <div>' +
+        '        <a class="pat-toggle target"' +
+        '          data-pat-toggle="target: .target;' +
+        '                           targetScope: #body;' +
+        '                           value: toggled">Button</a>' +
+        '      </div>' +
+        '      <div class="target"></div>' +
+        '    </div>' +
+        '    <div class="target"></div>' +
+        '    <div class="target"></div>' +
+        '  </div>' +
+        '  <div class="target"></div>' +
+        '  <div class="target"></div>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(6);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should target itself when no target is specified", function() {
-     var $el = $('' +
-       '<div>' +
-       ' <a class="pat-toggle"' +
-       '    data-pat-toggle="value: toggled">Button</a>' +
-       '</div>');
-     registry.scan($el);
-     expect($('.toggled', $el).size()).to.equal(0);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     $('.pat-toggle', $el).trigger('click');
-     expect($('.toggled', $el).size()).to.equal(0);
+    it('should target itself when no target is specified', function() {
+      var $el = $('' +
+        '<div>' +
+        ' <a class="pat-toggle"' +
+        '    data-pat-toggle="value: toggled">Button</a>' +
+        '</div>');
+      registry.scan($el);
+      expect($('.toggled', $el).size()).to.equal(0);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      $('.pat-toggle', $el).trigger('click');
+      expect($('.toggled', $el).size()).to.equal(0);
     });
 
-    it("should use the targetScope option to find the target when specified", function() {
-     var $el = $('' +
-       '<div>' +
-       '  <div class="parent1 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <div class="target pt1">' +
-       '     <a href="patterns.html">Click here to go somewhere else</a>' +
-       '    </div>' +
-       '  </div>' +
-       '  <div class="parent2 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <div class="target pt2">' +
-       '     <a href="patterns.html">Click here to go somewhere else</a>' +
-       '    </div>' +
-       '  </div>' +
-       '</div>');
-     registry.scan($el);
-     var $pattern1 = $el.find('.pat-toggle').first();
-     expect($('.toggled', $el).size()).to.equal(0);
-     $pattern1.trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     expect($('.parent1 .toggled', $el).size()).to.equal(1);
-     expect($('.parent2 .toggled', $el).size()).to.equal(0);
+    it('should use the targetScope option to find the target when specified', function() {
+      var $el = $('' +
+        '<div>' +
+        '  <div class="parent1 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <div class="target pt1">' +
+        '     <a href="patterns.html">Click here to go somewhere else</a>' +
+        '    </div>' +
+        '  </div>' +
+        '  <div class="parent2 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <div class="target pt2">' +
+        '     <a href="patterns.html">Click here to go somewhere else</a>' +
+        '    </div>' +
+        '  </div>' +
+        '</div>');
+      registry.scan($el);
+      var $pattern1 = $el.find('.pat-toggle').first();
+      expect($('.toggled', $el).size()).to.equal(0);
+      $pattern1.trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      expect($('.parent1 .toggled', $el).size()).to.equal(1);
+      expect($('.parent2 .toggled', $el).size()).to.equal(0);
     });
-    
-    it("the targetScope option should also work with other tags like p tag", function() {
-     var $el = $('' +
-       '<div>' +
-       '  <p class="parent1 myParent">' +
-       '    <a class="pat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <a class="target" href="patterns.html">Click here to go somewhere else</a>' +
-       '  </p>' +
-       '  <p class="parent2 myParent">' +
-       '    <a class="uupat-toggle"' +
-       '      data-pat-toggle="target: .target;' +
-       '                       value: toggled;' +
-       '                       targetScope: .myParent">Button</a>' +
-       '    <p><a class="target" href="patterns.html">Click here to go somewhere else</a></p>' +
-       '  </p>' +
-       '</div>');
-     registry.scan($el);
-     var $pattern1 = $el.find('.pat-toggle').first();
-     expect($('.toggled', $el).size()).to.equal(0);
-     $pattern1.trigger('click');
-     expect($('.toggled', $el).size()).to.equal(1);
-     expect($('.parent1 .toggled', $el).size()).to.equal(1);
-     expect($('.parent2 .toggled', $el).size()).to.equal(0);
+
+    it('the targetScope option should also work with other tags like p tag', function() {
+      var $el = $('' +
+        '<div>' +
+        '  <p class="parent1 myParent">' +
+        '    <a class="pat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <a class="target" href="patterns.html">Click here to go somewhere else</a>' +
+        '  </p>' +
+        '  <p class="parent2 myParent">' +
+        '    <a class="uupat-toggle"' +
+        '      data-pat-toggle="target: .target;' +
+        '                       value: toggled;' +
+        '                       targetScope: .myParent">Button</a>' +
+        '    <p><a class="target" href="patterns.html">Click here to go somewhere else</a></p>' +
+        '  </p>' +
+        '</div>');
+      registry.scan($el);
+      var $pattern1 = $el.find('.pat-toggle').first();
+      expect($('.toggled', $el).size()).to.equal(0);
+      $pattern1.trigger('click');
+      expect($('.toggled', $el).size()).to.equal(1);
+      expect($('.parent1 .toggled', $el).size()).to.equal(1);
+      expect($('.parent2 .toggled', $el).size()).to.equal(0);
     });
 
-    it("should throw an error when it cannot find the target", function() {
-     var $el = $('' +
-       '<div id="body">' +
-       ' <a class="pat-toggle"' +
-       '    data-pat-toggle="target: #notarget;' +
-       '                     targetScope: #body;' +
-       '                     value: toggled">Button</a>' +
-       ' <div id="target">' +
-       '   <a href="patterns.html">Click here to go somewhere else</a>' +
-       ' </div>' +
-       '</div>');
-     try {
-       registry.scan($el);
-     }
-     catch(err) {
-       expect(err.message).to.equal('No target found for "#notarget".');
-     }
+    it('should throw an error when it cannot find the target', function() {
+      var $el = $('' +
+        '<div id="body">' +
+        ' <a class="pat-toggle"' +
+        '    data-pat-toggle="target: #notarget;' +
+        '                     targetScope: #body;' +
+        '                     value: toggled">Button</a>' +
+        ' <div id="target">' +
+        '   <a href="patterns.html">Click here to go somewhere else</a>' +
+        ' </div>' +
+        '</div>');
+      try {
+        registry.scan($el);
+      } catch (err) {
+        expect(err.message).to.equal('No target found for "#notarget".');
+      }
     });
   });
 
diff --git a/tests/pattern-tooltip-test.js b/tests/pattern-tooltip-test.js
index 833624d..4683d7a 100644
--- a/tests/pattern-tooltip-test.js
+++ b/tests/pattern-tooltip-test.js
@@ -4,7 +4,7 @@ define([
   'mockup-registry',
   'mockup-patterns-tooltip'
 ], function(expect, $, registry, ToolTip) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
@@ -13,35 +13,34 @@ define([
    TEST: Tooltip
   ========================== */
 
-  describe("Tooltip", function () {
+  describe('Tooltip', function () {
 
     beforeEach(function() {
       this.$el = $('' +
-        '<div><p href=".example-class" class="pat-tooltip">'+
-        '  Hover over this line to see a tooltip'+
-        '</p>'+
-        '<p class="tooltips example-class">'+
-        '  Setting the .example-class in the href makes this show up'+
+        '<div><p href=".example-class" class="pat-tooltip">' +
+        '  Hover over this line to see a tooltip' +
+        '</p>' +
+        '<p class="tooltips example-class">' +
+        '  Setting the .example-class in the href makes this show up' +
         '</p></div>');
     });
 
     afterEach(function() {
-        this.$el.remove();
+      this.$el.remove();
     });
 
-    it("tooltip appears and disappears", function() {
-        registry.scan(this.$el);
+    it('tooltip appears and disappears', function() {
+      registry.scan(this.$el);
 
-        var trs;
+      var trs;
 
-        $('.pat-tooltip', this.$el).trigger('mouseenter.tooltip.patterns');
-        trs = this.$el.find('.example-class');
-        expect(trs.eq(0).hasClass('active')).to.be.equal(true);
-
-        $('.pat-tooltip', this.$el).trigger('mouseleave.tooltip.patterns');
-        trs = this.$el.find('.example-class');
-        expect(trs.eq(0).hasClass('active')).to.be.equal(false);
+      $('.pat-tooltip', this.$el).trigger('mouseenter.tooltip.patterns');
+      trs = this.$el.find('.example-class');
+      expect(trs.eq(0).hasClass('active')).to.be.equal(true);
 
+      $('.pat-tooltip', this.$el).trigger('mouseleave.tooltip.patterns');
+      trs = this.$el.find('.example-class');
+      expect(trs.eq(0).hasClass('active')).to.be.equal(false);
     });
 
   });
diff --git a/tests/pattern-tree-test.js b/tests/pattern-tree-test.js
index 3026f7b..9b242dc 100644
--- a/tests/pattern-tree-test.js
+++ b/tests/pattern-tree-test.js
@@ -4,37 +4,31 @@ define([
   'mockup-registry',
   'mockup-patterns-tree'
 ], function(expect, $, registry, Tree) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  describe("Tree", function() {
-    beforeEach(function() {
-    });
-    afterEach(function() {
-    });
-    it("loads the tree with data", function() {
+  describe('Tree', function() {
+    it('loads the tree with data', function() {
       var $el = $('<div class="pat-tree"/>').appendTo('body');
       var tree = new Tree($el, {
         autoOpen: true,
-        data: [
-          {"label": "node1",
-          "children": [{
-            "label": "child1"
-            },{
-            "label": "child2"
-            }]
+        data: [{
+          label: 'node1',
+          children: [{
+            label: 'child1'
           },{
-          "label": "node2",
-          "children": [{
-            "label": "child3"
-            }]
+            label: 'child2'
           }]
+        },{
+          label: 'node2',
+          children: [{ label: 'child3' }]
+        }]
       });
       expect(tree.$el.find('ul').length).to.be.equal(3);
     });
-    it("load string of json", function() {
+    it('load string of json', function() {
       var $el = $('<div class="pat-tree"/>').appendTo('body');
       var tree = new Tree($el, {
         autoOpen: true,
@@ -49,7 +43,6 @@ define([
       });
       expect(tree.$el.find('ul').length).to.be.equal(2);
     });
-
   });
 
 });
diff --git a/tests/router-test.js b/tests/router-test.js
index 3846df8..bfa8d54 100644
--- a/tests/router-test.js
+++ b/tests/router-test.js
@@ -4,18 +4,18 @@ define([
   'mockup-router',
   'backbone'
 ], function(expect, $, Router, Backbone) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
   Router.start();
 
-  describe("Router", function () {
+  describe('Router', function () {
 
     beforeEach(function() {
       var self = this;
-      Router._change_location = function(path, hash) {
+      Router._changeLocation = function(path, hash) {
         self.routerPath = path + '#' + hash;
       };
     });
@@ -24,7 +24,7 @@ define([
       this.routerPath = undefined;
     });
 
-    it("routes and calls back", function() {
+    it('routes and calls back', function() {
       var foo = {
         set: false
       };
@@ -34,12 +34,12 @@ define([
       };
 
       Router.addRoute('test', 'foo', callback, foo, '');
-      Router.navigate("test:foo", {trigger: true});
+      Router.navigate('test:foo', {trigger: true});
 
       expect(foo.set).to.equal(true);
     });
 
-    it("redirects from added action", function() {
+    it('redirects from added action', function() {
       var foo = {
         set: false
       };
@@ -57,7 +57,7 @@ define([
       Router.reset();
     });
 
-    it("basic redirect", function() {
+    it('basic redirect', function() {
 
       Router.addRedirect('/', 'test:two');
       Router.redirect();
diff --git a/tests/utils-test.js b/tests/utils-test.js
index 7807552..3068b7a 100644
--- a/tests/utils-test.js
+++ b/tests/utils-test.js
@@ -3,16 +3,16 @@ define([
   'jquery',
   'mockup-utils'
 ], function(expect, $, utils) {
-  "use strict";
+  'use strict';
 
   window.mocha.setup('bdd');
   $.fx.off = true;
 
-  describe("utils", function () {
+  describe('utils', function () {
 
     describe('setId', function() {
 
-      it("by default uses 'id' as prefix", function() {
+      it('by default uses "id" as prefix', function() {
         var $el = $('<div>'),
             id = utils.setId($el);
         expect(id).to.not.be.an('undefined');
@@ -20,13 +20,13 @@ define([
         expect(id.indexOf('id')).to.be(0);
       });
 
-      it("can use a custom prefix", function() {
+      it('can use a custom prefix', function() {
         var $el = $('<div>'),
             id = utils.setId($el, 'myprefix');
         expect(id.indexOf('myprefix')).to.be(0);
       });
 
-      it("updates the id of an element with no id", function() {
+      it('updates the id of an element with no id', function() {
         var $el = $('<div>'),
             id;
         utils.setId($el);
@@ -36,7 +36,7 @@ define([
         expect(id).to.contain('id');
       });
 
-      it("replaces dots in ids with dashes", function() {
+      it('replaces dots in ids with dashes', function() {
         var $el = $('<div id="something.with.dots"></div>'),
             id = utils.setId($el);
         id = $el.attr('id');
@@ -46,25 +46,25 @@ define([
 
     describe('parseBodyTag', function() {
 
-      it("parses the body tag's content from a response", function() {
+      it('parses the body tag\'s content from a response', function() {
         var response = '<body><p>foo</p></body>',
             html = utils.parseBodyTag(response);
         expect(html).to.equal('<p>foo</p>');
       });
 
-      it("returns an empty string for responses with an empty body", function() {
+      it('returns an empty string for responses with an empty body', function() {
         var response = '<body></body>',
             html = utils.parseBodyTag(response);
         expect(html).to.equal('');
       });
 
-      it("fails for empty responses", function() {
+      it('fails for empty responses', function() {
         var response = '',
             fn = function () {utils.parseBodyTag(response);};
         expect(fn).to.throwException(TypeError);
       });
 
-      it("fails for responses without a body tag", function() {
+      it('fails for responses without a body tag', function() {
         var response = '<div>qux</div>',
             fn = function () {utils.parseBodyTag(response);};
         expect(fn).to.throwException(TypeError);
@@ -74,30 +74,30 @@ define([
 
     describe('bool', function() {
 
-      it("returns true for 'true'", function() {
+      it('returns true for "true"', function() {
         expect(utils.bool('true')).to.be.equal(true);
         expect(utils.bool(' true ')).to.be.equal(true);
         expect(utils.bool('TRUE')).to.be.equal(true);
         expect(utils.bool('True')).to.be.equal(true);
       });
 
-      it("returns true for true", function() {
+      it('returns true for true', function() {
         var val = utils.bool(true);
         expect(val).to.be.equal(true);
       });
 
-      it("returns true for true", function() {
+      it('returns true for true', function() {
         var val = utils.bool(1);
         expect(val).to.be.equal(true);
       });
 
-      it("returns false for strings != 'true'", function() {
+      it('returns false for strings != "true"', function() {
         expect(utils.bool('1')).to.be.equal(false);
         expect(utils.bool('')).to.be.equal(false);
         expect(utils.bool('false')).to.be.equal(false);
       });
 
-      it("returns false for undefined/null", function() {
+      it('returns false for undefined/null', function() {
         expect(utils.bool(undefined)).to.be.equal(false);
         expect(utils.bool(null)).to.be.equal(false);
       });
@@ -106,30 +106,31 @@ define([
 
     describe('QueryHelper', function() {
 
-      it("getQueryData correctly", function() {
+      it('getQueryData correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var qd = qh.getQueryData('foobar');
         expect(qd.query).to.equal('{"criteria":[{"i":"SearchableText","o":"plone.app.querystring.operation.string.contains","v":"foobar*"}]}');
       });
-      it("getQueryData use attributes correctly", function() {
+      it('getQueryData use attributes correctly', function() {
         var qh = new utils.QueryHelper({
           vocabularyUrl: 'http://foobar.com/',
-          attributes: ['one', 'two']});
+          attributes: ['one', 'two']
+        });
         var qd = qh.getQueryData('foobar');
         expect(qd.attributes).to.equal('["one","two"]');
       });
-      it("getQueryData set batch", function() {
+      it('getQueryData set batch', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var qd = qh.getQueryData('foobar', 1);
         expect(qd.batch).to.equal('{"page":1,"size":' + qh.options.batchSize + '}');
       });
 
-      it("selectAjax gets data correctly", function() {
+      it('selectAjax gets data correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var sa = qh.selectAjax();
         expect(sa.data('foobar').query).to.equal('{"criteria":[{"i":"SearchableText","o":"plone.app.querystring.operation.string.contains","v":"foobar*"}]}');
       });
-      it("selectAjax formats results correctly", function() {
+      it('selectAjax formats results correctly', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
         var sa = qh.selectAjax();
         var data = sa.results({total: 100, results: [1,2,3]}, 1);
@@ -137,19 +138,17 @@ define([
         expect(data.more).to.equal(true);
       });
 
-      it("getUrl correct", function() {
+      it('getUrl correct', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/'});
-        expect(qh.getUrl()).to.equal(
-          'http://foobar.com/?query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
+        expect(qh.getUrl()).to.equal('http://foobar.com/?query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
       });
-      it("getUrl correct and url query params already present", function() {
+      it('getUrl correct and url query params already present', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/?foo=bar'});
-        expect(qh.getUrl()).to.equal(
-          'http://foobar.com/?foo=bar&query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
+        expect(qh.getUrl()).to.equal('http://foobar.com/?foo=bar&query=%7B%22criteria%22%3A%5B%5D%7D&attributes=%5B%22UID%22%2C%22Title%22%2C%22Description%22%2C%22getURL%22%2C%22Type%22%5D');
       });
 
 
-      it("browsing adds path criteria", function() {
+      it('browsing adds path criteria', function() {
         var qh = new utils.QueryHelper({vocabularyUrl: 'http://foobar.com/?foo=bar'});
         qh.pattern.browsing = true;
         expect(qh.getQueryData('foobar').query).to.contain('plone.app.querystring.operation.string.path');
@@ -160,40 +159,40 @@ define([
 
     describe('ProgressIndicator', function() {
 
-      it("creates element", function() {
+      it('creates element', function() {
         var pi = new utils.ProgressIndicator();
         expect($('.' + pi.options.className).length).to.equal(1);
       });
-      it("hidden on creation", function() {
+      it('hidden on creation', function() {
         var pi = new utils.ProgressIndicator();
         expect(pi.$loading.is(':visible')).to.equal(false);
       });
-      it("shows loader", function() {
+      it('shows loader', function() {
         var pi = new utils.ProgressIndicator();
         pi.show();
         expect(pi.$loading.is(':visible')).to.equal(true);
       });
-      it("hide loader", function() {
+      it('hide loader', function() {
         var pi = new utils.ProgressIndicator();
         pi.show();
         pi.hide();
         expect(pi.$loading.is(':visible')).to.equal(false);
       });
-      it("test custom zIndex", function() {
+      it('test custom zIndex', function() {
         var pi = new utils.ProgressIndicator({
-          zIndex: function(){ return 999; }
+          zIndex: function() { return 999; }
         });
         pi.show();
         expect(pi.$loading.css('zIndex')).to.equal('999');
       });
-      it("works with backdrop", function() {
+      it('works with backdrop', function() {
         var initCalled = false;
         var showCalled = false;
         var fakeBackdrop = {
-          init: function(){
+          init: function() {
             initCalled = true;
           },
-          show: function(){
+          show: function() {
             showCalled = true;
           }
         };
@@ -206,11 +205,11 @@ define([
         expect(fakeBackdrop.closeOnClick).to.equal(true);
         expect(fakeBackdrop.closeOnEsc).to.equal(true);
       });
-      it("removed overflow css", function() {
+      it('removed overflow css', function() {
         var $parent = $('<div><div /></div>');
         var $el = $parent.children();
         var pi = new utils.ProgressIndicator({
-          zIndex: function(){ return 999; },
+          zIndex: function() { return 999; },
           container: $el
         });
         pi.show();




-------------------------------------------------------------------------------


More information about the Testbot mailing list