").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("
").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});
\ No newline at end of file
diff --git a/panoramix/static/lib/jquery-ui/jquery-ui.structure.css b/panoramix/static/lib/jquery-ui/jquery-ui.structure.css
deleted file mode 100755
index 6972a62e6ae99..0000000000000
--- a/panoramix/static/lib/jquery-ui/jquery-ui.structure.css
+++ /dev/null
@@ -1,833 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/theming/
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0); /* support: IE8 */
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin: 2px 0 0 0;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
- font-size: 100%;
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 45%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- overflow: hidden;
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 20px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-draggable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-menu {
- list-style: none;
- padding: 0;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- position: relative;
- margin: 0;
- padding: 3px 1em 3px .4em;
- cursor: pointer;
- min-height: 0; /* support: IE7 */
- /* support: IE10, see #8844 */
- list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
-}
-.ui-menu .ui-menu-divider {
- margin: 5px 0;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-state-focus,
-.ui-menu .ui-state-active {
- margin: -1px;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item {
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: 0;
- bottom: 0;
- left: .2em;
- margin: auto 0;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- left: auto;
- right: 0;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
- height: 100%;
- filter: alpha(opacity=25); /* support: IE8 */
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-selectable {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-selectmenu-menu {
- padding: 0;
- margin: 0;
- position: absolute;
- top: 0;
- left: 0;
- display: none;
-}
-.ui-selectmenu-menu .ui-menu {
- overflow: auto;
- /* Support: IE7 */
- overflow-x: hidden;
- padding-bottom: 1px;
-}
-.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
- font-size: 1em;
- font-weight: bold;
- line-height: 1.5;
- padding: 2px 0.4em;
- margin: 0.5em 0 0 0;
- height: auto;
- border: 0;
-}
-.ui-selectmenu-open {
- display: block;
-}
-.ui-selectmenu-button {
- display: inline-block;
- overflow: hidden;
- position: relative;
- text-decoration: none;
- cursor: pointer;
-}
-.ui-selectmenu-button span.ui-icon {
- right: 0.5em;
- left: auto;
- margin-top: -8px;
- position: absolute;
- top: 50%;
-}
-.ui-selectmenu-button span.ui-selectmenu-text {
- text-align: left;
- padding: 0.4em 2.1em 0.4em 1em;
- display: block;
- line-height: 1.4;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: default;
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* support: IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-sortable-handle {
- -ms-touch-action: none;
- touch-action: none;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to override default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertically center icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
- cursor: text;
-}
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
diff --git a/panoramix/static/lib/jquery-ui/jquery-ui.structure.min.css b/panoramix/static/lib/jquery-ui/jquery-ui.structure.min.css
deleted file mode 100755
index 46f0ac900b0af..0000000000000
--- a/panoramix/static/lib/jquery-ui/jquery-ui.structure.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2015-03-11
-* http://jqueryui.com
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}
\ No newline at end of file
diff --git a/panoramix/static/lib/jquery-ui/jquery-ui.theme.css b/panoramix/static/lib/jquery-ui/jquery-ui.theme.css
deleted file mode 100755
index 5db92db3eba26..0000000000000
--- a/panoramix/static/lib/jquery-ui/jquery-ui.theme.css
+++ /dev/null
@@ -1,410 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.11.4
- * http://jqueryui.com
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * http://api.jqueryui.com/category/theming/
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #dddddd;
- background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #e78f08;
- background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
- color: #ffffff;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #ffffff;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #1c94c4;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #1c94c4;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #fbcb09;
- background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #c77405;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited,
-.ui-state-focus a,
-.ui-state-focus a:hover,
-.ui-state-focus a:link,
-.ui-state-focus a:visited {
- color: #c77405;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #fbd850;
- background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
- font-weight: bold;
- color: #eb8f00;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #eb8f00;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #fed22f;
- background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
- color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #cd0a0a;
- background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70); /* support: IE8 */
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35); /* support: IE8 */
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url("images/ui-icons_222222_256x240.png");
-}
-.ui-widget-header .ui-icon {
- background-image: url("images/ui-icons_ffffff_256x240.png");
-}
-.ui-state-default .ui-icon {
- background-image: url("images/ui-icons_ef8c08_256x240.png");
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url("images/ui-icons_ef8c08_256x240.png");
-}
-.ui-state-active .ui-icon {
- background-image: url("images/ui-icons_ef8c08_256x240.png");
-}
-.ui-state-highlight .ui-icon {
- background-image: url("images/ui-icons_228ef1_256x240.png");
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url("images/ui-icons_ffd27a_256x240.png");
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
- opacity: .5;
- filter: Alpha(Opacity=50); /* support: IE8 */
-}
-.ui-widget-shadow {
- margin: -5px 0 0 -5px;
- padding: 5px;
- background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;
- opacity: .2;
- filter: Alpha(Opacity=20); /* support: IE8 */
- border-radius: 5px;
-}
diff --git a/panoramix/static/lib/jquery-ui/jquery-ui.theme.min.css b/panoramix/static/lib/jquery-ui/jquery-ui.theme.min.css
deleted file mode 100755
index 7ccfb2fde1de1..0000000000000
--- a/panoramix/static/lib/jquery-ui/jquery-ui.theme.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.11.4 - 2015-03-11
-* http://jqueryui.com
-* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file
diff --git a/panoramix/static/lib/para/d3.parcoords.js b/panoramix/static/lib/para/d3.parcoords.js
deleted file mode 100644
index 91d061243853d..0000000000000
--- a/panoramix/static/lib/para/d3.parcoords.js
+++ /dev/null
@@ -1,2219 +0,0 @@
-d3.parcoords = function(config) {
- var __ = {
- data: [],
- highlighted: [],
- dimensions: [],
- dimensionTitles: {},
- dimensionTitleRotation: 0,
- types: {},
- brushed: false,
- brushedColor: null,
- alphaOnBrushed: 0.0,
- mode: "default",
- rate: 20,
- width: 600,
- height: 300,
- margin: { top: 24, right: 0, bottom: 12, left: 0 },
- nullValueSeparator: "undefined", // set to "top" or "bottom"
- nullValueSeparatorPadding: { top: 8, right: 0, bottom: 8, left: 0 },
- color: "#069",
- composite: "source-over",
- alpha: 0.7,
- bundlingStrength: 0.5,
- bundleDimension: null,
- smoothness: 0.0,
- showControlPoints: false,
- hideAxis : []
- };
-
- extend(__, config);
-var pc = function(selection) {
- selection = pc.selection = d3.select(selection);
-
- __.width = selection[0][0].clientWidth;
- __.height = selection[0][0].clientHeight;
-
- // canvas data layers
- ["marks", "foreground", "brushed", "highlight"].forEach(function(layer) {
- canvas[layer] = selection
- .append("canvas")
- .attr("class", layer)[0][0];
- ctx[layer] = canvas[layer].getContext("2d");
- });
-
- // svg tick and brush layers
- pc.svg = selection
- .append("svg")
- .attr("width", __.width)
- .attr("height", __.height)
- .append("svg:g")
- .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")");
-
- return pc;
-};
-var events = d3.dispatch.apply(this,["render", "resize", "highlight", "brush", "brushend", "axesreorder"].concat(d3.keys(__))),
- w = function() { return __.width - __.margin.right - __.margin.left; },
- h = function() { return __.height - __.margin.top - __.margin.bottom; },
- flags = {
- brushable: false,
- reorderable: false,
- axes: false,
- interactive: false,
- debug: false
- },
- xscale = d3.scale.ordinal(),
- yscale = {},
- dragging = {},
- line = d3.svg.line(),
- axis = d3.svg.axis().orient("left").ticks(5),
- g, // groups for axes, brushes
- ctx = {},
- canvas = {},
- clusterCentroids = [];
-
-// side effects for setters
-var side_effects = d3.dispatch.apply(this,d3.keys(__))
- .on("composite", function(d) {
- ctx.foreground.globalCompositeOperation = d.value;
- ctx.brushed.globalCompositeOperation = d.value;
- })
- .on("alpha", function(d) {
- ctx.foreground.globalAlpha = d.value;
- ctx.brushed.globalAlpha = d.value;
- })
- .on("brushedColor", function (d) {
- ctx.brushed.strokeStyle = d.value;
- })
- .on("width", function(d) { pc.resize(); })
- .on("height", function(d) { pc.resize(); })
- .on("margin", function(d) { pc.resize(); })
- .on("rate", function(d) {
- brushedQueue.rate(d.value);
- foregroundQueue.rate(d.value);
- })
- .on("dimensions", function(d) {
- xscale.domain(__.dimensions);
- if (flags.interactive){pc.render().updateAxes();}
- })
- .on("bundleDimension", function(d) {
- if (!__.dimensions.length) pc.detectDimensions();
- if (!(__.dimensions[0] in yscale)) pc.autoscale();
- if (typeof d.value === "number") {
- if (d.value < __.dimensions.length) {
- __.bundleDimension = __.dimensions[d.value];
- } else if (d.value < __.hideAxis.length) {
- __.bundleDimension = __.hideAxis[d.value];
- }
- } else {
- __.bundleDimension = d.value;
- }
-
- __.clusterCentroids = compute_cluster_centroids(__.bundleDimension);
- })
- .on("hideAxis", function(d) {
- if (!__.dimensions.length) pc.detectDimensions();
- pc.dimensions(without(__.dimensions, d.value));
- });
-
-// expose the state of the chart
-pc.state = __;
-pc.flags = flags;
-
-// create getter/setters
-getset(pc, __, events);
-
-// expose events
-d3.rebind(pc, events, "on");
-
-// getter/setter with event firing
-function getset(obj,state,events) {
- d3.keys(state).forEach(function(key) {
- obj[key] = function(x) {
- if (!arguments.length) {
- return state[key];
- }
- var old = state[key];
- state[key] = x;
- side_effects[key].call(pc,{"value": x, "previous": old});
- events[key].call(pc,{"value": x, "previous": old});
- return obj;
- };
- });
-};
-
-function extend(target, source) {
- for (key in source) {
- target[key] = source[key];
- }
- return target;
-};
-
-function without(arr, item) {
- return arr.filter(function(elem) { return item.indexOf(elem) === -1; })
-};
-/** adjusts an axis' default range [h()+1, 1] if a NullValueSeparator is set */
-function getRange() {
- if (__.nullValueSeparator=="bottom") {
- return [h()+1-__.nullValueSeparatorPadding.bottom-__.nullValueSeparatorPadding.top, 1];
- } else if (__.nullValueSeparator=="top") {
- return [h()+1, 1+__.nullValueSeparatorPadding.bottom+__.nullValueSeparatorPadding.top];
- }
- return [h()+1, 1];
-};
-
-pc.autoscale = function() {
- // yscale
- var defaultScales = {
- "date": function(k) {
- var extent = d3.extent(__.data, function(d) {
- return d[k] ? d[k].getTime() : null;
- });
-
- // special case if single value
- if (extent[0] === extent[1]) {
- return d3.scale.ordinal()
- .domain([extent[0]])
- .rangePoints(getRange());
- }
-
- return d3.time.scale()
- .domain(extent)
- .range(getRange());
- },
- "number": function(k) {
- var extent = d3.extent(__.data, function(d) { return +d[k]; });
-
- // special case if single value
- if (extent[0] === extent[1]) {
- return d3.scale.ordinal()
- .domain([extent[0]])
- .rangePoints(getRange());
- }
-
- return d3.scale.linear()
- .domain(extent)
- .range(getRange());
- },
- "string": function(k) {
- var counts = {},
- domain = [];
-
- // Let's get the count for each value so that we can sort the domain based
- // on the number of items for each value.
- __.data.map(function(p) {
- if (p[k] === undefined && __.nullValueSeparator!== "undefined"){
- return; // null values will be drawn beyond the horizontal null value separator!
- }
- if (counts[p[k]] === undefined) {
- counts[p[k]] = 1;
- } else {
- counts[p[k]] = counts[p[k]] + 1;
- }
- });
-
- domain = Object.getOwnPropertyNames(counts).sort(function(a, b) {
- return counts[a] - counts[b];
- });
-
- return d3.scale.ordinal()
- .domain(domain)
- .rangePoints(getRange());
- }
- };
-
- __.dimensions.forEach(function(k) {
- yscale[k] = defaultScales[__.types[k]](k);
- });
-
- __.hideAxis.forEach(function(k) {
- yscale[k] = defaultScales[__.types[k]](k);
- });
-
- // xscale
- xscale.rangePoints([0, w()], 1);
-
- // canvas sizes
- pc.selection.selectAll("canvas")
- .style("margin-top", __.margin.top + "px")
- .style("margin-left", __.margin.left + "px")
- .attr("width", w()+2)
- .attr("height", h()+2);
-
- // default styles, needs to be set when canvas width changes
- ctx.foreground.strokeStyle = __.color;
- ctx.foreground.lineWidth = 1.4;
- ctx.foreground.globalCompositeOperation = __.composite;
- ctx.foreground.globalAlpha = __.alpha;
- ctx.brushed.strokeStyle = __.brushedColor;
- ctx.brushed.lineWidth = 1.4;
- ctx.brushed.globalCompositeOperation = __.composite;
- ctx.brushed.globalAlpha = __.alpha;
- ctx.highlight.lineWidth = 3;
-
- return this;
-};
-
-pc.scale = function(d, domain) {
- yscale[d].domain(domain);
-
- return this;
-};
-
-pc.flip = function(d) {
- //yscale[d].domain().reverse(); // does not work
- yscale[d].domain(yscale[d].domain().reverse()); // works
-
- return this;
-};
-
-pc.commonScale = function(global, type) {
- var t = type || "number";
- if (typeof global === 'undefined') {
- global = true;
- }
-
- // scales of the same type
- var scales = __.dimensions.concat(__.hideAxis).filter(function(p) {
- return __.types[p] == t;
- });
-
- if (global) {
- var extent = d3.extent(scales.map(function(p,i) {
- return yscale[p].domain();
- }).reduce(function(a,b) {
- return a.concat(b);
- }));
-
- scales.forEach(function(d) {
- yscale[d].domain(extent);
- });
-
- } else {
- scales.forEach(function(k) {
- yscale[k].domain(d3.extent(__.data, function(d) { return +d[k]; }));
- });
- }
-
- // update centroids
- if (__.bundleDimension !== null) {
- pc.bundleDimension(__.bundleDimension);
- }
-
- return this;
-};
-pc.detectDimensions = function() {
- pc.types(pc.detectDimensionTypes(__.data));
- pc.dimensions(d3.keys(pc.types()));
- return this;
-};
-
-// a better "typeof" from this post: http://stackoverflow.com/questions/7390426/better-way-to-get-type-of-a-javascript-variable
-pc.toType = function(v) {
- return ({}).toString.call(v).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
-};
-
-// try to coerce to number before returning type
-pc.toTypeCoerceNumbers = function(v) {
- if ((parseFloat(v) == v) && (v != null)) {
- return "number";
-}
- return pc.toType(v);
-};
-
-// attempt to determine types of each dimension based on first row of data
-pc.detectDimensionTypes = function(data) {
- var types = {};
- d3.keys(data[0])
- .forEach(function(col) {
- types[col] = pc.toTypeCoerceNumbers(data[0][col]);
- });
- return types;
-};
-pc.render = function() {
- // try to autodetect dimensions and create scales
- if (!__.dimensions.length) pc.detectDimensions();
- if (!(__.dimensions[0] in yscale)) pc.autoscale();
-
- pc.render[__.mode]();
-
- events.render.call(this);
- return this;
-};
-
-pc.renderBrushed = function() {
- if (!__.dimensions.length) pc.detectDimensions();
- if (!(__.dimensions[0] in yscale)) pc.autoscale();
-
- pc.renderBrushed[__.mode]();
-
- events.render.call(this);
- return this;
-};
-
-function isBrushed() {
- if (__.brushed && __.brushed.length !== __.data.length)
- return true;
-
- var object = brush.currentMode().brushState();
-
- for (var key in object) {
- if (object.hasOwnProperty(key)) {
- return true;
- }
- }
- return false;
-};
-
-pc.render.default = function() {
- pc.clear('foreground');
- pc.clear('highlight');
-
- pc.renderBrushed.default();
-
- __.data.forEach(path_foreground);
-};
-
-var foregroundQueue = d3.renderQueue(path_foreground)
- .rate(50)
- .clear(function() {
- pc.clear('foreground');
- pc.clear('highlight');
- });
-
-pc.render.queue = function() {
- pc.renderBrushed.queue();
-
- foregroundQueue(__.data);
-};
-
-pc.renderBrushed.default = function() {
- pc.clear('brushed');
-
- if (isBrushed()) {
- __.brushed.forEach(path_brushed);
- }
-};
-
-var brushedQueue = d3.renderQueue(path_brushed)
- .rate(50)
- .clear(function() {
- pc.clear('brushed');
- });
-
-pc.renderBrushed.queue = function() {
- if (isBrushed()) {
- brushedQueue(__.brushed);
- } else {
- brushedQueue([]); // This is needed to clear the currently brushed items
- }
-};function compute_cluster_centroids(d) {
-
- var clusterCentroids = d3.map();
- var clusterCounts = d3.map();
- // determine clusterCounts
- __.data.forEach(function(row) {
- var scaled = yscale[d](row[d]);
- if (!clusterCounts.has(scaled)) {
- clusterCounts.set(scaled, 0);
- }
- var count = clusterCounts.get(scaled);
- clusterCounts.set(scaled, count + 1);
- });
-
- __.data.forEach(function(row) {
- __.dimensions.map(function(p, i) {
- var scaled = yscale[d](row[d]);
- if (!clusterCentroids.has(scaled)) {
- var map = d3.map();
- clusterCentroids.set(scaled, map);
- }
- if (!clusterCentroids.get(scaled).has(p)) {
- clusterCentroids.get(scaled).set(p, 0);
- }
- var value = clusterCentroids.get(scaled).get(p);
- value += yscale[p](row[p]) / clusterCounts.get(scaled);
- clusterCentroids.get(scaled).set(p, value);
- });
- });
-
- return clusterCentroids;
-
-}
-
-function compute_centroids(row) {
- var centroids = [];
-
- var p = __.dimensions;
- var cols = p.length;
- var a = 0.5; // center between axes
- for (var i = 0; i < cols; ++i) {
- // centroids on 'real' axes
- var x = position(p[i]);
- var y = yscale[p[i]](row[p[i]]);
- centroids.push($V([x, y]));
-
- // centroids on 'virtual' axes
- if (i < cols - 1) {
- var cx = x + a * (position(p[i+1]) - x);
- var cy = y + a * (yscale[p[i+1]](row[p[i+1]]) - y);
- if (__.bundleDimension !== null) {
- var leftCentroid = __.clusterCentroids.get(yscale[__.bundleDimension](row[__.bundleDimension])).get(p[i]);
- var rightCentroid = __.clusterCentroids.get(yscale[__.bundleDimension](row[__.bundleDimension])).get(p[i+1]);
- var centroid = 0.5 * (leftCentroid + rightCentroid);
- cy = centroid + (1 - __.bundlingStrength) * (cy - centroid);
- }
- centroids.push($V([cx, cy]));
- }
- }
-
- return centroids;
-}
-
-function compute_control_points(centroids) {
-
- var cols = centroids.length;
- var a = __.smoothness;
- var cps = [];
-
- cps.push(centroids[0]);
- cps.push($V([centroids[0].e(1) + a*2*(centroids[1].e(1)-centroids[0].e(1)), centroids[0].e(2)]));
- for (var col = 1; col < cols - 1; ++col) {
- var mid = centroids[col];
- var left = centroids[col - 1];
- var right = centroids[col + 1];
-
- var diff = left.subtract(right);
- cps.push(mid.add(diff.x(a)));
- cps.push(mid);
- cps.push(mid.subtract(diff.x(a)));
- }
- cps.push($V([centroids[cols-1].e(1) + a*2*(centroids[cols-2].e(1)-centroids[cols-1].e(1)), centroids[cols-1].e(2)]));
- cps.push(centroids[cols - 1]);
-
- return cps;
-
-};pc.shadows = function() {
- flags.shadows = true;
- pc.alphaOnBrushed(0.1);
- pc.render();
- return this;
-};
-
-// draw dots with radius r on the axis line where data intersects
-pc.axisDots = function(r) {
- var r = r || 0.1;
- var ctx = pc.ctx.marks;
- var startAngle = 0;
- var endAngle = 2 * Math.PI;
- ctx.globalAlpha = d3.min([ 1 / Math.pow(__.data.length, 1 / 2), 1 ]);
- __.data.forEach(function(d) {
- __.dimensions.map(function(p, i) {
- ctx.beginPath();
- ctx.arc(position(p), yscale[p](d[p]), r, startAngle, endAngle);
- ctx.stroke();
- ctx.fill();
- });
- });
- return this;
-};
-
-// draw single cubic bezier curve
-function single_curve(d, ctx) {
-
- var centroids = compute_centroids(d);
- var cps = compute_control_points(centroids);
-
- ctx.moveTo(cps[0].e(1), cps[0].e(2));
- for (var i = 1; i < cps.length; i += 3) {
- if (__.showControlPoints) {
- for (var j = 0; j < 3; j++) {
- ctx.fillRect(cps[i+j].e(1), cps[i+j].e(2), 2, 2);
- }
- }
- ctx.bezierCurveTo(cps[i].e(1), cps[i].e(2), cps[i+1].e(1), cps[i+1].e(2), cps[i+2].e(1), cps[i+2].e(2));
- }
-};
-
-// draw single polyline
-function color_path(d, ctx) {
- ctx.beginPath();
- if ((__.bundleDimension !== null && __.bundlingStrength > 0) || __.smoothness > 0) {
- single_curve(d, ctx);
- } else {
- single_path(d, ctx);
- }
- ctx.stroke();
-};
-
-// draw many polylines of the same color
-function paths(data, ctx) {
- ctx.clearRect(-1, -1, w() + 2, h() + 2);
- ctx.beginPath();
- data.forEach(function(d) {
- if ((__.bundleDimension !== null && __.bundlingStrength > 0) || __.smoothness > 0) {
- single_curve(d, ctx);
- } else {
- single_path(d, ctx);
- }
- });
- ctx.stroke();
-};
-
-// returns the y-position just beyond the separating null value line
-function getNullPosition() {
- if (__.nullValueSeparator=="bottom") {
- return h()+1;
- } else if (__.nullValueSeparator=="top") {
- return 1;
- } else {
- console.log("A value is NULL, but nullValueSeparator is not set; set it to 'bottom' or 'top'.");
- }
- return h()+1;
-};
-
-function single_path(d, ctx) {
- __.dimensions.map(function(p, i) {
- if (i == 0) {
- ctx.moveTo(position(p), typeof d[p] =='undefined' ? getNullPosition() : yscale[p](d[p]));
- } else {
- ctx.lineTo(position(p), typeof d[p] =='undefined' ? getNullPosition() : yscale[p](d[p]));
- }
- });
-};
-
-function path_brushed(d, i) {
- if (__.brushedColor !== null) {
- ctx.brushed.strokeStyle = d3.functor(__.brushedColor)(d, i);
- } else {
- ctx.brushed.strokeStyle = d3.functor(__.color)(d, i);
- }
- return color_path(d, ctx.brushed)
-};
-
-function path_foreground(d, i) {
- ctx.foreground.strokeStyle = d3.functor(__.color)(d, i);
- return color_path(d, ctx.foreground);
-};
-
-function path_highlight(d, i) {
- ctx.highlight.strokeStyle = d3.functor(__.color)(d, i);
- return color_path(d, ctx.highlight);
-};
-pc.clear = function(layer) {
- ctx[layer].clearRect(0, 0, w() + 2, h() + 2);
-
- // This will make sure that the foreground items are transparent
- // without the need for changing the opacity style of the foreground canvas
- // as this would stop the css styling from working
- if(layer === "brushed" && isBrushed()) {
- ctx.brushed.fillStyle = pc.selection.style("background-color");
- ctx.brushed.globalAlpha = 1 - __.alphaOnBrushed;
- ctx.brushed.fillRect(0, 0, w() + 2, h() + 2);
- ctx.brushed.globalAlpha = __.alpha;
- }
- return this;
-};
-d3.rebind(pc, axis, "ticks", "orient", "tickValues", "tickSubdivide", "tickSize", "tickPadding", "tickFormat");
-
-function flipAxisAndUpdatePCP(dimension) {
- var g = pc.svg.selectAll(".dimension");
-
- pc.flip(dimension);
-
- d3.select(this.parentElement)
- .transition()
- .duration(1100)
- .call(axis.scale(yscale[dimension]));
-
- pc.render();
-}
-
-function rotateLabels() {
- var delta = d3.event.deltaY;
- delta = delta < 0 ? -5 : delta;
- delta = delta > 0 ? 5 : delta;
-
- __.dimensionTitleRotation += delta;
- pc.svg.selectAll("text.label")
- .attr("transform", "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")");
- d3.event.preventDefault();
-}
-
-function dimensionLabels(d) {
- return d in __.dimensionTitles ? __.dimensionTitles[d] : d; // dimension display names
-}
-
-pc.createAxes = function() {
- if (g) pc.removeAxes();
-
- // Add a group element for each dimension.
- g = pc.svg.selectAll(".dimension")
- .data(__.dimensions, function(d) { return d; })
- .enter().append("svg:g")
- .attr("class", "dimension")
- .attr("transform", function(d) { return "translate(" + xscale(d) + ")"; });
-
- // Add an axis and title.
- g.append("svg:g")
- .attr("class", "axis")
- .attr("transform", "translate(0,0)")
- .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); })
- .append("svg:text")
- .attr({
- "text-anchor": "middle",
- "y": 0,
- "transform": "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")",
- "x": 0,
- "class": "label"
- })
- .text(dimensionLabels)
- .on("dblclick", flipAxisAndUpdatePCP)
- .on("wheel", rotateLabels);
-
- if (__.nullValueSeparator=="top") {
- pc.svg.append("line")
- .attr("x1", 0)
- .attr("y1", 1+__.nullValueSeparatorPadding.top)
- .attr("x2", w())
- .attr("y2", 1+__.nullValueSeparatorPadding.top)
- .attr("stroke-width", 1)
- .attr("stroke", "#777")
- .attr("fill", "none")
- .attr("shape-rendering", "crispEdges");
- } else if (__.nullValueSeparator=="bottom") {
- pc.svg.append("line")
- .attr("x1", 0)
- .attr("y1", h()+1-__.nullValueSeparatorPadding.bottom)
- .attr("x2", w())
- .attr("y2", h()+1-__.nullValueSeparatorPadding.bottom)
- .attr("stroke-width", 1)
- .attr("stroke", "#777")
- .attr("fill", "none")
- .attr("shape-rendering", "crispEdges");
- }
-
- flags.axes= true;
- return this;
-};
-
-pc.removeAxes = function() {
- g.remove();
- return this;
-};
-
-pc.updateAxes = function() {
- var g_data = pc.svg.selectAll(".dimension").data(__.dimensions);
-
- // Enter
- g_data.enter().append("svg:g")
- .attr("class", "dimension")
- .attr("transform", function(p) { return "translate(" + position(p) + ")"; })
- .style("opacity", 0)
- .append("svg:g")
- .attr("class", "axis")
- .attr("transform", "translate(0,0)")
- .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); })
- .append("svg:text")
- .attr({
- "text-anchor": "middle",
- "y": 0,
- "transform": "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")",
- "x": 0,
- "class": "label"
- })
- .text(dimensionLabels)
- .on("dblclick", flipAxisAndUpdatePCP)
- .on("wheel", rotateLabels);
-
- // Update
- g_data.attr("opacity", 0);
- g_data.select(".axis")
- .transition()
- .duration(1100)
- .each(function(d) {
- d3.select(this).call(axis.scale(yscale[d]));
- });
- g_data.select(".label")
- .transition()
- .duration(1100)
- .text(dimensionLabels)
- .attr("transform", "translate(0,-5) rotate(" + __.dimensionTitleRotation + ")");
-
- // Exit
- g_data.exit().remove();
-
- g = pc.svg.selectAll(".dimension");
- g.transition().duration(1100)
- .attr("transform", function(p) { return "translate(" + position(p) + ")"; })
- .style("opacity", 1);
-
- pc.svg.selectAll(".axis")
- .transition()
- .duration(1100)
- .each(function(d) { d3.select(this).call(axis.scale(yscale[d])); });
-
- if (flags.brushable) pc.brushable();
- if (flags.reorderable) pc.reorderable();
- if (pc.brushMode() !== "None") {
- var mode = pc.brushMode();
- pc.brushMode("None");
- pc.brushMode(mode);
- }
- return this;
-};
-
-// Jason Davies, http://bl.ocks.org/1341281
-pc.reorderable = function() {
- if (!g) pc.createAxes();
-
- g.style("cursor", "move")
- .call(d3.behavior.drag()
- .on("dragstart", function(d) {
- dragging[d] = this.__origin__ = xscale(d);
- })
- .on("drag", function(d) {
- dragging[d] = Math.min(w(), Math.max(0, this.__origin__ += d3.event.dx));
- __.dimensions.sort(function(a, b) { return position(a) - position(b); });
- xscale.domain(__.dimensions);
- pc.render();
- g.attr("transform", function(d) { return "translate(" + position(d) + ")"; });
- })
- .on("dragend", function(d) {
- // Let's see if the order has changed and send out an event if so.
- var i = 0,
- j = __.dimensions.indexOf(d),
- elem = this,
- parent = this.parentElement;
-
- while((elem = elem.previousElementSibling) != null) ++i;
- if (i !== j) {
- events.axesreorder.call(pc, __.dimensions);
- // We now also want to reorder the actual dom elements that represent
- // the axes. That is, the g.dimension elements. If we don't do this,
- // we get a weird and confusing transition when updateAxes is called.
- // This is due to the fact that, initially the nth g.dimension element
- // represents the nth axis. However, after a manual reordering,
- // without reordering the dom elements, the nth dom elements no longer
- // necessarily represents the nth axis.
- //
- // i is the original index of the dom element
- // j is the new index of the dom element
- if (i > j) { // Element moved left
- parent.insertBefore(this, parent.children[j - 1]);
- } else { // Element moved right
- if ((j + 1) < parent.children.length) {
- parent.insertBefore(this, parent.children[j + 1]);
- } else {
- parent.appendChild(this);
- }
- }
- }
-
- delete this.__origin__;
- delete dragging[d];
- d3.select(this).transition().attr("transform", "translate(" + xscale(d) + ")");
- pc.render();
- }));
- flags.reorderable = true;
- return this;
-};
-
-// Reorder dimensions, such that the highest value (visually) is on the left and
-// the lowest on the right. Visual values are determined by the data values in
-// the given row.
-pc.reorder = function(rowdata) {
- var dims = __.dimensions.slice(0);
- __.dimensions.sort(function(a, b) {
- var pixelDifference = yscale[a](rowdata[a]) - yscale[b](rowdata[b]);
-
- // Array.sort is not necessarily stable, this means that if pixelDifference is zero
- // the ordering of dimensions might change unexpectedly. This is solved by sorting on
- // variable name in that case.
- if (pixelDifference === 0) {
- return a.localeCompare(b);
- } // else
- return pixelDifference;
- });
-
- // NOTE: this is relatively cheap given that:
- // number of dimensions < number of data items
- // Thus we check equality of order to prevent rerendering when this is the case.
- var reordered = false;
- dims.some(function(val, index) {
- reordered = val !== __.dimensions[index];
- return reordered;
- });
-
- if (reordered) {
- xscale.domain(__.dimensions);
- var highlighted = __.highlighted.slice(0);
- pc.unhighlight();
-
- g.transition()
- .duration(1500)
- .attr("transform", function(d) {
- return "translate(" + xscale(d) + ")";
- });
- pc.render();
-
- // pc.highlight() does not check whether highlighted is length zero, so we do that here.
- if (highlighted.length !== 0) {
- pc.highlight(highlighted);
- }
- }
-}
-
-// pairs of adjacent dimensions
-pc.adjacent_pairs = function(arr) {
- var ret = [];
- for (var i = 0; i < arr.length-1; i++) {
- ret.push([arr[i],arr[i+1]]);
- };
- return ret;
-};
-
-var brush = {
- modes: {
- "None": {
- install: function(pc) {}, // Nothing to be done.
- uninstall: function(pc) {}, // Nothing to be done.
- selected: function() { return []; }, // Nothing to return
- brushState: function() { return {}; }
- }
- },
- mode: "None",
- predicate: "AND",
- currentMode: function() {
- return this.modes[this.mode];
- }
-};
-
-// This function can be used for 'live' updates of brushes. That is, during the
-// specification of a brush, this method can be called to update the view.
-//
-// @param newSelection - The new set of data items that is currently contained
-// by the brushes
-function brushUpdated(newSelection) {
- __.brushed = newSelection;
- events.brush.call(pc,__.brushed);
- pc.renderBrushed();
-}
-
-function brushPredicate(predicate) {
- if (!arguments.length) { return brush.predicate; }
-
- predicate = String(predicate).toUpperCase();
- if (predicate !== "AND" && predicate !== "OR") {
- throw "Invalid predicate " + predicate;
- }
-
- brush.predicate = predicate;
- __.brushed = brush.currentMode().selected();
- pc.renderBrushed();
- return pc;
-}
-
-pc.brushModes = function() {
- return Object.getOwnPropertyNames(brush.modes);
-};
-
-pc.brushMode = function(mode) {
- if (arguments.length === 0) {
- return brush.mode;
- }
-
- if (pc.brushModes().indexOf(mode) === -1) {
- throw "pc.brushmode: Unsupported brush mode: " + mode;
- }
-
- // Make sure that we don't trigger unnecessary events by checking if the mode
- // actually changes.
- if (mode !== brush.mode) {
- // When changing brush modes, the first thing we need to do is clearing any
- // brushes from the current mode, if any.
- if (brush.mode !== "None") {
- pc.brushReset();
- }
-
- // Next, we need to 'uninstall' the current brushMode.
- brush.modes[brush.mode].uninstall(pc);
- // Finally, we can install the requested one.
- brush.mode = mode;
- brush.modes[brush.mode].install();
- if (mode === "None") {
- delete pc.brushPredicate;
- } else {
- pc.brushPredicate = brushPredicate;
- }
- }
-
- return pc;
-};
-
-// brush mode: 1D-Axes
-
-(function() {
- var brushes = {};
-
- function is_brushed(p) {
- return !brushes[p].empty();
- }
-
- // data within extents
- function selected() {
- var actives = __.dimensions.filter(is_brushed),
- extents = actives.map(function(p) { return brushes[p].extent(); });
-
- // We don't want to return the full data set when there are no axes brushed.
- // Actually, when there are no axes brushed, by definition, no items are
- // selected. So, let's avoid the filtering and just return false.
- //if (actives.length === 0) return false;
-
- // Resolves broken examples for now. They expect to get the full dataset back from empty brushes
- if (actives.length === 0) return __.data;
-
- // test if within range
- var within = {
- "date": function(d,p,dimension) {
- if (typeof yscale[p].rangePoints === "function") { // if it is ordinal
- return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1]
- } else {
- return extents[dimension][0] <= d[p] && d[p] <= extents[dimension][1]
- }
- },
- "number": function(d,p,dimension) {
- if (typeof yscale[p].rangePoints === "function") { // if it is ordinal
- return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1]
- } else {
- return extents[dimension][0] <= d[p] && d[p] <= extents[dimension][1]
- }
- },
- "string": function(d,p,dimension) {
- return extents[dimension][0] <= yscale[p](d[p]) && yscale[p](d[p]) <= extents[dimension][1]
- }
- };
-
- return __.data
- .filter(function(d) {
- switch(brush.predicate) {
- case "AND":
- return actives.every(function(p, dimension) {
- return within[__.types[p]](d,p,dimension);
- });
- case "OR":
- return actives.some(function(p, dimension) {
- return within[__.types[p]](d,p,dimension);
- });
- default:
- throw "Unknown brush predicate " + __.brushPredicate;
- }
- });
- };
-
- function brushExtents(extents) {
- if(typeof(extents) === 'undefined')
- {
- var extents = {};
- __.dimensions.forEach(function(d) {
- var brush = brushes[d];
- if (brush !== undefined && !brush.empty()) {
- var extent = brush.extent();
- extent.sort(d3.ascending);
- extents[d] = extent;
- }
- });
- return extents;
- }
- else
- {
- //first get all the brush selections
- var brushSelections = {};
- g.selectAll('.brush')
- .each(function(d) {
- brushSelections[d] = d3.select(this);
-
- });
-
- // loop over each dimension and update appropriately (if it was passed in through extents)
- __.dimensions.forEach(function(d) {
- if (extents[d] === undefined){
- return;
- }
-
- var brush = brushes[d];
- if (brush !== undefined) {
- //update the extent
- brush.extent(extents[d]);
-
- //redraw the brush
- brush(brushSelections[d]);
-
- //fire some events
- brush.event(brushSelections[d]);
- }
- });
-
- //redraw the chart
- pc.renderBrushed();
- }
- }
- function brushFor(axis) {
- var brush = d3.svg.brush();
-
- brush
- .y(yscale[axis])
- .on("brushstart", function() {
- if(d3.event.sourceEvent !== null) {
- d3.event.sourceEvent.stopPropagation();
- }
- })
- .on("brush", function() {
- brushUpdated(selected());
- })
- .on("brushend", function() {
- events.brushend.call(pc, __.brushed);
- });
-
- brushes[axis] = brush;
- return brush;
- };
- function brushReset(dimension) {
- __.brushed = false;
- if (g) {
- g.selectAll('.brush')
- .each(function(d) {
- d3.select(this).call(
- brushes[d].clear()
- );
- });
- pc.renderBrushed();
- }
- return this;
- };
-
- function install() {
- if (!g) pc.createAxes();
-
- // Add and store a brush for each axis.
- g.append("svg:g")
- .attr("class", "brush")
- .each(function(d) {
- d3.select(this).call(brushFor(d));
- })
- .selectAll("rect")
- .style("visibility", null)
- .attr("x", -15)
- .attr("width", 30);
-
- pc.brushExtents = brushExtents;
- pc.brushReset = brushReset;
- return pc;
- };
-
- brush.modes["1D-axes"] = {
- install: install,
- uninstall: function() {
- g.selectAll(".brush").remove();
- brushes = {};
- delete pc.brushExtents;
- delete pc.brushReset;
- },
- selected: selected,
- brushState: brushExtents
- }
-})();
-// brush mode: 2D-strums
-// bl.ocks.org/syntagmatic/5441022
-
-(function() {
- var strums = {},
- strumRect;
-
- function drawStrum(strum, activePoint) {
- var svg = pc.selection.select("svg").select("g#strums"),
- id = strum.dims.i,
- points = [strum.p1, strum.p2],
- line = svg.selectAll("line#strum-" + id).data([strum]),
- circles = svg.selectAll("circle#strum-" + id).data(points),
- drag = d3.behavior.drag();
-
- line.enter()
- .append("line")
- .attr("id", "strum-" + id)
- .attr("class", "strum");
-
- line
- .attr("x1", function(d) { return d.p1[0]; })
- .attr("y1", function(d) { return d.p1[1]; })
- .attr("x2", function(d) { return d.p2[0]; })
- .attr("y2", function(d) { return d.p2[1]; })
- .attr("stroke", "black")
- .attr("stroke-width", 2);
-
- drag
- .on("drag", function(d, i) {
- var ev = d3.event;
- i = i + 1;
- strum["p" + i][0] = Math.min(Math.max(strum.minX + 1, ev.x), strum.maxX);
- strum["p" + i][1] = Math.min(Math.max(strum.minY, ev.y), strum.maxY);
- drawStrum(strum, i - 1);
- })
- .on("dragend", onDragEnd());
-
- circles.enter()
- .append("circle")
- .attr("id", "strum-" + id)
- .attr("class", "strum");
-
- circles
- .attr("cx", function(d) { return d[0]; })
- .attr("cy", function(d) { return d[1]; })
- .attr("r", 5)
- .style("opacity", function(d, i) {
- return (activePoint !== undefined && i === activePoint) ? 0.8 : 0;
- })
- .on("mouseover", function() {
- d3.select(this).style("opacity", 0.8);
- })
- .on("mouseout", function() {
- d3.select(this).style("opacity", 0);
- })
- .call(drag);
- }
-
- function dimensionsForPoint(p) {
- var dims = { i: -1, left: undefined, right: undefined };
- __.dimensions.some(function(dim, i) {
- if (xscale(dim) < p[0]) {
- var next = __.dimensions[i + 1];
- dims.i = i;
- dims.left = dim;
- dims.right = next;
- return false;
- }
- return true;
- });
-
- if (dims.left === undefined) {
- // Event on the left side of the first axis.
- dims.i = 0;
- dims.left = __.dimensions[0];
- dims.right = __.dimensions[1];
- } else if (dims.right === undefined) {
- // Event on the right side of the last axis
- dims.i = __.dimensions.length - 1;
- dims.right = dims.left;
- dims.left = __.dimensions[__.dimensions.length - 2];
- }
-
- return dims;
- }
-
- function onDragStart() {
- // First we need to determine between which two axes the sturm was started.
- // This will determine the freedom of movement, because a strum can
- // logically only happen between two axes, so no movement outside these axes
- // should be allowed.
- return function() {
- var p = d3.mouse(strumRect[0][0]),
- dims,
- strum;
-
- p[0] = p[0] - __.margin.left;
- p[1] = p[1] - __.margin.top;
-
- dims = dimensionsForPoint(p),
- strum = {
- p1: p,
- dims: dims,
- minX: xscale(dims.left),
- maxX: xscale(dims.right),
- minY: 0,
- maxY: h()
- };
-
- strums[dims.i] = strum;
- strums.active = dims.i;
-
- // Make sure that the point is within the bounds
- strum.p1[0] = Math.min(Math.max(strum.minX, p[0]), strum.maxX);
- strum.p2 = strum.p1.slice();
- };
- }
-
- function onDrag() {
- return function() {
- var ev = d3.event,
- strum = strums[strums.active];
-
- // Make sure that the point is within the bounds
- strum.p2[0] = Math.min(Math.max(strum.minX + 1, ev.x - __.margin.left), strum.maxX);
- strum.p2[1] = Math.min(Math.max(strum.minY, ev.y - __.margin.top), strum.maxY);
- drawStrum(strum, 1);
- };
- }
-
- function containmentTest(strum, width) {
- var p1 = [strum.p1[0] - strum.minX, strum.p1[1] - strum.minX],
- p2 = [strum.p2[0] - strum.minX, strum.p2[1] - strum.minX],
- m1 = 1 - width / p1[0],
- b1 = p1[1] * (1 - m1),
- m2 = 1 - width / p2[0],
- b2 = p2[1] * (1 - m2);
-
- // test if point falls between lines
- return function(p) {
- var x = p[0],
- y = p[1],
- y1 = m1 * x + b1,
- y2 = m2 * x + b2;
-
- if (y > Math.min(y1, y2) && y < Math.max(y1, y2)) {
- return true;
- }
-
- return false;
- };
- }
-
- function selected() {
- var ids = Object.getOwnPropertyNames(strums),
- brushed = __.data;
-
- // Get the ids of the currently active strums.
- ids = ids.filter(function(d) {
- return !isNaN(d);
- });
-
- function crossesStrum(d, id) {
- var strum = strums[id],
- test = containmentTest(strum, strums.width(id)),
- d1 = strum.dims.left,
- d2 = strum.dims.right,
- y1 = yscale[d1],
- y2 = yscale[d2],
- point = [y1(d[d1]) - strum.minX, y2(d[d2]) - strum.minX];
- return test(point);
- }
-
- if (ids.length === 0) { return brushed; }
-
- return brushed.filter(function(d) {
- switch(brush.predicate) {
- case "AND":
- return ids.every(function(id) { return crossesStrum(d, id); });
- case "OR":
- return ids.some(function(id) { return crossesStrum(d, id); });
- default:
- throw "Unknown brush predicate " + __.brushPredicate;
- }
- });
- }
-
- function removeStrum() {
- var strum = strums[strums.active],
- svg = pc.selection.select("svg").select("g#strums");
-
- delete strums[strums.active];
- strums.active = undefined;
- svg.selectAll("line#strum-" + strum.dims.i).remove();
- svg.selectAll("circle#strum-" + strum.dims.i).remove();
- }
-
- function onDragEnd() {
- return function() {
- var brushed = __.data,
- strum = strums[strums.active];
-
- // Okay, somewhat unexpected, but not totally unsurprising, a mousclick is
- // considered a drag without move. So we have to deal with that case
- if (strum && strum.p1[0] === strum.p2[0] && strum.p1[1] === strum.p2[1]) {
- removeStrum(strums);
- }
-
- brushed = selected(strums);
- strums.active = undefined;
- __.brushed = brushed;
- pc.renderBrushed();
- events.brushend.call(pc, __.brushed);
- };
- }
-
- function brushReset(strums) {
- return function() {
- var ids = Object.getOwnPropertyNames(strums).filter(function(d) {
- return !isNaN(d);
- });
-
- ids.forEach(function(d) {
- strums.active = d;
- removeStrum(strums);
- });
- onDragEnd(strums)();
- };
- }
-
- function install() {
- var drag = d3.behavior.drag();
-
- // Map of current strums. Strums are stored per segment of the PC. A segment,
- // being the area between two axes. The left most area is indexed at 0.
- strums.active = undefined;
- // Returns the width of the PC segment where currently a strum is being
- // placed. NOTE: even though they are evenly spaced in our current
- // implementation, we keep for when non-even spaced segments are supported as
- // well.
- strums.width = function(id) {
- var strum = strums[id];
-
- if (strum === undefined) {
- return undefined;
- }
-
- return strum.maxX - strum.minX;
- };
-
- pc.on("axesreorder.strums", function() {
- var ids = Object.getOwnPropertyNames(strums).filter(function(d) {
- return !isNaN(d);
- });
-
- // Checks if the first dimension is directly left of the second dimension.
- function consecutive(first, second) {
- var length = __.dimensions.length;
- return __.dimensions.some(function(d, i) {
- return (d === first)
- ? i + i < length && __.dimensions[i + 1] === second
- : false;
- });
- }
-
- if (ids.length > 0) { // We have some strums, which might need to be removed.
- ids.forEach(function(d) {
- var dims = strums[d].dims;
- strums.active = d;
- // If the two dimensions of the current strum are not next to each other
- // any more, than we'll need to remove the strum. Otherwise we keep it.
- if (!consecutive(dims.left, dims.right)) {
- removeStrum(strums);
- }
- });
- onDragEnd(strums)();
- }
- });
-
- // Add a new svg group in which we draw the strums.
- pc.selection.select("svg").append("g")
- .attr("id", "strums")
- .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")");
-
- // Install the required brushReset function
- pc.brushReset = brushReset(strums);
-
- drag
- .on("dragstart", onDragStart(strums))
- .on("drag", onDrag(strums))
- .on("dragend", onDragEnd(strums));
-
- // NOTE: The styling needs to be done here and not in the css. This is because
- // for 1D brushing, the canvas layers should not listen to
- // pointer-events.
- strumRect = pc.selection.select("svg").insert("rect", "g#strums")
- .attr("id", "strum-events")
- .attr("x", __.margin.left)
- .attr("y", __.margin.top)
- .attr("width", w())
- .attr("height", h() + 2)
- .style("opacity", 0)
- .call(drag);
- }
-
- brush.modes["2D-strums"] = {
- install: install,
- uninstall: function() {
- pc.selection.select("svg").select("g#strums").remove();
- pc.selection.select("svg").select("rect#strum-events").remove();
- pc.on("axesreorder.strums", undefined);
- delete pc.brushReset;
-
- strumRect = undefined;
- },
- selected: selected,
- brushState: function () { return strums; }
- };
-
-}());
-
-// brush mode: 1D-Axes with multiple extents
-// requires d3.svg.multibrush
-
-(function() {
- if (typeof d3.svg.multibrush !== 'function') {
- return;
- }
- var brushes = {};
-
- function is_brushed(p) {
- return !brushes[p].empty();
- }
-
- // data within extents
- function selected() {
- var actives = __.dimensions.filter(is_brushed),
- extents = actives.map(function(p) { return brushes[p].extent(); });
-
- // We don't want to return the full data set when there are no axes brushed.
- // Actually, when there are no axes brushed, by definition, no items are
- // selected. So, let's avoid the filtering and just return false.
- //if (actives.length === 0) return false;
-
- // Resolves broken examples for now. They expect to get the full dataset back from empty brushes
- if (actives.length === 0) return __.data;
-
- // test if within range
- var within = {
- "date": function(d,p,dimension,b) {
- if (typeof yscale[p].rangePoints === "function") { // if it is ordinal
- return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1]
- } else {
- return b[0] <= d[p] && d[p] <= b[1]
- }
- },
- "number": function(d,p,dimension,b) {
- if (typeof yscale[p].rangePoints === "function") { // if it is ordinal
- return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1]
- } else {
- return b[0] <= d[p] && d[p] <= b[1]
- }
- },
- "string": function(d,p,dimension,b) {
- return b[0] <= yscale[p](d[p]) && yscale[p](d[p]) <= b[1]
- }
- };
-
- return __.data
- .filter(function(d) {
- switch(brush.predicate) {
- case "AND":
- return actives.every(function(p, dimension) {
- return extents[dimension].some(function(b) {
- return within[__.types[p]](d,p,dimension,b);
- });
- });
- case "OR":
- return actives.some(function(p, dimension) {
- return extents[dimension].some(function(b) {
- return within[__.types[p]](d,p,dimension,b);
- });
- });
- default:
- throw "Unknown brush predicate " + __.brushPredicate;
- }
- });
- };
-
- function brushExtents() {
- var extents = {};
- __.dimensions.forEach(function(d) {
- var brush = brushes[d];
- if (brush !== undefined && !brush.empty()) {
- var extent = brush.extent();
- extents[d] = extent;
- }
- });
- return extents;
- }
-
- function brushFor(axis) {
- var brush = d3.svg.multibrush();
-
- brush
- .y(yscale[axis])
- .on("brushstart", function() {
- if(d3.event.sourceEvent !== null) {
- d3.event.sourceEvent.stopPropagation();
- }
- })
- .on("brush", function() {
- brushUpdated(selected());
- })
- .on("brushend", function() {
- // d3.svg.multibrush clears extents just before calling 'brushend'
- // so we have to update here again.
- // This fixes issue #103 for now, but should be changed in d3.svg.multibrush
- // to avoid unnecessary computation.
- brushUpdated(selected());
- events.brushend.call(pc, __.brushed);
- })
- .extentAdaption(function(selection) {
- selection
- .style("visibility", null)
- .attr("x", -15)
- .attr("width", 30);
- })
- .resizeAdaption(function(selection) {
- selection
- .selectAll("rect")
- .attr("x", -15)
- .attr("width", 30);
- });
-
- brushes[axis] = brush;
- return brush;
- }
-
- function brushReset(dimension) {
- __.brushed = false;
- if (g) {
- g.selectAll('.brush')
- .each(function(d) {
- d3.select(this).call(
- brushes[d].clear()
- );
- });
- pc.renderBrushed();
- }
- return this;
- };
-
- function install() {
- if (!g) pc.createAxes();
-
- // Add and store a brush for each axis.
- g.append("svg:g")
- .attr("class", "brush")
- .each(function(d) {
- d3.select(this).call(brushFor(d));
- })
- .selectAll("rect")
- .style("visibility", null)
- .attr("x", -15)
- .attr("width", 30);
-
- pc.brushExtents = brushExtents;
- pc.brushReset = brushReset;
- return pc;
- }
-
- brush.modes["1D-axes-multi"] = {
- install: install,
- uninstall: function() {
- g.selectAll(".brush").remove();
- brushes = {};
- delete pc.brushExtents;
- delete pc.brushReset;
- },
- selected: selected,
- brushState: brushExtents
- }
-})();
-// brush mode: angular
-// code based on 2D.strums.js
-
-(function() {
- var arcs = {},
- strumRect;
-
- function drawStrum(arc, activePoint) {
- var svg = pc.selection.select("svg").select("g#arcs"),
- id = arc.dims.i,
- points = [arc.p2, arc.p3],
- line = svg.selectAll("line#arc-" + id).data([{p1:arc.p1,p2:arc.p2},{p1:arc.p1,p2:arc.p3}]),
- circles = svg.selectAll("circle#arc-" + id).data(points),
- drag = d3.behavior.drag(),
- path = svg.selectAll("path#arc-" + id).data([arc]);
-
- path.enter()
- .append("path")
- .attr("id", "arc-" + id)
- .attr("class", "arc")
- .style("fill", "orange")
- .style("opacity", 0.5);
-
- path
- .attr("d", arc.arc)
- .attr("transform", "translate(" + arc.p1[0] + "," + arc.p1[1] + ")");
-
- line.enter()
- .append("line")
- .attr("id", "arc-" + id)
- .attr("class", "arc");
-
- line
- .attr("x1", function(d) { return d.p1[0]; })
- .attr("y1", function(d) { return d.p1[1]; })
- .attr("x2", function(d) { return d.p2[0]; })
- .attr("y2", function(d) { return d.p2[1]; })
- .attr("stroke", "black")
- .attr("stroke-width", 2);
-
- drag
- .on("drag", function(d, i) {
- var ev = d3.event,
- angle = 0;
-
- i = i + 2;
-
- arc["p" + i][0] = Math.min(Math.max(arc.minX + 1, ev.x), arc.maxX);
- arc["p" + i][1] = Math.min(Math.max(arc.minY, ev.y), arc.maxY);
-
- angle = i === 3 ? arcs.startAngle(id) : arcs.endAngle(id);
-
- if ((arc.startAngle < Math.PI && arc.endAngle < Math.PI && angle < Math.PI) ||
- (arc.startAngle >= Math.PI && arc.endAngle >= Math.PI && angle >= Math.PI)) {
-
- if (i === 2) {
- arc.endAngle = angle;
- arc.arc.endAngle(angle);
- } else if (i === 3) {
- arc.startAngle = angle;
- arc.arc.startAngle(angle);
- }
-
- }
-
- drawStrum(arc, i - 2);
- })
- .on("dragend", onDragEnd());
-
- circles.enter()
- .append("circle")
- .attr("id", "arc-" + id)
- .attr("class", "arc");
-
- circles
- .attr("cx", function(d) { return d[0]; })
- .attr("cy", function(d) { return d[1]; })
- .attr("r", 5)
- .style("opacity", function(d, i) {
- return (activePoint !== undefined && i === activePoint) ? 0.8 : 0;
- })
- .on("mouseover", function() {
- d3.select(this).style("opacity", 0.8);
- })
- .on("mouseout", function() {
- d3.select(this).style("opacity", 0);
- })
- .call(drag);
- }
-
- function dimensionsForPoint(p) {
- var dims = { i: -1, left: undefined, right: undefined };
- __.dimensions.some(function(dim, i) {
- if (xscale(dim) < p[0]) {
- var next = __.dimensions[i + 1];
- dims.i = i;
- dims.left = dim;
- dims.right = next;
- return false;
- }
- return true;
- });
-
- if (dims.left === undefined) {
- // Event on the left side of the first axis.
- dims.i = 0;
- dims.left = __.dimensions[0];
- dims.right = __.dimensions[1];
- } else if (dims.right === undefined) {
- // Event on the right side of the last axis
- dims.i = __.dimensions.length - 1;
- dims.right = dims.left;
- dims.left = __.dimensions[__.dimensions.length - 2];
- }
-
- return dims;
- }
-
- function onDragStart() {
- // First we need to determine between which two axes the arc was started.
- // This will determine the freedom of movement, because a arc can
- // logically only happen between two axes, so no movement outside these axes
- // should be allowed.
- return function() {
- var p = d3.mouse(strumRect[0][0]),
- dims,
- arc;
-
- p[0] = p[0] - __.margin.left;
- p[1] = p[1] - __.margin.top;
-
- dims = dimensionsForPoint(p),
- arc = {
- p1: p,
- dims: dims,
- minX: xscale(dims.left),
- maxX: xscale(dims.right),
- minY: 0,
- maxY: h(),
- startAngle: undefined,
- endAngle: undefined,
- arc: d3.svg.arc().innerRadius(0)
- };
-
- arcs[dims.i] = arc;
- arcs.active = dims.i;
-
- // Make sure that the point is within the bounds
- arc.p1[0] = Math.min(Math.max(arc.minX, p[0]), arc.maxX);
- arc.p2 = arc.p1.slice();
- arc.p3 = arc.p1.slice();
- };
- }
-
- function onDrag() {
- return function() {
- var ev = d3.event,
- arc = arcs[arcs.active];
-
- // Make sure that the point is within the bounds
- arc.p2[0] = Math.min(Math.max(arc.minX + 1, ev.x - __.margin.left), arc.maxX);
- arc.p2[1] = Math.min(Math.max(arc.minY, ev.y - __.margin.top), arc.maxY);
- arc.p3 = arc.p2.slice();
-// console.log(arcs.angle(arcs.active));
-// console.log(signedAngle(arcs.unsignedAngle(arcs.active)));
- drawStrum(arc, 1);
- };
- }
-
- // some helper functions
- function hypothenuse(a, b) {
- return Math.sqrt(a*a + b*b);
- }
-
- var rad = (function() {
- var c = Math.PI / 180;
- return function(angle) {
- return angle * c;
- };
- })();
-
- var deg = (function() {
- var c = 180 / Math.PI;
- return function(angle) {
- return angle * c;
- };
- })();
-
- // [0, 2*PI] -> [-PI/2, PI/2]
- var signedAngle = function(angle) {
- var ret = angle;
- if (angle > Math.PI) {
- ret = angle - 1.5 * Math.PI;
- ret = angle - 1.5 * Math.PI;
- } else {
- ret = angle - 0.5 * Math.PI;
- ret = angle - 0.5 * Math.PI;
- }
- return -ret;
- }
-
- /**
- * angles are stored in radians from in [0, 2*PI], where 0 in 12 o'clock.
- * However, one can only select lines from 0 to PI, so we compute the
- * 'signed' angle, where 0 is the horizontal line (3 o'clock), and +/- PI/2
- * are 12 and 6 o'clock respectively.
- */
- function containmentTest(arc) {
- var startAngle = signedAngle(arc.startAngle);
- var endAngle = signedAngle(arc.endAngle);
-
- if (startAngle > endAngle) {
- var tmp = startAngle;
- startAngle = endAngle;
- endAngle = tmp;
- }
-
- // test if segment angle is contained in angle interval
- return function(a) {
-
- if (a >= startAngle && a <= endAngle) {
- return true;
- }
-
- return false;
- };
- }
-
- function selected() {
- var ids = Object.getOwnPropertyNames(arcs),
- brushed = __.data;
-
- // Get the ids of the currently active arcs.
- ids = ids.filter(function(d) {
- return !isNaN(d);
- });
-
- function crossesStrum(d, id) {
- var arc = arcs[id],
- test = containmentTest(arc),
- d1 = arc.dims.left,
- d2 = arc.dims.right,
- y1 = yscale[d1],
- y2 = yscale[d2],
- a = arcs.width(id),
- b = y1(d[d1]) - y2(d[d2]),
- c = hypothenuse(a, b),
- angle = Math.asin(b/c); // rad in [-PI/2, PI/2]
- return test(angle);
- }
-
- if (ids.length === 0) { return brushed; }
-
- return brushed.filter(function(d) {
- switch(brush.predicate) {
- case "AND":
- return ids.every(function(id) { return crossesStrum(d, id); });
- case "OR":
- return ids.some(function(id) { return crossesStrum(d, id); });
- default:
- throw "Unknown brush predicate " + __.brushPredicate;
- }
- });
- }
-
- function removeStrum() {
- var arc = arcs[arcs.active],
- svg = pc.selection.select("svg").select("g#arcs");
-
- delete arcs[arcs.active];
- arcs.active = undefined;
- svg.selectAll("line#arc-" + arc.dims.i).remove();
- svg.selectAll("circle#arc-" + arc.dims.i).remove();
- svg.selectAll("path#arc-" + arc.dims.i).remove();
- }
-
- function onDragEnd() {
- return function() {
- var brushed = __.data,
- arc = arcs[arcs.active];
-
- // Okay, somewhat unexpected, but not totally unsurprising, a mousclick is
- // considered a drag without move. So we have to deal with that case
- if (arc && arc.p1[0] === arc.p2[0] && arc.p1[1] === arc.p2[1]) {
- removeStrum(arcs);
- }
-
- if (arc) {
- var angle = arcs.startAngle(arcs.active);
-
- arc.startAngle = angle;
- arc.endAngle = angle;
- arc.arc
- .outerRadius(arcs.length(arcs.active))
- .startAngle(angle)
- .endAngle(angle);
- }
-
-
- brushed = selected(arcs);
- arcs.active = undefined;
- __.brushed = brushed;
- pc.renderBrushed();
- events.brushend.call(pc, __.brushed);
- };
- }
-
- function brushReset(arcs) {
- return function() {
- var ids = Object.getOwnPropertyNames(arcs).filter(function(d) {
- return !isNaN(d);
- });
-
- ids.forEach(function(d) {
- arcs.active = d;
- removeStrum(arcs);
- });
- onDragEnd(arcs)();
- };
- }
-
- function install() {
- var drag = d3.behavior.drag();
-
- // Map of current arcs. arcs are stored per segment of the PC. A segment,
- // being the area between two axes. The left most area is indexed at 0.
- arcs.active = undefined;
- // Returns the width of the PC segment where currently a arc is being
- // placed. NOTE: even though they are evenly spaced in our current
- // implementation, we keep for when non-even spaced segments are supported as
- // well.
- arcs.width = function(id) {
- var arc = arcs[id];
-
- if (arc === undefined) {
- return undefined;
- }
-
- return arc.maxX - arc.minX;
- };
-
- // returns angles in [-PI/2, PI/2]
- angle = function(p1, p2) {
- var a = p1[0] - p2[0],
- b = p1[1] - p2[1],
- c = hypothenuse(a, b);
-
- return Math.asin(b/c);
- }
-
- // returns angles in [0, 2 * PI]
- arcs.endAngle = function(id) {
- var arc = arcs[id];
- if (arc === undefined) {
- return undefined;
- }
- var sAngle = angle(arc.p1, arc.p2),
- uAngle = -sAngle + Math.PI / 2;
-
- if (arc.p1[0] > arc.p2[0]) {
- uAngle = 2 * Math.PI - uAngle;
- }
-
- return uAngle;
- }
-
- arcs.startAngle = function(id) {
- var arc = arcs[id];
- if (arc === undefined) {
- return undefined;
- }
-
- var sAngle = angle(arc.p1, arc.p3),
- uAngle = -sAngle + Math.PI / 2;
-
- if (arc.p1[0] > arc.p3[0]) {
- uAngle = 2 * Math.PI - uAngle;
- }
-
- return uAngle;
- }
-
- arcs.length = function(id) {
- var arc = arcs[id];
-
- if (arc === undefined) {
- return undefined;
- }
-
- var a = arc.p1[0] - arc.p2[0],
- b = arc.p1[1] - arc.p2[1],
- c = hypothenuse(a, b);
-
- return(c);
- }
-
- pc.on("axesreorder.arcs", function() {
- var ids = Object.getOwnPropertyNames(arcs).filter(function(d) {
- return !isNaN(d);
- });
-
- // Checks if the first dimension is directly left of the second dimension.
- function consecutive(first, second) {
- var length = __.dimensions.length;
- return __.dimensions.some(function(d, i) {
- return (d === first)
- ? i + i < length && __.dimensions[i + 1] === second
- : false;
- });
- }
-
- if (ids.length > 0) { // We have some arcs, which might need to be removed.
- ids.forEach(function(d) {
- var dims = arcs[d].dims;
- arcs.active = d;
- // If the two dimensions of the current arc are not next to each other
- // any more, than we'll need to remove the arc. Otherwise we keep it.
- if (!consecutive(dims.left, dims.right)) {
- removeStrum(arcs);
- }
- });
- onDragEnd(arcs)();
- }
- });
-
- // Add a new svg group in which we draw the arcs.
- pc.selection.select("svg").append("g")
- .attr("id", "arcs")
- .attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")");
-
- // Install the required brushReset function
- pc.brushReset = brushReset(arcs);
-
- drag
- .on("dragstart", onDragStart(arcs))
- .on("drag", onDrag(arcs))
- .on("dragend", onDragEnd(arcs));
-
- // NOTE: The styling needs to be done here and not in the css. This is because
- // for 1D brushing, the canvas layers should not listen to
- // pointer-events.
- strumRect = pc.selection.select("svg").insert("rect", "g#arcs")
- .attr("id", "arc-events")
- .attr("x", __.margin.left)
- .attr("y", __.margin.top)
- .attr("width", w())
- .attr("height", h() + 2)
- .style("opacity", 0)
- .call(drag);
- }
-
- brush.modes["angular"] = {
- install: install,
- uninstall: function() {
- pc.selection.select("svg").select("g#arcs").remove();
- pc.selection.select("svg").select("rect#arc-events").remove();
- pc.on("axesreorder.arcs", undefined);
- delete pc.brushReset;
-
- strumRect = undefined;
- },
- selected: selected,
- brushState: function () { return arcs; }
- };
-
-}());
-
-pc.interactive = function() {
- flags.interactive = true;
- return this;
-};
-
-// expose a few objects
-pc.xscale = xscale;
-pc.yscale = yscale;
-pc.ctx = ctx;
-pc.canvas = canvas;
-pc.g = function() { return g; };
-
-// rescale for height, width and margins
-// TODO currently assumes chart is brushable, and destroys old brushes
-pc.resize = function() {
- // selection size
- pc.selection.select("svg")
- .attr("width", __.width)
- .attr("height", __.height)
- pc.svg.attr("transform", "translate(" + __.margin.left + "," + __.margin.top + ")");
-
- // FIXME: the current brush state should pass through
- if (flags.brushable) pc.brushReset();
-
- // scales
- pc.autoscale();
-
- // axes, destroys old brushes.
- if (g) pc.createAxes();
- if (flags.brushable) pc.brushable();
- if (flags.reorderable) pc.reorderable();
-
- events.resize.call(this, {width: __.width, height: __.height, margin: __.margin});
- return this;
-};
-
-// highlight an array of data
-pc.highlight = function(data) {
- if (arguments.length === 0) {
- return __.highlighted;
- }
-
- __.highlighted = data;
- pc.clear("highlight");
- d3.selectAll([canvas.foreground, canvas.brushed]).classed("faded", true);
- data.forEach(path_highlight);
- events.highlight.call(this, data);
- return this;
-};
-
-// clear highlighting
-pc.unhighlight = function() {
- __.highlighted = [];
- pc.clear("highlight");
- d3.selectAll([canvas.foreground, canvas.brushed]).classed("faded", false);
- return this;
-};
-
-// calculate 2d intersection of line a->b with line c->d
-// points are objects with x and y properties
-pc.intersection = function(a, b, c, d) {
- return {
- x: ((a.x * b.y - a.y * b.x) * (c.x - d.x) - (a.x - b.x) * (c.x * d.y - c.y * d.x)) / ((a.x - b.x) * (c.y - d.y) - (a.y - b.y) * (c.x - d.x)),
- y: ((a.x * b.y - a.y * b.x) * (c.y - d.y) - (a.y - b.y) * (c.x * d.y - c.y * d.x)) / ((a.x - b.x) * (c.y - d.y) - (a.y - b.y) * (c.x - d.x))
- };
-};
-
-function position(d) {
- var v = dragging[d];
- return v == null ? xscale(d) : v;
-}
-pc.version = "0.7.0";
- // this descriptive text should live with other introspective methods
- pc.toString = function() { return "Parallel Coordinates: " + __.dimensions.length + " dimensions (" + d3.keys(__.data[0]).length + " total) , " + __.data.length + " rows"; };
-
- return pc;
-};
-
-d3.renderQueue = (function(func) {
- var _queue = [], // data to be rendered
- _rate = 10, // number of calls per frame
- _clear = function() {}, // clearing function
- _i = 0; // current iteration
-
- var rq = function(data) {
- if (data) rq.data(data);
- rq.invalidate();
- _clear();
- rq.render();
- };
-
- rq.render = function() {
- _i = 0;
- var valid = true;
- rq.invalidate = function() { valid = false; };
-
- function doFrame() {
- if (!valid) return true;
- if (_i > _queue.length) return true;
-
- // Typical d3 behavior is to pass a data item *and* its index. As the
- // render queue splits the original data set, we'll have to be slightly
- // more carefull about passing the correct index with the data item.
- var end = Math.min(_i + _rate, _queue.length);
- for (var i = _i; i < end; i++) {
- func(_queue[i], i);
- }
- _i += _rate;
- }
-
- d3.timer(doFrame);
- };
-
- rq.data = function(data) {
- rq.invalidate();
- _queue = data.slice(0);
- return rq;
- };
-
- rq.rate = function(value) {
- if (!arguments.length) return _rate;
- _rate = value;
- return rq;
- };
-
- rq.remaining = function() {
- return _queue.length - _i;
- };
-
- // clear the canvas
- rq.clear = function(func) {
- if (!arguments.length) {
- _clear();
- return rq;
- }
- _clear = func;
- return rq;
- };
-
- rq.invalidate = function() {};
-
- return rq;
-});
diff --git a/panoramix/static/lib/select2.sortable.js b/panoramix/static/lib/select2.sortable.js
deleted file mode 100644
index 46afe7d0ea3c6..0000000000000
--- a/panoramix/static/lib/select2.sortable.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * jQuery Select2 Sortable
- * - enable select2 to be sortable via normal select element
- *
- * author : Vafour
- * modified : Kevin Provance (kprovance)
- * inspired by : jQuery Chosen Sortable (https://github.com/mrhenry/jquery-chosen-sortable)
- * License : GPL
- */
-
-(function ($) {
- $.fn.extend({
- select2SortableOrder: function () {
- var $this = this.filter('[multiple]');
-
- $this.each(function () {
- var $select = $(this);
-
- // skip elements not select2-ed
- if (typeof ($select.data('select2')) !== 'object') {
- return false;
- }
-
- var $select2 = $select.siblings('.select2-container');
- var sorted;
-
- // Opt group names
- var optArr = [];
-
- $select.find('optgroup').each(function(idx, val) {
- optArr.push (val);
- });
-
- $select.find('option').each(function(idx, val) {
- var groupName = $(this).parent('optgroup').prop('label');
- var optVal = this;
-
- if (groupName === undefined) {
- if (this.value !== '' && !this.selected) {
- optArr.push (optVal);
- }
- }
- });
-
- sorted = $($select2.find('.select2-choices li[class!="select2-search-field"]').map(function () {
- if (!this) {
- return undefined;
- }
-
- var id = $(this).data('select2Data').id;
-
- return $select.find('option[value="' + id + '"]')[0];
- }));
-
- sorted.push.apply(sorted, optArr);
-
- $select.children().remove();
- $select.append(sorted);
- });
-
- return $this;
- },
-
- select2Sortable: function () {
- var args = Array.prototype.slice.call(arguments, 0);
- $this = this.filter('[multiple]'),
- validMethods = ['destroy'];
-
- if (args.length === 0 || typeof (args[0]) === 'object') {
- var defaultOptions = {
- bindOrder: 'formSubmit', // or sortableStop
- sortableOptions: {
- placeholder: 'ui-state-highlight',
- items: 'li:not(.select2-search-field)',
- tolerance: 'pointer'
- }
- };
-
- var options = $.extend(defaultOptions, args[0]);
-
- // Init select2 only if not already initialized to prevent select2 configuration loss
- if (typeof ($this.data('select2')) !== 'object') {
- $this.select2();
- }
-
- $this.each(function () {
- var $select = $(this)
- var $select2choices = $select.siblings('.select2-container').find('.select2-choices');
-
- // Init jQuery UI Sortable
- $select2choices.sortable(options.sortableOptions);
-
- switch (options.bindOrder) {
- case 'sortableStop':
- // apply options ordering in sortstop event
- $select2choices.on("sortstop.select2sortable", function (event, ui) {
- $select.select2SortableOrder();
- });
-
- $select.on('change', function (e) {
- $(this).select2SortableOrder();
- });
- break;
-
- default:
- // apply options ordering in form submit
- $select.closest('form').unbind('submit.select2sortable').on('submit.select2sortable', function () {
- $select.select2SortableOrder();
- });
- break;
- }
- });
- }
- else if (typeof (args[0] === 'string')) {
- if ($.inArray(args[0], validMethods) == -1) {
- throw "Unknown method: " + args[0];
- }
-
- if (args[0] === 'destroy') {
- $this.select2SortableDestroy();
- }
- }
-
- return $this;
- },
-
- select2SortableDestroy: function () {
- var $this = this.filter('[multiple]');
- $this.each(function () {
- var $select = $(this)
- var $select2choices = $select.parent().find('.select2-choices');
-
- // unbind form submit event
- $select.closest('form').unbind('submit.select2sortable');
-
- // unbind sortstop event
- $select2choices.unbind("sortstop.select2sortable");
-
- // destroy select2Sortable
- $select2choices.sortable('destroy');
- });
-
- return $this;
- }
- });
-}(jQuery));
diff --git a/panoramix/static/lib/select2/select2-bootstrap.css b/panoramix/static/lib/select2/select2-bootstrap.css
deleted file mode 100644
index 1e392c938c760..0000000000000
--- a/panoramix/static/lib/select2/select2-bootstrap.css
+++ /dev/null
@@ -1,495 +0,0 @@
-/*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */
-/**
- * Reset Bootstrap 3 .form-control styles which - if applied to the
- * original