Bladeren bron

Implement initial 1.0 version

Denis K 8 jaren geleden
bovenliggende
commit
981f230fc7
100 gewijzigde bestanden met toevoegingen van 3483 en 5943 verwijderingen
  1. 4 0
      .gitignore
  2. 66 0
      gulpfile.js
  3. 0 0
      jet/static/admin/css/base.css
  4. 0 0
      jet/static/admin/css/dashboard.css
  5. 0 0
      jet/static/admin/css/fonts.css
  6. 0 0
      jet/static/admin/css/login.css
  7. 0 0
      jet/static/admin/css/rtl.css
  8. 0 0
      jet/static/admin/css/widgets.css
  9. 0 3
      jet/static/admin/js/SelectFilter2.js
  10. 0 204
      jet/static/admin/js/admin/RelatedObjectLookups.js
  11. 0 0
      jet/static/admin/js/admin/RelatedObjectLookups.min.js
  12. 0 293
      jet/static/admin/js/inlines.js
  13. 0 0
      jet/static/admin/js/inlines.min.js
  14. 0 1
      jet/static/admin/js/related-widget-wrapper.min.js
  15. 149 32
      jet/static/jet/css/_base.scss
  16. 35 0
      jet/static/jet/css/_breadcrumbs.scss
  17. 0 47
      jet/static/jet/css/_buttongroup.scss
  18. 452 420
      jet/static/jet/css/_changeform.scss
  19. 270 37
      jet/static/jet/css/_changelist.scss
  20. 220 99
      jet/static/jet/css/_content.scss
  21. 0 68
      jet/static/jet/css/_delete.scss
  22. 60 132
      jet/static/jet/css/_forms.scss
  23. 1 1
      jet/static/jet/css/_globals.scss
  24. 138 0
      jet/static/jet/css/_header.scss
  25. 0 90
      jet/static/jet/css/_login.scss
  26. 83 17
      jet/static/jet/css/_messages.scss
  27. 48 0
      jet/static/jet/css/_modules.scss
  28. 39 0
      jet/static/jet/css/_object-tools.scss
  29. 14 0
      jet/static/jet/css/_relatedpopup.scss
  30. 9 7
      jet/static/jet/css/_sidebar.scss
  31. 0 169
      jet/static/jet/css/_table.scss
  32. 178 0
      jet/static/jet/css/_tables.scss
  33. 0 151
      jet/static/jet/css/_top.scss
  34. 1 0
      jet/static/jet/css/_variables.scss
  35. 0 1044
      jet/static/jet/js/main.js
  36. 0 0
      jet/static/jet/js/main.min.js
  37. 0 214
      jet/static/jet/js/select2.jet.js
  38. 0 0
      jet/static/jet/js/select2.jet.min.js
  39. 43 0
      jet/static/jet/js/src/features/changeform-tabs.js
  40. 34 0
      jet/static/jet/js/src/features/changeform.js
  41. 121 0
      jet/static/jet/js/src/features/changelist.js
  42. 29 0
      jet/static/jet/js/src/features/checkboxes.js
  43. 238 0
      jet/static/jet/js/src/features/dashboard.js
  44. 98 0
      jet/static/jet/js/src/features/date-time-widgets.js
  45. 19 0
      jet/static/jet/js/src/features/delete-objects.js
  46. 20 0
      jet/static/jet/js/src/features/filters.js
  47. 57 0
      jet/static/jet/js/src/features/inlines.js
  48. 31 0
      jet/static/jet/js/src/features/related-objects.js
  49. 214 0
      jet/static/jet/js/src/features/selects.js
  50. 26 0
      jet/static/jet/js/src/features/siblings.js
  51. 361 0
      jet/static/jet/js/src/features/side-menu.js
  52. 46 0
      jet/static/jet/js/src/features/themes.js
  53. 16 0
      jet/static/jet/js/src/features/tooltips.js
  54. 54 0
      jet/static/jet/js/src/layout-updaters/actions.js
  55. 27 0
      jet/static/jet/js/src/layout-updaters/breadcrumbs.js
  56. 91 0
      jet/static/jet/js/src/layout-updaters/paginator.js
  57. 115 0
      jet/static/jet/js/src/layout-updaters/toolbar.js
  58. 44 0
      jet/static/jet/js/src/layout-updaters/user-tools.js
  59. 20 0
      jet/static/jet/js/src/main.js
  60. 7 0
      jet/static/jet/js/src/utils/jquery-icontains.js
  61. 5 0
      jet/static/jet/js/src/utils/jquery-slidefade.js
  62. 0 2
      jet/static/jet/vendor/jquery-cookie/jquery.cookie-1.4.1.min.js
  63. 0 278
      jet/static/jet/vendor/jquery-ui-timepicker/GPL-LICENSE.txt
  64. 0 20
      jet/static/jet/vendor/jquery-ui-timepicker/MIT-LICENSE.txt
  65. 0 147
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/i18n.html
  66. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-cs.js
  67. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-de.js
  68. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-es.js
  69. 0 13
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-fr.js
  70. 0 13
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-hr.js
  71. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-it.js
  72. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-ja.js
  73. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-nl.js
  74. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-pl.js
  75. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-pt-BR.js
  76. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-ru.js
  77. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-sl.js
  78. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-sv.js
  79. 0 12
      jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-tr.js
  80. 0 72
      jet/static/jet/vendor/jquery-ui-timepicker/index.html
  81. 0 57
      jet/static/jet/vendor/jquery-ui-timepicker/jquery.ui.timepicker.css
  82. 0 1500
      jet/static/jet/vendor/jquery-ui-timepicker/jquery.ui.timepicker.js
  83. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-af.js
  84. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-ar-DZ.js
  85. 0 38
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-ar.js
  86. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-az.js
  87. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-be.js
  88. 0 38
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-bg.js
  89. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-bs.js
  90. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-ca.js
  91. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-cs.js
  92. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-cy-GB.js
  93. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-da.js
  94. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-de.js
  95. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-el.js
  96. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-AU.js
  97. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-GB.js
  98. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-NZ.js
  99. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-eo.js
  100. 0 37
      jet/static/jet/vendor/jquery-ui/i18n/datepicker-es.js

+ 4 - 0
.gitignore

@@ -4,3 +4,7 @@
 /dist/
 /.idea
 /docs/_build/
+/node_modules/
+
+/jet/static2/
+/jet/templates2/

+ 66 - 0
gulpfile.js

@@ -0,0 +1,66 @@
+var gulp = require('gulp');
+var browserify = require('browserify');
+var concatCss = require('gulp-concat-css');
+var minifyCss = require('gulp-minify-css');
+var sass = require('gulp-sass');
+var uglify = require('gulp-uglify');
+var buffer = require('vinyl-buffer');
+var source = require('vinyl-source-stream');
+var sourcemaps = require('gulp-sourcemaps');
+var merge = require('merge-stream');
+
+gulp.task('js', function() {
+    browserify('./jet/static/jet/js/src/main.js')
+        .bundle()
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(source('bundle.min.js'))
+        .pipe(buffer())
+        .pipe(uglify({'mangle': false}))
+        .pipe(gulp.dest('./jet/static/jet/js/build/'));
+});
+
+gulp.task('vendor-css', function() {
+    merge(
+        gulp.src([
+            './node_modules/select2/dist/css/select2.css',
+            './node_modules/jquery-ui/themes/base/all.css',
+            './node_modules/timepicker/jquery.ui.timepicker.css'
+        ]),
+        gulp.src([
+            './node_modules/perfect-scrollbar/src/css/main.scss'
+        ])
+            .pipe(sass())
+            .on('error', function(error) {
+                console.error(error);
+            })
+    )
+        .pipe(minifyCss())
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(concatCss('vendor.css'))
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(gulp.dest('./jet/static/jet/css'));
+});
+
+gulp.task('scss', function() {
+    gulp.src('./jet/static/jet/css/**/*.scss')
+        .pipe(sourcemaps.init())
+        .pipe(sass())
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(sourcemaps.write('./'))
+        .pipe(gulp.dest('./jet/static/jet/css'));
+});
+
+gulp.task('watch', function() {
+    gulp.watch('./jet/static/jet/js/src/**/*.js', ['js']);
+    gulp.watch('./jet/static/jet/css/**/*.scss', ['scss']);
+});
+
+gulp.task('default', ['js', 'scss', 'vendor-css', 'watch']);

+ 0 - 0
jet/static/admin/js/admin/DateTimeShortcuts.js → jet/static/admin/css/base.css


+ 0 - 0
jet/static/admin/js/related-widget-wrapper.js → jet/static/admin/css/dashboard.css


+ 0 - 0
jet/static/admin/css/fonts.css


+ 0 - 0
jet/static/admin/css/login.css


+ 0 - 0
jet/static/admin/css/rtl.css


+ 0 - 0
jet/static/admin/css/widgets.css


+ 0 - 3
jet/static/admin/js/SelectFilter2.js

@@ -1,3 +0,0 @@
-var SelectFilter = {
-    init: function($a, $b, $c, $d) {  } //stub
-};

+ 0 - 204
jet/static/admin/js/admin/RelatedObjectLookups.js

@@ -1,204 +0,0 @@
-// Handles related-objects functionality: lookup link for raw_id_fields
-// and Add Another links.
-
-function html_unescape(text) {
-    // Unescape a string that was escaped using django.utils.html.escape.
-    text = text.replace(/&lt;/g, '<');
-    text = text.replace(/&gt;/g, '>');
-    text = text.replace(/&quot;/g, '"');
-    text = text.replace(/&#39;/g, "'");
-    text = text.replace(/&amp;/g, '&');
-    return text;
-}
-
-// IE doesn't accept periods or dashes in the window name, but the element IDs
-// we use to generate popup window names may contain them, therefore we map them
-// to allowed characters in a reversible way so that we can locate the correct
-// element when the popup window is dismissed.
-function id_to_windowname(text) {
-    text = text.replace(/\./g, '__dot__');
-    text = text.replace(/\-/g, '__dash__');
-    return text;
-}
-
-function windowname_to_id(text) {
-    text = text.replace(/__dot__/g, '.');
-    text = text.replace(/__dash__/g, '-');
-    return text;
-}
-
-function showAdminPopup(triggeringLink, name_regexp) {
-    var name = triggeringLink.id.replace(name_regexp, '');
-    name = id_to_windowname(name);
-    var href = triggeringLink.href;
-    if (href.indexOf('?') == -1) {
-        href += '?_popup=1';
-    } else {
-        href  += '&_popup=1';
-    }
-
-    // Django JET
-    showRelatedPopup(name, href);
-
-    return false;
-}
-
-function showRelatedObjectLookupPopup(triggeringLink) {
-    return showAdminPopup(triggeringLink, /^lookup_/);
-}
-
-function dismissRelatedLookupPopup(win, chosenId) {
-    var name = windowname_to_id(win.name);
-    var elem = document.getElementById(name);
-    if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
-        elem.value += ',' + chosenId;
-    } else {
-        document.getElementById(name).value = chosenId;
-    }
-
-    // Django JET
-    closeRelatedPopup(win);
-}
-
-function showRelatedObjectPopup(triggeringLink) {
-    var name = triggeringLink.id.replace(/^(change|add|delete)_/, '');
-    name = id_to_windowname(name);
-    var href = triggeringLink.href;
-
-    // Django JET
-    if (href.indexOf('_popup=1') == -1) {
-        if (href.indexOf('?') == -1) {
-            href += '?_popup=1';
-        } else {
-            href += '&_popup=1';
-        }
-    }
-
-    showRelatedPopup(name, href);
-
-    return false;
-}
-
-function dismissAddRelatedObjectPopup(win, newId, newRepr) {
-    // newId and newRepr are expected to have previously been escaped by
-    // django.utils.html.escape.
-    newId = html_unescape(newId);
-    newRepr = html_unescape(newRepr);
-    var name = windowname_to_id(win.name);
-    var elem = document.getElementById(name);
-    var o;
-    if (elem) {
-        var elemName = elem.nodeName.toUpperCase();
-        if (elemName == 'SELECT') {
-            o = new Option(newRepr, newId);
-            elem.options[elem.options.length] = o;
-            o.selected = true;
-        } else if (elemName == 'INPUT') {
-            if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
-                elem.value += ',' + newId;
-            } else {
-                elem.value = newId;
-            }
-        }
-        // Trigger a change event to update related links if required.
-        django.jQuery(elem).trigger('change');
-    } else {
-        var toId = name + "_to";
-        o = new Option(newRepr, newId);
-        SelectBox.add_to_cache(toId, o);
-        SelectBox.redisplay(toId);
-    }
-
-    // Django JET
-    closeRelatedPopup(win);
-}
-
-function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
-    objId = html_unescape(objId);
-    newRepr = html_unescape(newRepr);
-    var id = windowname_to_id(win.name).replace(/^edit_/, '');
-    var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
-    var selects = django.jQuery(selectsSelector);
-    selects.find('option').each(function() {
-        if (this.value == objId) {
-            this.innerHTML = newRepr;
-            this.value = newId;
-        }
-    });
-
-    // Django JET
-    closeRelatedPopup(win);
-};
-
-function dismissDeleteRelatedObjectPopup(win, objId) {
-    objId = html_unescape(objId);
-    var id = windowname_to_id(win.name).replace(/^delete_/, '');
-    var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
-    var selects = django.jQuery(selectsSelector);
-    selects.find('option').each(function() {
-        if (this.value == objId) {
-            django.jQuery(this).remove();
-        }
-    }).trigger('change');
-
-    // Django JET
-    closeRelatedPopup(win);
-};
-
-// Kept for backward compatibility
-showAddAnotherPopup = showRelatedObjectPopup;
-dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
-
-// Django JET
-
-opener = parent.window;
-
-function showRelatedPopup(name, href) {
-    django.jQuery(function($) {
-        var $container = $('.related-popup-container', parent.document);
-        var $loading = $container.find('.loading-indicator', parent.document);
-        var $body = $('body').addClass('non-scrollable', parent.document);
-        var $popup = $('<iframe>').attr('name', name).attr('src', href).addClass('related-popup').on('load', function() {
-            $popup.add($('.related-popup-back')).fadeIn(200, 'swing', function() {
-                $loading.hide();
-            });
-        });
-
-        $loading.show();
-        $container.fadeIn(200, 'swing', function() {
-            $container.append($popup);
-        });
-        $body.addClass('non-scrollable', parent.document);
-    });
-}
-
-function closeRelatedPopup(win) {
-    jet.jQuery('select').trigger('select:init');
-    jet.jQuery(win.parent).trigger('related-popup:close');
-}
-
-django.jQuery(document).ready(function() {
-    jet.jQuery(function($){
-        function updateLinks() {
-            var $this = $(this);
-            var siblings = $this.nextAll('.change-related, .delete-related');
-            if (!siblings.length) return;
-            var value = $this.val();
-            if (value) {
-                siblings.each(function(){
-                    var elm = $(this);
-                    elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
-                });
-            } else siblings.removeAttr('href');
-        }
-        var container = $(document);
-        container.on('change', '.related-widget-wrapper select', updateLinks);
-        container.find('.related-widget-wrapper select').each(updateLinks);
-        container.on('click', '.related-widget-wrapper-link', function(event){
-            if (this.href) {
-                showRelatedObjectPopup(this);
-            }
-            event.preventDefault();
-        });
-    });
-});

File diff suppressed because it is too large
+ 0 - 0
jet/static/admin/js/admin/RelatedObjectLookups.min.js


+ 0 - 293
jet/static/admin/js/inlines.js

@@ -1,293 +0,0 @@
-/**
- * Django admin inlines
- *
- * Based on jQuery Formset 1.1
- * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
- * @requires jQuery 1.2.6 or later
- *
- * Copyright (c) 2009, Stanislaus Madueke
- * All rights reserved.
- *
- * Spiced up with Code from Zain Memon's GSoC project 2009
- * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip.
- *
- * Licensed under the New BSD License
- * See: http://www.opensource.org/licenses/bsd-license.php
- */
-(function($) {
-  $.fn.formset = function(opts) {
-    var options = $.extend({}, $.fn.formset.defaults, opts);
-    var $this = $(this);
-    var $parent = $this.parent();
-    var updateElementIndex = function(el, prefix, ndx) {
-      var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
-      var replacement = prefix + "-" + ndx;
-      if ($(el).prop("for")) {
-        $(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
-      }
-      if (el.id) {
-        el.id = el.id.replace(id_regex, replacement);
-      }
-      if (el.name) {
-        el.name = el.name.replace(id_regex, replacement);
-      }
-    };
-    var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
-    var nextIndex = parseInt(totalForms.val(), 10);
-    var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
-    // only show the add button if we are allowed to add more items,
-        // note that max_num = None translates to a blank string.
-    var showAddButton = maxForms.val() === '' || (maxForms.val()-totalForms.val()) > 0;
-    $this.each(function(i) {
-      $(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
-    });
-    if ($this.length && showAddButton) {
-      var addButton;
-      if ($this.prop("tagName") == "TR") {
-        // If forms are laid out as table rows, insert the
-        // "add" button in a new table row:
-        var numCols = this.eq(-1).children().length;
-        $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
-        addButton = $parent.find("tr:last a");
-      } else {
-        // Otherwise, insert it immediately after the last form:
-        $this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
-        addButton = $this.filter(":last").next().find("a");
-      }
-      addButton.click(function(e) {
-        e.preventDefault();
-        var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS");
-        var template = $("#" + options.prefix + "-empty");
-        var row = template.clone(true);
-        row.removeClass(options.emptyCssClass)
-          .addClass(options.formCssClass)
-          .attr("id", options.prefix + "-" + nextIndex);
-        if (row.is("tr")) {
-          // If the forms are laid out in table rows, insert
-          // the remove button into the last table cell:
-          row.children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>");
-        } else if (row.is("ul") || row.is("ol")) {
-          // If they're laid out as an ordered/unordered list,
-          // insert an <li> after the last list item:
-          row.append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>");
-        } else {
-          // Otherwise, just insert the remove button as the
-          // last child element of the form's container:
-          row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
-        }
-        row.find("*").each(function() {
-          updateElementIndex(this, options.prefix, totalForms.val());
-        });
-        // Insert the new form when it has been fully edited
-        row.insertBefore($(template));
-        // Update number of total forms
-        $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
-        nextIndex += 1;
-        // Hide add button in case we've hit the max, except we want to add infinitely
-        if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) {
-          addButton.parent().hide();
-        }
-        // The delete button of each row triggers a bunch of other things
-        row.find("a." + options.deleteCssClass).click(function(e) {
-          e.preventDefault();
-          // Remove the parent form containing this button:
-          var row = $(this).parents("." + options.formCssClass);
-          row.remove();
-          nextIndex -= 1;
-          // If a post-delete callback was provided, call it with the deleted form:
-          if (options.removed) {
-            options.removed(row);
-          }
-          // Update the TOTAL_FORMS form count.
-          var forms = $("." + options.formCssClass);
-          $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
-          // Show add button again once we drop below max
-          if ((maxForms.val() === '') || (maxForms.val()-forms.length) > 0) {
-            addButton.parent().show();
-          }
-          // Also, update names and ids for all remaining form controls
-          // so they remain in sequence:
-          for (var i=0, formCount=forms.length; i<formCount; i++)
-          {
-            updateElementIndex($(forms).get(i), options.prefix, i);
-            $(forms.get(i)).find("*").each(function() {
-              updateElementIndex(this, options.prefix, i);
-            });
-          }
-        });
-        // If a post-add callback was supplied, call it with the added form:
-        if (options.added) {
-          options.added(row);
-        }
-      });
-    }
-    return this;
-  };
-
-  /* Setup plugin defaults */
-  $.fn.formset.defaults = {
-    prefix: "form",          // The form prefix for your django formset
-    addText: "add another",      // Text for the add link
-    deleteText: "remove",      // Text for the delete link
-    addCssClass: "add-row",      // CSS class applied to the add link
-    deleteCssClass: "delete-row",  // CSS class applied to the delete link
-    emptyCssClass: "empty-row",    // CSS class applied to the empty row
-    formCssClass: "dynamic-form",  // CSS class applied to each form in a formset
-    added: null,          // Function called each time a new form is added
-    removed: null          // Function called each time a form is deleted
-  };
-
-
-  // Tabular inlines ---------------------------------------------------------
-  $.fn.tabularFormset = function(options) {
-    var $rows = $(this);
-    var alternatingRows = function(row) {
-      $($rows.selector).not(".add-row").removeClass("row1 row2")
-        .filter(":even").addClass("row1").end()
-        .filter(":odd").addClass("row2");
-    };
-
-    var reinitDateTimeShortCuts = function() {
-      // Reinitialize the calendar and clock widgets by force
-      if (typeof DateTimeShortcuts != "undefined") {
-        $(".datetimeshortcuts").remove();
-        DateTimeShortcuts.init();
-      }
-    };
-
-    var updateSelectFilter = function() {
-      // If any SelectFilter widgets are a part of the new form,
-      // instantiate a new SelectFilter instance for it.
-      if (typeof SelectFilter != 'undefined'){
-        $('.selectfilter').each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix );
-        });
-        $('.selectfilterstacked').each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix );
-        });
-      }
-    };
-
-    var initPrepopulatedFields = function(row) {
-      row.find('.prepopulated_field').each(function() {
-        var field = $(this),
-            input = field.find('input, select, textarea'),
-            dependency_list = input.data('dependency_list') || [],
-            dependencies = [];
-        $.each(dependency_list, function(i, field_name) {
-          dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
-        });
-        if (dependencies.length) {
-          input.prepopulate(dependencies, input.attr('maxlength'));
-        }
-      });
-    };
-
-    $rows.formset({
-      prefix: options.prefix,
-      addText: options.addText,
-      formCssClass: "dynamic-" + options.prefix,
-      deleteCssClass: "inline-deletelink",
-      deleteText: options.deleteText,
-      emptyCssClass: "empty-form",
-      removed: alternatingRows,
-      added: function(row) {
-        initPrepopulatedFields(row);
-        reinitDateTimeShortCuts();
-        updateSelectFilter();
-        alternatingRows(row);
-      }
-    });
-
-    return $rows;
-  };
-
-  // Stacked inlines ---------------------------------------------------------
-  $.fn.stackedFormset = function(options) {
-    var $rows = $(this);
-    var updateInlineLabel = function(row) {
-      $($rows.selector).find(".inline_label").each(function(i) {
-        var count = i + 1;
-        $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
-      });
-    };
-
-    var reinitDateTimeShortCuts = function() {
-      // Reinitialize the calendar and clock widgets by force, yuck.
-      if (typeof DateTimeShortcuts != "undefined") {
-        $(".datetimeshortcuts").remove();
-        DateTimeShortcuts.init();
-      }
-    };
-
-    var updateSelectFilter = function() {
-      // If any SelectFilter widgets were added, instantiate a new instance.
-      if (typeof SelectFilter != "undefined"){
-        $(".selectfilter").each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix);
-        });
-        $(".selectfilterstacked").each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix);
-        });
-      }
-    };
-
-    var initPrepopulatedFields = function(row) {
-      row.find('.prepopulated_field').each(function() {
-        var field = $(this),
-            input = field.find('input, select, textarea'),
-            dependency_list = input.data('dependency_list') || [],
-            dependencies = [];
-        $.each(dependency_list, function(i, field_name) {
-          dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
-        });
-        if (dependencies.length) {
-          input.prepopulate(dependencies, input.attr('maxlength'));
-        }
-      });
-    };
-
-    $rows.formset({
-      prefix: options.prefix,
-      addText: options.addText,
-      formCssClass: "dynamic-" + options.prefix,
-      deleteCssClass: "inline-deletelink",
-      deleteText: options.deleteText,
-      emptyCssClass: "empty-form",
-      removed:  (function(row) {
-        //hack
-
-        updateInlineLabel(row);
-      }),
-      added: (function(row) {
-        initPrepopulatedFields(row);
-        reinitDateTimeShortCuts();
-        updateSelectFilter();
-        updateInlineLabel(row);
-
-        //hack
-        var $items = row.closest('.stacked-inline').find('.stacked-inline-list');
-        var $emptyItem = $items.find('.stacked-inline-list-item.empty');
-        var $item = $emptyItem.clone();
-
-        row.find('.inline-deletelink').remove();
-
-        $item.removeClass('empty');
-        $item.find('.stacked-inline-list-item-link').attr('data-inline-related-id', row.attr('id'));
-
-        $emptyItem.before($item);
-
-        $items.find(".inline_label").each(function(i) {
-          var count = i + 1;
-          $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
-        });
-      })
-    });
-
-    return $rows;
-  };
-})(django.jQuery);

File diff suppressed because it is too large
+ 0 - 0
jet/static/admin/js/inlines.min.js


+ 0 - 1
jet/static/admin/js/related-widget-wrapper.min.js

@@ -1 +0,0 @@
-

+ 149 - 32
jet/static/jet/css/_base.scss

@@ -1,3 +1,7 @@
+/*
+  DJANGO JET Admin styles
+*/
+
 @import "globals";
 
 html, body {
@@ -7,6 +11,7 @@ html, body {
 }
 
 body {
+  background: $background-color;
   color: $text-color;
   font-family: $font;
   font-size: $font-size;
@@ -16,20 +21,40 @@ body {
   }
 }
 
-a, a:visited, a:hover {
-  color: $link-color;
-  font-weight: normal;
-  text-decoration: none;
+/* PAGE STRUCTURE */
+
+#container {
+  padding: 0 0 0 $sidebar-width;
+  min-height: 100%;
 }
 
-a:hover {
-  color: $hover-link-color;
+#content {
+  padding: 20px;
+
+  & > h1 {
+    display: none;
+  }
 }
 
-.container {
-  padding-left: $sidebar-width;
-  height: 100%;
-  position: relative;
+//.dashboard #content {
+//    width: 600px;
+//}
+//
+//#content-main {
+//    float: left;
+//    width: 100%;
+//}
+//
+//#content-related {
+//    float: right;
+//    width: 260px;
+//    position: relative;
+//    margin-right: -300px;
+//}
+
+#footer {
+  clear: both;
+  padding: 10px;
 }
 
 .sidebar {
@@ -41,33 +66,125 @@ a:hover {
   overflow-y: auto;
 }
 
-.content {
-  width: 100%;
-  min-height: 100%;
-  z-index: 1;
-  box-shadow: -2px 0 6px 0 rgba(0, 0, 0, 0.25);
-  position: relative;
+.dialog-confirm {
+  display: none;
 }
 
-#content {
-  padding: 20px;
-}
+/* COLUMN TYPES */
 
-.module {
-  border: 0;
-  margin: 0;
-}
+//.colMS {
+//    margin-right: 300px;
+//}
+//
+//.colSM {
+//    margin-left: 300px;
+//}
+//
+//.colSM #content-related {
+//    float: left;
+//    margin-right: 0;
+//    margin-left: -300px;
+//}
+//
+//.colSM #content-main {
+//    float: right;
+//}
+//
+//.popup .colM {
+//    width: auto;
+//}
+//
 
-@import "table";
-@import "buttongroup";
-@import "sidebar";
-@import "top";
+/* SIDEBAR */
+
+//#content-related {
+//    background: #f8f8f8;
+//}
+//
+//#content-related .module {
+//    background: none;
+//}
+//
+//#content-related h3 {
+//    font-size: 14px;
+//    color: #666;
+//    padding: 0 16px;
+//    margin: 0 0 16px;
+//}
+//
+//#content-related h4 {
+//    font-size: 13px;
+//}
+//
+//#content-related p {
+//    padding-left: 16px;
+//    padding-right: 16px;
+//}
+//
+//#content-related .actionlist {
+//    padding: 0;
+//    margin: 16px;
+//}
+//
+//#content-related .actionlist li {
+//    line-height: 1.2;
+//    margin-bottom: 10px;
+//    padding-left: 18px;
+//}
+//
+//#content-related .module h2 {
+//    background: none;
+//    padding: 16px;
+//    margin-bottom: 16px;
+//    border-bottom: 1px solid #eaeaea;
+//    font-size: 18px;
+//    color: #333;
+//}
+//
+//.delete-confirmation form input[type="submit"] {
+//    background: #ba2121;
+//    border-radius: 4px;
+//    padding: 10px 15px;
+//    color: #fff;
+//}
+//
+//.delete-confirmation form input[type="submit"]:active,
+//.delete-confirmation form input[type="submit"]:focus,
+//.delete-confirmation form input[type="submit"]:hover {
+//    background: #a41515;
+//}
+//
+//.delete-confirmation form .cancel-link {
+//    display: inline-block;
+//    vertical-align: middle;
+//    height: 15px;
+//    line-height: 15px;
+//    background: #ddd;
+//    border-radius: 4px;
+//    padding: 10px 15px;
+//    color: #333;
+//    margin: 0 0 0 10px;
+//}
+//
+//.delete-confirmation form .cancel-link:active,
+//.delete-confirmation form .cancel-link:focus,
+//.delete-confirmation form .cancel-link:hover {
+//    background: #ccc;
+//}
+//
+
+@import "jquery-ui/jquery-ui.theme";
+@import "select2/layout";
+@import "content";
 @import "forms";
+@import "tables";
 @import "messages";
-@import "changelist";
+@import "header";
+@import "breadcrumbs";
+@import "modules";
+@import "object-tools";
 @import "changeform";
-@import "delete";
-@import "login";
-@import "content";
+@import "changelist";
+@import "sidebar";
+@import "relatedpopup";
 @import "dashboard";
-@import "relatedpopup";

+ 35 - 0
jet/static/jet/css/_breadcrumbs.scss

@@ -0,0 +1,35 @@
+@import "globals";
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+  font-size: 12px;
+  font-weight: bold;
+  text-transform: uppercase;
+  line-height: $top-height;
+  color: $top-text-color;
+  padding: 20px 175px + 20px + 20px 20px 20px;
+  visibility: hidden;
+
+  &.initialized {
+    visibility: inherit;
+  }
+
+  a {
+    &, &:visited {
+      color: $top-link-color;
+    }
+
+    &:focus, &:hover {
+      color: $top-hover-link-color;
+    }
+  }
+}
+
+.breadcrumbs-separator {
+  color: $top-separator-color;
+  margin: 0 6px 0 6px;
+  font-weight: bold !important;
+  font-size: 15px;
+  vertical-align: middle;
+}

+ 0 - 47
jet/static/jet/css/_buttongroup.scss

@@ -1,47 +0,0 @@
-@import "globals";
-
-.button-group {
-  margin: 0;
-  line-height: normal;
-
-  &-buttons {
-    span, a {
-      padding: 6px 10px;
-      display: inline-block;
-
-      &:first-child {
-        border-radius: 4px 0 0 4px;
-      }
-
-      &:last-child {
-        border-radius: 0 4px 4px 0;
-      }
-
-      &:first-child:last-child {
-        border-radius: 4px;
-      }
-    }
-
-    span {
-      background-color: $button-active-background-color;
-      color: $button-active-text-color;
-    }
-
-    a {
-      &, &:visited, &:hover {
-        background-color: $button-background-color;
-        color: $button-text-color;
-        text-decoration: none;
-      }
-
-      &:hover {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-      }
-    }
-  }
-
-  &-label {
-    margin-right: 10px;
-  }
-}

+ 452 - 420
jet/static/jet/css/_changeform.scss

@@ -1,498 +1,530 @@
 @import "globals";
 
-.module {
-  &-separator {
-    height: 1em;
+/* FORM ROWS */
+
+.form-row {
+  overflow: hidden;
+  padding: 10px;
+
+  img, input {
+    vertical-align: middle;
   }
 
-  .form-row {
-    padding: 6px 0;
-    overflow: hidden;
+  label input[type="checkbox"] {
+    margin-top: 0;
+    vertical-align: 0;
+  }
 
-    label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word;
+  p {
+    padding-left: 0;
+  }
+}
 
-      + p {
-        padding-top: 6px;
-        margin: 4px 0 4px (150px + 10px);
-      }
-    }
+.hidden {
+  display: none;
+}
+
+/* FORM LABELS */
 
-    br {
-      clear: both;
+label {
+  .required &, &.required {
+    font-weight: bold;
+
+    &:after {
+      content: "*";
     }
+  }
 
-    &.errors label {
-      color: $error-text-color;
+  .form-row.errors & {
+    color: $error-text-color;
+  }
+}
+
+/* RADIO BUTTONS */
+
+form {
+  ul.radiolist {
+    li {
+      list-style-type: none;
     }
 
-    .checkbox-row label {
+    label {
       float: none;
       display: inline;
     }
 
-    .help {
-      @extend .small;
-      clear: left;
-      color: $dim-text-color;
-      margin: 12px 0 0 160px;
+    input[type="radio"] {
+      margin: -2px 4px 0 0;
+      padding: 0;
     }
+  }
 
-    .checkbox-row .help {
-      margin-left: 0;
-    }
+  ul.inline {
+    margin-left: 0;
+    padding: 0;
 
-    .errorlist {
-      @extend .clear-list;
-      @extend .small;
-      color: $error-text-color;
-      margin-bottom: 10px !important;
+    li {
+      float: left;
+      padding-right: 7px;
     }
+  }
+}
 
-    .datetime {
-      margin-left: 160px;
-    }
+/* ALIGNED FIELDSETS */
 
-    .add-related span {
-      font-size: 18px;
-      vertical-align: middle;
-    }
+.aligned {
+  label {
+    display: block;
+    padding: 8px 10px 0 0;
+    float: left;
+    width: 160px;
+    word-wrap: break-word;
+    line-height: 1;
+  }
 
-    .change-related span {
-      font-size: 20px;
-      vertical-align: middle;
-    }
+  label + p {
+    padding: 6px 0;
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 170px;
+  }
 
-    .add-another {
-      margin-left: 4px;
+  ul label {
+    display: inline;
+    float: none;
+    width: auto;
+  }
 
-      &:before {
-        @include font-icon;
-        vertical-align: middle;
-        font-size: 18px;
-        content: $icon-add3;
-      }
+  .form-row input {
+    margin-bottom: 0;
+  }
 
-      img {
-        display: none;
-      }
-    }
+  .vCheckboxLabel {
+    float: none;
+    width: auto;
+    display: inline-block;
+    vertical-align: -3px;
+    padding: 0 0 5px 5px;
 
-    .field-box {
-      margin-right: 20px;
-      float: left;
+    & + p.help {
+      margin-top: -4px;
     }
+  }
+}
 
-    .file-upload {
-      background: $content-contrast-background-color;
-      display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px;
+form .aligned {
+  ul {
+    margin-left: 160px;
+    padding-left: 10px;
+  }
 
-      .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px;
-      }
-    }
+  ul.radiolist {
+    display: inline-block;
+    margin: 0;
+    padding: 0;
   }
 
-  &.aligned {
-    background-color: $content-background-color;
-    border-radius: 4px;
-    padding: 20px;
+  p.help {
+    clear: left;
+    margin-top: 0;
+    margin-left: 160px;
+    padding-left: 10px;
+  }
 
-    ul label {
-      display: inline;
-      float: none;
-      width: auto;
-    }
+  label + p.help {
+    margin-left: 0;
+    padding-left: 0;
+  }
 
-    ul {
-      margin: 0 0 0 160px;
-      padding: 0;
-    }
+  p.help:last-child {
+    margin-bottom: 0;
+    padding-bottom: 0;
   }
-}
 
-.submit-row {
-  padding: 20px 0;
+  input + p.help,
+  textarea + p.help,
+  select + p.help {
+    margin-left: 160px;
+    padding-left: 10px;
+  }
 
-  .deletelink-box {
-    float: right;
-    padding: 0;
-    margin: 0;
+  ul li {
+    list-style: none;
+  }
+
+  table p {
+    margin-left: 0;
+    padding-left: 0;
   }
 }
 
-.changeform {
-  background-color: $content-background-color;
-  border-radius: 4px;
-  min-width: 800px;
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+  width: 350px;
+}
+
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+  width: 610px;
+}
+
+.checkbox-row p.help {
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* FIELDSETS */
 
-  &-navigation {
+fieldset {
+  .field-box {
     float: left;
-    margin-bottom: 20px;
+    margin-right: 20px;
   }
 
-  &-tabs {
-    @extend .clear-list;
-    border-bottom: 2px solid $background-color;
-    padding-left: 16px !important;
+  &.monospace textarea {
+    font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+  }
+}
 
-    &-item {
-      display: inline-block;
+/* WIDE FIELDSETS */
 
-      & a, & a:hover, & a:visited {
-        display: inline-block;
-        padding: 12px 4px;
-        margin: 0 4px;
-        border-bottom: 2px solid transparent;
-        position: relative;
-        top: 2px;
-        color: $dim-text-color;
-        font-weight: bold;
-        font-size: 11px;
-        text-transform: uppercase;
-      }
-
-      & a:hover {
-        color: $text-color;
-      }
-
-      &.selected {
-        & a, & a:hover, & a:visited {
-          color: $text-color;
-          border-color: $tab-selected-border-color;
-        }
-      }
-
-      &.errors {
-        & a, & a:hover, & a:visited {
-          border-color: $tab-error-border-color;
-        }
-      }
-    }
-  }
+.wide label {
+  width: 200px;
+}
 
-  &-tabs ~ .module {
-    display: none;
+form .wide p, form .wide input + p.help {
+  margin-left: 200px;
+}
 
-    &.selected {
-      display: block;
-    }
+form .wide p.help {
+  padding-left: 38px;
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+  width: 450px;
+}
 
-    .stacked.inline-related {
-      display: none;
+/* COLLAPSED FIELDSETS */
+
+//fieldset.collapsed * {
+//    display: none;
+//}
+//
+//fieldset.collapsed h2, fieldset.collapsed {
+//    display: block;
+//}
+//
+//fieldset.collapsed {
+//    border: 1px solid #eee;
+//    border-radius: 4px;
+//    overflow: hidden;
+//}
+//
+//fieldset.collapsed h2 {
+//    background: #f8f8f8;
+//    color: #666;
+//}
+//
+//fieldset .collapse-toggle {
+//    color: #fff;
+//}
+//
+//fieldset.collapsed .collapse-toggle {
+//    background: transparent;
+//    display: inline;
+//    color: #447e9b;
+//}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+    font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
 
-      &.selected {
-        display: block;
-      }
+/* SUBMIT ROW */
+
+.submit-row {
+  margin: 0 0 20px;
+  overflow: hidden;
+  padding: 20px 0;
+
+  input {
+    &, &:visited, &:hover {
+      margin: 0 5px 0 0;
+      padding: 0 20px;
+      font-size: 12px;
     }
-  }
 
-  .module {
-    .form-row {
-      .select2 {
-        max-width: 800px - 20px * 2 - 150px - 24px;
-      }
+    &.default {
+      margin: 0 8px 0 0;
     }
   }
 
-  .inline-group {
-    .errornote {
-      color: $error-text-color;
-      margin: 0;
-      padding: 20px;
-    }
+  p {
+    margin: 0.3em;
   }
 
-  .tabular.inline-related {
-    .module {
+  p.deletelink-box {
+    float: right;
+    padding: 0;
+    margin: 0;
+  }
+
+  a.deletelink {
+    &, &:visited, &:hover {
+      display: inline-block;
+      background-color: $danger-button-background-color;
+      color: $danger-button-text-color;
       border: 0;
-      margin: 0;
-      padding: 0;
+      border-radius: 4px;
+      height: 32px;
+      line-height: 32px;
+      outline: 0;
+      font-size: 12px;
+      font-weight: lighter;
+      text-align: center;
+      padding: 0 20px;
+      text-transform: uppercase;
+      @include transition(background $transitions-duration, box-shadow $transitions-duration, border $transitions-duration);
+    }
+
+    &:hover, &:focus {
+      background-color: $button-hover-background-color;
+      color: $button-hover-text-color;
+    }
 
-      .errornote {
-        background-color: $content-contrast-background-color;
-      }
-
-      .errorlist {
-        @extend .clear-list;
-        @extend .small;
-        color: $error-text-color;
-      }
-
-      table {
-        border-collapse: collapse;
-        width: 100%;
-
-        thead {
-          th {
-            background: -webkit-linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-            background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-            padding: 8px;
-            font-size: 12px;
-            font-weight: bold;
-            text-align: left;
-            text-transform: uppercase;
-
-            &.action-checkbox-column {
-              width: 20px;
-              text-align: center;
-            }
-          }
-        }
-
-        tbody {
-          tr {
-            border-bottom: 1px solid $content-border-color;
-
-            &:last-child {
-              border-bottom: 0;
-            }
-
-            & th, & td {
-              padding: 8px;
-              text-align: left;
-              font-size: 13px;
-
-              &.original {
-                text-align: center;
-                font-size: 18px;
-                width: 36px;
-                padding-right: 0;
-                white-space: nowrap;
-
-                p {
-                  margin: 0;
-                }
-
-                .icon-new {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-
-                .icon-edit {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-
-                .icon-open-external {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-              }
-            }
-          }
-
-          .add-row {
-            td {
-              padding: 16px;
-
-              a {
-                font-size: 12px;
-                font-weight: bold;
-
-                span {
-                  vertical-align: middle;
-                }
-              }
-            }
-          }
-        }
-      }
+    &:active {
+      background-color: $button-active-background-color;
+      color: $button-active-text-color;
     }
   }
+}
 
-  .stacked-inline {
-    $side-width: 250px;
+body.popup .submit-row {
+  overflow: auto;
+}
 
+/* CUSTOM FORM FIELDS */
+
+.vSelectMultipleField {
+  vertical-align: top;
+}
+
+.vCheckboxField {
+  border: none;
+}
+
+.vDateField, .vTimeField {
+  margin-right: 2px;
+  margin-bottom: 4px;
+}
+
+.vDateField {
+  min-width: 6.85em;
+}
+
+.vTimeField {
+  min-width: 4.7em;
+}
+
+.vURLField {
+  width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+  width: 48em;
+}
+
+.flatpages-flatpage #id_content {
+  height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+  width: 2.2em;
+}
+
+.vTextField {
+  width: 20em;
+}
+
+.vIntegerField {
+  width: 5em;
+}
+
+.vBigIntegerField {
+  width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+  width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+    padding: 0;
+    margin: 0 0 30px;
+}
+
+.inline-group thead th {
+    padding: 8px 10px;
+}
+
+.inline-group .aligned label {
+    width: 160px;
+}
+
+.inline-related {
     position: relative;
+}
 
-    &.side {
-      margin-left: $side-width;
-    }
+.inline-related h3 {
+    margin: 0;
+    color: #666;
+    padding: 5px;
+    font-size: 13px;
+    background: #f8f8f8;
+    border-top: 1px solid #eee;
+    border-bottom: 1px solid #eee;
+}
 
-    &-side {
-      float: left;
-      width: $side-width;
-      margin-left: -$side-width;
-      background: $content-contrast-background-color;
-      max-height: 60vh;
-      overflow-y: auto;
-
-      &-top {
-        height: 40px;
-        background: -webkit-linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-        background: linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-      }
-
-      &-bottom {
-        height: 40px;
-        background: -webkit-linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-        background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-      }
-    }
+.inline-related h3 span.delete {
+    float: right;
+}
 
-    &-content {
-      float: right;
-      width: 100%;
-
-      .actions {
-        margin: 20px 20px 0 20px;
-
-        .icon-new {
-          font-size: 18px;
-          vertical-align: middle;
-        }
-
-        .icon-edit {
-          font-size: 18px;
-          vertical-align: middle;
-        }
-
-        .icon-open-external {
-          font-size: 18px;
-          vertical-align: middle;
-        }
-      }
-
-      .delete {
-        margin: 20px 20px 0 20px;
-        border-radius: 4px;
-        padding: 10px;
-        border: 2px solid $warning-color;
-        box-sizing: border-box;
-      }
-    }
+.inline-related h3 span.delete label {
+    margin-left: 2px;
+    font-size: 11px;
+}
 
-    .add-row {
-      position: absolute;
-      top: 0;
-      left: -$side-width;
-      width: $side-width;
-      height: 40px;
-      line-height: 40px;
-      padding: 0 20px;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-      box-sizing: border-box;
-      background: -webkit-linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-      background: linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-
-      a {
-        font-size: 12px;
-        font-weight: bold;
-
-        span {
-          vertical-align: middle;
-        }
-      }
-    }
+.inline-related fieldset {
+    margin: 0;
+    background: #fff;
+    border: none;
+    width: 100%;
+}
 
-    &-list {
-      @extend .clear-list;
-
-      &-item {
-        &-link{
-          &-remove {
-            position: relative;
-            float: right;
-            display: none;
-          }
-
-          &:hover .stacked-inline-list-item-link-remove {
-            display: inline-block;
-          }
-        }
-
-        a, a:visited, a:hover {
-          display: block;
-          padding: 8px 10px 8px 20px;
-          color: $dim-text-color;
-          overflow: hidden;
-          text-overflow: ellipsis;
-          white-space: nowrap;
-          @include transition-all(0.2s);
-        }
-
-        a:hover {
-          color: $button-hover-text-color;
-          background-color: $button-hover-background-color;
-        }
-
-        &.selected {
-          a, a:visited, a:hover {
-            color: $text-color;
-          }
-
-          a:hover {
-            color: $text-color;
-            background-color: transparent;
-          }
-        }
-
-        &:not(.has_original) {
-          a, a:visited {
-
-          }
-        }
-
-        &.empty {
-          display: none;
-        }
-
-        &.delete {
-          a, a:visited, a:hover {
-            text-decoration: line-through;
-          }
-        }
-
-        &.errors {
-          a, a:visited, a:hover {
-            color: $error-text-color;
-          }
-        }
-      }
-    }
-  }
+.inline-related fieldset.module h3 {
+    margin: 0;
+    padding: 2px 5px 3px 5px;
+    font-size: 11px;
+    text-align: left;
+    font-weight: bold;
+    background: #bcd;
+    color: #fff;
+}
 
-  .submit-row {
-    padding: 20px;
-  }
+.inline-group .tabular fieldset.module {
+    border: none;
 }
 
-.related-lookup {
-  margin-left: 10px;
+.inline-related.tabular fieldset.module table {
+    width: 100%;
+}
 
-  &:before {
-    @include font-icon;
-    color: $button-text-color;
-    vertical-align: middle;
-    font-size: 20px;
-    content: $icon-search;
-  }
+.last-related fieldset {
+    border: none;
+}
 
-  img {
-    display: none;
-  }
+.inline-group .tabular tr.has_original td {
+    padding-top: 2em;
+}
+
+.inline-group .tabular tr td.original {
+    padding: 2px 0 0 0;
+    width: 0;
+    _position: relative;
+}
+
+.inline-group .tabular th.original {
+    width: 0px;
+    padding: 0;
+}
+
+.inline-group .tabular td.original p {
+    position: absolute;
+    left: 0;
+    height: 1.1em;
+    padding: 2px 9px;
+    overflow: hidden;
+    font-size: 9px;
+    font-weight: bold;
+    color: #666;
+    _width: 700px;
+}
+
+.inline-group ul.tools {
+    padding: 0;
+    margin: 0;
+    list-style: none;
+}
+
+.inline-group ul.tools li {
+    display: inline;
+    padding: 0 5px;
+}
 
-  + strong {
-    font-weight: normal;
+.inline-group div.add-row,
+.inline-group .tabular tr.add-row td {
+    color: #666;
+    background: #f8f8f8;
+    padding: 8px 10px;
+    border-bottom: 1px solid #eee;
+}
+
+.inline-group .tabular tr.add-row td {
+    padding: 8px 10px;
+    border-bottom: 1px solid #eee;
+}
+
+.inline-group ul.tools a.add,
+.inline-group div.add-row a,
+.inline-group .tabular tr.add-row td a {
+    background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+    padding-left: 16px;
     font-size: 12px;
-  }
 }
 
-.related-widget-wrapper {
+.empty-form {
+    display: none;
+}
+
+/* RELATED FIELD ADD ONE / LOOKUP */
+
+.add-another, .related-lookup {
+    margin-left: 5px;
+    display: inline-block;
+    vertical-align: middle;
+    background-repeat: no-repeat;
+    background-size: 14px;
+}
+
+.add-another {
+    width: 16px;
+    height: 16px;
+    background-image: url(../img/icon-addlink.svg);
+}
+
+.related-lookup {
+    width: 16px;
+    height: 16px;
+    background-image: url(../img/search.svg);
+}
+
+form .related-widget-wrapper ul {
+    display: inline-block;
+    margin-left: 0;
+    padding-left: 0;
+}
+
+.clearable-file-input input {
+    margin-top: 0;
+}
+
+.changeform-navigation {
   float: left;
-}
+  margin-bottom: 20px;
+
+  &-button {
+    font-weight: bold;
+    vertical-align: middle;
+  }
+}

+ 270 - 37
jet/static/jet/css/_changelist.scss

@@ -1,67 +1,300 @@
 @import "globals";
 
+/* CHANGELISTS */
+
 #changelist {
-  .changelist-filter {
-    margin-bottom: 20px;
-    line-height: 40px;
+  position: relative;
+  width: 100%;
+
+  table {
+    width: 100%;
+  }
+
+  .results {
+    overflow-x: auto;
+  }
 
-    * {
+  .toplinks {
+    border-bottom: 1px solid #ddd;
+  }
+
+  .paginator {
+    text-align: right;
+  }
+}
+
+.change-list {
+  .hiddenfields {
+    display: none;
+  }
+
+  .filtered table {
+    border-right: none;
+  }
+
+  .filtered {
+    min-height: 400px;
+  }
+
+  .filtered table tbody th {
+    padding-right: 1em;
+  }
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table {
+  thead th {
+    &.action-checkbox-column {
+      width: 1.5em;
+      text-align: center;
+    }
+  }
+
+  tbody td.action-checkbox {
+    text-align: center;
+  }
+
+  tfoot {
+    color: #666;
+  }
+}
+
+/* TOOLBAR */
+
+#toolbar {
+  float: left;
+  margin-bottom: 20px;
+
+  form {
+    label[for="searchbar"] {
+      display: none;
+    }
+
+    #searchbar {
+      margin-right: 2px;
       vertical-align: top;
     }
 
-    &-submit-block {
-      white-space: nowrap;
-      line-height: 32px;
-      display: inline-block;
+    input[type="submit"] {
+      &, &:visited, &:hover {
+        background-color: $primary-button-background-color;
+        color: $primary-button-text-color;
+        font-size: 12px;
+        font-weight: lighter;
+        padding: 0 20px;
+        text-transform: uppercase;
+        vertical-align: middle;
+      }
+
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
+      }
     }
   }
+}
 
-  .results {
-    overflow-x: auto;
+.changelist-filter-select {
+  &-wrapper {
+    margin-right: 2px;
+    margin-bottom: 2px;
+    display: inline-block;
   }
+}
 
-  table {
-    @extend .table;
-    box-shadow: 0 2px 0 0 $content-border2-color;
+/* FILTER COLUMN */
+
+#changelist-filter {
+  display: none;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+    display: block;
+    float: left;
+    padding: 0;
+    margin: 0;
     width: 100%;
+}
+
+.change-list ul.toplinks li {
+    padding: 3px 6px;
+    font-weight: bold;
+    list-style-type: none;
+    display: inline-block;
+}
+
+.change-list ul.toplinks .date-back a {
+    color: #999;
+}
+
+.change-list ul.toplinks .date-back a:focus,
+.change-list ul.toplinks .date-back a:hover {
+    color: #036;
+}
+
+/* PAGINATOR */
+
+.paginator {
+  display: none;
+  line-height: normal;
+  padding: 0 !important;
+  margin: 0;
+  font-size: 12px;
+
+  &.initialized {
+    display: inherit;
+  }
+
+  span:not(.pages-wrapper), a {
+    font-size: 14px;
+    padding: 6px 10px;
+    display: inline-block;
+
+    &:first-child {
+      border-radius: 4px 0 0 4px;
+    }
+
+    &:last-child {
+      border-radius: 0 4px 4px 0;
+    }
+
+    &:first-child:last-child {
+      border-radius: 4px;
+    }
+  }
+
+  span:not(.pages-wrapper) {
+    background-color: $button-active-background-color;
+    color: $button-active-text-color;
+
+    &.disabled {
+      background-color: $button-background-color;
+      color: $button-text-color;
+    }
+  }
+
+  a:not(.showall) {
+    &:link, &:visited {
+      background-color: $button-background-color;
+      color: $button-text-color;
+      text-decoration: none;
+    }
+
+    &:focus, &:hover {
+      background-color: $button-hover-background-color;
+      color: $button-hover-text-color;
+    }
+  }
+
+  a.showall {
+    &:link, &:visited {
+      font-size: 12px;
+    }
+  }
+
+  .pages-wrapper {
+    margin-left: 10px;
   }
 
-  .changelist-footer {
-    margin-top: 20px;
-    background: $background-color;
+  input[type="submit"] {
+    &, &:hover, &:focus {
+      font-size: 13px;
+      padding: 6px 10px;
+      height: auto;
+      line-height: normal;
+      margin-left: 10px;
+    }
+  }
+}
 
-    &.fixed {
-      position: fixed;
-      left: 250px + 20px;
-      right: 20px;
-      bottom: 0;
+/* ACTIONS */
+
+#changelist {
+  table {
+    input {
       margin: 0;
-      padding: 20px 0;
-      border-top: 2px solid $content-border2-color;
+      vertical-align: baseline;
+    }
+
+    tbody tr.selected {
+      border-color: $content-selected-border-color;
+      background-color: $content-selected-background-color;
+    }
+  }
+
+  .actions {
+    float: left;
+    display: none;
+
+    &.initialized {
+      display: inherit;
     }
 
-    &.popup {
-      left: 20px;
+    span.all, span.action-counter, span.clear, span.question {
+      display: none;
     }
 
-    .actions {
-      float: left;
+    &:last-child {
+      border-bottom: none;
+    }
 
-      &-label {
-        margin-left: 10px;
+    .button {
+      &, &:visited, &:hover {
+        display: inline-block;
+        background-color: $primary-button-background-color;
+        color: $primary-button-text-color;
+        border: 0;
+        border-radius: 4px;
+        height: 32px;
+        line-height: 32px;
+        outline: 0;
+        font-size: 12px;
+        font-weight: lighter;
+        text-align: center;
+        padding: 0 20px;
+        text-transform: uppercase;
+        margin: 0 8px 0 0;
+        @include transition(background $transitions-duration);
       }
 
-      span {
-        .all, .action-counter, .clear, .question {
-          display: none;
-        }
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
       }
     }
+
+    span {
+      font-size: 12px;
+    }
   }
 }
 
-table#change-history {
-  @extend .table;
-  box-shadow: 0 2px 0 0 $content-border2-color;
-  width: 100%;
+.changelist-footer {
+  padding: 20px 0;
+  background: $background-color;
+
+  &.fixed {
+    position: fixed;
+    left: 250px + 20px;
+    right: 20px;
+    bottom: 0;
+    border-top: 2px solid $content-border2-color;
+  }
+
+  &.popup {
+    left: 20px;
+  }
 }

+ 220 - 99
jet/static/jet/css/_content.scss

@@ -1,129 +1,250 @@
 @import "globals";
 
-.content {
-  background-color: $background-color;
+
+/* LINKS */
+
+a, a:visited, a:hover, a:focus {
+  color: $link-color;
+  font-weight: normal;
+  text-decoration: none;
 }
 
-.dashboard #content {
-  width: 500px;
+a:hover, a:focus {
+  color: $hover-link-color;
 }
 
-#content {
-  > h1 {
-    text-transform: uppercase;
-    font-size: 12px;
-    font-weight: bold;
-    line-height: $top-height;
-    color: $top-text-color;
-    margin: 0 0 2em 0;
-  }
+a img {
+  border: none;
 }
 
-.small {
+//a.section:link, a.section:visited {
+//    color: #fff;
+//    text-decoration: none;
+//}
+//
+//a.section:focus, a.section:hover {
+//    text-decoration: underline;
+//}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+  margin: .2em 0 .8em 0;
+}
+
+p {
+  padding: 0;
+  line-height: 140%;
+}
+
+h1, h2, h3, h4, h5 {
+  font-weight: bold;
+}
+
+h1 {
+  margin: 0 0 20px;
+  font-weight: 300;
+  font-size: 20px;
+}
+
+h2 {
+  font-size: 16px;
+  margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+  font-weight: normal;
+  margin-top: 0;
+}
+
+h3 {
+  font-size: 14px;
+  margin: .8em 0 .3em 0;
+  font-weight: bold;
+}
+
+h4 {
   font-size: 12px;
+  margin: 1em 0 .8em 0;
+  padding-bottom: 3px;
 }
 
-.changeform-object-tools {
-  text-align: right;
-  overflow: auto;
+h5 {
+  font-size: 10px;
+  margin: 1.5em 0 .5em 0;
+  text-transform: uppercase;
+  letter-spacing: 1px;
 }
 
-ul.object-tools {
-  @extend .clear-list;
-  margin-bottom: 20px !important;
-  float: right;
+ul li {
+  list-style-type: square;
+  padding: 1px 0;
+}
 
-  li {
-    margin-top: 10px;
-    text-align: right;
-
-    &:first-child {
-      margin-top: 0;
-    }
-
-    a {
-      display: inline-block;
-      background-color: $button-background-color;
-      padding: 8px;
-      border-radius: 4px;
-
-      &.addlink:before {
-        @include font-icon;
-        color: $button-text-color;
-        font-size: 13px;
-        content: $icon-add;
-      }
-
-      &, &:visited, &:hover {
-        color: $button-text-color;
-      }
-
-      &:hover {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-
-        &.addlink:before {
-          color: $button-hover-text-color;
-        }
-      }
-
-      &:active {
-        background-color: $button-active-background-color;
-        color: $button-active-text-color;
-
-        &.addlink:before {
-          color: $button-active-text-color;
-        }
-      }
-    }
-  }
+li ul {
+  margin-bottom: 0;
+}
 
-  &.horizontal {
-    line-height: 40px;
+li, dt, dd {
+  line-height: 20px;
+}
 
-    li {
-      display: inline;
-      margin-top: 0;
-      line-height: normal;
-    }
-  }
+dt {
+  font-weight: bold;
+  margin-top: 4px;
 }
 
-.content-sidebar {
-  float: right;
-  width: 24em;
-  margin: 0 20px;
+dd {
+  margin-left: 0;
 }
 
-.dashboard .module table td a {
-  display: inline !important;
+form {
+  margin: 0;
+  padding: 0;
 }
 
-.dialog-confirm {
-  display: none;
+fieldset {
+  margin: 0;
+  padding: 0;
+  border: none;
 }
 
-.cleared {
+blockquote {
+  font-size: 11px;
+  color: #777;
+  margin-left: 2px;
+  padding-left: 10px;
+  border-left: 5px solid #ddd;
+}
+
+code, pre {
+  font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+  color: #666;
+  font-size: 12px;
+}
+
+pre.literal-block {
+  margin: 10px;
+  background: #eee;
+  padding: 6px 8px;
+}
+
+code strong {
+  color: #930;
+}
+
+hr {
   clear: both;
+  color: #eee;
+  background-color: #eee;
+  height: 1px;
+  border: none;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  line-height: 1px;
 }
 
-.loading-indicator {
-  font-size: 32px;
-  color: $button-hover-background-color;
-  -webkit-animation: spin 4s linear infinite;
-  -moz-animation: spin 4s linear infinite;
-  animation: spin 4s linear infinite;
+/* TEXT STYLES & MODIFIERS */
 
-  &-wrapper {
-    text-align: center;
-    padding: 40px 0;
-  }
+.small {
+  font-size: 11px;
+}
+
+.tiny {
+  font-size: 10px;
+}
+
+p.tiny {
+  margin-top: -2px;
+}
+
+.mini {
+  font-size: 10px;
+}
+
+p.mini {
+  margin-top: -3px;
+}
+
+.help, p.help, form p.help {
+  color: $dim-text-color;
+  font-size: 12px;
+}
+
+.help-tooltip {
+  cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+  vertical-align: middle;
+}
+
+.quiet, a.quiet:link, a.quiet:visited {
+  font-weight: normal;
 }
-@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
-@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
-@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }
 
-img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-no.gif"], img[src$="admin/img/icon-unknown.gif"] {
+.float-right {
+  float: right;
+}
+
+.float-left {
+  float: left;
+}
+
+.clear {
+  clear: both;
+}
+
+.align-left {
+  text-align: left;
+}
+
+.align-right {
+  text-align: right;
+}
+
+.example {
+  margin: 10px 0;
+  padding: 5px 10px;
+  background: #efefef;
+}
+
+.nowrap {
+  white-space: nowrap;
+}
+
+/* ACTION ICONS */
+
+//.addlink {
+//    padding-left: 16px;
+//    background: url(../img/icon-addlink.svg) 0 1px no-repeat;
+//}
+//
+//.changelink, .inlinechangelink {
+//    padding-left: 16px;
+//    background: url(../img/icon-changelink.svg) 0 1px no-repeat;
+//}
+//
+//.deletelink {
+//    padding-left: 16px;
+//    background: url(../img/icon-deletelink.svg) 0 1px no-repeat;
+//}
+//
+//a.deletelink:link, a.deletelink:visited {
+//    color: #CC3434;
+//}
+//
+//a.deletelink:focus, a.deletelink:hover {
+//    color: #993333;
+//    text-decoration: none;
+//}
+
+/* BOOLEAN ICONS */
+
+img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-yes.svg"],
+img[src$="admin/img/icon-no.gif"], img[src$="admin/img/icon-no.svg"],
+img[src$="admin/img/icon-unknown.gif"], img[src$="admin/img/icon-unknown.svg"] {
   display: none;
 
   + span {
@@ -132,10 +253,10 @@ img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-no.gif"], img[src$=
   }
 }
 
-img[src$="admin/img/icon-yes.gif"] + span {
+img[src$="admin/img/icon-yes.gif"] + span, img[src$="admin/img/icon-yes.svg"] + span {
   color: $success-text-color;
 }
 
-img[src$="admin/img/icon-no.gif"] + span {
+img[src$="admin/img/icon-no.gif"] + span, img[src$="admin/img/icon-no.svg"] + span {
   color: $warning-text-color;
-}
+}

+ 0 - 68
jet/static/jet/css/_delete.scss

@@ -1,68 +0,0 @@
-@import "globals";
-
-.delete {
-  &-summary {
-    background: $warning-color;
-    color: $warning-text-color;
-    border-radius: 4px;
-    padding: 20px;
-    margin-bottom: 20px;
-
-    h2 {
-      font-size: 14px;
-      font-weight: bold;
-      margin: 0 0 10px 0;
-    }
-
-    ul {
-      @extend .clear-list;
-    }
-
-    &-buttons {
-      float: right;
-    }
-  }
-
-  &-objects {
-    background: $content-background-color;
-    border-radius: 4px;
-    box-shadow: 0 2px 0 0 $content-border2-color;
-
-    &-list {
-      @extend .clear-list;
-
-      &-item {
-        border-bottom: 1px solid $content-border-color;
-        font-size: 13px;
-
-        &:last-child {
-          border-bottom: 0;
-        }
-
-        &-row {
-          padding: 8px;
-
-          &-collapse {
-            float: right;
-
-            span {
-              vertical-align: middle;
-              font-weight: bold;
-              font-size: 16px;
-            }
-          }
-        }
-
-        &-collapsable {
-          background-color: $content-contrast3-background-color;
-          padding: 20px 20px 20px 0;
-          display: none;
-
-          &-list {
-            list-style-type: disc;
-          }
-        }
-      }
-    }
-  }
-}

+ 60 - 132
jet/static/jet/css/_forms.scss

@@ -1,7 +1,50 @@
 @import "globals";
 
-.base_input {
-  border: 0;
+/* FORM BUTTONS */
+
+input[type="submit"], input[type="button"], .object-tools a {
+  &, &:visited, &:hover {
+    display: inline-block;
+    background-color: $button-background-color;
+    color: $button-text-color;
+    border: 0;
+    border-radius: 4px;
+    height: 32px;
+    line-height: 32px;
+    outline: 0;
+    font-size: 14px;
+    font-weight: normal;
+    text-align: center;
+    padding: 0 8px;
+    @include transition(background $transitions-duration);
+  }
+
+  &.default {
+    font-size: 12px;
+    font-weight: lighter;
+    background-color: $primary-button-background-color;
+    color: $primary-button-text-color;
+    text-transform: uppercase;
+    margin: 0 8px 0 0;
+    padding: 0 20px;
+  }
+
+  &:hover, &:focus {
+    background-color: $button-hover-background-color;
+    color: $button-hover-text-color;
+  }
+
+  &:active {
+    background-color: $button-active-background-color;
+    color: $button-active-text-color;
+  }
+}
+
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+  opacity: 0.4;
+}
+
+input[type="text"], input[type="email"], input[type="password"], input[type="url"], input[type="number"], textarea, .vTextField {
   border-radius: 4px;
   font-size: 13px;
   height: 32px;
@@ -9,18 +52,15 @@
   outline: 0;
   box-sizing: border-box;
   margin: 0;
+  background-color: $input-background-color;
+  color: $input-text-color;
+  border: 1px solid $input-border-color;
+  padding: 0 12px;
   @include transition(background $transitions-duration, box-shadow $transitions-duration, border $transitions-duration);
-}
 
-.input {
-  @extend .base_input;
   @include placeholder {
     color: $input-placeholder-color;
   }
-  background-color: $input-background-color;
-  color: $input-text-color;
-  border: 1px solid $input-border-color;
-  padding: 0 12px;
 
   &:focus {
     box-shadow: 0 0 4px 0 $input-shadow-color;
@@ -28,64 +68,19 @@
   }
 }
 
-.background-form .input {
-  @extend .input;
-  background-color: $background-input-background-color;
-  color: $background-input-text-color;
-  border-color: $background-input-border-color;
-}
-
-.button {
-  &, &:visited, &:hover {
-    @extend .base_input;
-    font-weight: lighter;
-    font-size: 12px;
-    text-align: center;
-    background-color: $primary-button-background-color;
-    color: $primary-button-text-color;
-    padding: 0 20px;
-    display: inline-block;
-    text-transform: uppercase;
-  }
-
-  &.button-secondary {
-    background-color: $button-background-color;
-    color: $button-text-color;
-    text-transform: none;
-    font-weight: normal;
-  }
-
-  &.button-red {
-    background-color: $danger-button-background-color;
-    color: $danger-button-text-color;
-  }
-
-  &.button-background {
-    background-color: $background-button-background-color;
-    color: $background-button-text-color;
-  }
-
-  &.button-transparent {
-    background-color: transparent;
-    color: $text-color;
-    padding: 0 10px;
-  }
-
-  &:hover {
-    background-color: $button-hover-background-color;
-    color: $button-hover-text-color;
-    font-weight: lighter;
-  }
-
-  &:active {
-    background-color: $button-active-background-color;
-    color: $button-active-text-color;
-  }
+textarea {
+  height: auto;
+  line-height: normal;
+  padding: 12px;
+  white-space: pre-wrap;
+  vertical-align: top;
 }
 
 .segmented-button {
   &, &:visited, &:hover {
-    @extend .base_input;
+    border: 0;
+    height: 32px;
+    line-height: 32px;
     font-size: 12px;
     text-align: center;
     background-color: $button-background-color;
@@ -94,9 +89,10 @@
     display: inline-block;
     text-transform: none;
     border-radius: 0;
+    @include transition(background $transitions-duration);
   }
 
-  &:hover {
+  &:hover, &:focus {
     background-color: $button-hover-background-color;
     color: $button-hover-text-color;
   }
@@ -121,26 +117,6 @@
   }
 }
 
-a.button, a.segmented-button {
-  line-height: 32px;
-}
-
-input[type="text"], input[type="email"], input[type="password"], input[type="url"], input[type="number"] {
-  @extend .input;
-}
-
-textarea {
-  @extend .input;
-  height: auto;
-  line-height: normal;
-  padding: 12px;
-  white-space: pre-wrap;
-}
-
-.button, input[type="submit"], input[type="button"] {
-  @extend .button;
-}
-
 input[type=checkbox] {
   display: none;
 
@@ -165,51 +141,3 @@ input[type=checkbox] {
     content: $icon-checkbox;
   }
 }
-
-.form-row {
-  .vDateField, .vTimeField {
-    border-radius: 4px 0 0 4px !important;
-
-    &-link {
-      vertical-align: top;
-      display: inline-block;
-
-      span {
-        width: 32px;
-        height: 32px;
-        line-height: 32px !important;
-        background-color: $button-background-color;
-        color: $button-text-color;
-        display: inline-block;
-        vertical-align: middle;
-        text-align: center;
-        border-radius: 0 4px 4px 0;
-      }
-
-      &:hover span {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-      }
-    }
-  }
-
-  .vDateField-link + .vTimeField {
-    margin-left: 10px;
-  }
-
-  label.required {
-    font-weight: bold;
-
-    &:after {
-      content: '*';
-    }
-  }
-
-  select {
-    min-width: 200px;
-  }
-}
-
-.empty-form {
-  display: none;
-}

+ 1 - 1
jet/static/jet/css/_globals.scss

@@ -1,3 +1,3 @@
 @import "variables";
 @import "helpers";
-@import "icons/variables";
+@import "icons/variables";

+ 138 - 0
jet/static/jet/css/_header.scss

@@ -0,0 +1,138 @@
+@import "globals";
+
+
+/* HEADER */
+
+//#header {
+    //width: auto;
+    //height: 40px;
+    //padding: 10px 40px;
+    //background: #417690;
+    //line-height: 40px;
+    //color: #ffc;
+    //overflow: hidden;
+//}
+
+//#header a:link, #header a:visited {
+//    color: #fff;
+//}
+//
+//#header a:focus , #header a:hover {
+//    text-decoration: underline;
+//}
+
+#branding {
+  display: none;
+    float: left;
+}
+
+#branding h1 {
+    padding: 0;
+    margin: 0 20px 0 0;
+    font-weight: 300;
+    font-size: 24px;
+    color: #f5dd5d;
+}
+
+#branding h1, #branding h1 a:link, #branding h1 a:visited {
+    color: #f5dd5d;
+}
+
+#branding h2 {
+    padding: 0 10px;
+    font-size: 14px;
+    margin: -8px 0 8px 0;
+    font-weight: normal;
+    color: #ffc;
+}
+
+#branding a:hover {
+    text-decoration: none;
+}
+
+#user-tools {
+  display: none;
+
+  &.initialized {
+    display: block;
+  }
+}
+
+.user-tools {
+  display: none;
+  position: relative;
+
+  ul {
+    position: absolute;
+    top: $top-height - 12px;
+    right: 20px;
+    border: 1px solid $top-border-color;
+    border-radius: 4px;
+    font-size: 12px;
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    display: inline-block;
+    width: 175px;
+
+    &.opened {
+      background-color: $top-dropdown-background-color;
+      border-color: transparent;
+      color: $top-dropdown-text-color;
+    }
+
+    li {
+      display: block;
+      list-style-type: none;
+      margin: 0;
+      line-height: 30px;
+      padding: 0 10px 0 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    li.user-tools-welcome-msg {
+      font-weight: bold;
+
+      &:after {
+        @include font-icon;
+        content: $icon-arrow-down;
+        font-weight: normal;
+        float: right;
+        color: #47bac1;
+        font-size: 24px;
+        vertical-align: middle;
+        line-height: 30px;
+        @include transition(color $transitions-duration);
+      }
+    }
+
+    &.opened .user-tools-welcome-msg {
+      border-bottom: 1px solid $top-dropdown-border-color;
+
+      &:after {
+        color: $top-dropdown-icon-color;
+        @include transform(rotate(180deg));
+      }
+    }
+
+    li.user-tools-link {
+      display: none;
+
+      a, a:visited, a:hover {
+        color: $top-dropdown-link-color;
+        text-decoration: none;
+      }
+
+      a:hover {
+        color: $top-dropdown-hover-link-color;
+        text-decoration: underline;
+      }
+    }
+
+    &.opened li.user-tools-link {
+      display: block;
+    }
+  }
+}

+ 0 - 90
jet/static/jet/css/_login.scss

@@ -1,90 +0,0 @@
-@import "globals";
-
-.login {
-  $width: 400px;
-  $expected-height: 230px;
-
-  background: $login-background-color;
-  position: relative;
-
-  &-title {
-    width: 100%;
-    color: $login-title-text-color;
-    font-size: 36px;
-    text-transform: uppercase;
-    text-align: center;
-    position: absolute;
-    top: 50%;
-    margin-top: -($expected-height / 2) - 60px;
-
-    .bright {
-      color: $login-title-contrast-text-color;
-      font-weight: bold;
-    }
-  }
-
-  &-container {
-    border-radius: 4px;
-    width: $width;
-    overflow: hidden;
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    margin-left: -($width / 2);
-    margin-top: -($expected-height / 2);
-
-    &-header {
-      background: $login-header-background-color;
-      color: $login-header-text-color;
-      text-transform: uppercase;
-      padding: 10px;
-      font-size: 11px;
-      font-weight: bold;
-    }
-
-    &-content {
-      background: $login-content-background-color;
-      height: 100%;
-      padding: 30px;
-    }
-
-    &-submit-row {
-      text-align: center;
-      margin-top: 20px;
-    }
-  }
-}
-
-.login-form {
-  .form-row {
-    padding: 6px 0;
-    clear: both;
-
-    label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 130px;
-      word-wrap: break-word;
-    }
-
-    &.errors label {
-      color: $error-text-color;
-    }
-
-    input[type="text"], input[type="password"] {
-      width: 170px;
-    }
-
-    .errorlist {
-      @extend .clear-list;
-      @extend .small;
-      color: $error-text-color;
-    }
-  }
-
-  .submit-row {
-    margin-top: 20px;
-    text-align: center;
-  }
-}

+ 83 - 17
jet/static/jet/css/_messages.scss

@@ -1,29 +1,95 @@
 @import "globals";
 
-.messagelist {
-  @extend .clear-list;
+/* MESSAGES & ERRORS */
 
-  @mixin message-item {
+ul.messagelist {
+  padding: 0;
+  margin: 0;
+
+  li {
+    display: block;
     margin: 0 20px 10px 20px;
     border-radius: 6px;
-    padding: 10px
+    padding: 10px;
+
+    &.success {
+      background: $success-color;
+      color: $success-text-color;
+    }
+
+    &.warning, &.error {
+      background: $warning-color;
+      color: $warning-text-color;
+    }
+
+    &.info, &.debug {
+      background: $info-color;
+      color: $info-text-color;
+    }
   }
+}
+
+.errornote {
+  display: block;
+  margin: 0 0 10px 0;
+  border-radius: 6px;
+  padding: 10px;
+  background: $warning-color;
+  color: $warning-text-color;
+}
+
+ul.errorlist {
+  margin: 0 0 4px;
+  padding: 0;
+  color: #ba2121;
+  background: #fff;
 
-  .warning, .error {
-    @include message-item;
-    background: $warning-color;
-    color: $warning-text-color;
+  li {
+    font-size: 13px;
+    display: block;
+    margin-bottom: 4px;
+
+    &:first-child {
+      margin-top: 0;
+    }
+
+    a {
+      color: inherit;
+      text-decoration: underline;
+    }
   }
 
-  .info, .debug {
-    @include message-item;
-    background: $info-color;
-    color: $info-text-color;
+  td & {
+    margin: 0;
+    padding: 0;
+
+    li {
+      margin: 0;
+    }
   }
+}
 
-  .success {
-    @include message-item;
-    background: $success-color;
-    color: $success-text-color;
+.form-row.errors {
+  ul.errorlist li {
+    padding-left: 0;
   }
-}
+}
+
+div.system-message {
+    background: #ffc;
+    margin: 10px;
+    padding: 6px 8px;
+    font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+    padding: 4px 5px 4px 25px;
+    margin: 0;
+    color: #c11;
+    background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
+}
+
+.description {
+    font-size: 12px;
+    padding: 5px 0 0 12px;
+}

+ 48 - 0
jet/static/jet/css/_modules.scss

@@ -0,0 +1,48 @@
+@import "globals";
+
+/* MODULES */
+
+fieldset.module {
+  background-color: $content-background-color;
+  border-radius: 4px;
+  padding: 20px;
+  border: 0;
+}
+
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre {
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+.module blockquote {
+  margin-left: 12px;
+}
+
+.module ul, .module ol {
+  margin-left: 1.5em;
+}
+
+.module h3 {
+  margin-top: .6em;
+}
+
+.module h2, .module caption, .inline-group h2 {
+  margin: 0;
+  padding: 8px;
+  font-weight: 400;
+  font-size: 13px;
+  text-align: left;
+  background: #79aec8;
+  color: #fff;
+}
+
+.module caption,
+.inline-group h2 {
+  font-size: 12px;
+  letter-spacing: 0.5px;
+  text-transform: uppercase;
+}
+
+.module table {
+  border-collapse: collapse;
+}

+ 39 - 0
jet/static/jet/css/_object-tools.scss

@@ -0,0 +1,39 @@
+@import "globals";
+
+/* OBJECT TOOLS */
+
+.object-tools {
+  display: block;
+  text-align: right;
+  margin-bottom: 20px;
+  overflow: hidden;
+
+  .form-row & {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    float: none;
+    height: 2em;
+    padding-left: 3.5em;
+  }
+
+  li {
+    display: inline-block;
+    margin-left: 5px;
+  }
+
+  a.addlink {
+    &:before {
+      @include font-icon;
+      color: $button-text-color;
+      font-size: 13px;
+      content: $icon-add;
+      vertical-align: middle;
+      margin-top: -3px;
+      margin-right: 3px;
+    }
+
+    &:hover:before {
+      color: $button-hover-text-color;
+    }
+  }
+}

+ 14 - 0
jet/static/jet/css/_relatedpopup.scss

@@ -1,5 +1,19 @@
 @import "globals";
 
+/* POPUP */
+
+//.popup #content {
+//    padding: 20px;
+//}
+//
+//.popup #container {
+//    min-width: 0;
+//}
+//
+//.popup #header {
+//    padding: 10px 20px;
+//}
+
 .related-popup {
   position: absolute;
   top: 0;

+ 9 - 7
jet/static/jet/css/_sidebar.scss

@@ -268,18 +268,20 @@
     }
 
     &-search {
-      @extend .base_input;
-      @include placeholder {
-        color: $sidebar-popup-search-input-placeholder-color;
-      }
       background-color: $sidebar-popup-search-input-background-color;
       color: $sidebar-popup-search-input-text-color;
-      border-radius: 0 !important;
       width: 100%;
       height: 32px;
-      padding: 0 !important;
       text-indent: 20px;
-      margin-bottom: 12px !important;
+      border: 0;
+      font-size: 13px;
+      outline: 0;
+      padding: 0;
+      margin: 0 0 12px 0;
+
+      @include placeholder {
+        color: $sidebar-popup-search-input-placeholder-color;
+      }
     }
 
     &-list {

+ 0 - 169
jet/static/jet/css/_table.scss

@@ -1,169 +0,0 @@
-@import "globals";
-
-.table {
-  background: $content-background-color;
-  border-collapse: collapse;
-  border-radius: 4px;
-  margin-bottom: 2px;
-  overflow-x: auto;
-  width: 100%;
-
-  &.helper {
-    display: none;
-    position: fixed;
-    z-index: 2;
-    top: 0;
-    right: 20px;
-    width: auto;
-    border-radius: 0;
-    box-shadow: none;
-
-    thead {
-      th {
-        border-radius: 0 !important;
-      }
-    }
-  }
-
-  caption {
-    border-radius: 4px;
-    padding: 6px;
-    text-align: left;
-    text-transform: uppercase;
-    font-size: 11px;
-    font-weight: bold;
-
-    a {
-      color: $text-color;
-      font-size: 11px;
-      font-weight: bold;
-    }
-  }
-
-  thead {
-    th {
-      background: $content-contrast2-background-color;
-      padding: 8px;
-      font-size: 12px;
-      font-weight: normal;
-      text-align: left;
-      white-space: nowrap;
-
-      &, & a, & a:visited, & a:hover {
-        color: $content-contrast2-text-color;
-        text-decoration: none;
-        text-transform: uppercase;
-      }
-
-      &:first-child {
-        border-radius: 4px 0 0 0;
-      }
-
-      &:last-child {
-        border-radius: 0 4px 0 0;
-      }
-
-      &:first-child:last-child {
-        border-radius: 4px 4px 0 0;
-      }
-
-      &.action-checkbox-column {
-        width: 20px;
-        text-align: center;
-      }
-
-      &.sorted {
-        .sortoptions {
-          display: inline-block;
-
-          .sortpriority {
-            background: $content-background-color;
-            color: $text-color;
-            padding: 2px 8px;
-            margin-right: 2px;
-            border-radius: 12px;
-          }
-        }
-
-        .text {
-          display: inline-block;
-
-          &:after {
-            @include font-icon;
-            color: $content-contrast2-text-color;
-            font-size: 13px;
-            font-weight: bold;
-            margin-left: 4px;
-          }
-        }
-
-        &.ascending .text:after {
-          content: $icon-arrow-down;
-        }
-
-        &.descending .text:after {
-          content: $icon-arrow-up;
-        }
-      }
-    }
-  }
-
-  tbody {
-    tr {
-      border-bottom: 1px solid $content-border-color;
-
-      &:last-child {
-        border-bottom: 0;
-      }
-
-      & th {
-        text-align: left;
-      }
-
-      & th, & td {
-        padding: 8px;
-        font-size: 13px;
-
-        &.action-checkbox {
-          text-align: center;
-        }
-      }
-    }
-
-    tr.selected {
-      border-color: $content-selected-border-color;
-
-      &:last-child {
-        & th:first-child, & td:first-child {
-          border-radius: 0 0 0 4px;
-        }
-
-        & th:last-child, & td:last-child {
-          border-radius: 0 0 4px 0;
-        }
-      }
-
-      & th, & td {
-        background-color: $content-selected-background-color;
-      }
-    }
-
-    tr.contrast {
-      background: $content-contrast-background-color;
-    }
-
-    tr.contrast2 {
-      background: $content-contrast2-background-color;
-      color: $content-contrast2-text-color;
-      border: 0;
-
-      a, a:visited, a:hover {
-        color: $content-contrast2-text-color;
-      }
-    }
-
-    tr.contrast3 {
-      background: $content-contrast3-background-color;
-    }
-  }
-}

+ 178 - 0
jet/static/jet/css/_tables.scss

@@ -0,0 +1,178 @@
+@import "globals";
+
+/* TABLES */
+
+table {
+  border-collapse: collapse;
+  background: $content-background-color;
+  border-radius: 4px;
+  overflow-x: auto;
+  box-shadow: 0 2px 0 0 $content-border2-color;
+  margin-bottom: 2px;
+
+  &.helper {
+    display: none;
+    position: fixed;
+    z-index: 2;
+    top: 0;
+    right: 20px;
+    width: auto;
+    border-radius: 0;
+    box-shadow: none;
+
+    thead {
+      th {
+        border-radius: 0 !important;
+      }
+    }
+  }
+}
+
+td, th {
+  padding: 8px;
+  font-size: 13px;
+}
+
+th {
+  text-align: left;
+}
+
+thead th,
+tfoot td {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+  vertical-align: middle;
+  font-size: 12px;
+
+  &:first-child {
+    border-radius: 4px 0 0 0;
+  }
+
+  &:last-child {
+    border-radius: 0 4px 0 0;
+  }
+}
+
+tfoot td {
+  border-bottom: none;
+  border-top: 1px solid #eee;
+}
+
+//tr.alt {
+  //background: #f6f6f6;
+//}
+
+tbody tr {
+  border-bottom: 1px solid $content-border-color;
+
+  &:last-child {
+    border-bottom: 0;
+  }
+}
+
+/* SORTABLE TABLES */
+
+table {
+  thead th {
+    background: $content-contrast2-background-color;
+    color: $content-contrast2-text-color;
+    text-transform: uppercase;
+
+    @include transition(background-color $fast-transitions-duration);
+
+    &.sortable {
+      cursor: pointer;
+
+      &:hover {
+        background: $button-hover-background-color;
+      }
+    }
+
+    a:link, a:visited {
+      color: $content-contrast2-text-color;
+    }
+
+    .text {
+      a {
+        display: block;
+        cursor: pointer;
+      }
+    }
+
+    &.sorted {
+      position: relative;
+      padding-right: 32px;
+
+      .text {
+        display: inline-block;
+      }
+
+      .sortoptions {
+        display: inline-block;
+
+        a {
+          display: inline-block;
+          vertical-align: middle;
+
+          &.sortremove {
+            position: absolute;
+            top: 50%;
+            right: 18px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-cross;
+            }
+          }
+
+          &.ascending {
+            position: absolute;
+            top: 50%;
+            right: 4px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-arrow-down;
+              font-weight: bold;
+            }
+          }
+
+          &.descending {
+            position: absolute;
+            top: 50%;
+            right: 4px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-arrow-up;
+              font-weight: bold;
+            }
+          }
+        }
+      }
+
+      .sortpriority {
+        background: $content-background-color;
+        color: $text-color;
+        padding: 1px 5px;
+        margin-right: 2px;
+        border-radius: 5px;
+        font-size: 10px;
+      }
+    }
+  }
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+    width: 100%;
+}
+
+table#change-history tbody th {
+    width: 16em;
+}

+ 0 - 151
jet/static/jet/css/_top.scss

@@ -1,151 +0,0 @@
-@import "globals";
-
-.breadcrumbs {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  padding-right: 200px;
-  overflow: hidden;
-}
-
-.top {
-  padding: 20px;
-
-  &-breadcrumbs {
-    text-transform: uppercase;
-    font-size: 12px;
-    font-weight: bold;
-    line-height: $top-height;
-    color: $top-text-color;
-
-    a, a:visited, a:hover {
-      color: $top-link-color;
-      text-decoration: none;
-      word-spacing: normal;
-    }
-
-    a:hover {
-      color: $top-hover-link-color;
-    }
-
-    &-separator {
-      color: $top-separator-color;
-      margin: 0 6px 0 6px;
-      font-weight: bold !important;
-      font-size: 15px;
-      vertical-align: middle;
-    }
-  }
-
-  &-right {
-    float: right;
-    position: relative;
-    padding-right: 175px + 10px;
-  }
-
-  &-user-tools {
-    @extend .clear-list;
-    position: absolute;
-    top: 0;
-    right: 0;
-    border: 1px solid $top-border-color;
-    border-radius: 4px;
-    font-size: 12px;
-    text-align: left;
-    width: 175px;
-    z-index: 1;
-
-    &-welcome-msg {
-      font-weight: bold;
-      line-height: $top-height - 2px;
-      padding: 0 10px 0 14px;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-
-      &-arrow {
-        float: right;
-        color: $top-icon-color;
-        font-size: 24px;
-        line-height: $top-height - 2px !important;
-        @include transition(color $transitions-duration);
-      }
-    }
-
-    &.opened &-welcome-msg-arrow {
-      color: $top-dropdown-icon-color;
-      @include transform(rotate(180deg));
-    }
-
-    &-contrast-block {
-      display: none;
-      padding: 8px 14px;
-      background: $top-dropdown-contrast-background-color;
-      color: $top-dropdown-contrast-text-color;
-
-      &-title {
-        text-transform: uppercase;
-        font-size: 10px;
-        font-weight: bold;
-        margin-bottom: 6px;
-      }
-    }
-
-    &.opened &-contrast-block {
-      display: block;
-    }
-
-    &-theme-link {
-      display: inline-block;
-      float: left;
-      margin-right: 6px;
-      margin-bottom: 6px;
-      width: 14px;
-      height: 14px;
-      border: 1px solid $top-dropdown-contrast-background-color;
-      border-radius: 3px;
-
-      &:last-child {
-        margin-right: 0;
-      }
-
-      &.selected {
-        box-shadow: 0 0 1px 1px $top-dropdown-selected-color;
-      }
-    }
-
-    &-user-link {
-      display: none;
-      padding: 8px 14px;
-
-      a, a:visited, a:hover {
-        color: $top-dropdown-link-color;
-        text-decoration: none;
-      }
-
-      a:hover {
-        color: $top-dropdown-hover-link-color;
-        text-decoration: underline;
-      }
-
-      &-icon {
-        color: $top-dropdown-icon-color;
-        font-size: 15px;
-        vertical-align: middle;
-      }
-    }
-
-    &.opened {
-      background-color: $top-dropdown-background-color;
-      border-color: transparent;
-      color: $top-dropdown-text-color;
-    }
-
-    &.opened &-welcome-msg {
-      border-bottom: 1px solid $top-dropdown-border-color;
-    }
-
-    &.opened &-user-link {
-      display: block;
-    }
-  }
-}

+ 1 - 0
jet/static/jet/css/_variables.scss

@@ -19,6 +19,7 @@ $font: Arial, sans-serif !default;
 $font-size: 14px !default;
 
 $transitions-duration: 0.3s !default;
+$fast-transitions-duration: 0.1s !default;
 
 /*
  * Sidebar

+ 0 - 1044
jet/static/jet/js/main.js

@@ -1,1044 +0,0 @@
-(function ($) {
-    $(document).ready(function() {
-        var initFilters = function() {
-            $('.changelist-filter-select').on('change', function () {
-                var $select = $(this);
-                var $selectedOption = $select.find('option:selected');
-                var url = $selectedOption.data('url');
-                var querysetLookup = $select.data('queryset--lookup');
-
-                if (url) {
-                    document.location = $selectedOption.data('url');
-                } else if (querysetLookup) {
-                    document.location = '?' + querysetLookup + '=' + $selectedOption.val();
-                }
-            });
-        };
-
-        var initChangeformTabs = function() {
-            $('.changeform').each(function() {
-                var $changeform = $(this);
-                var $tabItems = $changeform.find('.changeform-tabs-item');
-                var $modules = $changeform.find('.module');
-
-                if ($tabItems.length == 0) {
-                    return;
-                }
-
-                var showTab = function(selector) {
-                    selector = selector.replace(/^#\/?/, '');
-
-                    var $module = selector.length > 0 ? $modules.filter('#' + selector) : $();
-
-                    if ($module && $module.length == 0) {
-                        selector = $tabItems.first().find('a').attr('href').replace(/^#\/?/, '');
-                    }
-
-                    var $tabItem = $tabItems.find('a[href="#/' + selector + '"]').closest('.changeform-tabs-item');
-
-
-                    $tabItems.removeClass('selected');
-                    $tabItem.addClass('selected');
-                    $module = $modules.removeClass('selected').filter('#' + selector).addClass('selected');
-                    $module.find('select').trigger('select:init');
-                };
-
-                $('.changeform-tabs-item-link').click(function (e) {
-                    var moduleSelector = $(this).attr('href');
-
-                    showTab(moduleSelector);
-                });
-
-                showTab(location.hash);
-            });
-        };
-
-        var initCheckboxesWithoutLabel = function () {
-            var uniqueCheckboxIdCounter = 0;
-            var uniqueCheckboxIdPrefix = 'unique_checkbox_id_';
-
-            var addLabelToCheckbox = function($checkbox) {
-                var checkboxId = $checkbox.attr('id') ? $checkbox.attr('id') : uniqueCheckboxIdPrefix + uniqueCheckboxIdCounter++;
-                var $label = $('<label>').attr('for', checkboxId);
-
-                $checkbox.hide().attr('id', checkboxId);
-                $label.insertAfter($checkbox);
-            };
-
-            var addLabelToCheckboxes = function() {
-                var $containers = $('.action-checkbox, .action-checkbox-column').add('.tabular.inline-related .form-row');
-                var $checkboxes = $containers.find('input[type="checkbox"]').add('.checkbox-without-label').add('label > input[type="checkbox"]');
-
-                $checkboxes.each(function() {
-                    addLabelToCheckbox($(this));
-                });
-            };
-
-            addLabelToCheckboxes();
-        };
-
-        var initUserTools = function() {
-            var $userTools = $('.top-user-tools');
-            var closeTimeout;
-
-            $userTools.on('mouseenter', function() {
-                if (closeTimeout) {
-                    clearTimeout(closeTimeout);
-                }
-                $userTools.addClass('opened');
-            });
-
-            $userTools.on('mouseleave', function() {
-                closeTimeout = setTimeout(function() {
-                    $userTools.removeClass('opened');
-                    closeTimeout = null;
-                }, 200);
-            });
-        };
-
-        var initSideMenu = function() {
-            var initPopupItems = function() {
-                var $popupContainer = $('.sidebar-popup-container');
-                var $popup = $('.sidebar-popup');
-                var $popupItems = $('.sidebar-popup-item');
-                var $popupLinks = $('.popup-item-link');
-                var $popupLink;
-                var t;
-                var $currentPopupItem;
-                var $currentPopupItemListItem;
-                var $currentPopupItemListItems = function() { return $currentPopupItem.find('.sidebar-popup-list-item:visible') };
-
-                var resetCurrentPopupItemListItems = function() {
-                    $currentPopupItemListItems().removeClass('selected');
-                };
-
-                var initPopupItemsSearch = function() {
-                    $popupItems.each(function() {
-                        var $popupItem = $(this);
-                        var $search = $popupItem.find('.sidebar-popup-search');
-                        var $items = $popupItem.find('.sidebar-popup-list-item');
-
-                        $search.on('change keyup', function() {
-                            var text = $(this).val();
-
-                            $items.hide();
-                            $popupItem
-                                .find('.sidebar-popup-list-item-link:icontains("' + text + '")')
-                                .closest('.sidebar-popup-list-item')
-                                .show();
-                        });
-                    });
-                };
-
-                var showPopup = function ($popupLink) {
-                    clearHideTimeout();
-
-                    var popupItemId = $popupLink.data('popup-item-id');
-                    var $popupItem = $('#' + popupItemId);
-                    var $search = $popupItem.find('.sidebar-popup-search');
-
-                    $popupItems.hide();
-                    $popupItem.show();
-                    $popupContainer.stop().fadeIn(200, 'swing');
-                    $popupLinks.removeClass('hovered');
-                    $popupLink.addClass('hovered');
-                    $('body').addClass('non-scrollable');
-
-                    $currentPopupItem = $popupItem;
-                    $currentPopupItemListItem = null;
-                    resetCurrentPopupItemListItems();
-
-                    $search.val('').trigger('change').focus();
-                };
-
-                var hidePopup = function () {
-                    t = setTimeout(function() {
-                        $popupItems.hide();
-                        $popupContainer.stop().fadeOut(200, 'swing');
-                        $popupLinks.removeClass('hovered');
-                        $('body').removeClass('non-scrollable');
-
-                        $currentPopupItem = null;
-                    }, 200);
-                };
-
-                var clearHideTimeout = function() {
-                    if (t != null) {
-                        clearTimeout(t);
-                    }
-                    t = null;
-                };
-
-                $popupLinks.on('mouseenter', function () {
-                    $popupLink = $(this);
-
-                    showPopup($popupLink);
-                });
-
-                $popupLinks.on('mouseleave', function (e) {
-                    var $toElement = $(e.toElement);
-
-                    if ($toElement.hasClass('sidebar-popup') || $toElement.parents('.sidebar-popup').length) {
-                        return;
-                    }
-
-                    hidePopup();
-                });
-
-                $popup.on('mouseenter', function (e) {
-                    clearHideTimeout();
-                });
-
-                $popup.on('mouseleave', function (e) {
-                    var $toElement = $(e.toElement);
-
-                    if ($toElement.hasClass('popup-item-link')
-                        && $popupLink.data('popup-item-id') == $toElement.data('popup-item-id')) {
-                        return;
-                    }
-
-                    hidePopup();
-                });
-
-                $popup.find('.sidebar-popup-list-item-link').on('mouseenter', function() {
-                    var $link = $(this);
-                    var $item = $link.closest('.sidebar-popup-list-item');
-
-                    $currentPopupItemListItem = $item;
-
-                    resetCurrentPopupItemListItems();
-                    $currentPopupItemListItem.addClass('selected');
-                });
-
-                var selectCurrentPopupItemListItem = function(next) {
-                    if ($currentPopupItemListItem != null) {
-                        $currentPopupItemListItem = next ? $currentPopupItemListItem.nextAll(':visible').first() : $currentPopupItemListItem.prevAll(':visible').first();
-                    }
-
-                    if ($currentPopupItemListItem == null || $currentPopupItemListItem.length == 0) {
-                        $currentPopupItemListItem = next ? $currentPopupItemListItems().first() : $currentPopupItemListItems().last();
-                    }
-
-                    resetCurrentPopupItemListItems();
-                    $currentPopupItemListItem.addClass('selected');
-                };
-
-                $(document).keydown(function(e) {
-                    if ($currentPopupItem == null) {
-                        return;
-                    }
-
-                    if (e.which == 38) { //up
-                        selectCurrentPopupItemListItem(false);
-                    } else if (e.which == 40) { //down
-                        selectCurrentPopupItemListItem(true);
-                    } else if (e.which == 13) {
-                        if ($currentPopupItemListItem) {
-                            document.location = $currentPopupItemListItem.find('a').attr('href');
-                        }
-                    } else {
-                        return;
-                    }
-
-                    e.preventDefault();
-                });
-
-                initPopupItemsSearch();
-            };
-
-            var initBookmarks = function() {
-                var $addForm = $('#bookmarks-add-form');
-                var $removeForm = $('#bookmarks-remove-form');
-                var $addTitleInput = $addForm.find('input[name="title"]');
-                var $addUrlInput = $addForm.find('input[name="url"]');
-                var $removeIdInput = $removeForm.find('input[name="id"]');
-
-                $('.bookmarks-add').on('click', function(e) {
-                    e.preventDefault();
-
-                    var $link = $(this);
-                    var defaultTitle = $link.data('title') ? $link.data('title') : document.title;
-                    var url = window.location.href;
-
-                    $addTitleInput.val(defaultTitle);
-                    $addUrlInput.val(url);
-
-                    var addBookmark = function() {
-                        $.ajax({
-                            url: $addForm.attr('action'),
-                            method: $addForm.attr('method'),
-                            dataType: 'json',
-                            data: $addForm.serialize(),
-                            success: function (result) {
-                                if (result.error) {
-                                    return;
-                                }
-
-                                var $list = $('.bookmarks-list');
-                                var $item = $('.sidebar-menu-item-list-item.empty').clone().removeClass('empty');
-
-                                $item.find('.sidebar-menu-item-list-item-link')
-                                    .attr('href', url)
-                                    .append($addTitleInput.val());
-
-                                $item.find('.sidebar-menu-item-list-item-link-remove').attr('data-bookmark-id', result.id);
-
-                                $list.append($item);
-                            }
-                        });
-                    };
-
-                    var buttons = {};
-
-                    buttons[django.gettext('Add')] = function() {
-                        addBookmark();
-                        $(this).dialog('close');
-                    };
-
-                    buttons[django.gettext('Cancel')] = function() {
-                        $(this).dialog('close');
-                    };
-
-                    $('#bookmarks-add-dialog').dialog({
-                        resizable: false,
-                        modal: true,
-                        buttons: buttons
-                    });
-                });
-
-                $(document).on('click', '.bookmarks-remove', function(e) {
-                    e.preventDefault();
-
-                    var $remove = $(this);
-                    var bookmarkId = $remove.data('bookmark-id');
-
-                    var deleteBookmark = function() {
-                        $removeIdInput.val(bookmarkId);
-
-                        $.ajax({
-                            url: $removeForm.attr('action'),
-                            method: $removeForm.attr('method'),
-                            dataType: 'json',
-                            data: $removeForm.serialize(),
-                            success: function (result) {
-                                if (result.error) {
-                                    return;
-                                }
-
-                                var $item = $remove.closest('.sidebar-menu-item-list-item');
-
-                                $item.remove();
-                            }
-                        });
-                    };
-
-                    var buttons = {};
-
-                    buttons[django.gettext('Delete')] = function() {
-                        deleteBookmark();
-                        $(this).dialog('close');
-                    };
-
-                    buttons[django.gettext('Cancel')] = function() {
-                        $(this).dialog('close');
-                    };
-
-                    $('#bookmarks-remove-dialog').dialog({
-                        resizable: false,
-                        modal: true,
-                        buttons: buttons
-                    });
-                });
-            };
-
-            var initApplicationPinning = function() {
-                var $appsList = $('.apps-list');
-                var $pinnedAppsList = $('.apps-list-pinned');
-                var $appsHide = $('.apps-hide');
-
-                var updateAppsHide = function () {
-                    var text;
-
-                    if ($appsList.is(':visible')) {
-                        text = django.gettext('Hide applications');
-                    } else {
-                        text = django.gettext('Show hidden');
-                    }
-
-                    $appsHide.text(text);
-
-                    if (($appsList.children().length == 0 || $pinnedAppsList.children().length == 0) && $appsList.is(':visible')) {
-                        $appsHide.hide();
-                    } else {
-                        $appsHide.show();
-                    }
-                };
-
-                $appsHide.on('click', function (e) {
-                    e.preventDefault();
-
-                    $appsList.slideFadeToggle(200, 'swing', function () {
-                        localStorage['side_menu_apps_list_visible'] = $appsList.is(':visible');
-                        updateAppsHide();
-                    });
-                });
-
-                $('.app-item .pin-toggle').on('click', function (e) {
-                    var $appItem = $(this).closest('.app-item');
-                    var appLabel = $appItem.data('app-label');
-                    var $form = $('#toggle-application-pin-form');
-
-                    $form.find('input[name="app_label"]').val(appLabel);
-
-                    $.ajax({
-                        url: $form.attr('action'),
-                        method: $form.attr('method'),
-                        dataType: 'json',
-                        data: $form.serialize(),
-                        success: function (result) {
-                            if (result.error) {
-                                return;
-                            }
-
-                            var $target = result.pinned ? $('.apps-list-pinned') : $('.apps-list');
-
-                            if (result.pinned) {
-                                $appItem.addClass('pinned');
-                            } else {
-                                $appItem.removeClass('pinned');
-                            }
-
-                            $appItem.detach();
-                            $appItem.appendTo($target);
-
-                            updateAppsHide();
-                        }
-                    });
-
-                    e.preventDefault();
-                });
-
-                if (localStorage['side_menu_apps_list_visible'] === 'false') {
-                    if ($pinnedAppsList.children().length != 0) {
-                        $appsList.hide();
-                    } else {
-                        localStorage['side_menu_apps_list_visible'] = true;
-                    }
-                }
-
-                updateAppsHide();
-            };
-
-            initPopupItems();
-            initBookmarks();
-            initApplicationPinning();
-        };
-
-        var initDeleteObjects = function() {
-            $('.delete-objects-list-item.collapsable').each(function() {
-                var $item = $(this);
-                var $link = $item.find('.delete-objects-list-item-row-collapse');
-                var $collapsable = $item.find('.delete-objects-list-item-collapsable');
-
-                $link.on('click', function(e) {
-                    e.preventDefault();
-
-                    $collapsable.slideToggle(200, 'swing');
-                });
-            });
-        };
-
-        var initjQueryCaseInsensitiveSelector = function() {
-            $.expr[":"].icontains = $.expr.createPseudo(function (arg) {
-                return function (elem) {
-                    return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
-                };
-            });
-        };
-
-        var initjQuerySlideFadeToggle = function() {
-            $.fn.slideFadeToggle = function (speed, easing, callback) {
-                return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback);
-            };
-        };
-
-        var initDateTimeWidgets = function() {
-            var removePreviousSibling = function($element) {
-                var node = $element[0].previousSibling;
-                node.parentNode.removeChild(node);
-            };
-
-            var djangoDateTimeFormatToJs = function(format) {
-                return format.toLowerCase().replace(/%\w/g, function(format) {
-                    format = format.replace(/%/,"");
-                    return format + format;
-                });
-            };
-
-            var updateDatetimeLayout = function() {
-                $('.form-row .datetime').each(function () {
-                    var $dateTime = $(this);
-                    var $dateField = $dateTime.find('.vDateField');
-                    var $timeField = $dateTime.find('.vTimeField');
-
-                    removePreviousSibling($dateField);
-                    removePreviousSibling($timeField);
-
-                    $dateField.nextAll('br').first().remove();
-                });
-            };
-
-            var initDateWidget = function() {
-                $('.form-row .vDateField').each(function () {
-                    var $dateField = $(this);
-                    var $dateLink = $('<a href="#">').addClass('vDateField-link');
-                    var $dateButton = $('<span>').addClass('icon-calendar');
-
-                    $dateLink.append($dateButton).insertAfter($dateField);
-
-                    $dateField.datepicker({
-                        dateFormat: djangoDateTimeFormatToJs(DATE_FORMAT),
-                        showButtonPanel: true,
-                        nextText: '',
-                        prevText: ''
-                    });
-                    $dateLink.on('click', function (e) {
-                        if ($dateField.datepicker('widget').is(':visible')) {
-                            $dateField.datepicker('hide');
-                        } else {
-                            $dateField.datepicker('show');
-                        }
-
-                        e.preventDefault();
-                    });
-                });
-
-                var old_goToToday = $.datepicker._gotoToday;
-                $.datepicker._gotoToday = function(id) {
-                    old_goToToday.call(this,id);
-                    this._selectDate(id);
-                };
-            };
-
-            var initTimeWidget = function() {
-                $('.form-row .vTimeField').each(function () {
-                    var $timeField = $(this);
-                    var $timeLink = $('<a href="#">').addClass('vTimeField-link');
-                    var $timeButton = $('<span>').addClass('icon-clock');
-
-                    $timeLink.append($timeButton).insertAfter($timeField);
-
-                    $timeField.timepicker({
-                        showPeriodLabels: false,
-                        showCloseButton: true,
-                        showNowButton: true
-                    });
-                    $timeLink.on('click', function (e) {
-                        if ($timeField.datepicker('widget').is(':visible')) {
-                            $timeField.datepicker('hide');
-                        } else {
-                            $timeField.timepicker('show');
-                        }
-
-                        e.preventDefault();
-                    });
-                });
-            };
-
-            updateDatetimeLayout();
-            initDateWidget();
-            initTimeWidget();
-        };
-
-        var initInlines = function() {
-            $('.module').each(function() {
-                var $module = $(this);
-                var $items = function() { return $module.find('.stacked-inline-list-item'); };
-                var $inlinesRelated = function() { return $module.find('.inline-related'); };
-
-                $module.on('click', '.stacked-inline-list-item-link', function(e) {
-                    var $itemLink = $(this);
-                    var $item = $itemLink.closest('.stacked-inline-list-item');
-                    var moduleId = $itemLink.data('inline-related-id');
-
-                    $items().removeClass('selected');
-                    $item.addClass('selected');
-                    $inlinesRelated().removeClass('selected').filter('#' + moduleId).addClass('selected');
-
-                    e.preventDefault();
-                });
-
-                $module.on('click', '.stacked-inline-list-item-link-remove', function(e) {
-                    var $itemLink = $(this).closest('.stacked-inline-list-item-link');
-                    var $item = $itemLink.closest('.stacked-inline-list-item');
-                    var moduleId = $itemLink.data('inline-related-id');
-
-                    $item.remove();
-                    $inlinesRelated().filter('#' + moduleId).remove();
-
-                    e.preventDefault();
-                });
-
-                $module.find('.inline-related').each(function() {
-                    var $inline = $(this);
-
-                    $inline.find('.delete input').on('change', function(e) {
-                        var $input = $(this);
-                        var id = $inline.attr('id');
-                        var $link = $module.find('.stacked-inline-list-item-link[data-inline-related-id="' + id + '"]');
-                        var $item = $link.closest('.stacked-inline-list-item');
-
-                        if ($input.is(':checked')) {
-                            $item.addClass('delete');
-                        } else {
-                            $item.removeClass('delete');
-                        }
-                    });
-                });
-
-                $module.find('.add-row a').on('click', function() {
-                   $module.find('select').trigger('select:init');
-                });
-            });
-        };
-
-        var initChangelist = function() {
-            var initChangelistHeaders = function() {
-                var $originalThead = $('.results thead');
-
-                if ($originalThead.length == 0) {
-                    return;
-                }
-
-                var $thead = $originalThead.clone();
-                var $table = $('<table>').addClass('table helper').append($thead);
-
-                $table.find('.action-checkbox-column').empty();
-                $table.appendTo(document.body);
-
-                var updateChangelistHeaderVisibility = function () {
-                    if ($(window).scrollTop() > $originalThead.offset().top) {
-                        $table.show();
-                    } else {
-                        $table.hide();
-                    }
-                };
-
-                var updateChangelistHeaderWidth = function () {
-                    var $originalTheadColumns = $originalThead.find('th');
-                    var $theadColumns = $thead.find('th');
-
-                    $originalTheadColumns.each(function (i) {
-                        $theadColumns.eq(i).css('width', $(this).width());
-                    });
-                };
-
-                $(window).on('scroll', updateChangelistHeaderVisibility);
-                $(window).on('resize', updateChangelistHeaderWidth);
-
-                updateChangelistHeaderWidth();
-            };
-
-            var initChangelistFooters = function() {
-                var $changelistFooters = $('.changelist-footer');
-
-                if ($changelistFooters.length == 0) {
-                    return;
-                }
-
-                var updateChangelistFooters = function () {
-                    $changelistFooters.each(function () {
-                        var $changelistFooter = $(this);
-                        var $results = $changelistFooter.siblings('.results');
-
-                        if ($(window).scrollTop() + $(window).height() < $(document).height()) {
-                            if (!$changelistFooter.hasClass('fixed')) {
-                                var previousScrollTop = $(window).scrollTop();
-
-                                $changelistFooter.addClass('fixed');
-                                $results.css('margin-bottom', ($changelistFooter.outerHeight(false) - 20 - 2) + 'px');
-
-                                $(window).scrollTop(previousScrollTop);
-                            }
-                        } else {
-                            if ($changelistFooter.hasClass('fixed')) {
-                                $changelistFooter.removeClass('fixed');
-                                $results.css('margin-bottom', 0);
-                            }
-                        }
-                    });
-                };
-
-                $(window).on('scroll', updateChangelistFooters);
-                $(window).on('resize', updateChangelistFooters);
-
-                updateChangelistFooters();
-            };
-
-            var initChangelistImages = function() {
-                $('img[src$="admin/img/icon-yes.gif"]').after($('<span class="icon-tick">'));
-                $('img[src$="admin/img/icon-no.gif"]').after($('<span class="icon-cross">'));
-                $('img[src$="admin/img/icon-unknown.gif"]').after($('<span class="icon-question">'));
-            };
-
-            var initChangelistRowSelection = function() {
-                $('#result_list tbody th, #result_list tbody td').on('click', function(e) {
-                    // Fix selection on clicking elements inside row (e.x. links)
-                    if (e.target != this) {
-                        return;
-                    }
-
-                    $(this).closest('tr').find('.action-checkbox .action-select').click();
-                });
-            };
-
-            initChangelistHeaders();
-            initChangelistFooters();
-            initChangelistImages();
-            initChangelistRowSelection();
-        };
-
-        var initTooltips = function() {
-            $('a[title],.tooltip[title]').tooltip({
-                track: true
-            });
-        };
-
-        var initDashboard = function() {
-            var updateDashboardModules = function () {
-                var $form = $('#update-dashboard-modules-form');
-                var modules = [];
-
-                $('.dashboard-column').each(function () {
-                    var $column = $(this);
-                    var column = $column.closest('.dashboard-column-wrapper').index();
-
-                    $column.find('.dashboard-item').each(function () {
-                        var $item = $(this);
-                        var order = $item.index();
-                        var id = $item.data('module-id');
-
-                        modules.push({
-                            id: id,
-                            column: column,
-                            order: order
-                        });
-                    });
-                });
-
-                $form.find('[name="modules"]').val(JSON.stringify(modules));
-
-                $.ajax({
-                    url: $form.attr('action'),
-                    method: $form.attr('method'),
-                    dataType: 'json',
-                    data: $form.serialize()
-                });
-            };
-
-            $('.dashboard-column').droppable({
-                activeClass: 'active',
-                hoverClass: 'hovered',
-                tolerance: 'pointer',
-                accept: '.dashboard-item'
-            }).sortable({
-                items: '.dashboard-item',
-                handle: '.dashboard-item-header',
-                tolerance: 'pointer',
-                connectWith: '.dashboard-column',
-                cursor: 'move',
-                placeholder: 'dashboard-item placeholder',
-                forcePlaceholderSize: true,
-                update: function (event, ui) {
-                    updateDashboardModules();
-                }
-            });
-
-            $('.dashboard-item.collapsible').each(function () {
-                var $item = $(this);
-                var $link = $item.find('.dashboard-item-collapse');
-                var $collapsible = $item.find('.dashboard-item-content');
-                var $form = $('#update-dashboard-module-collapse-form');
-                var moduleId = $item.data('module-id');
-
-                $link.on('click', function (e) {
-                    e.preventDefault();
-
-                    $collapsible.slideFadeToggle(200, 'swing', function () {
-                        var collapsed = $collapsible.is(':visible') == false;
-
-                        if (collapsed) {
-                            $item.addClass('collapsed')
-                        } else {
-                            $item.removeClass('collapsed')
-                        }
-
-                        $form.find('[name="id"]').val(moduleId);
-                        $form.find('[name="collapsed"]').val(collapsed ? 'true' : 'false');
-
-                        $.ajax({
-                            url: $form.attr('action'),
-                            method: $form.attr('method'),
-                            dataType: 'json',
-                            data: $form.serialize()
-                        });
-                    });
-                });
-            });
-
-            $('.dashboard-item.deletable').each(function () {
-                var $item = $(this);
-                var $link = $item.find('.dashboard-item-remove');
-                var $form = $('#remove-dashboard-module-form');
-                var moduleId = $item.data('module-id');
-
-                $link.on('click', function (e) {
-                    e.preventDefault();
-
-                    var buttons = {};
-
-                    var deleteModule = function () {
-                        $item.fadeOut(200, 'swing', function () {
-                            $form.find('[name="id"]').val(moduleId);
-
-                            $.ajax({
-                                url: $form.attr('action'),
-                                method: $form.attr('method'),
-                                dataType: 'json',
-                                data: $form.serialize()
-                            });
-                        });
-                    };
-
-                    buttons[django.gettext('Delete')] = function () {
-                        deleteModule();
-                        $(this).dialog('close');
-                    };
-
-                    buttons[django.gettext('Cancel')] = function () {
-                        $(this).dialog('close');
-                    };
-
-                    $('#module-remove-dialog').dialog({
-                        resizable: false,
-                        modal: true,
-                        buttons: buttons
-                    });
-                });
-            });
-
-            var $form = $('#add-dashboard-module-form');
-
-            $form.find('.add-dashboard-link').on('click', function (e) {
-                var $typeInput = $form.find('[name="type"]');
-                var type = $form.find('[name="module"] option:selected').data('type');
-
-                if (type) {
-                    $typeInput.val(type);
-
-                    $.ajax({
-                        url: $form.attr('action'),
-                        method: $form.attr('method'),
-                        dataType: 'json',
-                        data: $form.serialize(),
-                        success: function (result) {
-                            if (result.error) {
-                                return;
-                            }
-
-                            document.location = result.success_url;
-                        }
-                    });
-                }
-
-                e.preventDefault();
-            });
-
-            $('.dashboard-item.ajax').each(function () {
-                var $item = $(this);
-                var $content = $item.find('.dashboard-item-content');
-                var url = $item.data('ajax-url');
-                var moduleId = $item.data('module-id');
-
-                $form.find('[name="id"]').val(moduleId);
-
-                $.ajax({
-                    url: url,
-                    dataType: 'json',
-                    success: function (result) {
-                        if (result.error) {
-                            $content.empty();
-                            return;
-                        }
-
-                        var oldHeight = $content.height();
-                        $content.html(result.html);
-                        var newHeight = $content.height();
-
-                        $content.height(oldHeight);
-                        $content.animate({
-                            height: newHeight
-                        }, 250);
-                    },
-                    error: function() {
-                        $content.empty();
-                    }
-                });
-            });
-
-            $('.reset-dashboard-link').on('click', function(e) {
-                var buttons = {};
-                var resetDashboard = function () {
-                    var $form = $('#reset-dashboard-form');
-
-                    $.ajax({
-                        url: $form.attr('action'),
-                        method: $form.attr('method'),
-                        dataType: 'json',
-                        data: $form.serialize(),
-                        success: function (result) {
-                            if (result.error) {
-                                return;
-                            }
-
-                            location.reload();
-                        }
-                    });
-                };
-
-                buttons[django.gettext('Yes')] = function() {
-                    resetDashboard();
-                    $(this).dialog('close');
-                };
-
-                buttons[django.gettext('Cancel')] = function() {
-                    $(this).dialog('close');
-                };
-
-                $('#reset-dashboard-dialog').dialog({
-                    resizable: false,
-                    modal: true,
-                    buttons: buttons
-                });
-
-                e.preventDefault();
-            });
-        };
-
-        var initUnsavedChangesWarning = function() {
-            var $changeform = $('.changeform');
-
-            if ($changeform.length) {
-                var $inputs = $changeform.find('input, textarea, select');
-                var bound = false;
-
-                var onBeforeUnload = function (){
-                    return django.gettext('Warning: you have unsaved changes');
-                };
-
-                var onChange = function () {
-                    $inputs.off('change', onChange);
-
-                    if (!bound) {
-                        $(window).bind('beforeunload', onBeforeUnload);
-
-                        bound = true;
-                    }
-                };
-
-                $(document).on('submit', 'form', function() {
-                    $(window).off('beforeunload', onBeforeUnload);
-                });
-
-                $inputs.on('change', onChange);
-            }
-        };
-
-        var initScrollbars = function() {
-            $('.sidebar-menu-wrapper').perfectScrollbar();
-        };
-
-        var initThemeChoosing = function() {
-            $('.choose-theme').on('click', function () {
-                var $link = $(this);
-
-                $.cookie('JET_THEME', $link.data('theme'), { expires: 365, path: '/' });
-
-                var cssToLoad = [
-                    { url: $link.data('base-stylesheet'), class: 'base-stylesheet' },
-                    { url: $link.data('select2-stylesheet'), class: 'select2-stylesheet' },
-                    { url: $link.data('jquery-ui-stylesheet'), class: 'jquery-ui-stylesheet' }
-                ];
-
-                var loadedCss = 0;
-
-                var onCssLoaded = function() {
-                    ++loadedCss;
-
-                    if (loadedCss == cssToLoad.length) {
-                        $(document).trigger('theme:changed');
-                    }
-                };
-
-                cssToLoad.forEach(function(css) {
-                    $('<link>')
-                        .attr('rel', 'stylesheet')
-                        .addClass(css['class'])
-                        .attr('href', css['url'])
-                        .load(onCssLoaded)
-                        .appendTo('head');
-                    $('.' + css['class'])
-                        .slice(0, -2)
-                        .remove();
-                });
-
-                $('.choose-theme').removeClass('selected');
-                $link.addClass('selected');
-            });
-        };
-
-        var initRelatedPopups = function() {
-            var closeRelatedPopup = function () {
-                var $popups = $('.related-popup');
-                var $container = $('.related-popup-container');
-                var $popup = $popups.last();
-
-                $popup.remove();
-
-                if ($popups.length == 1) {
-                    $container.fadeOut(200, 'swing', function () {
-                        $('.related-popup-back').hide();
-                        $('body').removeClass('non-scrollable');
-                    });
-                }
-            };
-
-            $('.related-popup-back').on('click', function (e) {
-                e.preventDefault();
-                closeRelatedPopup();
-            });
-
-            $(window).on('related-popup:close', function () {
-                closeRelatedPopup();
-            });
-        };
-
-        initjQueryCaseInsensitiveSelector();
-        initjQuerySlideFadeToggle();
-        initFilters();
-        initChangeformTabs();
-        initCheckboxesWithoutLabel();
-        initUserTools();
-        initSideMenu();
-        initDeleteObjects();
-        initDateTimeWidgets();
-        initInlines();
-        initChangelist();
-        initTooltips();
-        initDashboard();
-        initUnsavedChangesWarning();
-        initScrollbars();
-        initThemeChoosing();
-        initRelatedPopups();
-    });
-})(jet.jQuery);

File diff suppressed because it is too large
+ 0 - 0
jet/static/jet/js/main.min.js


+ 0 - 214
jet/static/jet/js/select2.jet.js

@@ -1,214 +0,0 @@
-(function ($) {
-    $.fn.select2.amd.require([
-        'select2/utils',
-        'select2/dropdown',
-        'select2/dropdown/attachBody',
-        'select2/dropdown/search',
-        'select2/dropdown/minimumResultsForSearch',
-        'select2/dropdown/closeOnSelect'
-    ], function (Utils, DropdownAdapter, AttachBody, DropdownSearch, MinimumResultsForSearch, closeOnSelect) {
-        AttachBody.prototype._positionDropdown = function () {
-            var $window = $(window);
-
-            var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
-            var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
-
-            var newDirection = null;
-
-            var position = this.$container.position();
-            var offset = this.$container.offset();
-
-            offset.bottom = offset.top + this.$container.outerHeight(false);
-
-            var container = {
-                height: this.$container.outerHeight(false)
-            };
-
-            container.top = offset.top;
-            container.bottom = offset.top + container.height;
-
-            var dropdown = {
-                height: this.$dropdown.outerHeight(false)
-            };
-
-            var viewport = {
-                top: $window.scrollTop(),
-                bottom: $window.scrollTop() + $window.height()
-            };
-
-            var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
-            var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
-
-            var css = {
-                left: offset.left,
-                top: container.bottom
-            };
-
-            if (!isCurrentlyAbove && !isCurrentlyBelow) {
-                newDirection = 'below';
-            }
-
-            if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
-                newDirection = 'above';
-            } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
-                newDirection = 'below';
-            }
-
-            if (newDirection == 'above' ||
-                (isCurrentlyAbove && newDirection !== 'below')) {
-                css.top = container.top - dropdown.height;
-            }
-
-            if (newDirection != null) {
-                this.$dropdown
-                    .removeClass('select2-dropdown--below select2-dropdown--above')
-                    .addClass('select2-dropdown--' + newDirection);
-                this.$container
-                    .removeClass('select2-container--below select2-container--above')
-                    .addClass('select2-container--' + newDirection);
-
-                //hack
-                var $search = this.$dropdown.find('.select2-search');
-
-                if (newDirection == 'above' && $search.is(':first-child')) {
-                    $search.detach().appendTo(this.$dropdown);
-                } else if (newDirection == 'below' && $search.is(':last-child')) {
-                    $search.detach().prependTo(this.$dropdown);
-                }
-            }
-
-            this.$dropdownContainer.css(css);
-        };
-
-        AttachBody.prototype.render = function (decorated) {
-            var $container = $('<span></span>');
-
-            var $dropdown = decorated.call(this);
-            $container.append($dropdown);
-
-            this.$dropdownContainer = $container;
-
-            //hack
-            if (this.$element.prop('multiple')) {
-                this.$dropdown.addClass('select2-multiple-dropdown');
-            } else {
-                this.$dropdown.removeClass('select2-multiple-dropdown');
-            }
-
-            return $container;
-        };
-
-        DropdownAdapter.prototype.render = function () {
-            var buttons = '';
-
-            if (this.options.get('multiple')) {
-                buttons =
-                    '<div class="select2-buttons">' +
-                        '<a href="#" class="select2-buttons-button select2-buttons-button-select-all">' +
-                            django.gettext('select all') +
-                        '</a> ' +
-                        '<a href="#" class="select2-buttons-button select2-buttons-button-deselect-all">' +
-                            django.gettext('deselect all') +
-                        '</a>' +
-                    '</div>';
-            }
-
-            var $dropdown = $(
-                '<span class="select2-dropdown">' +
-                buttons +
-                '<span class="select2-results"></span>' +
-                '</span>'
-            );
-
-            var $element = this.$element;
-
-            $dropdown.find('.select2-buttons-button-select-all').on('click', function(e) {
-                e.preventDefault();
-                var selected = [];
-                $element.find('option').each(function() {
-                    selected.push($(this).val());
-                });
-                $element.select2('val', selected);
-                $element.select2('close');
-            });
-
-            $dropdown.find('.select2-buttons-button-deselect-all').on('click', function(e) {
-                e.preventDefault();
-                $element.select2('val', '');
-                $element.select2('close');
-            });
-
-            $dropdown.attr('dir', this.options.get('dir'));
-            this.$dropdown = $dropdown;
-            return $dropdown;
-        };
-
-        var dropdownAdapter = Utils.Decorate(
-            Utils.Decorate(
-                DropdownAdapter,
-                DropdownSearch
-            ),
-            AttachBody
-        );
-
-        dropdownAdapter = Utils.Decorate(dropdownAdapter, MinimumResultsForSearch);
-        dropdownAdapter = Utils.Decorate(dropdownAdapter, closeOnSelect);
-
-        $(document).on('select:init', 'select', function() {
-            var $select = $(this);
-
-            if ($select.parents('.empty-form').length > 0) {
-                return;
-            }
-
-            var settings = {
-                theme: 'jet',
-                dropdownAdapter: dropdownAdapter
-            };
-
-            if ($select.hasClass('ajax')) {
-                var contentTypeId = $select.data('content-type-id');
-                var appLabel = $select.data('app-label');
-                var model = $select.data('model');
-                var objectId = $select.data('object-id');
-                var pageSize = 100;
-
-                settings['ajax'] = {
-                    dataType: 'json',
-                    data: function (params) {
-                        return {
-                            content_type: contentTypeId,
-                            app_label: appLabel,
-                            model: model,
-                            q: params.term,
-                            page: params.page,
-                            page_size: pageSize,
-                            object_id: objectId
-                        };
-                    },
-                    processResults: function (data, params) {
-                        if (data.error) {
-                            return {}
-                        }
-
-                        params.page = params.page || 1;
-                        var more = (params.page * pageSize) < data.total;
-
-                        return {
-                          results: data.items,
-                          pagination: {
-                            more: more
-                          }
-                        };
-                    }
-                };
-            }
-
-            $select.select2(settings);
-        });
-
-        $(document).ready(function() {
-            $('select').trigger('select:init');
-        });
-    });
-})(jet.jQuery);

File diff suppressed because it is too large
+ 0 - 0
jet/static/jet/js/select2.jet.min.js


+ 43 - 0
jet/static/jet/js/src/features/changeform-tabs.js

@@ -0,0 +1,43 @@
+var $ = require('jquery');
+
+var initChangeformTabs = function() {
+    $('.changeform').each(function() {
+        var $changeform = $(this);
+        var $tabItems = $changeform.find('.changeform-tabs-item');
+        var $modules = $changeform.find('.module');
+
+        if ($tabItems.length == 0) {
+            return;
+        }
+
+        var showTab = function(selector) {
+            selector = selector.replace(/^#\/?/, '');
+
+            var $module = selector.length > 0 ? $modules.filter('#' + selector) : $();
+
+            if ($module && $module.length == 0) {
+                selector = $tabItems.first().find('a').attr('href').replace(/^#\/?/, '');
+            }
+
+            var $tabItem = $tabItems.find('a[href="#/' + selector + '"]').closest('.changeform-tabs-item');
+
+
+            $tabItems.removeClass('selected');
+            $tabItem.addClass('selected');
+            $module = $modules.removeClass('selected').filter('#' + selector).addClass('selected');
+            $module.find('select').trigger('select:init');
+        };
+
+        $('.changeform-tabs-item-link').click(function (e) {
+            var moduleSelector = $(this).attr('href');
+
+            showTab(moduleSelector);
+        });
+
+        showTab(location.hash);
+    });
+};
+
+$(document).ready(function() {
+    initChangeformTabs();
+});

+ 34 - 0
jet/static/jet/js/src/features/changeform.js

@@ -0,0 +1,34 @@
+var $ = require('jquery');
+
+var initUnsavedChangesWarning = function() {
+    var $changeform = $('.change-form #content-main form');
+
+    if ($changeform.length) {
+        var $inputs = $changeform.find('input, textarea, select');
+        var bound = false;
+
+        var onBeforeUnload = function() {
+            return django.gettext('Warning: you have unsaved changes');
+        };
+
+        var onChange = function() {
+            $inputs.off('change', onChange);
+
+            if (!bound) {
+                $(window).bind('beforeunload', onBeforeUnload);
+
+                bound = true;
+            }
+        };
+
+        $(document).on('submit', 'form', function() {
+            $(window).off('beforeunload', onBeforeUnload);
+        });
+
+        $inputs.on('change', onChange);
+    }
+};
+
+$(document).ready(function() {
+    initUnsavedChangesWarning();
+});

+ 121 - 0
jet/static/jet/js/src/features/changelist.js

@@ -0,0 +1,121 @@
+var $ = require('jquery');
+
+var initChangelist = function() {
+    var initChangelistHeaders = function() {
+        var $originalThead = $('#changelist .results thead');
+
+        if ($originalThead.length == 0) {
+            return;
+        }
+
+        var $thead = $originalThead.clone();
+        var $table = $('<table>').addClass('table helper').append($thead);
+
+        $table.find('.action-checkbox-column').empty();
+        $table.appendTo(document.body);
+
+        var updateChangelistHeaderVisibility = function () {
+            if ($(window).scrollTop() > $originalThead.offset().top) {
+                $table.show();
+            } else {
+                $table.hide();
+            }
+        };
+
+        var updateChangelistHeaderWidth = function () {
+            var $originalTheadColumns = $originalThead.find('th');
+            var $theadColumns = $thead.find('th');
+
+            $originalTheadColumns.each(function (i) {
+                $theadColumns.eq(i).css('width', $(this).width());
+            });
+        };
+
+        $(window).on('scroll', updateChangelistHeaderVisibility);
+        $(window).on('resize', updateChangelistHeaderWidth);
+
+        updateChangelistHeaderWidth();
+    };
+
+    var initChangelistFooters = function() {
+        var $changelistFooters = $('.changelist-footer');
+
+        if ($changelistFooters.length == 0) {
+            return;
+        }
+
+        var updateChangelistFooters = function () {
+            $changelistFooters.each(function () {
+                var $changelistFooter = $(this);
+                var $results = $changelistFooter.siblings('.results');
+
+                if ($results.length == 0) {
+                    return;
+                }
+
+                if ($(window).scrollTop() + $(window).height() - $changelistFooter.outerHeight(false) < $results.offset().top + $results.outerHeight(false)) {
+                    if (!$changelistFooter.hasClass('fixed')) {
+                        var previousScrollTop = $(window).scrollTop();
+
+                        $changelistFooter.addClass('fixed');
+                        $results.css('margin-bottom', ($changelistFooter.outerHeight(false) - 20 - 2) + 'px');
+
+                        $(window).scrollTop(previousScrollTop);
+                    }
+                } else {
+                    if ($changelistFooter.hasClass('fixed')) {
+                        $changelistFooter.removeClass('fixed');
+                        $results.css('margin-bottom', 0);
+                    }
+                }
+            });
+        };
+
+        $(window).on('scroll', updateChangelistFooters);
+        $(window).on('resize', updateChangelistFooters);
+
+        updateChangelistFooters();
+    };
+
+    var initChangelistImages = function() {
+        $('img[src$="admin/img/icon-yes.gif"]').add('img[src$="admin/img/icon-yes.svg"]').after($('<span class="icon-tick">'));
+        $('img[src$="admin/img/icon-no.gif"]').add('img[src$="admin/img/icon-no.svg"]').after($('<span class="icon-cross">'));
+        $('img[src$="admin/img/icon-unknown.gif"]').add('img[src$="admin/img/icon-unknown.svg"]').after($('<span class="icon-question">'));
+    };
+
+    var initChangelistRowSelection = function() {
+        $('#result_list tbody th, #result_list tbody td').on('click', function(e) {
+            // Fix selection on clicking elements inside row (e.x. links)
+            if (e.target != this) {
+                return;
+            }
+
+            $(this).closest('tr').find('.action-checkbox .action-select').click();
+        });
+    };
+
+    var initChangelistSortableSelection = function() {
+        $('table thead .sortable').on('click', function(e) {
+
+            if (e.target != this) {
+                return;
+            }
+
+            var link = $(this).find('.text a').get(0);
+
+            if (link != undefined) {
+                link.click();
+            }
+        });
+    };
+
+    initChangelistHeaders();
+    initChangelistFooters();
+    initChangelistImages();
+    initChangelistRowSelection();
+    initChangelistSortableSelection();
+};
+
+$(document).ready(function() {
+    initChangelist();
+});

+ 29 - 0
jet/static/jet/js/src/features/checkboxes.js

@@ -0,0 +1,29 @@
+var $ = require('jquery');
+
+var initCheckboxesWithoutLabel = function () {
+    var uniqueCheckboxIdCounter = 0;
+    var uniqueCheckboxIdPrefix = 'unique_checkbox_id_';
+
+    var addLabelToCheckbox = function($checkbox) {
+        var checkboxId = $checkbox.attr('id') ? $checkbox.attr('id') : uniqueCheckboxIdPrefix + uniqueCheckboxIdCounter++;
+        var $label = $('<label>').attr('for', checkboxId);
+
+        $checkbox.hide().attr('id', checkboxId);
+        $label.insertAfter($checkbox);
+    };
+
+    var addLabelToCheckboxes = function() {
+        var $containers = $('.action-checkbox, .action-checkbox-column').add('.tabular.inline-related .form-row');
+        var $checkboxes = $containers.find('input[type="checkbox"]').add('.checkbox-without-label').add('label > input[type="checkbox"]');
+
+        $checkboxes.each(function() {
+            addLabelToCheckbox($(this));
+        });
+    };
+
+    addLabelToCheckboxes();
+};
+
+$(document).ready(function() {
+    initCheckboxesWithoutLabel();
+});

+ 238 - 0
jet/static/jet/js/src/features/dashboard.js

@@ -0,0 +1,238 @@
+require('./../utils/jquery-slidefade');
+
+var $ = window.jQuery = require('jquery');
+
+require('jquery-ui/ui/core');
+require('jquery-ui/ui/widget');
+require('jquery-ui/ui/mouse');
+require('jquery-ui/ui/draggable');
+require('jquery-ui/ui/droppable');
+require('jquery-ui/ui/sortable');
+require('jquery-ui/ui/resizable');
+require('jquery-ui/ui/button');
+require('jquery-ui/ui/dialog');
+
+var initDashboard = function() {
+    var updateDashboardModules = function () {
+        var $form = $('#update-dashboard-modules-form');
+        var modules = [];
+
+        $('.dashboard-column').each(function () {
+            var $column = $(this);
+            var column = $column.closest('.dashboard-column-wrapper').index();
+
+            $column.find('.dashboard-item').each(function () {
+                var $item = $(this);
+                var order = $item.index();
+                var id = $item.data('module-id');
+
+                modules.push({
+                    id: id,
+                    column: column,
+                    order: order
+                });
+            });
+        });
+
+        $form.find('[name="modules"]').val(JSON.stringify(modules));
+
+        $.ajax({
+            url: $form.attr('action'),
+            method: $form.attr('method'),
+            dataType: 'json',
+            data: $form.serialize()
+        });
+    };
+
+    $('.dashboard-column').droppable({
+        activeClass: 'active',
+        hoverClass: 'hovered',
+        tolerance: 'pointer',
+        accept: '.dashboard-item'
+    }).sortable({
+        items: '.dashboard-item',
+        handle: '.dashboard-item-header',
+        tolerance: 'pointer',
+        connectWith: '.dashboard-column',
+        cursor: 'move',
+        placeholder: 'dashboard-item placeholder',
+        forcePlaceholderSize: true,
+        update: function (event, ui) {
+            updateDashboardModules();
+        }
+    });
+
+    $('.dashboard-item.collapsible').each(function () {
+        var $item = $(this);
+        var $link = $item.find('.dashboard-item-collapse');
+        var $collapsible = $item.find('.dashboard-item-content');
+        var $form = $('#update-dashboard-module-collapse-form');
+        var moduleId = $item.data('module-id');
+
+        $link.on('click', function (e) {
+            e.preventDefault();
+
+            $collapsible.slideFadeToggle(200, 'swing', function () {
+                var collapsed = $collapsible.is(':visible') == false;
+
+                if (collapsed) {
+                    $item.addClass('collapsed')
+                } else {
+                    $item.removeClass('collapsed')
+                }
+
+                $form.find('[name="id"]').val(moduleId);
+                $form.find('[name="collapsed"]').val(collapsed ? 'true' : 'false');
+
+                $.ajax({
+                    url: $form.attr('action'),
+                    method: $form.attr('method'),
+                    dataType: 'json',
+                    data: $form.serialize()
+                });
+            });
+        });
+    });
+
+    $('.dashboard-item.deletable').each(function () {
+        var $item = $(this);
+        var $link = $item.find('.dashboard-item-remove');
+        var $form = $('#remove-dashboard-module-form');
+        var moduleId = $item.data('module-id');
+
+        $link.on('click', function (e) {
+            e.preventDefault();
+
+            var buttons = {};
+
+            var deleteModule = function () {
+                $item.fadeOut(200, 'swing', function () {
+                    $form.find('[name="id"]').val(moduleId);
+
+                    $.ajax({
+                        url: $form.attr('action'),
+                        method: $form.attr('method'),
+                        dataType: 'json',
+                        data: $form.serialize()
+                    });
+                });
+            };
+
+            buttons[django.gettext('Delete')] = function () {
+                deleteModule();
+                $(this).dialog('close');
+            };
+
+            buttons[django.gettext('Cancel')] = function () {
+                $(this).dialog('close');
+            };
+
+            $('#module-remove-dialog').dialog({
+                resizable: false,
+                modal: true,
+                buttons: buttons
+            });
+        });
+    });
+
+    var $form = $('#add-dashboard-module-form');
+
+    $form.find('.add-dashboard-link').on('click', function (e) {
+        var $typeInput = $form.find('[name="type"]');
+        var type = $form.find('[name="module"] option:selected').data('type');
+
+        if (type) {
+            $typeInput.val(type);
+
+            $.ajax({
+                url: $form.attr('action'),
+                method: $form.attr('method'),
+                dataType: 'json',
+                data: $form.serialize(),
+                success: function (result) {
+                    if (result.error) {
+                        return;
+                    }
+
+                    document.location = result.success_url;
+                }
+            });
+        }
+
+        e.preventDefault();
+    });
+
+    $('.dashboard-item.ajax').each(function () {
+        var $item = $(this);
+        var $content = $item.find('.dashboard-item-content');
+        var url = $item.data('ajax-url');
+        var moduleId = $item.data('module-id');
+
+        $form.find('[name="id"]').val(moduleId);
+
+        $.ajax({
+            url: url,
+            dataType: 'json',
+            success: function (result) {
+                if (result.error) {
+                    $content.empty();
+                    return;
+                }
+
+                var oldHeight = $content.height();
+                $content.html(result.html);
+                var newHeight = $content.height();
+
+                $content.height(oldHeight);
+                $content.animate({
+                    height: newHeight
+                }, 250);
+            },
+            error: function() {
+                $content.empty();
+            }
+        });
+    });
+
+    $('.reset-dashboard-link').on('click', function(e) {
+        var buttons = {};
+        var resetDashboard = function () {
+            var $form = $('#reset-dashboard-form');
+
+            $.ajax({
+                url: $form.attr('action'),
+                method: $form.attr('method'),
+                dataType: 'json',
+                data: $form.serialize(),
+                success: function (result) {
+                    if (result.error) {
+                        return;
+                    }
+
+                    location.reload();
+                }
+            });
+        };
+
+        buttons[django.gettext('Yes')] = function() {
+            resetDashboard();
+            $(this).dialog('close');
+        };
+
+        buttons[django.gettext('Cancel')] = function() {
+            $(this).dialog('close');
+        };
+
+        $('#reset-dashboard-dialog').dialog({
+            resizable: false,
+            modal: true,
+            buttons: buttons
+        });
+
+        e.preventDefault();
+    });
+};
+
+$(document).ready(function() {
+    initDashboard();
+});

+ 98 - 0
jet/static/jet/js/src/features/date-time-widgets.js

@@ -0,0 +1,98 @@
+var $ = window.jQuery = require('jquery');
+
+require('jquery-ui/ui/core');
+require('jquery-ui/ui/datepicker');
+
+require('timepicker');
+
+var initDateTimeWidgets = function() {
+    var removePreviousSibling = function($element) {
+        var node = $element[0].previousSibling;
+        node.parentNode.removeChild(node);
+    };
+
+    var djangoDateTimeFormatToJs = function(format) {
+        return format.toLowerCase().replace(/%\w/g, function(format) {
+            format = format.replace(/%/,"");
+            return format + format;
+        });
+    };
+
+    var updateDatetimeLayout = function() {
+        $('.form-row .datetime').each(function () {
+            var $dateTime = $(this);
+            var $dateField = $dateTime.find('.vDateField');
+            var $timeField = $dateTime.find('.vTimeField');
+
+            removePreviousSibling($dateField);
+            removePreviousSibling($timeField);
+
+            $dateField.nextAll('br').first().remove();
+        });
+    };
+
+    var initDateWidget = function() {
+        $('.form-row .vDateField').each(function () {
+            var $dateField = $(this);
+            var $dateLink = $('<a href="#">').addClass('vDateField-link');
+            var $dateButton = $('<span>').addClass('icon-calendar');
+
+            $dateLink.append($dateButton).insertAfter($dateField);
+
+            $dateField.datepicker({
+                dateFormat: djangoDateTimeFormatToJs(DATE_FORMAT),
+                showButtonPanel: true,
+                nextText: '',
+                prevText: ''
+            });
+            $dateLink.on('click', function (e) {
+                if ($dateField.datepicker('widget').is(':visible')) {
+                    $dateField.datepicker('hide');
+                } else {
+                    $dateField.datepicker('show');
+                }
+
+                e.preventDefault();
+            });
+        });
+
+        var old_goToToday = $.datepicker._gotoToday;
+        $.datepicker._gotoToday = function(id) {
+            old_goToToday.call(this,id);
+            this._selectDate(id);
+        };
+    };
+
+    var initTimeWidget = function() {
+        $('.form-row .vTimeField').each(function () {
+            var $timeField = $(this);
+            var $timeLink = $('<a href="#">').addClass('vTimeField-link');
+            var $timeButton = $('<span>').addClass('icon-clock');
+
+            $timeLink.append($timeButton).insertAfter($timeField);
+
+            $timeField.timepicker({
+                showPeriodLabels: false,
+                showCloseButton: true,
+                showNowButton: true
+            });
+            $timeLink.on('click', function (e) {
+                if ($timeField.datepicker('widget').is(':visible')) {
+                    $timeField.datepicker('hide');
+                } else {
+                    $timeField.timepicker('show');
+                }
+
+                e.preventDefault();
+            });
+        });
+    };
+
+    updateDatetimeLayout();
+    initDateWidget();
+    initTimeWidget();
+};
+
+$(document).ready(function() {
+    initDateTimeWidgets();
+});

+ 19 - 0
jet/static/jet/js/src/features/delete-objects.js

@@ -0,0 +1,19 @@
+var $ = require('jquery');
+
+var initDeleteObjects = function() {
+    $('.delete-objects-list-item.collapsable').each(function() {
+        var $item = $(this);
+        var $link = $item.find('.delete-objects-list-item-row-collapse');
+        var $collapsable = $item.find('.delete-objects-list-item-collapsable');
+
+        $link.on('click', function(e) {
+            e.preventDefault();
+
+            $collapsable.slideToggle(200, 'swing');
+        });
+    });
+};
+
+$(document).ready(function() {
+    initDeleteObjects();
+});

+ 20 - 0
jet/static/jet/js/src/features/filters.js

@@ -0,0 +1,20 @@
+var $ = require('jquery');
+
+var initFilters = function() {
+    $('.changelist-filter-select').on('change', function () {
+        var $select = $(this);
+        var $selectedOption = $select.find('option:selected');
+        var url = $selectedOption.data('url');
+        var querysetLookup = $select.data('queryset--lookup');
+
+        if (url) {
+            document.location = $selectedOption.data('url');
+        } else if (querysetLookup) {
+            document.location = '?' + querysetLookup + '=' + $selectedOption.val();
+        }
+    });
+};
+
+$(document).ready(function() {
+    initFilters();
+});

+ 57 - 0
jet/static/jet/js/src/features/inlines.js

@@ -0,0 +1,57 @@
+var $ = require('jquery');
+
+var initInlines = function() {
+    $('.module').each(function() {
+        var $module = $(this);
+        var $items = function() { return $module.find('.stacked-inline-list-item'); };
+        var $inlinesRelated = function() { return $module.find('.inline-related'); };
+
+        $module.on('click', '.stacked-inline-list-item-link', function(e) {
+            var $itemLink = $(this);
+            var $item = $itemLink.closest('.stacked-inline-list-item');
+            var moduleId = $itemLink.data('inline-related-id');
+
+            $items().removeClass('selected');
+            $item.addClass('selected');
+            $inlinesRelated().removeClass('selected').filter('#' + moduleId).addClass('selected');
+
+            e.preventDefault();
+        });
+
+        $module.on('click', '.stacked-inline-list-item-link-remove', function(e) {
+            var $itemLink = $(this).closest('.stacked-inline-list-item-link');
+            var $item = $itemLink.closest('.stacked-inline-list-item');
+            var moduleId = $itemLink.data('inline-related-id');
+
+            $item.remove();
+            $inlinesRelated().filter('#' + moduleId).remove();
+
+            e.preventDefault();
+        });
+
+        $module.find('.inline-related').each(function() {
+            var $inline = $(this);
+
+            $inline.find('.delete input').on('change', function(e) {
+                var $input = $(this);
+                var id = $inline.attr('id');
+                var $link = $module.find('.stacked-inline-list-item-link[data-inline-related-id="' + id + '"]');
+                var $item = $link.closest('.stacked-inline-list-item');
+
+                if ($input.is(':checked')) {
+                    $item.addClass('delete');
+                } else {
+                    $item.removeClass('delete');
+                }
+            });
+        });
+
+        $module.find('.add-row a').on('click', function() {
+           $module.find('select').trigger('select:init');
+        });
+    });
+};
+
+$(document).ready(function() {
+    initInlines();
+});

+ 31 - 0
jet/static/jet/js/src/features/related-objects.js

@@ -0,0 +1,31 @@
+var $ = require('jquery');
+
+var initRelatedPopups = function() {
+    var closeRelatedPopup = function () {
+        var $popups = $('.related-popup');
+        var $container = $('.related-popup-container');
+        var $popup = $popups.last();
+
+        $popup.remove();
+
+        if ($popups.length == 1) {
+            $container.fadeOut(200, 'swing', function () {
+                $('.related-popup-back').hide();
+                $('body').removeClass('non-scrollable');
+            });
+        }
+    };
+
+    $('.related-popup-back').on('click', function (e) {
+        e.preventDefault();
+        closeRelatedPopup();
+    });
+
+    $(window).on('related-popup:close', function () {
+        closeRelatedPopup();
+    });
+};
+
+$(document).ready(function() {
+    initRelatedPopups();
+});

+ 214 - 0
jet/static/jet/js/src/features/selects.js

@@ -0,0 +1,214 @@
+require('select2');
+
+var $ = require('jquery');
+var Utils = $.fn.select2.amd.require('select2/utils');
+var DropdownAdapter = $.fn.select2.amd.require('select2/dropdown');
+var AttachBody = $.fn.select2.amd.require('select2/dropdown/attachBody');
+var DropdownSearch = $.fn.select2.amd.require('select2/dropdown/search');
+var MinimumResultsForSearch = $.fn.select2.amd.require('select2/dropdown/minimumResultsForSearch');
+var closeOnSelect = $.fn.select2.amd.require('select2/dropdown/closeOnSelect');
+
+AttachBody.prototype._positionDropdown = function () {
+    var $window = $(window);
+
+    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
+    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
+
+    var newDirection = null;
+
+    var position = this.$container.position();
+    var offset = this.$container.offset();
+
+    offset.bottom = offset.top + this.$container.outerHeight(false);
+
+    var container = {
+        height: this.$container.outerHeight(false)
+    };
+
+    container.top = offset.top;
+    container.bottom = offset.top + container.height;
+
+    var dropdown = {
+        height: this.$dropdown.outerHeight(false)
+    };
+
+    var viewport = {
+        top: $window.scrollTop(),
+        bottom: $window.scrollTop() + $window.height()
+    };
+
+    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
+    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
+
+    var css = {
+        left: offset.left,
+        top: container.bottom
+    };
+
+    if (!isCurrentlyAbove && !isCurrentlyBelow) {
+        newDirection = 'below';
+    }
+
+    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
+        newDirection = 'above';
+    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
+        newDirection = 'below';
+    }
+
+    if (newDirection == 'above' ||
+        (isCurrentlyAbove && newDirection !== 'below')) {
+        css.top = container.top - dropdown.height;
+    }
+
+    if (newDirection != null) {
+        this.$dropdown
+            .removeClass('select2-dropdown--below select2-dropdown--above')
+            .addClass('select2-dropdown--' + newDirection);
+        this.$container
+            .removeClass('select2-container--below select2-container--above')
+            .addClass('select2-container--' + newDirection);
+
+        //hack
+        var $search = this.$dropdown.find('.select2-search');
+
+        if (newDirection == 'above' && $search.is(':first-child')) {
+            $search.detach().appendTo(this.$dropdown);
+        } else if (newDirection == 'below' && $search.is(':last-child')) {
+            $search.detach().prependTo(this.$dropdown);
+        }
+    }
+
+    this.$dropdownContainer.css(css);
+};
+
+AttachBody.prototype.render = function (decorated) {
+    var $container = $('<span></span>');
+
+    var $dropdown = decorated.call(this);
+    $container.append($dropdown);
+
+    this.$dropdownContainer = $container;
+
+    //hack
+    if (this.$element.prop('multiple')) {
+        this.$dropdown.addClass('select2-multiple-dropdown');
+    } else {
+        this.$dropdown.removeClass('select2-multiple-dropdown');
+    }
+
+    return $container;
+};
+
+DropdownAdapter.prototype.render = function () {
+    var buttons = '';
+
+    if (this.options.get('multiple')) {
+        buttons =
+            '<div class="select2-buttons">' +
+                '<a href="#" class="select2-buttons-button select2-buttons-button-select-all">' +
+                    django.gettext('select all') +
+                '</a> ' +
+                '<a href="#" class="select2-buttons-button select2-buttons-button-deselect-all">' +
+                    django.gettext('deselect all') +
+                '</a>' +
+            '</div>';
+    }
+
+    var $dropdown = $(
+        '<span class="select2-dropdown">' +
+        buttons +
+        '<span class="select2-results"></span>' +
+        '</span>'
+    );
+
+    var $element = this.$element;
+
+    $dropdown.find('.select2-buttons-button-select-all').on('click', function(e) {
+        e.preventDefault();
+        var selected = [];
+        $element.find('option').each(function() {
+            selected.push($(this).val());
+        });
+        $element.select2('val', selected);
+        $element.select2('close');
+    });
+
+    $dropdown.find('.select2-buttons-button-deselect-all').on('click', function(e) {
+        e.preventDefault();
+        $element.select2('val', '');
+        $element.select2('close');
+    });
+
+    $dropdown.attr('dir', this.options.get('dir'));
+    this.$dropdown = $dropdown;
+    return $dropdown;
+};
+
+var dropdownAdapter = Utils.Decorate(
+    Utils.Decorate(
+        DropdownAdapter,
+        DropdownSearch
+    ),
+    AttachBody
+);
+
+dropdownAdapter = Utils.Decorate(dropdownAdapter, MinimumResultsForSearch);
+dropdownAdapter = Utils.Decorate(dropdownAdapter, closeOnSelect);
+
+$(document).on('select:init', 'select', function() {
+    var $select = $(this);
+
+    if ($select.parents('.empty-form').length > 0) {
+        return;
+    }
+
+    var settings = {
+        theme: 'jet',
+        dropdownAdapter: dropdownAdapter
+    };
+
+    if ($select.hasClass('ajax')) {
+        var contentTypeId = $select.data('content-type-id');
+        var appLabel = $select.data('app-label');
+        var model = $select.data('model');
+        var objectId = $select.data('object-id');
+        var pageSize = 100;
+
+        settings['ajax'] = {
+            dataType: 'json',
+            data: function (params) {
+                return {
+                    content_type: contentTypeId,
+                    app_label: appLabel,
+                    model: model,
+                    q: params.term,
+                    page: params.page,
+                    page_size: pageSize,
+                    object_id: objectId
+                };
+            },
+            processResults: function (data, params) {
+                if (data.error) {
+                    return {}
+                }
+
+                params.page = params.page || 1;
+                var more = (params.page * pageSize) < data.total;
+
+                return {
+                  results: data.items,
+                  pagination: {
+                    more: more
+                  }
+                };
+            }
+        };
+    }
+
+    $select.select2(settings);
+});
+
+$(document).ready(function() {
+    $('select').trigger('select:init');
+});
+

+ 26 - 0
jet/static/jet/js/src/features/siblings.js

@@ -0,0 +1,26 @@
+var $ = require('jquery');
+
+var Siblings = function($siblings) {
+    this.$siblings = $siblings;
+};
+
+Siblings.prototype = {
+    moveSiblings: function($siblings) {
+        $siblings.remove().insertBefore($('.object-tools'));
+    },
+    run: function() {
+        try {
+            this.moveSiblings(this.$siblings);
+        } catch (e) {
+            console.error(e);
+        }
+
+        this.$siblings.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    $('.changeform-navigation').each(function() {
+        new Siblings($(this)).run();
+    });
+});

+ 361 - 0
jet/static/jet/js/src/features/side-menu.js

@@ -0,0 +1,361 @@
+require('./../utils/jquery-icontains');
+require('./../utils/jquery-slidefade');
+
+var $ = window.jQuery = require('jquery');
+
+require('jquery-ui/ui/core');
+require('jquery-ui/ui/widget');
+require('jquery-ui/ui/mouse');
+require('jquery-ui/ui/draggable');
+require('jquery-ui/ui/resizable');
+require('jquery-ui/ui/button');
+require('jquery-ui/ui/dialog');
+
+require('perfect-scrollbar/jquery')($);
+
+var initSideMenu = function() {
+    var initPopupItems = function() {
+        var $popupContainer = $('.sidebar-popup-container');
+        var $popup = $('.sidebar-popup');
+        var $popupItems = $('.sidebar-popup-item');
+        var $popupLinks = $('.popup-item-link');
+        var $popupLink;
+        var t;
+        var $currentPopupItem;
+        var $currentPopupItemListItem;
+        var $currentPopupItemListItems = function() { return $currentPopupItem.find('.sidebar-popup-list-item:visible') };
+
+        var resetCurrentPopupItemListItems = function() {
+            $currentPopupItemListItems().removeClass('selected');
+        };
+
+        var initPopupItemsSearch = function() {
+            $popupItems.each(function() {
+                var $popupItem = $(this);
+                var $search = $popupItem.find('.sidebar-popup-search');
+                var $items = $popupItem.find('.sidebar-popup-list-item');
+
+                $search.on('change keyup', function() {
+                    var text = $(this).val();
+
+                    $items.hide();
+                    $popupItem
+                        .find('.sidebar-popup-list-item-link:icontains("' + text + '")')
+                        .closest('.sidebar-popup-list-item')
+                        .show();
+                });
+            });
+        };
+
+        var showPopup = function ($popupLink) {
+            clearHideTimeout();
+
+            var popupItemId = $popupLink.data('popup-item-id');
+            var $popupItem = $('#' + popupItemId);
+            var $search = $popupItem.find('.sidebar-popup-search');
+
+            $popupItems.hide();
+            $popupItem.show();
+            $popupContainer.stop().fadeIn(200, 'swing');
+            $popupLinks.removeClass('hovered');
+            $popupLink.addClass('hovered');
+            $('body').addClass('non-scrollable');
+
+            $currentPopupItem = $popupItem;
+            $currentPopupItemListItem = null;
+            resetCurrentPopupItemListItems();
+
+            $search.val('').trigger('change').focus();
+        };
+
+        var hidePopup = function () {
+            t = setTimeout(function() {
+                $popupItems.hide();
+                $popupContainer.stop().fadeOut(200, 'swing');
+                $popupLinks.removeClass('hovered');
+                $('body').removeClass('non-scrollable');
+
+                $currentPopupItem = null;
+            }, 200);
+        };
+
+        var clearHideTimeout = function() {
+            if (t != null) {
+                clearTimeout(t);
+            }
+            t = null;
+        };
+
+        $popupLinks.on('mouseenter', function () {
+            $popupLink = $(this);
+
+            showPopup($popupLink);
+        });
+
+        $popupLinks.on('mouseleave', function (e) {
+            var $toElement = $(e.toElement);
+
+            if ($toElement.hasClass('sidebar-popup') || $toElement.parents('.sidebar-popup').length) {
+                return;
+            }
+
+            hidePopup();
+        });
+
+        $popup.on('mouseenter', function (e) {
+            clearHideTimeout();
+        });
+
+        $popup.on('mouseleave', function (e) {
+            var $toElement = $(e.toElement);
+
+            if ($toElement.hasClass('popup-item-link')
+                && $popupLink.data('popup-item-id') == $toElement.data('popup-item-id')) {
+                return;
+            }
+
+            hidePopup();
+        });
+
+        $popup.find('.sidebar-popup-list-item-link').on('mouseenter', function() {
+            var $link = $(this);
+            var $item = $link.closest('.sidebar-popup-list-item');
+
+            $currentPopupItemListItem = $item;
+
+            resetCurrentPopupItemListItems();
+            $currentPopupItemListItem.addClass('selected');
+        });
+
+        var selectCurrentPopupItemListItem = function(next) {
+            if ($currentPopupItemListItem != null) {
+                $currentPopupItemListItem = next ? $currentPopupItemListItem.nextAll(':visible').first() : $currentPopupItemListItem.prevAll(':visible').first();
+            }
+
+            if ($currentPopupItemListItem == null || $currentPopupItemListItem.length == 0) {
+                $currentPopupItemListItem = next ? $currentPopupItemListItems().first() : $currentPopupItemListItems().last();
+            }
+
+            resetCurrentPopupItemListItems();
+            $currentPopupItemListItem.addClass('selected');
+        };
+
+        $(document).keydown(function(e) {
+            if ($currentPopupItem == null) {
+                return;
+            }
+
+            if (e.which == 38) { //up
+                selectCurrentPopupItemListItem(false);
+            } else if (e.which == 40) { //down
+                selectCurrentPopupItemListItem(true);
+            } else if (e.which == 13) {
+                if ($currentPopupItemListItem) {
+                    document.location = $currentPopupItemListItem.find('a').attr('href');
+                }
+            } else {
+                return;
+            }
+
+            e.preventDefault();
+        });
+
+        initPopupItemsSearch();
+    };
+
+    var initBookmarks = function() {
+        var $addForm = $('#bookmarks-add-form');
+        var $removeForm = $('#bookmarks-remove-form');
+        var $addTitleInput = $addForm.find('input[name="title"]');
+        var $addUrlInput = $addForm.find('input[name="url"]');
+        var $removeIdInput = $removeForm.find('input[name="id"]');
+
+        $('.bookmarks-add').on('click', function(e) {
+            e.preventDefault();
+
+            var $link = $(this);
+            var defaultTitle = $link.data('title') ? $link.data('title') : document.title;
+            var url = window.location.href;
+
+            $addTitleInput.val(defaultTitle);
+            $addUrlInput.val(url);
+
+            var addBookmark = function() {
+                $.ajax({
+                    url: $addForm.attr('action'),
+                    method: $addForm.attr('method'),
+                    dataType: 'json',
+                    data: $addForm.serialize(),
+                    success: function (result) {
+                        if (result.error) {
+                            return;
+                        }
+
+                        var $list = $('.bookmarks-list');
+                        var $item = $('.sidebar-menu-item-list-item.empty').clone().removeClass('empty');
+
+                        $item.find('.sidebar-menu-item-list-item-link')
+                            .attr('href', url)
+                            .append($addTitleInput.val());
+
+                        $item.find('.sidebar-menu-item-list-item-link-remove').attr('data-bookmark-id', result.id);
+
+                        $list.append($item);
+                    }
+                });
+            };
+
+            var buttons = {};
+
+            buttons[django.gettext('Add')] = function() {
+                addBookmark();
+                $(this).dialog('close');
+            };
+
+            buttons[django.gettext('Cancel')] = function() {
+                $(this).dialog('close');
+            };
+
+            $('#bookmarks-add-dialog').dialog({
+                resizable: false,
+                modal: true,
+                buttons: buttons
+            });
+        });
+
+        $(document).on('click', '.bookmarks-remove', function(e) {
+            e.preventDefault();
+
+            var $remove = $(this);
+            var bookmarkId = $remove.data('bookmark-id');
+
+            var deleteBookmark = function() {
+                $removeIdInput.val(bookmarkId);
+
+                $.ajax({
+                    url: $removeForm.attr('action'),
+                    method: $removeForm.attr('method'),
+                    dataType: 'json',
+                    data: $removeForm.serialize(),
+                    success: function (result) {
+                        if (result.error) {
+                            return;
+                        }
+
+                        var $item = $remove.closest('.sidebar-menu-item-list-item');
+
+                        $item.remove();
+                    }
+                });
+            };
+
+            var buttons = {};
+
+            buttons[django.gettext('Delete')] = function() {
+                deleteBookmark();
+                $(this).dialog('close');
+            };
+
+            buttons[django.gettext('Cancel')] = function() {
+                $(this).dialog('close');
+            };
+
+            $('#bookmarks-remove-dialog').dialog({
+                resizable: false,
+                modal: true,
+                buttons: buttons
+            });
+        });
+    };
+
+    var initApplicationPinning = function() {
+        var $appsList = $('.apps-list');
+        var $pinnedAppsList = $('.apps-list-pinned');
+        var $appsHide = $('.apps-hide');
+
+        var updateAppsHide = function () {
+            var text;
+
+            if ($appsList.is(':visible')) {
+                text = django.gettext('Hide applications');
+            } else {
+                text = django.gettext('Show hidden');
+            }
+
+            $appsHide.text(text);
+
+            if (($appsList.children().length == 0 || $pinnedAppsList.children().length == 0) && $appsList.is(':visible')) {
+                $appsHide.hide();
+            } else {
+                $appsHide.show();
+            }
+        };
+
+        $appsHide.on('click', function (e) {
+            e.preventDefault();
+
+            $appsList.slideFadeToggle(200, 'swing', function () {
+                localStorage['side_menu_apps_list_visible'] = $appsList.is(':visible');
+                updateAppsHide();
+            });
+        });
+
+        $('.app-item .pin-toggle').on('click', function (e) {
+            var $appItem = $(this).closest('.app-item');
+            var appLabel = $appItem.data('app-label');
+            var $form = $('#toggle-application-pin-form');
+
+            $form.find('input[name="app_label"]').val(appLabel);
+
+            $.ajax({
+                url: $form.attr('action'),
+                method: $form.attr('method'),
+                dataType: 'json',
+                data: $form.serialize(),
+                success: function (result) {
+                    if (result.error) {
+                        return;
+                    }
+
+                    var $target = result.pinned ? $('.apps-list-pinned') : $('.apps-list');
+
+                    if (result.pinned) {
+                        $appItem.addClass('pinned');
+                    } else {
+                        $appItem.removeClass('pinned');
+                    }
+
+                    $appItem.detach();
+                    $appItem.appendTo($target);
+
+                    updateAppsHide();
+                }
+            });
+
+            e.preventDefault();
+        });
+
+        if (localStorage['side_menu_apps_list_visible'] === 'false') {
+            if ($pinnedAppsList.children().length != 0) {
+                $appsList.hide();
+            } else {
+                localStorage['side_menu_apps_list_visible'] = true;
+            }
+        }
+
+        updateAppsHide();
+    };
+
+    initPopupItems();
+    initBookmarks();
+    initApplicationPinning();
+};
+
+var initScrollbars = function() {
+    $('.sidebar-menu-wrapper').perfectScrollbar();
+};
+
+$(document).ready(function() {
+    initSideMenu();
+    initScrollbars();
+});

+ 46 - 0
jet/static/jet/js/src/features/themes.js

@@ -0,0 +1,46 @@
+require('jquery.cookie');
+
+var $ = require('jquery');
+
+var initThemeChoosing = function() {
+    $('.choose-theme').on('click', function () {
+        var $link = $(this);
+
+        $.cookie('JET_THEME', $link.data('theme'), { expires: 365, path: '/' });
+
+        var cssToLoad = [
+            { url: $link.data('base-stylesheet'), class: 'base-stylesheet' },
+            { url: $link.data('select2-stylesheet'), class: 'select2-stylesheet' },
+            { url: $link.data('jquery-ui-stylesheet'), class: 'jquery-ui-stylesheet' }
+        ];
+
+        var loadedCss = 0;
+
+        var onCssLoaded = function() {
+            ++loadedCss;
+
+            if (loadedCss == cssToLoad.length) {
+                $(document).trigger('theme:changed');
+            }
+        };
+
+        cssToLoad.forEach(function(css) {
+            $('<link>')
+                .attr('rel', 'stylesheet')
+                .addClass(css['class'])
+                .attr('href', css['url'])
+                .load(onCssLoaded)
+                .appendTo('head');
+            $('.' + css['class'])
+                .slice(0, -2)
+                .remove();
+        });
+
+        $('.choose-theme').removeClass('selected');
+        $link.addClass('selected');
+    });
+};
+
+$(document).ready(function() {
+    initThemeChoosing();
+});

+ 16 - 0
jet/static/jet/js/src/features/tooltips.js

@@ -0,0 +1,16 @@
+var $ = window.jQuery = require('jquery');
+
+require('jquery-ui/ui/core');
+require('jquery-ui/ui/position');
+require('jquery-ui/ui/widget');
+require('jquery-ui/ui/tooltip');
+
+var initTooltips = function() {
+    $('a[title], .tooltip[title]').tooltip({
+        track: true
+    });
+};
+
+$(document).ready(function() {
+    initTooltips();
+});

+ 54 - 0
jet/static/jet/js/src/layout-updaters/actions.js

@@ -0,0 +1,54 @@
+var $ = require('jquery');
+
+var ActionsUpdater = function($changelist) {
+    this.$changelist = $changelist;
+};
+
+ActionsUpdater.prototype = {
+    removeLabel: function($actions) {
+        var $input = $actions.find('[name="action"]').first();
+
+        if ($input.length == 0) {
+            return;
+        }
+
+        var $label = $input[0].previousSibling;
+
+        if ($label.nodeType == 3) {
+            $label.remove();
+        }
+    },
+    moveActions: function($actions) {
+        $actions.remove();
+        //$actions.insertAfter(this.$changelist.find('.results'));
+
+        var $paginator = this.$changelist.find('.paginator');
+        var $wrapper = $('<div>').addClass('changelist-footer');
+
+        $wrapper.insertAfter($paginator);
+
+        $actions.remove();
+        $paginator.remove();
+
+        $wrapper.append($actions);
+        $wrapper.append($paginator);
+    },
+    run: function() {
+        var $actions = this.$changelist.find('.actions');
+
+        try {
+            this.removeLabel($actions);
+            this.moveActions($actions);
+        } catch (e) {
+            console.error(e);
+        }
+
+        $actions.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    $('#changelist').each(function() {
+        new ActionsUpdater($(this)).run();
+    });
+});

+ 27 - 0
jet/static/jet/js/src/layout-updaters/breadcrumbs.js

@@ -0,0 +1,27 @@
+var $ = require('jquery');
+
+var BreadcrumbsUpdater = function($breadcrumbs) {
+    this.$breadcrumbs = $breadcrumbs;
+};
+
+BreadcrumbsUpdater.prototype = {
+    run: function() {
+        try {
+            var html = this.$breadcrumbs.html();
+
+            html = html.replace(/›/g, '<span class="icon-arrow-right breadcrumbs-separator"></span>');
+
+            this.$breadcrumbs.html(html);
+        } catch (e) {
+            console.error(e);
+        }
+
+        this.$breadcrumbs.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    $('.breadcrumbs').each(function() {
+        new BreadcrumbsUpdater($(this)).run();
+    });
+});

+ 91 - 0
jet/static/jet/js/src/layout-updaters/paginator.js

@@ -0,0 +1,91 @@
+var $ = require('jquery');
+
+var PaginatorUpdater = function($paginator) {
+    this.$paginator = $paginator;
+};
+
+PaginatorUpdater.prototype = {
+    removeSpacesBetweenPages: function() {
+        this.$paginator.contents().each(function() {
+            if (this.nodeType != 3) {
+                return;
+            }
+
+            var $node = $(this);
+
+            if (($node.prev().prop('tagName') == 'A' || $node.prev().prop('tagName') == 'SPAN')
+                && ($node.next().prop('tagName') == 'A' || $node.next().prop('tagName') == 'SPAN')) {
+
+                if ($.trim($node.text()) == '...') {
+                    $node.wrap($('<span>').addClass('disabled'));
+                } else {
+                    $node.remove();
+                }
+            }
+        });
+    },
+    wrapPages: function() {
+        var foundPage = false;
+        var pagesEnded = false;
+        var $pageNodes = $([]);
+
+        this.$paginator.contents().each(function() {
+            var pageNode = this.tagName == 'A' || this.tagName == 'SPAN';
+
+            if (pageNode) {
+                foundPage = true;
+            }
+
+            if (!foundPage) {
+                return;
+            }
+
+            if (pageNode && !pagesEnded) {
+                var $node = $(this);
+
+                $node.remove();
+                $pageNodes = $pageNodes.add($node);
+            } else {
+                pagesEnded = true
+            }
+        });
+
+        this.$paginator.prepend($('<span>').addClass('pages-wrapper').append($pageNodes));
+    },
+    moveTextNodes: function() {
+        var foundPage = false;
+        var $nodes = $([]);
+
+        this.$paginator.contents().each(function() {
+            var pageNode = this.tagName == 'A' || this.tagName == 'SPAN';
+
+            if (pageNode) {
+                foundPage = true;
+            } else if (foundPage && !pageNode && this.tagName != 'INPUT') {
+                var $node = $(this);
+
+                $node.remove();
+                $nodes = $nodes.add($node);
+            }
+        });
+
+        this.$paginator.prepend($nodes);
+    },
+    run: function() {
+        try {
+            this.removeSpacesBetweenPages();
+            this.wrapPages();
+            this.moveTextNodes();
+        } catch (e) {
+            console.error(e);
+        }
+
+        this.$paginator.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    $('.paginator').each(function() {
+        new PaginatorUpdater($(this)).run();
+    });
+});

+ 115 - 0
jet/static/jet/js/src/layout-updaters/toolbar.js

@@ -0,0 +1,115 @@
+var $ = require('jquery');
+
+var ToolbarUpdater = function() { };
+
+ToolbarUpdater.prototype = {
+    moveToolbar: function($toolbar) {
+        $toolbar.remove();
+        $('#content-main').prepend($toolbar);
+    },
+    updateToolbar: function($toolbar) {
+        var placeholder = $toolbar.find('input[type="submit"]').val();
+        $toolbar.find('#searchbar').attr('placeholder', placeholder);
+    },
+    moveFilters: function($changelist) {
+        var filterName;
+        var $toolbar = $('#toolbar');
+
+        if ($toolbar.length == 0) {
+            $toolbar = $('<div>').attr('id', 'toolbar');
+            $('#content-main').prepend($toolbar);
+        }
+
+        var $search = $toolbar.find('#searchbar');
+
+        $changelist.find('#changelist-filter').children().each(function() {
+            var $element = $(this);
+
+            if ($element.prop('tagName') == 'H3') {
+                filterName = $element.text();
+            } else if ($element.prop('tagName') == 'UL') {
+                var $select = $('<select>').addClass('changelist-filter-select');
+
+                $element.find('li').each(function(i) {
+                    var $item = $(this);
+                    var $link = $item.find('a');
+                    var $option = $('<option>')
+                        .text($link.text())
+                        .attr('data-url', $link.attr('href'))
+                        .attr('selected', $item.hasClass('selected'));
+
+                    if (i == 0 ) {
+                        if (filterName != null) {
+                            $option.text(filterName)
+                        }
+
+                        var $separator = $('<option>')
+                            .attr('disabled', true)
+                            .text('---');
+
+                        $option = $option.add($separator);
+                    }
+
+                    $select.append($option);
+                });
+
+                var $wrapper = $('<span>')
+                    .addClass('changelist-filter-select-wrapper')
+                    .append($select);
+
+                if ($search.length) {
+                    $wrapper.insertAfter($search);
+                } else {
+                    $toolbar.append($wrapper);
+                }
+
+                filterName = null;
+            }
+        });
+
+        $changelist.find('#changelist-filter').remove();
+    },
+    fixFloatLineBreak: function() {
+        $('#content-main').each(function() {
+            var $content = $(this);
+
+            $.each(['.object-tools', '#toolbar', 'changeform-navigation'], function(i, selector) {
+                var $element = $content.find(selector).first();
+
+                if ($element.length == 0) {
+                    return;
+                }
+
+                $('<div>')
+                    .addClass('clear')
+                    .insertAfter($element);
+
+                return false;
+            });
+        });
+    },
+    run: function() {
+        var $changelist = $('#changelist');
+        var $toolbar = $changelist.find('#toolbar');
+
+        try {
+            this.moveToolbar($toolbar);
+            this.updateToolbar($toolbar);
+            this.moveFilters($changelist);
+        } catch (e) {
+            console.error(e);
+        }
+
+        try {
+            this.fixFloatLineBreak();
+        } catch (e) {
+            console.error(e);
+        }
+
+        $toolbar.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    new ToolbarUpdater().run();
+});

+ 44 - 0
jet/static/jet/js/src/layout-updaters/user-tools.js

@@ -0,0 +1,44 @@
+var $ = require('jquery');
+
+var UserToolsUpdater = function($usertools) {
+    this.$usertools = $usertools;
+};
+
+UserToolsUpdater.prototype = {
+    updateUserTools: function($usertools) {
+        var $list = $('<ul>');
+        var user = $usertools.find('strong').first().text();
+
+        $('<li>').addClass('user-tools-welcome-msg').text(user).appendTo($list);
+
+        $usertools.find('a').each(function() {
+            var $link = $(this);
+            $('<li>').addClass('user-tools-link').html($link).appendTo($list);
+        });
+
+        $usertools.empty().addClass('user-tools').append($list);
+
+        $list.on('mouseenter', function() {
+            $list.addClass('opened');
+        });
+
+        $list.on('mouseleave', function() {
+            $list.removeClass('opened');
+        });
+    },
+    run: function() {
+        try {
+            this.updateUserTools(this.$usertools);
+        } catch (e) {
+            console.error(e);
+        }
+
+        this.$usertools.addClass('initialized');
+    }
+};
+
+$(document).ready(function() {
+    $('#user-tools').each(function() {
+        new UserToolsUpdater($(this)).run();
+    });
+});

+ 20 - 0
jet/static/jet/js/src/main.js

@@ -0,0 +1,20 @@
+require('./layout-updaters/actions');
+require('./layout-updaters/breadcrumbs');
+require('./layout-updaters/paginator');
+require('./layout-updaters/toolbar');
+require('./layout-updaters/user-tools');
+require('./features/side-menu');
+require('./features/filters');
+require('./features/changeform-tabs');
+require('./features/checkboxes');
+require('./features/delete-objects');
+require('./features/date-time-widgets');
+require('./features/inlines');
+require('./features/changelist');
+require('./features/tooltips');
+require('./features/dashboard');
+require('./features/changeform');
+require('./features/themes');
+require('./features/related-objects');
+require('./features/siblings');
+require('./features/selects');

+ 7 - 0
jet/static/jet/js/src/utils/jquery-icontains.js

@@ -0,0 +1,7 @@
+var $ = require('jquery');
+
+$.expr[":"].icontains = $.expr.createPseudo(function (arg) {
+    return function (elem) {
+        return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
+    };
+});

+ 5 - 0
jet/static/jet/js/src/utils/jquery-slidefade.js

@@ -0,0 +1,5 @@
+var $ = require('jquery');
+
+$.fn.slideFadeToggle = function(speed, easing, callback) {
+    return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback);
+};

+ 0 - 2
jet/static/jet/vendor/jquery-cookie/jquery.cookie-1.4.1.min.js

@@ -1,2 +0,0 @@
-/*! jquery.cookie v1.4.1 | MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});

+ 0 - 278
jet/static/jet/vendor/jquery-ui-timepicker/GPL-LICENSE.txt

@@ -1,278 +0,0 @@
-GNU GENERAL PUBLIC LICENSE
-Version 2, June 1991
-
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-Preamble
-
-The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-        the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-        this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-    distribute and/or modify the software.
-
-    Also, for each author's protection and ours, we want to make certain
-    that everyone understands that there is no warranty for this free
-    software.  If the software is modified by someone else and passed on, we
-    want its recipients to know that what they have is not the original, so
-    that any problems introduced by others will not reflect on the original
-    authors' reputations.
-
-    Finally, any free program is threatened constantly by software
-    patents.  We wish to avoid the danger that redistributors of a free
-    program will individually obtain patent licenses, in effect making the
-    program proprietary.  To prevent this, we have made it clear that any
-    patent must be licensed for everyone's free use or not licensed at all.
-
-    The precise terms and conditions for copying, distribution and
-    modification follow.
-
-    GNU GENERAL PUBLIC LICENSE
-    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-    0. This License applies to any program or other work which contains
-    a notice placed by the copyright holder saying it may be distributed
-    under the terms of this General Public License.  The "Program", below,
-    refers to any such program or work, and a "work based on the Program"
-    means either the Program or any derivative work under copyright law:
-    that is to say, a work containing the Program or a portion of it,
-    either verbatim or with modifications and/or translated into another
-    language.  (Hereinafter, translation is included without limitation in
-            the term "modification".)  Each licensee is addressed as "you".
-
-    Activities other than copying, distribution and modification are not
-    covered by this License; they are outside its scope.  The act of
-    running the Program is not restricted, and the output from the Program
-    is covered only if its contents constitute a work based on the
-    Program (independent of having been made by running the Program).
-    Whether that is true depends on what the Program does.
-
-    1. You may copy and distribute verbatim copies of the Program's
-    source code as you receive it, in any medium, provided that you
-    conspicuously and appropriately publish on each copy an appropriate
-    copyright notice and disclaimer of warranty; keep intact all the
-    notices that refer to this License and to the absence of any warranty;
-    and give any other recipients of the Program a copy of this License
-    along with the Program.
-
-    You may charge a fee for the physical act of transferring a copy, and
-    you may at your option offer warranty protection in exchange for a fee.
-
-    2. You may modify your copy or copies of the Program or any portion
-    of it, thus forming a work based on the Program, and copy and
-    distribute such modifications or work under the terms of Section 1
-    above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-            a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-            does not normally print such an announcement, your work based on
-            the Program is not required to print an announcement.)
-
-    These requirements apply to the modified work as a whole.  If
-    identifiable sections of that work are not derived from the Program,
-    and can be reasonably considered independent and separate works in
-    themselves, then this License, and its terms, do not apply to those
-    sections when you distribute them as separate works.  But when you
-    distribute the same sections as part of a whole which is a work based
-    on the Program, the distribution of the whole must be on the terms of
-    this License, whose permissions for other licensees extend to the
-    entire whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest
-    your rights to work written entirely by you; rather, the intent is to
-    exercise the right to control the distribution of derivative or
-    collective works based on the Program.
-
-    In addition, mere aggregation of another work not based on the Program
-    with the Program (or with a work based on the Program) on a volume of
-    a storage or distribution medium does not bring the other work under
-    the scope of this License.
-
-    3. You may copy and distribute the Program (or a work based on it,
-            under Section 2) in object code or executable form under the terms of
-    Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-            allowed only for noncommercial distribution and only if you
-            received the program in object code or executable form with such
-            an offer, in accord with Subsection b above.)
-
-    The source code for a work means the preferred form of the work for
-    making modifications to it.  For an executable work, complete source
-    code means all the source code for all modules it contains, plus any
-    associated interface definition files, plus the scripts used to
-    control compilation and installation of the executable.  However, as a
-    special exception, the source code distributed need not include
-    anything that is normally distributed (in either source or binary
-            form) with the major components (compiler, kernel, and so on) of the
-    operating system on which the executable runs, unless that component
-    itself accompanies the executable.
-
-    If distribution of executable or object code is made by offering
-    access to copy from a designated place, then offering equivalent
-    access to copy the source code from the same place counts as
-    distribution of the source code, even though third parties are not
-    compelled to copy the source along with the object code.
-
-    4. You may not copy, modify, sublicense, or distribute the Program
-    except as expressly provided under this License.  Any attempt
-    otherwise to copy, modify, sublicense or distribute the Program is
-    void, and will automatically terminate your rights under this License.
-    However, parties who have received copies, or rights, from you under
-    this License will not have their licenses terminated so long as such
-    parties remain in full compliance.
-
-    5. You are not required to accept this License, since you have not
-    signed it.  However, nothing else grants you permission to modify or
-    distribute the Program or its derivative works.  These actions are
-    prohibited by law if you do not accept this License.  Therefore, by
-    modifying or distributing the Program (or any work based on the
-            Program), you indicate your acceptance of this License to do so, and
-    all its terms and conditions for copying, distributing or modifying
-    the Program or works based on it.
-
-    6. Each time you redistribute the Program (or any work based on the
-            Program), the recipient automatically receives a license from the
-    original licensor to copy, distribute or modify the Program subject to
-    these terms and conditions.  You may not impose any further
-    restrictions on the recipients' exercise of the rights granted herein.
-    You are not responsible for enforcing compliance by third parties to
-    this License.
-
-    7. If, as a consequence of a court judgment or allegation of patent
-    infringement or for any other reason (not limited to patent issues),
-    conditions are imposed on you (whether by court order, agreement or
-            otherwise) that contradict the conditions of this License, they do not
-    excuse you from the conditions of this License.  If you cannot
-    distribute so as to satisfy simultaneously your obligations under this
-    License and any other pertinent obligations, then as a consequence you
-    may not distribute the Program at all.  For example, if a patent
-    license would not permit royalty-free redistribution of the Program by
-    all those who receive copies directly or indirectly through you, then
-    the only way you could satisfy both it and this License would be to
-    refrain entirely from distribution of the Program.
-
-    If any portion of this section is held invalid or unenforceable under
-    any particular circumstance, the balance of the section is intended to
-    apply and the section as a whole is intended to apply in other
-    circumstances.
-
-    It is not the purpose of this section to induce you to infringe any
-    patents or other property right claims or to contest validity of any
-    such claims; this section has the sole purpose of protecting the
-    integrity of the free software distribution system, which is
-    implemented by public license practices.  Many people have made
-    generous contributions to the wide range of software distributed
-    through that system in reliance on consistent application of that
-    system; it is up to the author/donor to decide if he or she is willing
-    to distribute software through any other system and a licensee cannot
-    impose that choice.
-
-    This section is intended to make thoroughly clear what is believed to
-    be a consequence of the rest of this License.
-
-    8. If the distribution and/or use of the Program is restricted in
-    certain countries either by patents or by copyrighted interfaces, the
-    original copyright holder who places the Program under this License
-    may add an explicit geographical distribution limitation excluding
-    those countries, so that distribution is permitted only in or among
-    countries not thus excluded.  In such case, this License incorporates
-    the limitation as if written in the body of this License.
-
-    9. The Free Software Foundation may publish revised and/or new versions
-    of the General Public License from time to time.  Such new versions will
-    be similar in spirit to the present version, but may differ in detail to
-    address new problems or concerns.
-
-    Each version is given a distinguishing version number.  If the Program
-    specifies a version number of this License which applies to it and "any
-    later version", you have the option of following the terms and conditions
-    either of that version or of any later version published by the Free
-    Software Foundation.  If the Program does not specify a version number of
-    this License, you may choose any version ever published by the Free Software
-    Foundation.
-
-    10. If you wish to incorporate parts of the Program into other free
-    programs whose distribution conditions are different, write to the author
-    to ask for permission.  For software which is copyrighted by the Free
-    Software Foundation, write to the Free Software Foundation; we sometimes
-    make exceptions for this.  Our decision will be guided by the two goals
-    of preserving the free status of all derivatives of our free software and
-    of promoting the sharing and reuse of software generally.
-
-    NO WARRANTY
-
-    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-    OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-    TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-    PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-    REPAIR OR CORRECTION.
-
-    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-    INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-    OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-            TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-            YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-            PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGES.""''''''

+ 0 - 20
jet/static/jet/vendor/jquery-ui-timepicker/MIT-LICENSE.txt

@@ -1,20 +0,0 @@
-Copyright (c) 2011 John Resig, http://jquery.com/
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 0 - 147
jet/static/jet/vendor/jquery-ui-timepicker/i18n/i18n.html

@@ -1,147 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <!-- Around the world, around the world -->
-    <!-- Around the world, around the world -->
-    <!-- Around the world, around the world -->
-    <!-- Around the world, around the world -->
-
-	<meta charset="utf-8">
-	<title>Internationalisation page for the jquery ui timepicker</title>
-
-    <script src="../include/jquery-1.5.1.min.js"></script>
-    <script src="../include/jquery.ui.core.min.js"></script>
-    <script src="../include/jquery.ui.widget.min.js"></script>
-    <script src="../jquery.ui.timepicker.js"></script>
-    
-    <link rel="stylesheet" href="../include/jquery-ui-1.8.14.custom.css" />
-    <link rel="stylesheet" href="../jquery.ui.timepicker.css" />
-    <style>
-        #timepicker { font-size: 10px }
-    </style>
-    <script src='jquery.ui.timepicker-cs.js'></script>
-    <script src='jquery.ui.timepicker-de.js'></script>
-    <script src='jquery.ui.timepicker-es.js'></script>
-
-    <script src='jquery.ui.timepicker-fr.js'></script>
-    <script src='jquery.ui.timepicker-hr.js'></script>
-    <script src='jquery.ui.timepicker-it.js'></script>
-    <script src='jquery.ui.timepicker-ja.js'></script>
-	<script src='jquery.ui.timepicker-nl.js'></script>
-    <script src='jquery.ui.timepicker-pl.js'></script>
-    <script src='jquery.ui.timepicker-pt-BR.js'></script>
-    <script src='jquery.ui.timepicker-sl.js'></script>
-    <script src='jquery.ui.timepicker-sv.js'></script>
-    <script src='jquery.ui.timepicker-tr.js'></script>
-</head>
-<body>
-
-    <script type="text/javascript">
-        $(document).ready(function() {
-
-            $.timepicker.setDefaults( $.timepicker.regional[ "" ] );
-
-            $('#timepicker').timepicker({
-                showCloseButton: true,
-                showNowButton: true,
-                showDeselectButton: true
-            });
-
-            $('#locale').change(updateLocale).keyup(updateLocale);
-
-        });
-
-        function updateLocale()
-        {
-            $('#timepicker').timepicker( "option",
-                        				$.timepicker.regional[ $( '#locale' ).val() ] );
-        }
-
-    </script>
-
-    Select a localisation :
-    <select id='locale'>
-        <option>Select a localisation</option>
-        
-        <option value='hr'>Croatian/Bosnian</option>
-        <option value='cs'>Czech</option>
-        <option value='de'>German (Deutsch)</option>
-		<option value='nl'>Dutch (Nederlands)</option>
-		<option value='fr'>Fran&ccedil;ais</option>
-        <option value='it'>Italian</option>
-        <option value='ja'>Japanese</option>
-        <option value='pl'>Polish</option>
-        <option value="pt-BR">Portuguese/Brazilian</option>
-        <option value='sl'>Slovenian</option>
-        <option value='es'>Spanish</option>
-        <option value='sv'>Swedish</option>
-        <option value='tr'>Turkish</option>
-    </select>
-
-    <br>
-
-    <div id="timepicker">
-
-    </div>
-
-    <br>
-
-    List of localisations : 
-<ul>
-
-    <li>
-        <a href="jquery.ui.timepicker-hr.js">Croatian/Bosnian (jquery.ui.timepicker.hr.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-cs.js">Czech (jquery.ui.timepicker-cs.js</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-de.js">German (Deutsch) (jquery.ui.timepicker-de.js)</a>
-    </li>
-
-	<li>
-     <a href="jquery.ui.timepicker-nl.js">Dutch (Nederlands) (jquery.ui.timepicker-nl.js)</a>
- 	</li>
-
-    <li>
-        <a href="jquery.ui.timepicker-fr.js">Fran&ccedil;ais (jquery.ui.timepicker-fr.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-it.js">Italian (jquery.ui.timepicker-it.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-ja.js">Japanese (jquery.ui.timepicker-ja.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-pl.js">Polish (jquery.ui.timepicker-pl.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-pt-BR.js">Portuguese/Brazilian (jquery.ui.timepicker-pt-BR.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-sl.js">Slovenian (jquery.ui.timepicker-sl.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-sv.js">Swedish (jquery.ui.timepicker-sv.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-es.js">Spanish (jquery.ui.timepicker-es.js)</a>
-    </li>
-
-    <li>
-        <a href="jquery.ui.timepicker-sv.js">Turkish (jquery.ui.timepicker-tr.js)</a>
-    </li>
-
-</ul>
-
-</body>
-</html>

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-cs.js

@@ -1,12 +0,0 @@
-/* Czech initialisation for the timepicker plugin */
-/* Written by David Spohr (spohr.david at gmail). */
-jQuery(function($){
-    $.timepicker.regional['cs'] = {
-                hourText: 'Hodiny',
-                minuteText: 'Minuty',
-                amPmText: ['AM', 'PM'] ,
-                closeButtonText: 'Zavřít',
-                nowButtonText: 'Nyní',
-                deselectButtonText: 'Odoznačit' }
-    $.timepicker.setDefaults($.timepicker.regional['cs']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-de.js

@@ -1,12 +0,0 @@
-/* German initialisation for the timepicker plugin */
-/* Written by Lowie Hulzinga. */
-jQuery(function($){
-    $.timepicker.regional['de'] = {
-                hourText: 'Stunde',
-                minuteText: 'Minuten',
-                amPmText: ['AM', 'PM'] ,
-                closeButtonText: 'Beenden',
-                nowButtonText: 'Aktuelle Zeit',
-                deselectButtonText: 'Wischen' }
-    $.timepicker.setDefaults($.timepicker.regional['de']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-es.js

@@ -1,12 +0,0 @@
-/* Spanish initialisation for the jQuery time picker plugin. */
-/* Writen by Jandro González (agonzalezalves@gmail.com) */
-jQuery(function($){
-    $.timepicker.regional['es'] = {
-                hourText: 'Hora',
-                minuteText: 'Minuto',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Aceptar',
-                nowButtonText: 'Ahora',
-                deselectButtonText: 'Deseleccionar' }
-    $.timepicker.setDefaults($.timepicker.regional['es']);
-});

+ 0 - 13
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-fr.js

@@ -1,13 +0,0 @@
-/* French initialisation for the jQuery time picker plugin. */
-/* Written by Bernd Plagge (bplagge@choicenet.ne.jp),
-              Francois Gelinas (frank@fgelinas.com) */
-jQuery(function($){
-    $.timepicker.regional['fr'] = {
-                hourText: 'Heures',
-                minuteText: 'Minutes',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Fermer',
-                nowButtonText: 'Maintenant',
-                deselectButtonText: 'Désélectionner' }
-    $.timepicker.setDefaults($.timepicker.regional['fr']);
-});

+ 0 - 13
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-hr.js

@@ -1,13 +0,0 @@
-/* Croatian/Bosnian initialisation for the timepicker plugin */
-/* Written by Rene Brakus (rene.brakus@infobip.com). */
-jQuery(function($){
-    $.timepicker.regional['hr'] = {
-                hourText: 'Sat',
-                minuteText: 'Minuta',
-                amPmText: ['Prijepodne', 'Poslijepodne'],
-                closeButtonText: 'Zatvoriti',
-                nowButtonText: 'Sada',
-                deselectButtonText: 'Poništite'}
-
-    $.timepicker.setDefaults($.timepicker.regional['hr']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-it.js

@@ -1,12 +0,0 @@
-/* Italian initialisation for the jQuery time picker plugin. */
-/* Written by Serge Margarita (serge.margarita@gmail.com) */
-jQuery(function($){
-    $.timepicker.regional['it'] = {
-                hourText: 'Ore',
-                minuteText: 'Minuti',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Chiudi',
-                nowButtonText: 'Adesso',
-                deselectButtonText: 'Svuota' }
-    $.timepicker.setDefaults($.timepicker.regional['it']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-ja.js

@@ -1,12 +0,0 @@
-/* Japanese initialisation for the jQuery time picker plugin. */
-/* Written by Bernd Plagge (bplagge@choicenet.ne.jp). */
-jQuery(function($){
-    $.timepicker.regional['ja'] = {
-                hourText: '時間',
-                minuteText: '分',
-                amPmText: ['午前', '午後'],
-                closeButtonText: '閉じる',
-                nowButtonText: '現時',
-                deselectButtonText: '選択解除' }
-    $.timepicker.setDefaults($.timepicker.regional['ja']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-nl.js

@@ -1,12 +0,0 @@
-/* Nederlands initialisation for the timepicker plugin */
-/* Written by Lowie Hulzinga. */
-jQuery(function($){
-    $.timepicker.regional['nl'] = {
-                hourText: 'Uren',
-                minuteText: 'Minuten',
-                amPmText: ['AM', 'PM'],
-				closeButtonText: 'Sluiten',
-				nowButtonText: 'Actuele tijd',
-				deselectButtonText: 'Wissen' }
-    $.timepicker.setDefaults($.timepicker.regional['nl']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-pl.js

@@ -1,12 +0,0 @@
-/* Polish initialisation for the timepicker plugin */
-/* Written by Mateusz Wadolkowski (mw@pcdoctor.pl). */
-jQuery(function($){
-    $.timepicker.regional['pl'] = {
-                hourText: 'Godziny',
-                minuteText: 'Minuty',
-                amPmText: ['', ''],
-				closeButtonText: 'Zamknij',
-                nowButtonText: 'Teraz',
-                deselectButtonText: 'Odznacz'}
-    $.timepicker.setDefaults($.timepicker.regional['pl']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-pt-BR.js

@@ -1,12 +0,0 @@
-/* Brazilan initialisation for the timepicker plugin */
-/* Written by Daniel Almeida (quantodaniel@gmail.com). */
-jQuery(function($){
-    $.timepicker.regional['pt-BR'] = {
-                hourText: 'Hora',
-                minuteText: 'Minuto',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Fechar',
-                nowButtonText: 'Agora',
-                deselectButtonText: 'Limpar' }
-    $.timepicker.setDefaults($.timepicker.regional['pt-BR']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-ru.js

@@ -1,12 +0,0 @@
-/* Russian initialisation for the timepicker plugin */
-/* Written by Denis Kildishev. */
-jQuery(function($){
-    $.timepicker.regional['ru'] = {
-                hourText: 'Час',
-                minuteText: 'Минута',
-                amPmText: ['AM', 'PM'] ,
-                closeButtonText: 'Закрыть',
-                nowButtonText: 'Сейчас',
-                deselectButtonText: 'Очистить' }
-    $.timepicker.setDefaults($.timepicker.regional['ru']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-sl.js

@@ -1,12 +0,0 @@
-/* Slovenian localization for the jQuery time picker plugin. */
-/* Written by  Blaž Maležič (blaz@malezic.si)              */
-jQuery(function($){
-    $.timepicker.regional['sl'] = {
-                hourText: 'Ure',
-                minuteText: 'Minute',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Zapri',
-                nowButtonText: 'Zdaj',
-                deselectButtonText: 'Pobriši' }
-    $.timepicker.setDefaults($.timepicker.regional['sl']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-sv.js

@@ -1,12 +0,0 @@
-/* Swedish initialisation for the timepicker plugin */
-/* Written by Björn Westlin (bjorn.westlin@su.se). */
-jQuery(function($){
-    $.timepicker.regional['sv'] = {
-                hourText: 'Timme',
-                minuteText: 'Minut',
-                amPmText: ['AM', 'PM'] ,
-                closeButtonText: 'Stäng',
-                nowButtonText: 'Nu',
-                deselectButtonText: 'Rensa' }
-    $.timepicker.setDefaults($.timepicker.regional['sv']);
-});

+ 0 - 12
jet/static/jet/vendor/jquery-ui-timepicker/i18n/jquery.ui.timepicker-tr.js

@@ -1,12 +0,0 @@
-/* Turkish initialisation for the jQuery time picker plugin. */
-/* Written by Mutlu Tevfik Koçak (mtkocak@gmail.com) */
-jQuery(function($){
-    $.timepicker.regional['tr'] = {
-                hourText: 'Saat',
-                minuteText: 'Dakika',
-                amPmText: ['AM', 'PM'],
-                closeButtonText: 'Kapat',
-                nowButtonText: 'Şu anda',
-                deselectButtonText: 'Seçimi temizle' }
-    $.timepicker.setDefaults($.timepicker.regional['tr']);
-});

File diff suppressed because it is too large
+ 0 - 72
jet/static/jet/vendor/jquery-ui-timepicker/index.html


+ 0 - 57
jet/static/jet/vendor/jquery-ui-timepicker/jquery.ui.timepicker.css

@@ -1,57 +0,0 @@
-/*
- * Timepicker stylesheet
- * Highly inspired from datepicker
- * FG - Nov 2010 - Web3R 
- *
- * version 0.0.3 : Fixed some settings, more dynamic
- * version 0.0.4 : Removed width:100% on tables
- * version 0.1.1 : set width 0 on tables to fix an ie6 bug
- */
-
-.ui-timepicker-inline { display: inline; }
-
-#ui-timepicker-div { padding: 0.2em; }
-.ui-timepicker-table { display: inline-table; width: 0; }
-.ui-timepicker-table table { margin:0.15em 0 0 0; border-collapse: collapse; }
-
-.ui-timepicker-hours, .ui-timepicker-minutes { padding: 0.2em;  }
-
-.ui-timepicker-table .ui-timepicker-title { line-height: 1.8em; text-align: center; }
-.ui-timepicker-table td { padding: 0.1em; width: 2.2em; }
-.ui-timepicker-table th.periods { padding: 0.1em; width: 2.2em; }
-
-/* span for disabled cells */
-.ui-timepicker-table td span {
-	display:block;
-    padding:0.2em 0.3em 0.2em 0.5em;
-    width: 1.2em;
-
-    text-align:right;
-    text-decoration:none;
-}
-/* anchors for clickable cells */
-.ui-timepicker-table td a {
-    display:block;
-    padding:0.2em 0.3em 0.2em 0.5em;
-    width: 1.2em;
-    cursor: pointer;
-    text-align:right;
-    text-decoration:none;
-}
-
-
-/* buttons and button pane styling */
-.ui-timepicker .ui-timepicker-buttonpane {
-    background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0;
-}
-.ui-timepicker .ui-timepicker-buttonpane button { margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-/* The close button */
-.ui-timepicker .ui-timepicker-close { float: right }
-
-/* the now button */
-.ui-timepicker .ui-timepicker-now { float: left; }
-
-/* the deselect button */
-.ui-timepicker .ui-timepicker-deselect { float: left; }
-
-

+ 0 - 1500
jet/static/jet/vendor/jquery-ui-timepicker/jquery.ui.timepicker.js

@@ -1,1500 +0,0 @@
-/*
- * jQuery UI Timepicker
- *
- * Copyright 2010-2013, Francois Gelinas
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://fgelinas.com/code/timepicker
- *
- * Depends:
- *	jquery.ui.core.js
- *  jquery.ui.position.js (only if position settings are used)
- *
- * Change version 0.1.0 - moved the t-rex up here
- *
-                                                  ____
-       ___                                      .-~. /_"-._
-      `-._~-.                                  / /_ "~o\  :Y
-          \  \                                / : \~x.  ` ')
-           ]  Y                              /  |  Y< ~-.__j
-          /   !                        _.--~T : l  l<  /.-~
-         /   /                 ____.--~ .   ` l /~\ \<|Y
-        /   /             .-~~"        /| .    ',-~\ \L|
-       /   /             /     .^   \ Y~Y \.^>/l_   "--'
-      /   Y           .-"(  .  l__  j_j l_/ /~_.-~    .
-     Y    l          /    \  )    ~~~." / `/"~ / \.__/l_
-     |     \     _.-"      ~-{__     l  :  l._Z~-.___.--~
-     |      ~---~           /   ~~"---\_  ' __[>
-     l  .                _.^   ___     _>-y~
-      \  \     .      .-~   .-~   ~>--"  /
-       \  ~---"            /     ./  _.-'
-        "-.,_____.,_  _.--~\     _.-~
-                    ~~     (   _}       -Row
-                           `. ~(
-                             )  \
-                            /,`--'~\--'~\
-                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-                             ->T-Rex<-
-*/
-
-(function ($) {
-
-    $.extend($.ui, { timepicker: { version: "0.3.3"} });
-
-    var PROP_NAME = 'timepicker',
-        tpuuid = new Date().getTime();
-
-    /* Time picker manager.
-    Use the singleton instance of this class, $.timepicker, to interact with the time picker.
-    Settings for (groups of) time pickers are maintained in an instance object,
-    allowing multiple different settings on the same page. */
-
-    function Timepicker() {
-        this.debug = true; // Change this to true to start debugging
-        this._curInst = null; // The current instance in use
-        this._disabledInputs = []; // List of time picker inputs that have been disabled
-        this._timepickerShowing = false; // True if the popup picker is showing , false if not
-        this._inDialog = false; // True if showing within a "dialog", false if not
-        this._dialogClass = 'ui-timepicker-dialog'; // The name of the dialog marker class
-        this._mainDivId = 'ui-timepicker-div'; // The ID of the main timepicker division
-        this._inlineClass = 'ui-timepicker-inline'; // The name of the inline marker class
-        this._currentClass = 'ui-timepicker-current'; // The name of the current hour / minutes marker class
-        this._dayOverClass = 'ui-timepicker-days-cell-over'; // The name of the day hover marker class
-
-        this.regional = []; // Available regional settings, indexed by language code
-        this.regional[''] = { // Default regional settings
-            hourText: 'Hour',           // Display text for hours section
-            minuteText: 'Minute',       // Display text for minutes link
-            amPmText: ['AM', 'PM'],     // Display text for AM PM
-            closeButtonText: 'Done',        // Text for the confirmation button (ok button)
-            nowButtonText: 'Now',           // Text for the now button
-            deselectButtonText: 'Deselect'  // Text for the deselect button
-        };
-        this._defaults = { // Global defaults for all the time picker instances
-            showOn: 'focus',    // 'focus' for popup on focus,
-                                // 'button' for trigger button, or 'both' for either (not yet implemented)
-            button: null,                   // 'button' element that will trigger the timepicker
-            showAnim: 'fadeIn',             // Name of jQuery animation for popup
-            showOptions: {},                // Options for enhanced animations
-            appendText: '',                 // Display text following the input box, e.g. showing the format
-
-            beforeShow: null,               // Define a callback function executed before the timepicker is shown
-            onSelect: null,                 // Define a callback function when a hour / minutes is selected
-            onClose: null,                  // Define a callback function when the timepicker is closed
-
-            timeSeparator: ':',             // The character to use to separate hours and minutes.
-            periodSeparator: ' ',           // The character to use to separate the time from the time period.
-            showPeriod: false,              // Define whether or not to show AM/PM with selected time
-            showPeriodLabels: true,         // Show the AM/PM labels on the left of the time picker
-            showLeadingZero: true,          // Define whether or not to show a leading zero for hours < 10. [true/false]
-            showMinutesLeadingZero: true,   // Define whether or not to show a leading zero for minutes < 10.
-            altField: '',                   // Selector for an alternate field to store selected time into
-            defaultTime: 'now',             // Used as default time when input field is empty or for inline timePicker
-                                            // (set to 'now' for the current time, '' for no highlighted time)
-            myPosition: 'left top',         // Position of the dialog relative to the input.
-                                            // see the position utility for more info : http://jqueryui.com/demos/position/
-            atPosition: 'left bottom',      // Position of the input element to match
-                                            // Note : if the position utility is not loaded, the timepicker will attach left top to left bottom
-            //NEW: 2011-02-03
-            onHourShow: null,			    // callback for enabling / disabling on selectable hours  ex : function(hour) { return true; }
-            onMinuteShow: null,             // callback for enabling / disabling on time selection  ex : function(hour,minute) { return true; }
-
-            hours: {
-                starts: 0,                  // first displayed hour
-                ends: 23                    // last displayed hour
-            },
-            minutes: {
-                starts: 0,                  // first displayed minute
-                ends: 55,                   // last displayed minute
-                interval: 5,                // interval of displayed minutes
-                manual: []                  // optional extra manual entries for minutes
-            },
-            rows: 4,                        // number of rows for the input tables, minimum 2, makes more sense if you use multiple of 2
-            // 2011-08-05 0.2.4
-            showHours: true,                // display the hours section of the dialog
-            showMinutes: true,              // display the minute section of the dialog
-            optionalMinutes: false,         // optionally parse inputs of whole hours with minutes omitted
-
-            // buttons
-            showCloseButton: false,         // shows an OK button to confirm the edit
-            showNowButton: false,           // Shows the 'now' button
-            showDeselectButton: false,       // Shows the deselect time button
-            
-            maxTime: {
-                hour: null,
-                minute: null
-            },
-            minTime: {
-                hour: null,
-                minute: null
-            }
-			
-        };
-        $.extend(this._defaults, this.regional['']);
-
-        this.tpDiv = $('<div id="' + this._mainDivId + '" class="ui-timepicker ui-widget ui-helper-clearfix ui-corner-all " style="display: none"></div>');
-    }
-
-    $.extend(Timepicker.prototype, {
-        /* Class name added to elements to indicate already configured with a time picker. */
-        markerClassName: 'hasTimepicker',
-
-        /* Debug logging (if enabled). */
-        log: function () {
-            if (this.debug)
-                console.log.apply('', arguments);
-        },
-
-        _widgetTimepicker: function () {
-            return this.tpDiv;
-        },
-
-        /* Override the default settings for all instances of the time picker.
-        @param  settings  object - the new settings to use as defaults (anonymous object)
-        @return the manager object */
-        setDefaults: function (settings) {
-            extendRemove(this._defaults, settings || {});
-            return this;
-        },
-
-        /* Attach the time picker to a jQuery selection.
-        @param  target    element - the target input field or division or span
-        @param  settings  object - the new settings to use for this time picker instance (anonymous) */
-        _attachTimepicker: function (target, settings) {
-            // check for settings on the control itself - in namespace 'time:'
-            var inlineSettings = null;
-            for (var attrName in this._defaults) {
-                var attrValue = target.getAttribute('time:' + attrName);
-                if (attrValue) {
-                    inlineSettings = inlineSettings || {};
-                    try {
-                        inlineSettings[attrName] = eval(attrValue);
-                    } catch (err) {
-                        inlineSettings[attrName] = attrValue;
-                    }
-                }
-            }
-            var nodeName = target.nodeName.toLowerCase();
-            var inline = (nodeName == 'div' || nodeName == 'span');
-
-            if (!target.id) {
-                this.uuid += 1;
-                target.id = 'tp' + this.uuid;
-            }
-            var inst = this._newInst($(target), inline);
-            inst.settings = $.extend({}, settings || {}, inlineSettings || {});
-            if (nodeName == 'input') {
-                this._connectTimepicker(target, inst);
-                // init inst.hours and inst.minutes from the input value
-                this._setTimeFromField(inst);
-            } else if (inline) {
-                this._inlineTimepicker(target, inst);
-            }
-
-
-        },
-
-        /* Create a new instance object. */
-        _newInst: function (target, inline) {
-            var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
-            return {
-                id: id, input: target, // associated target
-                inline: inline, // is timepicker inline or not :
-                tpDiv: (!inline ? this.tpDiv : // presentation div
-                    $('<div class="' + this._inlineClass + ' ui-timepicker ui-widget  ui-helper-clearfix"></div>'))
-            };
-        },
-
-        /* Attach the time picker to an input field. */
-        _connectTimepicker: function (target, inst) {
-            var input = $(target);
-            inst.append = $([]);
-            inst.trigger = $([]);
-            if (input.hasClass(this.markerClassName)) { return; }
-            this._attachments(input, inst);
-            input.addClass(this.markerClassName).
-                keydown(this._doKeyDown).
-                keyup(this._doKeyUp).
-                bind("setData.timepicker", function (event, key, value) {
-                    inst.settings[key] = value;
-                }).
-                bind("getData.timepicker", function (event, key) {
-                    return this._get(inst, key);
-                });
-            $.data(target, PROP_NAME, inst);
-        },
-
-        /* Handle keystrokes. */
-        _doKeyDown: function (event) {
-            var inst = $.timepicker._getInst(event.target);
-            var handled = true;
-            inst._keyEvent = true;
-            if ($.timepicker._timepickerShowing) {
-                switch (event.keyCode) {
-                    case 9: $.timepicker._hideTimepicker();
-                        handled = false;
-                        break; // hide on tab out
-                    case 13:
-                        $.timepicker._updateSelectedValue(inst);
-                        $.timepicker._hideTimepicker();
-
-						return false; // don't submit the form
-						break; // select the value on enter
-                    case 27: $.timepicker._hideTimepicker();
-                        break; // hide on escape
-                    default: handled = false;
-                }
-            }
-            else if (event.keyCode == 36 && event.ctrlKey) { // display the time picker on ctrl+home
-                $.timepicker._showTimepicker(this);
-            }
-            else {
-                handled = false;
-            }
-            if (handled) {
-                event.preventDefault();
-                event.stopPropagation();
-            }
-        },
-
-        /* Update selected time on keyUp */
-        /* Added verion 0.0.5 */
-        _doKeyUp: function (event) {
-            var inst = $.timepicker._getInst(event.target);
-            $.timepicker._setTimeFromField(inst);
-            $.timepicker._updateTimepicker(inst);
-        },
-
-        /* Make attachments based on settings. */
-        _attachments: function (input, inst) {
-            var appendText = this._get(inst, 'appendText');
-            var isRTL = this._get(inst, 'isRTL');
-            if (inst.append) { inst.append.remove(); }
-            if (appendText) {
-                inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
-                input[isRTL ? 'before' : 'after'](inst.append);
-            }
-            input.unbind('focus.timepicker', this._showTimepicker);
-            input.unbind('click.timepicker', this._adjustZIndex);
-
-            if (inst.trigger) { inst.trigger.remove(); }
-
-            var showOn = this._get(inst, 'showOn');
-            if (showOn == 'focus' || showOn == 'both') { // pop-up time picker when in the marked field
-                input.bind("focus.timepicker", this._showTimepicker);
-                input.bind("click.timepicker", this._adjustZIndex);
-            }
-            if (showOn == 'button' || showOn == 'both') { // pop-up time picker when 'button' element is clicked
-                var button = this._get(inst, 'button');
-
-                // Add button if button element is not set
-                if(button == null) {
-                    button = $('<button class="ui-timepicker-trigger" type="button">...</button>');
-                    input.after(button);
-                }
-
-                $(button).bind("click.timepicker", function () {
-                    if ($.timepicker._timepickerShowing && $.timepicker._lastInput == input[0]) {
-                        $.timepicker._hideTimepicker();
-                    } else if (!inst.input.is(':disabled')) {
-                        $.timepicker._showTimepicker(input[0]);
-                    }
-                    return false;
-                });
-
-            }
-        },
-
-
-        /* Attach an inline time picker to a div. */
-        _inlineTimepicker: function(target, inst) {
-            var divSpan = $(target);
-            if (divSpan.hasClass(this.markerClassName))
-                return;
-            divSpan.addClass(this.markerClassName).append(inst.tpDiv).
-                bind("setData.timepicker", function(event, key, value){
-                    inst.settings[key] = value;
-                }).bind("getData.timepicker", function(event, key){
-                    return this._get(inst, key);
-                });
-            $.data(target, PROP_NAME, inst);
-
-            this._setTimeFromField(inst);
-            this._updateTimepicker(inst);
-            inst.tpDiv.show();
-        },
-
-        _adjustZIndex: function(input) {
-            input = input.target || input;
-            var inst = $.timepicker._getInst(input);
-            inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
-        },
-
-        /* Pop-up the time picker for a given input field.
-        @param  input  element - the input field attached to the time picker or
-        event - if triggered by focus */
-        _showTimepicker: function (input) {
-            input = input.target || input;
-            if (input.nodeName.toLowerCase() != 'input') { input = $('input', input.parentNode)[0]; } // find from button/image trigger
-
-            if ($.timepicker._isDisabledTimepicker(input) || $.timepicker._lastInput == input) { return; } // already here
-
-            // fix v 0.0.8 - close current timepicker before showing another one
-            $.timepicker._hideTimepicker();
-
-            var inst = $.timepicker._getInst(input);
-            if ($.timepicker._curInst && $.timepicker._curInst != inst) {
-                $.timepicker._curInst.tpDiv.stop(true, true);
-            }
-            var beforeShow = $.timepicker._get(inst, 'beforeShow');
-            extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
-            inst.lastVal = null;
-            $.timepicker._lastInput = input;
-
-            $.timepicker._setTimeFromField(inst);
-
-            // calculate default position
-            if ($.timepicker._inDialog) { input.value = ''; } // hide cursor
-            if (!$.timepicker._pos) { // position below input
-                $.timepicker._pos = $.timepicker._findPos(input);
-                $.timepicker._pos[1] += input.offsetHeight; // add the height
-            }
-            var isFixed = false;
-            $(input).parents().each(function () {
-                isFixed |= $(this).css('position') == 'fixed';
-                return !isFixed;
-            });
-
-            var offset = { left: $.timepicker._pos[0], top: $.timepicker._pos[1] };
-
-            $.timepicker._pos = null;
-            // determine sizing offscreen
-            inst.tpDiv.css({ position: 'absolute', display: 'block', top: '-1000px' });
-            $.timepicker._updateTimepicker(inst);
-
-
-            // position with the ui position utility, if loaded
-            if ( ( ! inst.inline )  && ( typeof $.ui.position == 'object' ) ) {
-                inst.tpDiv.position({
-                    of: inst.input,
-                    my: $.timepicker._get( inst, 'myPosition' ),
-                    at: $.timepicker._get( inst, 'atPosition' ),
-                    // offset: $( "#offset" ).val(),
-                    // using: using,
-                    collision: 'flip'
-                });
-                var offset = inst.tpDiv.offset();
-                $.timepicker._pos = [offset.top, offset.left];
-            }
-
-
-            // reset clicked state
-            inst._hoursClicked = false;
-            inst._minutesClicked = false;
-
-            // fix width for dynamic number of time pickers
-            // and adjust position before showing
-            offset = $.timepicker._checkOffset(inst, offset, isFixed);
-            inst.tpDiv.css({ position: ($.timepicker._inDialog && $.blockUI ?
-			    'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
-                left: offset.left + 'px', top: offset.top + 'px'
-            });
-            if ( ! inst.inline ) {
-                var showAnim = $.timepicker._get(inst, 'showAnim');
-                var duration = $.timepicker._get(inst, 'duration');
-
-                var postProcess = function () {
-                    $.timepicker._timepickerShowing = true;
-                    var borders = $.timepicker._getBorders(inst.tpDiv);
-                    inst.tpDiv.find('iframe.ui-timepicker-cover'). // IE6- only
-					css({ left: -borders[0], top: -borders[1],
-					    width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
-					});
-                };
-
-                // Fixed the zIndex problem for real (I hope) - FG - v 0.2.9
-                $.timepicker._adjustZIndex(input);
-                //inst.tpDiv.css('zIndex', $.timepicker._getZIndex(input) +1);
-
-                if ($.effects && $.effects[showAnim]) {
-                    inst.tpDiv.show(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
-                }
-                else {
-                    inst.tpDiv.show((showAnim ? duration : null), postProcess);
-                }
-                if (!showAnim || !duration) { postProcess(); }
-                if (inst.input.is(':visible') && !inst.input.is(':disabled')) { inst.input.focus(); }
-                $.timepicker._curInst = inst;
-            }
-        },
-
-        // This is an enhanced copy of the zIndex function of UI core 1.8.?? For backward compatibility.
-        // Enhancement returns maximum zindex value discovered while traversing parent elements,
-        // rather than the first zindex value found. Ensures the timepicker popup will be in front,
-        // even in funky scenarios like non-jq dialog containers with large fixed zindex values and
-        // nested zindex-influenced elements of their own.
-        _getZIndex: function (target) {
-            var elem = $(target);
-            var maxValue = 0;
-            var position, value;
-            while (elem.length && elem[0] !== document) {
-                position = elem.css("position");
-                if (position === "absolute" || position === "relative" || position === "fixed") {
-                    value = parseInt(elem.css("zIndex"), 10);
-                    if (!isNaN(value) && value !== 0) {
-                        if (value > maxValue) { maxValue = value; }
-                    }
-                }
-                elem = elem.parent();
-            }
-
-            return maxValue;
-        },
-
-        /* Refresh the time picker
-           @param   target  element - The target input field or inline container element. */
-        _refreshTimepicker: function(target) {
-            var inst = this._getInst(target);
-            if (inst) {
-                this._updateTimepicker(inst);
-            }
-        },
-
-
-        /* Generate the time picker content. */
-        _updateTimepicker: function (inst) {
-            inst.tpDiv.empty().append(this._generateHTML(inst));
-            this._rebindDialogEvents(inst);
-
-        },
-
-        _rebindDialogEvents: function (inst) {
-            var borders = $.timepicker._getBorders(inst.tpDiv),
-                self = this;
-            inst.tpDiv
-			.find('iframe.ui-timepicker-cover') // IE6- only
-				.css({ left: -borders[0], top: -borders[1],
-				    width: inst.tpDiv.outerWidth(), height: inst.tpDiv.outerHeight()
-				})
-			.end()
-            // after the picker html is appended bind the click & double click events (faster in IE this way
-            // then letting the browser interpret the inline events)
-            // the binding for the minute cells also exists in _updateMinuteDisplay
-            .find('.ui-timepicker-minute-cell')
-                .unbind()
-                .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
-                .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this))
-            .end()
-            .find('.ui-timepicker-hour-cell')
-                .unbind()
-                .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectHours, this))
-                .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectHours, this))
-            .end()
-			.find('.ui-timepicker td a')
-                .unbind()
-				.bind('mouseout', function () {
-				    $(this).removeClass('ui-state-hover');
-				    if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).removeClass('ui-timepicker-prev-hover');
-				    if (this.className.indexOf('ui-timepicker-next') != -1) $(this).removeClass('ui-timepicker-next-hover');
-				})
-				.bind('mouseover', function () {
-				    if ( ! self._isDisabledTimepicker(inst.inline ? inst.tpDiv.parent()[0] : inst.input[0])) {
-				        $(this).parents('.ui-timepicker-calendar').find('a').removeClass('ui-state-hover');
-				        $(this).addClass('ui-state-hover');
-				        if (this.className.indexOf('ui-timepicker-prev') != -1) $(this).addClass('ui-timepicker-prev-hover');
-				        if (this.className.indexOf('ui-timepicker-next') != -1) $(this).addClass('ui-timepicker-next-hover');
-				    }
-				})
-			.end()
-			.find('.' + this._dayOverClass + ' a')
-				.trigger('mouseover')
-			.end()
-            .find('.ui-timepicker-now').bind("click", function(e) {
-                    $.timepicker.selectNow(e);
-            }).end()
-            .find('.ui-timepicker-deselect').bind("click",function(e) {
-                    $.timepicker.deselectTime(e);
-            }).end()
-            .find('.ui-timepicker-close').bind("click",function(e) {
-                    $.timepicker._hideTimepicker();
-            }).end();
-        },
-
-        /* Generate the HTML for the current state of the time picker. */
-        _generateHTML: function (inst) {
-
-            var h, m, row, col, html, hoursHtml, minutesHtml = '',
-                showPeriod = (this._get(inst, 'showPeriod') == true),
-                showPeriodLabels = (this._get(inst, 'showPeriodLabels') == true),
-                showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
-                showHours = (this._get(inst, 'showHours') == true),
-                showMinutes = (this._get(inst, 'showMinutes') == true),
-                amPmText = this._get(inst, 'amPmText'),
-                rows = this._get(inst, 'rows'),
-                amRows = 0,
-                pmRows = 0,
-                amItems = 0,
-                pmItems = 0,
-                amFirstRow = 0,
-                pmFirstRow = 0,
-                hours = Array(),
-                hours_options = this._get(inst, 'hours'),
-                hoursPerRow = null,
-                hourCounter = 0,
-                hourLabel = this._get(inst, 'hourText'),
-                showCloseButton = this._get(inst, 'showCloseButton'),
-                closeButtonText = this._get(inst, 'closeButtonText'),
-                showNowButton = this._get(inst, 'showNowButton'),
-                nowButtonText = this._get(inst, 'nowButtonText'),
-                showDeselectButton = this._get(inst, 'showDeselectButton'),
-                deselectButtonText = this._get(inst, 'deselectButtonText'),
-                showButtonPanel = showCloseButton || showNowButton || showDeselectButton;
-
-
-
-            // prepare all hours and minutes, makes it easier to distribute by rows
-            for (h = hours_options.starts; h <= hours_options.ends; h++) {
-                hours.push (h);
-            }
-            hoursPerRow = Math.ceil(hours.length / rows); // always round up
-
-            if (showPeriodLabels) {
-                for (hourCounter = 0; hourCounter < hours.length; hourCounter++) {
-                    if (hours[hourCounter] < 12) {
-                        amItems++;
-                    }
-                    else {
-                        pmItems++;
-                    }
-                }
-                hourCounter = 0;
-
-                amRows = Math.floor(amItems / hours.length * rows);
-                pmRows = Math.floor(pmItems / hours.length * rows);
-
-                // assign the extra row to the period that is more densely populated
-                if (rows != amRows + pmRows) {
-                    // Make sure: AM Has Items and either PM Does Not, AM has no rows yet, or AM is more dense
-                    if (amItems && (!pmItems || !amRows || (pmRows && amItems / amRows >= pmItems / pmRows))) {
-                        amRows++;
-                    } else {
-                        pmRows++;
-                    }
-                }
-                amFirstRow = Math.min(amRows, 1);
-                pmFirstRow = amRows + 1;
-
-                if (amRows == 0) {
-                    hoursPerRow = Math.ceil(pmItems / pmRows);
-                } else if (pmRows == 0) {
-                    hoursPerRow = Math.ceil(amItems / amRows);
-                } else {
-                    hoursPerRow = Math.ceil(Math.max(amItems / amRows, pmItems / pmRows));
-                }
-            }
-
-
-            html = '<table class="ui-timepicker-table ui-widget-content ui-corner-all"><tr>';
-
-            if (showHours) {
-
-                html += '<td class="ui-timepicker-hours">' +
-                        '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
-                        hourLabel +
-                        '</div>' +
-                        '<table class="ui-timepicker">';
-
-                for (row = 1; row <= rows; row++) {
-                    html += '<tr>';
-                    // AM
-                    if (row == amFirstRow && showPeriodLabels) {
-                        html += '<th rowspan="' + amRows.toString() + '" class="periods" scope="row">' + amPmText[0] + '</th>';
-                    }
-                    // PM
-                    if (row == pmFirstRow && showPeriodLabels) {
-                        html += '<th rowspan="' + pmRows.toString() + '" class="periods" scope="row">' + amPmText[1] + '</th>';
-                    }
-                    for (col = 1; col <= hoursPerRow; col++) {
-                        if (showPeriodLabels && row < pmFirstRow && hours[hourCounter] >= 12) {
-                            html += this._generateHTMLHourCell(inst, undefined, showPeriod, showLeadingZero);
-                        } else {
-                            html += this._generateHTMLHourCell(inst, hours[hourCounter], showPeriod, showLeadingZero);
-                            hourCounter++;
-                        }
-                    }
-                    html += '</tr>';
-                }
-                html += '</table>' + // Close the hours cells table
-                        '</td>'; // Close the Hour td
-            }
-
-            if (showMinutes) {
-                html += '<td class="ui-timepicker-minutes">';
-                html += this._generateHTMLMinutes(inst);
-                html += '</td>';
-            }
-
-            html += '</tr>';
-
-
-            if (showButtonPanel) {
-                var buttonPanel = '<tr><td colspan="3"><div class="ui-timepicker-buttonpane ui-widget-content">';
-                if (showNowButton) {
-                    buttonPanel += '<button type="button" class="ui-timepicker-now ui-state-default ui-corner-all" '
-                                   + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
-                                   + nowButtonText + '</button>';
-                }
-                if (showDeselectButton) {
-                    buttonPanel += '<button type="button" class="ui-timepicker-deselect ui-state-default ui-corner-all" '
-                                   + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
-                                   + deselectButtonText + '</button>';
-                }
-                if (showCloseButton) {
-                    buttonPanel += '<button type="button" class="ui-timepicker-close ui-state-default ui-corner-all" '
-                                   + ' data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" >'
-                                   + closeButtonText + '</button>';
-                }
-
-                html += buttonPanel + '</div></td></tr>';
-            }
-            html += '</table>';
-
-            return html;
-        },
-
-        /* Special function that update the minutes selection in currently visible timepicker
-         * called on hour selection when onMinuteShow is defined  */
-        _updateMinuteDisplay: function (inst) {
-            var newHtml = this._generateHTMLMinutes(inst);
-            inst.tpDiv.find('td.ui-timepicker-minutes').html(newHtml);
-            this._rebindDialogEvents(inst);
-                // after the picker html is appended bind the click & double click events (faster in IE this way
-                // then letting the browser interpret the inline events)
-                // yes I know, duplicate code, sorry
-/*                .find('.ui-timepicker-minute-cell')
-                    .bind("click", { fromDoubleClick:false }, $.proxy($.timepicker.selectMinutes, this))
-                    .bind("dblclick", { fromDoubleClick:true }, $.proxy($.timepicker.selectMinutes, this));
-*/
-
-        },
-
-        /*
-         * Generate the minutes table
-         * This is separated from the _generateHTML function because is can be called separately (when hours changes)
-         */
-        _generateHTMLMinutes: function (inst) {
-
-            var m, row, html = '',
-                rows = this._get(inst, 'rows'),
-                minutes = Array(),
-                minutes_options = this._get(inst, 'minutes'),
-                minutesPerRow = null,
-                minuteCounter = 0,
-                showMinutesLeadingZero = (this._get(inst, 'showMinutesLeadingZero') == true),
-                onMinuteShow = this._get(inst, 'onMinuteShow'),
-                minuteLabel = this._get(inst, 'minuteText');
-
-            if ( ! minutes_options.starts) {
-                minutes_options.starts = 0;
-            }
-            if ( ! minutes_options.ends) {
-                minutes_options.ends = 59;
-            }
-            if ( ! minutes_options.manual) {
-                minutes_options.manual = [];
-            }
-            for (m = minutes_options.starts; m <= minutes_options.ends; m += minutes_options.interval) {
-                minutes.push(m);
-            }
-            for (i = 0; i < minutes_options.manual.length;i++) {
-                var currMin = minutes_options.manual[i];
-
-                // Validate & filter duplicates of manual minute input
-                if (typeof currMin != 'number' || currMin < 0 || currMin > 59 || $.inArray(currMin, minutes) >= 0) {
-                    continue;
-                }
-                minutes.push(currMin);
-            }
-
-            // Sort to get correct order after adding manual minutes
-            // Use compare function to sort by number, instead of string (default)
-            minutes.sort(function(a, b) {
-                return a-b;
-            });
-
-            minutesPerRow = Math.round(minutes.length / rows + 0.49); // always round up
-
-            /*
-             * The minutes table
-             */
-            // if currently selected minute is not enabled, we have a problem and need to select a new minute.
-            if (onMinuteShow &&
-                (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours , inst.minutes]) == false) ) {
-                // loop minutes and select first available
-                for (minuteCounter = 0; minuteCounter < minutes.length; minuteCounter += 1) {
-                    m = minutes[minuteCounter];
-                    if (onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours, m])) {
-                        inst.minutes = m;
-                        break;
-                    }
-                }
-            }
-
-
-
-            html += '<div class="ui-timepicker-title ui-widget-header ui-helper-clearfix ui-corner-all">' +
-                    minuteLabel +
-                    '</div>' +
-                    '<table class="ui-timepicker">';
-
-            minuteCounter = 0;
-            for (row = 1; row <= rows; row++) {
-                html += '<tr>';
-                while (minuteCounter < row * minutesPerRow) {
-                    var m = minutes[minuteCounter];
-                    var displayText = '';
-                    if (m !== undefined ) {
-                        displayText = (m < 10) && showMinutesLeadingZero ? "0" + m.toString() : m.toString();
-                    }
-                    html += this._generateHTMLMinuteCell(inst, m, displayText);
-                    minuteCounter++;
-                }
-                html += '</tr>';
-            }
-
-            html += '</table>';
-
-            return html;
-        },
-
-        /* Generate the content of a "Hour" cell */
-        _generateHTMLHourCell: function (inst, hour, showPeriod, showLeadingZero) {
-
-            var displayHour = hour;
-            if ((hour > 12) && showPeriod) {
-                displayHour = hour - 12;
-            }
-            if ((displayHour == 0) && showPeriod) {
-                displayHour = 12;
-            }
-            if ((displayHour < 10) && showLeadingZero) {
-                displayHour = '0' + displayHour;
-            }
-
-            var html = "";
-            var enabled = true;
-            var onHourShow = this._get(inst, 'onHourShow');		//custom callback
-            var maxTime = this._get(inst, 'maxTime');
-            var minTime = this._get(inst, 'minTime');
-
-            if (hour == undefined) {
-                html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
-                return html;
-            }
-
-            if (onHourShow) {
-            	enabled = onHourShow.apply((inst.input ? inst.input[0] : null), [hour]);
-            }
-			
-            if (enabled) {
-                if ( !isNaN(parseInt(maxTime.hour)) && hour > maxTime.hour ) enabled = false;
-                if ( !isNaN(parseInt(minTime.hour)) && hour < minTime.hour ) enabled = false;
-            }
-			
-            if (enabled) {
-                html = '<td class="ui-timepicker-hour-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-hour="' + hour.toString() + '">' +
-                   '<a class="ui-state-default ' +
-                   (hour == inst.hours ? 'ui-state-active' : '') +
-                   '">' +
-                   displayHour.toString() +
-                   '</a></td>';
-            }
-            else {
-            	html =
-            		'<td>' +
-		                '<span class="ui-state-default ui-state-disabled ' +
-		                (hour == inst.hours ? ' ui-state-active ' : ' ') +
-		                '">' +
-		                displayHour.toString() +
-		                '</span>' +
-		            '</td>';
-            }
-            return html;
-        },
-
-        /* Generate the content of a "Hour" cell */
-        _generateHTMLMinuteCell: function (inst, minute, displayText) {
-             var html = "";
-             var enabled = true;
-             var hour = inst.hours;
-             var onMinuteShow = this._get(inst, 'onMinuteShow');		//custom callback
-             var maxTime = this._get(inst, 'maxTime');
-             var minTime = this._get(inst, 'minTime');
-
-             if (onMinuteShow) {
-            	 //NEW: 2011-02-03  we should give the hour as a parameter as well!
-             	enabled = onMinuteShow.apply((inst.input ? inst.input[0] : null), [inst.hours,minute]);		//trigger callback
-             }
-
-             if (minute == undefined) {
-                 html = '<td><span class="ui-state-default ui-state-disabled">&nbsp;</span></td>';
-                 return html;
-             }
-
-            if (enabled && hour !== null) {
-                if ( !isNaN(parseInt(maxTime.hour)) && !isNaN(parseInt(maxTime.minute)) && hour >= maxTime.hour && minute > maxTime.minute ) enabled = false;
-                if ( !isNaN(parseInt(minTime.hour)) && !isNaN(parseInt(minTime.minute)) && hour <= minTime.hour && minute < minTime.minute ) enabled = false;
-            }
-			
-             if (enabled) {
-	             html = '<td class="ui-timepicker-minute-cell" data-timepicker-instance-id="#' + inst.id.replace(/\\\\/g,"\\") + '" data-minute="' + minute.toString() + '" >' +
-	                   '<a class="ui-state-default ' +
-	                   (minute == inst.minutes ? 'ui-state-active' : '') +
-	                   '" >' +
-	                   displayText +
-	                   '</a></td>';
-             }
-             else {
-
-            	html = '<td>' +
-	                 '<span class="ui-state-default ui-state-disabled" >' +
-	                 	displayText +
-	                 '</span>' +
-                 '</td>';
-             }
-             return html;
-        },
-
-
-        /* Detach a timepicker from its control.
-           @param  target    element - the target input field or division or span */
-        _destroyTimepicker: function(target) {
-            var $target = $(target);
-            var inst = $.data(target, PROP_NAME);
-            if (!$target.hasClass(this.markerClassName)) {
-                return;
-            }
-            var nodeName = target.nodeName.toLowerCase();
-            $.removeData(target, PROP_NAME);
-            if (nodeName == 'input') {
-                inst.append.remove();
-                inst.trigger.remove();
-                $target.removeClass(this.markerClassName)
-                    .unbind('focus.timepicker', this._showTimepicker)
-                    .unbind('click.timepicker', this._adjustZIndex);
-            } else if (nodeName == 'div' || nodeName == 'span')
-                $target.removeClass(this.markerClassName).empty();
-        },
-
-        /* Enable the date picker to a jQuery selection.
-           @param  target    element - the target input field or division or span */
-        _enableTimepicker: function(target) {
-            var $target = $(target),
-                target_id = $target.attr('id'),
-                inst = $.data(target, PROP_NAME);
-
-            if (!$target.hasClass(this.markerClassName)) {
-                return;
-            }
-            var nodeName = target.nodeName.toLowerCase();
-            if (nodeName == 'input') {
-                target.disabled = false;
-                var button = this._get(inst, 'button');
-                $(button).removeClass('ui-state-disabled').disabled = false;
-                inst.trigger.filter('button').
-                    each(function() { this.disabled = false; }).end();
-            }
-            else if (nodeName == 'div' || nodeName == 'span') {
-                var inline = $target.children('.' + this._inlineClass);
-                inline.children().removeClass('ui-state-disabled');
-                inline.find('button').each(
-                    function() { this.disabled = false }
-                )
-            }
-            this._disabledInputs = $.map(this._disabledInputs,
-                function(value) { return (value == target_id ? null : value); }); // delete entry
-        },
-
-        /* Disable the time picker to a jQuery selection.
-           @param  target    element - the target input field or division or span */
-        _disableTimepicker: function(target) {
-            var $target = $(target);
-            var inst = $.data(target, PROP_NAME);
-            if (!$target.hasClass(this.markerClassName)) {
-                return;
-            }
-            var nodeName = target.nodeName.toLowerCase();
-            if (nodeName == 'input') {
-                var button = this._get(inst, 'button');
-
-                $(button).addClass('ui-state-disabled').disabled = true;
-                target.disabled = true;
-
-                inst.trigger.filter('button').
-                    each(function() { this.disabled = true; }).end();
-
-            }
-            else if (nodeName == 'div' || nodeName == 'span') {
-                var inline = $target.children('.' + this._inlineClass);
-                inline.children().addClass('ui-state-disabled');
-                inline.find('button').each(
-                    function() { this.disabled = true }
-                )
-
-            }
-            this._disabledInputs = $.map(this._disabledInputs,
-                function(value) { return (value == target ? null : value); }); // delete entry
-            this._disabledInputs[this._disabledInputs.length] = $target.attr('id');
-        },
-
-        /* Is the first field in a jQuery collection disabled as a timepicker?
-        @param  target_id element - the target input field or division or span
-        @return boolean - true if disabled, false if enabled */
-        _isDisabledTimepicker: function (target_id) {
-            if ( ! target_id) { return false; }
-            for (var i = 0; i < this._disabledInputs.length; i++) {
-                if (this._disabledInputs[i] == target_id) { return true; }
-            }
-            return false;
-        },
-
-        /* Check positioning to remain on screen. */
-        _checkOffset: function (inst, offset, isFixed) {
-            var tpWidth = inst.tpDiv.outerWidth();
-            var tpHeight = inst.tpDiv.outerHeight();
-            var inputWidth = inst.input ? inst.input.outerWidth() : 0;
-            var inputHeight = inst.input ? inst.input.outerHeight() : 0;
-            var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
-            var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
-
-            offset.left -= (this._get(inst, 'isRTL') ? (tpWidth - inputWidth) : 0);
-            offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
-            offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
-
-            // now check if timepicker is showing outside window viewport - move to a better place if so.
-            offset.left -= Math.min(offset.left, (offset.left + tpWidth > viewWidth && viewWidth > tpWidth) ?
-			Math.abs(offset.left + tpWidth - viewWidth) : 0);
-            offset.top -= Math.min(offset.top, (offset.top + tpHeight > viewHeight && viewHeight > tpHeight) ?
-			Math.abs(tpHeight + inputHeight) : 0);
-
-            return offset;
-        },
-
-        /* Find an object's position on the screen. */
-        _findPos: function (obj) {
-            var inst = this._getInst(obj);
-            var isRTL = this._get(inst, 'isRTL');
-            while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
-                obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
-            }
-            var position = $(obj).offset();
-            return [position.left, position.top];
-        },
-
-        /* Retrieve the size of left and top borders for an element.
-        @param  elem  (jQuery object) the element of interest
-        @return  (number[2]) the left and top borders */
-        _getBorders: function (elem) {
-            var convert = function (value) {
-                return { thin: 1, medium: 2, thick: 3}[value] || value;
-            };
-            return [parseFloat(convert(elem.css('border-left-width'))),
-			parseFloat(convert(elem.css('border-top-width')))];
-        },
-
-
-        /* Close time picker if clicked elsewhere. */
-        _checkExternalClick: function (event) {
-            if (!$.timepicker._curInst) { return; }
-            var $target = $(event.target);
-            if ($target[0].id != $.timepicker._mainDivId &&
-				$target.parents('#' + $.timepicker._mainDivId).length == 0 &&
-				!$target.hasClass($.timepicker.markerClassName) &&
-				!$target.hasClass($.timepicker._triggerClass) &&
-				$.timepicker._timepickerShowing && !($.timepicker._inDialog && $.blockUI))
-                $.timepicker._hideTimepicker();
-        },
-
-        /* Hide the time picker from view.
-        @param  input  element - the input field attached to the time picker */
-        _hideTimepicker: function (input) {
-            var inst = this._curInst;
-            if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
-            if (this._timepickerShowing) {
-                var showAnim = this._get(inst, 'showAnim');
-                var duration = this._get(inst, 'duration');
-                var postProcess = function () {
-                    $.timepicker._tidyDialog(inst);
-                    this._curInst = null;
-                };
-                if ($.effects && $.effects[showAnim]) {
-                    inst.tpDiv.hide(showAnim, $.timepicker._get(inst, 'showOptions'), duration, postProcess);
-                }
-                else {
-                    inst.tpDiv[(showAnim == 'slideDown' ? 'slideUp' :
-					    (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
-                }
-                if (!showAnim) { postProcess(); }
-
-                this._timepickerShowing = false;
-
-                this._lastInput = null;
-                if (this._inDialog) {
-                    this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
-                    if ($.blockUI) {
-                        $.unblockUI();
-                        $('body').append(this.tpDiv);
-                    }
-                }
-                this._inDialog = false;
-
-                var onClose = this._get(inst, 'onClose');
-                 if (onClose) {
-                     onClose.apply(
-                         (inst.input ? inst.input[0] : null),
- 					    [(inst.input ? inst.input.val() : ''), inst]);  // trigger custom callback
-                 }
-
-            }
-        },
-
-
-
-        /* Tidy up after a dialog display. */
-        _tidyDialog: function (inst) {
-            inst.tpDiv.removeClass(this._dialogClass).unbind('.ui-timepicker');
-        },
-
-        /* Retrieve the instance data for the target control.
-        @param  target  element - the target input field or division or span
-        @return  object - the associated instance data
-        @throws  error if a jQuery problem getting data */
-        _getInst: function (target) {
-            try {
-                return $.data(target, PROP_NAME);
-            }
-            catch (err) {
-                throw 'Missing instance data for this timepicker';
-            }
-        },
-
-        /* Get a setting value, defaulting if necessary. */
-        _get: function (inst, name) {
-            return inst.settings[name] !== undefined ?
-			inst.settings[name] : this._defaults[name];
-        },
-
-        /* Parse existing time and initialise time picker. */
-        _setTimeFromField: function (inst) {
-            if (inst.input.val() == inst.lastVal) { return; }
-            var defaultTime = this._get(inst, 'defaultTime');
-
-            var timeToParse = defaultTime == 'now' ? this._getCurrentTimeRounded(inst) : defaultTime;
-            if ((inst.inline == false) && (inst.input.val() != '')) { timeToParse = inst.input.val() }
-
-            if (timeToParse instanceof Date) {
-                inst.hours = timeToParse.getHours();
-                inst.minutes = timeToParse.getMinutes();
-            } else {
-                var timeVal = inst.lastVal = timeToParse;
-                if (timeToParse == '') {
-                    inst.hours = -1;
-                    inst.minutes = -1;
-                } else {
-                    var time = this.parseTime(inst, timeVal);
-                    inst.hours = time.hours;
-                    inst.minutes = time.minutes;
-                }
-            }
-
-
-            $.timepicker._updateTimepicker(inst);
-        },
-
-        /* Update or retrieve the settings for an existing time picker.
-           @param  target  element - the target input field or division or span
-           @param  name    object - the new settings to update or
-                           string - the name of the setting to change or retrieve,
-                           when retrieving also 'all' for all instance settings or
-                           'defaults' for all global defaults
-           @param  value   any - the new value for the setting
-                       (omit if above is an object or to retrieve a value) */
-        _optionTimepicker: function(target, name, value) {
-            var inst = this._getInst(target);
-            if (arguments.length == 2 && typeof name == 'string') {
-                return (name == 'defaults' ? $.extend({}, $.timepicker._defaults) :
-                    (inst ? (name == 'all' ? $.extend({}, inst.settings) :
-                    this._get(inst, name)) : null));
-            }
-            var settings = name || {};
-            if (typeof name == 'string') {
-                settings = {};
-                settings[name] = value;
-            }
-            if (inst) {
-                extendRemove(inst.settings, settings);
-                if (this._curInst == inst) {
-                    this._hideTimepicker();
-                	this._updateTimepicker(inst);
-                }
-                if (inst.inline) {
-                    this._updateTimepicker(inst);
-                }
-            }
-        },
-
-
-        /* Set the time for a jQuery selection.
-	    @param  target  element - the target input field or division or span
-	    @param  time    String - the new time */
-	    _setTimeTimepicker: function(target, time) {
-		    var inst = this._getInst(target);
-		    if (inst) {
-			    this._setTime(inst, time);
-    			this._updateTimepicker(inst);
-	    		this._updateAlternate(inst, time);
-		    }
-	    },
-
-        /* Set the time directly. */
-        _setTime: function(inst, time, noChange) {
-            var origHours = inst.hours;
-            var origMinutes = inst.minutes;
-            if (time instanceof Date) {
-                inst.hours = time.getHours();
-                inst.minutes = time.getMinutes();
-            } else {
-                var time = this.parseTime(inst, time);
-                inst.hours = time.hours;
-                inst.minutes = time.minutes;
-            }
-
-            if ((origHours != inst.hours || origMinutes != inst.minutes) && !noChange) {
-                inst.input.trigger('change');
-            }
-            this._updateTimepicker(inst);
-            this._updateSelectedValue(inst);
-        },
-
-        /* Return the current time, ready to be parsed, rounded to the closest minute by interval */
-        _getCurrentTimeRounded: function (inst) {
-            var currentTime = new Date(),
-                currentMinutes = currentTime.getMinutes(),
-                minutes_options = this._get(inst, 'minutes'),
-                // round to closest interval
-                adjustedMinutes = Math.round(currentMinutes / minutes_options.interval) * minutes_options.interval;
-            currentTime.setMinutes(adjustedMinutes);
-            return currentTime;
-        },
-
-        /*
-        * Parse a time string into hours and minutes
-        */
-        parseTime: function (inst, timeVal) {
-            var retVal = new Object();
-            retVal.hours = -1;
-            retVal.minutes = -1;
-
-            if(!timeVal)
-                return '';
-
-            var timeSeparator = this._get(inst, 'timeSeparator'),
-                amPmText = this._get(inst, 'amPmText'),
-                showHours = this._get(inst, 'showHours'),
-                showMinutes = this._get(inst, 'showMinutes'),
-                optionalMinutes = this._get(inst, 'optionalMinutes'),
-                showPeriod = (this._get(inst, 'showPeriod') == true),
-                p = timeVal.indexOf(timeSeparator);
-
-            // check if time separator found
-            if (p != -1) {
-                retVal.hours = parseInt(timeVal.substr(0, p), 10);
-                retVal.minutes = parseInt(timeVal.substr(p + 1), 10);
-            }
-            // check for hours only
-            else if ( (showHours) && ( !showMinutes || optionalMinutes ) ) {
-                retVal.hours = parseInt(timeVal, 10);
-            }
-            // check for minutes only
-            else if ( ( ! showHours) && (showMinutes) ) {
-                retVal.minutes = parseInt(timeVal, 10);
-            }
-
-            if (showHours) {
-                var timeValUpper = timeVal.toUpperCase();
-                if ((retVal.hours < 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[1].toUpperCase()) != -1)) {
-                    retVal.hours += 12;
-                }
-                // fix for 12 AM
-                if ((retVal.hours == 12) && (showPeriod) && (timeValUpper.indexOf(amPmText[0].toUpperCase()) != -1)) {
-                    retVal.hours = 0;
-                }
-            }
-
-            return retVal;
-        },
-
-        selectNow: function(event) {
-            var id = $(event.target).attr("data-timepicker-instance-id"),
-                $target = $(id),
-                inst = this._getInst($target[0]);
-            //if (!inst || (input && inst != $.data(input, PROP_NAME))) { return; }
-            var currentTime = new Date();
-            inst.hours = currentTime.getHours();
-            inst.minutes = currentTime.getMinutes();
-            this._updateSelectedValue(inst);
-            this._updateTimepicker(inst);
-            this._hideTimepicker();
-        },
-
-        deselectTime: function(event) {
-            var id = $(event.target).attr("data-timepicker-instance-id"),
-                $target = $(id),
-                inst = this._getInst($target[0]);
-            inst.hours = -1;
-            inst.minutes = -1;
-            this._updateSelectedValue(inst);
-            this._hideTimepicker();
-        },
-
-
-        selectHours: function (event) {
-            var $td = $(event.currentTarget),
-                id = $td.attr("data-timepicker-instance-id"),
-                newHours = parseInt($td.attr("data-hour")),
-                fromDoubleClick = event.data.fromDoubleClick,
-                $target = $(id),
-                inst = this._getInst($target[0]),
-                showMinutes = (this._get(inst, 'showMinutes') == true);
-
-            // don't select if disabled
-            if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
-
-            $td.parents('.ui-timepicker-hours:first').find('a').removeClass('ui-state-active');
-            $td.children('a').addClass('ui-state-active');
-            inst.hours = newHours;
-
-            // added for onMinuteShow callback
-            var onMinuteShow = this._get(inst, 'onMinuteShow'),
-                maxTime = this._get(inst, 'maxTime'),
-                minTime = this._get(inst, 'minTime');
-            if (onMinuteShow || maxTime.minute || minTime.minute) {
-                // this will trigger a callback on selected hour to make sure selected minute is allowed. 
-                this._updateMinuteDisplay(inst);
-            }
-
-            this._updateSelectedValue(inst);
-
-            inst._hoursClicked = true;
-            if ((inst._minutesClicked) || (fromDoubleClick) || (showMinutes == false)) {
-                $.timepicker._hideTimepicker();
-            }
-            // return false because if used inline, prevent the url to change to a hashtag
-            return false;
-        },
-
-        selectMinutes: function (event) {
-            var $td = $(event.currentTarget),
-                id = $td.attr("data-timepicker-instance-id"),
-                newMinutes = parseInt($td.attr("data-minute")),
-                fromDoubleClick = event.data.fromDoubleClick,
-                $target = $(id),
-                inst = this._getInst($target[0]),
-                showHours = (this._get(inst, 'showHours') == true);
-
-            // don't select if disabled
-            if ( $.timepicker._isDisabledTimepicker($target.attr('id')) ) { return false }
-
-            $td.parents('.ui-timepicker-minutes:first').find('a').removeClass('ui-state-active');
-            $td.children('a').addClass('ui-state-active');
-
-            inst.minutes = newMinutes;
-            this._updateSelectedValue(inst);
-
-            inst._minutesClicked = true;
-            if ((inst._hoursClicked) || (fromDoubleClick) || (showHours == false)) {
-                $.timepicker._hideTimepicker();
-                // return false because if used inline, prevent the url to change to a hashtag
-                return false;
-            }
-
-            // return false because if used inline, prevent the url to change to a hashtag
-            return false;
-        },
-
-        _updateSelectedValue: function (inst) {
-            var newTime = this._getParsedTime(inst);
-            if (inst.input) {
-                inst.input.val(newTime);
-                inst.input.trigger('change');
-            }
-            var onSelect = this._get(inst, 'onSelect');
-            if (onSelect) { onSelect.apply((inst.input ? inst.input[0] : null), [newTime, inst]); } // trigger custom callback
-            this._updateAlternate(inst, newTime);
-            return newTime;
-        },
-
-        /* this function process selected time and return it parsed according to instance options */
-        _getParsedTime: function(inst) {
-
-            if (inst.hours == -1 && inst.minutes == -1) {
-                return '';
-            }
-
-            // default to 0 AM if hours is not valid
-            if ((inst.hours < inst.hours.starts) || (inst.hours > inst.hours.ends )) { inst.hours = 0; }
-            // default to 0 minutes if minute is not valid
-            if ((inst.minutes < inst.minutes.starts) || (inst.minutes > inst.minutes.ends)) { inst.minutes = 0; }
-
-            var period = "",
-                showPeriod = (this._get(inst, 'showPeriod') == true),
-                showLeadingZero = (this._get(inst, 'showLeadingZero') == true),
-                showHours = (this._get(inst, 'showHours') == true),
-                showMinutes = (this._get(inst, 'showMinutes') == true),
-                optionalMinutes = (this._get(inst, 'optionalMinutes') == true),
-                amPmText = this._get(inst, 'amPmText'),
-                selectedHours = inst.hours ? inst.hours : 0,
-                selectedMinutes = inst.minutes ? inst.minutes : 0,
-                displayHours = selectedHours ? selectedHours : 0,
-                parsedTime = '';
-
-            // fix some display problem when hours or minutes are not selected yet
-            if (displayHours == -1) { displayHours = 0 }
-            if (selectedMinutes == -1) { selectedMinutes = 0 }
-
-            if (showPeriod) {
-                if (inst.hours == 0) {
-                    displayHours = 12;
-                }
-                if (inst.hours < 12) {
-                    period = amPmText[0];
-                }
-                else {
-                    period = amPmText[1];
-                    if (displayHours > 12) {
-                        displayHours -= 12;
-                    }
-                }
-            }
-
-            var h = displayHours.toString();
-            if (showLeadingZero && (displayHours < 10)) { h = '0' + h; }
-
-            var m = selectedMinutes.toString();
-            if (selectedMinutes < 10) { m = '0' + m; }
-
-            if (showHours) {
-                parsedTime += h;
-            }
-            if (showHours && showMinutes && (!optionalMinutes || m != 0)) {
-                parsedTime += this._get(inst, 'timeSeparator');
-            }
-            if (showMinutes && (!optionalMinutes || m != 0)) {
-                parsedTime += m;
-            }
-            if (showHours) {
-                if (period.length > 0) { parsedTime += this._get(inst, 'periodSeparator') + period; }
-            }
-
-            //hack
-            parsedTime += this._get(inst, 'timeSeparator');
-            parsedTime += '00';
-
-            return parsedTime;
-        },
-
-        /* Update any alternate field to synchronise with the main field. */
-        _updateAlternate: function(inst, newTime) {
-            var altField = this._get(inst, 'altField');
-            if (altField) { // update alternate field too
-                $(altField).each(function(i,e) {
-                    $(e).val(newTime);
-                });
-            }
-        },
-
-        _getTimeAsDateTimepicker: function(input) {
-            var inst = this._getInst(input);
-            if (inst.hours == -1 && inst.minutes == -1) {
-                return '';
-            }
-
-            // default to 0 AM if hours is not valid
-            if ((inst.hours < inst.hours.starts) || (inst.hours > inst.hours.ends )) { inst.hours = 0; }
-            // default to 0 minutes if minute is not valid
-            if ((inst.minutes < inst.minutes.starts) || (inst.minutes > inst.minutes.ends)) { inst.minutes = 0; }
-
-            return new Date(0, 0, 0, inst.hours, inst.minutes, 0);
-        },
-        /* This might look unused but it's called by the $.fn.timepicker function with param getTime */
-        /* added v 0.2.3 - gitHub issue #5 - Thanks edanuff */
-        _getTimeTimepicker : function(input) {
-            var inst = this._getInst(input);
-            return this._getParsedTime(inst);
-        },
-        _getHourTimepicker: function(input) {
-            var inst = this._getInst(input);
-            if ( inst == undefined) { return -1; }
-            return inst.hours;
-        },
-        _getMinuteTimepicker: function(input) {
-            var inst= this._getInst(input);
-            if ( inst == undefined) { return -1; }
-            return inst.minutes;
-        }
-
-    });
-
-
-
-    /* Invoke the timepicker functionality.
-    @param  options  string - a command, optionally followed by additional parameters or
-    Object - settings for attaching new timepicker functionality
-    @return  jQuery object */
-    $.fn.timepicker = function (options) {
-        /* Initialise the time picker. */
-        if (!$.timepicker.initialized) {
-            $(document).mousedown($.timepicker._checkExternalClick);
-            $.timepicker.initialized = true;
-        }
-
-         /* Append timepicker main container to body if not exist. */
-        if ($("#"+$.timepicker._mainDivId).length === 0) {
-            $('body').append($.timepicker.tpDiv);
-        }
-
-        var otherArgs = Array.prototype.slice.call(arguments, 1);
-        if (typeof options == 'string' && (options == 'getTime' || options == 'getTimeAsDate' || options == 'getHour' || options == 'getMinute' ))
-            return $.timepicker['_' + options + 'Timepicker'].
-			    apply($.timepicker, [this[0]].concat(otherArgs));
-        if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
-            return $.timepicker['_' + options + 'Timepicker'].
-                apply($.timepicker, [this[0]].concat(otherArgs));
-        return this.each(function () {
-            typeof options == 'string' ?
-			$.timepicker['_' + options + 'Timepicker'].
-				apply($.timepicker, [this].concat(otherArgs)) :
-			$.timepicker._attachTimepicker(this, options);
-        });
-    };
-
-    /* jQuery extend now ignores nulls! */
-    function extendRemove(target, props) {
-        $.extend(target, props);
-        for (var name in props)
-            if (props[name] == null || props[name] == undefined)
-                target[name] = props[name];
-        return target;
-    };
-
-    $.timepicker = new Timepicker(); // singleton instance
-    $.timepicker.initialized = false;
-    $.timepicker.uuid = new Date().getTime();
-    $.timepicker.version = "0.3.3";
-
-    // Workaround for #4055
-    // Add another global to avoid noConflict issues with inline event handlers
-    window['TP_jQuery_' + tpuuid] = $;
-
-})(jQuery);

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-af.js

@@ -1,37 +0,0 @@
-/* Afrikaans initialisation for the jQuery UI date picker plugin. */
-/* Written by Renier Pretorius. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['af'] = {
-	closeText: 'Selekteer',
-	prevText: 'Vorige',
-	nextText: 'Volgende',
-	currentText: 'Vandag',
-	monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
-	'Julie','Augustus','September','Oktober','November','Desember'],
-	monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
-	'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
-	dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
-	dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
-	dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['af']);
-
-return datepicker.regional['af'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-ar-DZ.js

@@ -1,37 +0,0 @@
-/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
-/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
-
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['ar-DZ'] = {
-	closeText: 'إغلاق',
-	prevText: '&#x3C;السابق',
-	nextText: 'التالي&#x3E;',
-	currentText: 'اليوم',
-	monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
-	'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
-	monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
-	dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-	dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-	dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-	weekHeader: 'أسبوع',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 6,
-		isRTL: true,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['ar-DZ']);
-
-return datepicker.regional['ar-DZ'];
-
-}));

+ 0 - 38
jet/static/jet/vendor/jquery-ui/i18n/datepicker-ar.js

@@ -1,38 +0,0 @@
-/* Arabic Translation for jQuery UI date picker plugin. */
-/* Used in most of Arab countries, primarily in Bahrain, Kuwait, Oman, Qatar, Saudi Arabia and the United Arab Emirates, Egypt, Sudan and Yemen. */
-/* Written by Mohammed Alshehri -- m@dralshehri.com */
-
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['ar'] = {
-	closeText: 'إغلاق',
-	prevText: '&#x3C;السابق',
-	nextText: 'التالي&#x3E;',
-	currentText: 'اليوم',
-	monthNames: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو',
-	'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],
-	monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
-	dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-	dayNamesShort: ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
-	dayNamesMin: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],
-	weekHeader: 'أسبوع',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 0,
-		isRTL: true,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['ar']);
-
-return datepicker.regional['ar'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-az.js

@@ -1,37 +0,0 @@
-/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
-/* Written by Jamil Najafov (necefov33@gmail.com). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['az'] = {
-	closeText: 'Bağla',
-	prevText: '&#x3C;Geri',
-	nextText: 'İrəli&#x3E;',
-	currentText: 'Bugün',
-	monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
-	'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
-	monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
-	'İyul','Avq','Sen','Okt','Noy','Dek'],
-	dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
-	dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
-	dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
-	weekHeader: 'Hf',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['az']);
-
-return datepicker.regional['az'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-be.js

@@ -1,37 +0,0 @@
-/* Belarusian initialisation for the jQuery UI date picker plugin. */
-/* Written by Pavel Selitskas <p.selitskas@gmail.com> */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['be'] = {
-	closeText: 'Зачыніць',
-	prevText: '&larr;Папяр.',
-	nextText: 'Наст.&rarr;',
-	currentText: 'Сёньня',
-	monthNames: ['Студзень','Люты','Сакавік','Красавік','Травень','Чэрвень',
-	'Ліпень','Жнівень','Верасень','Кастрычнік','Лістапад','Сьнежань'],
-	monthNamesShort: ['Сту','Лют','Сак','Кра','Тра','Чэр',
-	'Ліп','Жні','Вер','Кас','Ліс','Сьн'],
-	dayNames: ['нядзеля','панядзелак','аўторак','серада','чацьвер','пятніца','субота'],
-	dayNamesShort: ['ндз','пнд','аўт','срд','чцв','птн','сбт'],
-	dayNamesMin: ['Нд','Пн','Аў','Ср','Чц','Пт','Сб'],
-	weekHeader: 'Тд',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['be']);
-
-return datepicker.regional['be'];
-
-}));

+ 0 - 38
jet/static/jet/vendor/jquery-ui/i18n/datepicker-bg.js

@@ -1,38 +0,0 @@
-/* Bulgarian initialisation for the jQuery UI date picker plugin. */
-/* Written by Stoyan Kyosev (http://svest.org). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['bg'] = {
-	closeText: 'затвори',
-	prevText: '&#x3C;назад',
-	nextText: 'напред&#x3E;',
-	nextBigText: '&#x3E;&#x3E;',
-	currentText: 'днес',
-	monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
-	'Юли','Август','Септември','Октомври','Ноември','Декември'],
-	monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
-	'Юли','Авг','Сеп','Окт','Нов','Дек'],
-	dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
-	dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
-	dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['bg']);
-
-return datepicker.regional['bg'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-bs.js

@@ -1,37 +0,0 @@
-/* Bosnian i18n for the jQuery UI date picker plugin. */
-/* Written by Kenan Konjo. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['bs'] = {
-	closeText: 'Zatvori',
-	prevText: '&#x3C;',
-	nextText: '&#x3E;',
-	currentText: 'Danas',
-	monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
-	'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
-	monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-	'Jul','Aug','Sep','Okt','Nov','Dec'],
-	dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
-	dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
-	dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['bs']);
-
-return datepicker.regional['bs'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-ca.js

@@ -1,37 +0,0 @@
-/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
-/* Writers: (joan.leon@gmail.com). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['ca'] = {
-	closeText: 'Tanca',
-	prevText: 'Anterior',
-	nextText: 'Següent',
-	currentText: 'Avui',
-	monthNames: ['gener','febrer','març','abril','maig','juny',
-	'juliol','agost','setembre','octubre','novembre','desembre'],
-	monthNamesShort: ['gen','feb','març','abr','maig','juny',
-	'jul','ag','set','oct','nov','des'],
-	dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
-	dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
-	dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
-	weekHeader: 'Set',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['ca']);
-
-return datepicker.regional['ca'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-cs.js

@@ -1,37 +0,0 @@
-/* Czech initialisation for the jQuery UI date picker plugin. */
-/* Written by Tomas Muller (tomas@tomas-muller.net). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['cs'] = {
-	closeText: 'Zavřít',
-	prevText: '&#x3C;Dříve',
-	nextText: 'Později&#x3E;',
-	currentText: 'Nyní',
-	monthNames: ['leden','únor','březen','duben','květen','červen',
-	'červenec','srpen','září','říjen','listopad','prosinec'],
-	monthNamesShort: ['led','úno','bře','dub','kvě','čer',
-	'čvc','srp','zář','říj','lis','pro'],
-	dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
-	dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-	dayNamesMin: ['ne','po','út','st','čt','pá','so'],
-	weekHeader: 'Týd',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['cs']);
-
-return datepicker.regional['cs'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-cy-GB.js

@@ -1,37 +0,0 @@
-/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
-/* Written by William Griffiths. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['cy-GB'] = {
-	closeText: 'Done',
-	prevText: 'Prev',
-	nextText: 'Next',
-	currentText: 'Today',
-	monthNames: ['Ionawr','Chwefror','Mawrth','Ebrill','Mai','Mehefin',
-	'Gorffennaf','Awst','Medi','Hydref','Tachwedd','Rhagfyr'],
-	monthNamesShort: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh',
-	'Gor', 'Aws', 'Med', 'Hyd', 'Tac', 'Rha'],
-	dayNames: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
-	dayNamesShort: ['Sul', 'Llu', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
-	dayNamesMin: ['Su','Ll','Ma','Me','Ia','Gw','Sa'],
-	weekHeader: 'Wy',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['cy-GB']);
-
-return datepicker.regional['cy-GB'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-da.js

@@ -1,37 +0,0 @@
-/* Danish initialisation for the jQuery UI date picker plugin. */
-/* Written by Jan Christensen ( deletestuff@gmail.com). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['da'] = {
-	closeText: 'Luk',
-	prevText: '&#x3C;Forrige',
-	nextText: 'Næste&#x3E;',
-	currentText: 'Idag',
-	monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
-	'Juli','August','September','Oktober','November','December'],
-	monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-	'Jul','Aug','Sep','Okt','Nov','Dec'],
-	dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
-	dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
-	dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
-	weekHeader: 'Uge',
-	dateFormat: 'dd-mm-yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['da']);
-
-return datepicker.regional['da'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-de.js

@@ -1,37 +0,0 @@
-/* German initialisation for the jQuery UI date picker plugin. */
-/* Written by Milian Wolff (mail@milianw.de). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['de'] = {
-	closeText: 'Schließen',
-	prevText: '&#x3C;Zurück',
-	nextText: 'Vor&#x3E;',
-	currentText: 'Heute',
-	monthNames: ['Januar','Februar','März','April','Mai','Juni',
-	'Juli','August','September','Oktober','November','Dezember'],
-	monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
-	'Jul','Aug','Sep','Okt','Nov','Dez'],
-	dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
-	dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-	dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-	weekHeader: 'KW',
-	dateFormat: 'dd.mm.yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['de']);
-
-return datepicker.regional['de'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-el.js

@@ -1,37 +0,0 @@
-/* Greek (el) initialisation for the jQuery UI date picker plugin. */
-/* Written by Alex Cicovic (http://www.alexcicovic.com) */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['el'] = {
-	closeText: 'Κλείσιμο',
-	prevText: 'Προηγούμενος',
-	nextText: 'Επόμενος',
-	currentText: 'Σήμερα',
-	monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
-	'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
-	monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
-	'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
-	dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
-	dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
-	dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
-	weekHeader: 'Εβδ',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['el']);
-
-return datepicker.regional['el'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-AU.js

@@ -1,37 +0,0 @@
-/* English/Australia initialisation for the jQuery UI date picker plugin. */
-/* Based on the en-GB initialisation. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['en-AU'] = {
-	closeText: 'Done',
-	prevText: 'Prev',
-	nextText: 'Next',
-	currentText: 'Today',
-	monthNames: ['January','February','March','April','May','June',
-	'July','August','September','October','November','December'],
-	monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-	'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['en-AU']);
-
-return datepicker.regional['en-AU'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-GB.js

@@ -1,37 +0,0 @@
-/* English/UK initialisation for the jQuery UI date picker plugin. */
-/* Written by Stuart. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['en-GB'] = {
-	closeText: 'Done',
-	prevText: 'Prev',
-	nextText: 'Next',
-	currentText: 'Today',
-	monthNames: ['January','February','March','April','May','June',
-	'July','August','September','October','November','December'],
-	monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-	'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['en-GB']);
-
-return datepicker.regional['en-GB'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-en-NZ.js

@@ -1,37 +0,0 @@
-/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
-/* Based on the en-GB initialisation. */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['en-NZ'] = {
-	closeText: 'Done',
-	prevText: 'Prev',
-	nextText: 'Next',
-	currentText: 'Today',
-	monthNames: ['January','February','March','April','May','June',
-	'July','August','September','October','November','December'],
-	monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-	'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
-	weekHeader: 'Wk',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['en-NZ']);
-
-return datepicker.regional['en-NZ'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-eo.js

@@ -1,37 +0,0 @@
-/* Esperanto initialisation for the jQuery UI date picker plugin. */
-/* Written by Olivier M. (olivierweb@ifrance.com). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['eo'] = {
-	closeText: 'Fermi',
-	prevText: '&#x3C;Anta',
-	nextText: 'Sekv&#x3E;',
-	currentText: 'Nuna',
-	monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
-	'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
-	monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-	'Jul','Aŭg','Sep','Okt','Nov','Dec'],
-	dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
-	dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
-	dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
-	weekHeader: 'Sb',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 0,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['eo']);
-
-return datepicker.regional['eo'];
-
-}));

+ 0 - 37
jet/static/jet/vendor/jquery-ui/i18n/datepicker-es.js

@@ -1,37 +0,0 @@
-/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
-/* Traducido por Vester (xvester@gmail.com). */
-(function( factory ) {
-	if ( typeof define === "function" && define.amd ) {
-
-		// AMD. Register as an anonymous module.
-		define([ "../datepicker" ], factory );
-	} else {
-
-		// Browser globals
-		factory( jQuery.datepicker );
-	}
-}(function( datepicker ) {
-
-datepicker.regional['es'] = {
-	closeText: 'Cerrar',
-	prevText: '&#x3C;Ant',
-	nextText: 'Sig&#x3E;',
-	currentText: 'Hoy',
-	monthNames: ['enero','febrero','marzo','abril','mayo','junio',
-	'julio','agosto','septiembre','octubre','noviembre','diciembre'],
-	monthNamesShort: ['ene','feb','mar','abr','may','jun',
-	'jul','ago','sep','oct','nov','dic'],
-	dayNames: ['domingo','lunes','martes','miércoles','jueves','viernes','sábado'],
-	dayNamesShort: ['dom','lun','mar','mié','jue','vie','sáb'],
-	dayNamesMin: ['D','L','M','X','J','V','S'],
-	weekHeader: 'Sm',
-	dateFormat: 'dd/mm/yy',
-	firstDay: 1,
-	isRTL: false,
-	showMonthAfterYear: false,
-	yearSuffix: ''};
-datepicker.setDefaults(datepicker.regional['es']);
-
-return datepicker.regional['es'];
-
-}));

Some files were not shown because too many files changed in this diff