diff --git a/images/animated.gif b/images/animated.gif deleted file mode 100644 index 2af1c6e24..000000000 Binary files a/images/animated.gif and /dev/null differ diff --git a/index.html b/index.html index c8d205328..364340acd 100644 --- a/index.html +++ b/index.html @@ -8,10 +8,10 @@ - + ATLAS @@ -79,7 +79,8 @@ - + +
diff --git a/js/app.js b/js/app.js index a3e8bf8b2..18005274c 100644 --- a/js/app.js +++ b/js/app.js @@ -2,7 +2,10 @@ define([ 'jquery', 'knockout', 'bootstrap', - 'facets' + 'facets', + 'css!styles/atlas.dataTables.css', + 'css!styles/jquery.dataTables.colVis.css', + 'css!styles/jquery.dataTables.min.css' ], function ($, ko) { var appModel = function () { var self = this; @@ -38,7 +41,6 @@ define([ 'Drug Exposure', 'Procedure', 'Death' - //'Measurement' ]); self.loadCohortDefinition = function (cohortDefinitionId) { @@ -281,133 +283,6 @@ define([ }); } - self.loadConcept = function (conceptId) { - self.currentView('loading'); - - var conceptPromise = $.ajax({ - url: self.vocabularyUrl() + 'concept/' + conceptId, - method: 'GET', - contentType: 'application/json', - success: function (c, status, xhr) { - var exists = false; - for (i = 0; i < self.recentConcept().length; i++) { - if (self.recentConcept()[i].CONCEPT_ID == c.CONCEPT_ID) - exists = true; - } - if (!exists) { - self.recentConcept.unshift(c); - } - if (self.recentConcept().length > 7) { - self.recentConcept.pop(); - } - - self.currentConcept(c); - self.currentView('concept'); - }, - error: function () { - alert('An error occurred while attempting to load the concept from your currently configured provider. Please check the status of your selection from the configuration button in the top right corner.'); - } - }); - - // load related concepts once the concept is loaded - self.loadingRelated(true); - var relatedPromise = $.Deferred(); - - $.when(conceptPromise).done(function () { - metarchy = { - parents: ko.observableArray(), - children: ko.observableArray(), - synonyms: ko.observableArray() - }; - - $.getJSON(self.vocabularyUrl() + 'concept/' + conceptId + '/related', function (related) { - self.relatedConcepts(related); - - var feTemp = new FacetEngine({ - Facets: [ - { - 'caption': 'Vocabulary', - 'binding': function (o) { - return o.VOCABULARY_ID; - } - }, - { - 'caption': 'Standard Concept', - 'binding': function (o) { - return o.STANDARD_CONCEPT_CAPTION; - } - }, - { - 'caption': 'Invalid Reason', - 'binding': function (o) { - return o.INVALID_REASON_CAPTION; - } - }, - { - 'caption': 'Class', - 'binding': function (o) { - return o.CONCEPT_CLASS_ID; - } - }, - { - 'caption': 'Domain', - 'binding': function (o) { - return o.DOMAIN_ID; - } - }, - { - 'caption': 'Relationship', - 'binding': function (o) { - values = []; - for (i = 0; i < o.RELATIONSHIPS.length; i++) { - values.push(o.RELATIONSHIPS[i].RELATIONSHIP_NAME); - } - return values; - } - }, - { - 'caption': 'Distance', - 'binding': function (o) { - values = []; - for (i = 0; i < o.RELATIONSHIPS.length; i++) { - if (values.indexOf(o.RELATIONSHIPS[i].RELATIONSHIP_DISTANCE) == -1) { - values.push(o.RELATIONSHIPS[i].RELATIONSHIP_DISTANCE); - } - } - return values; - } - } - ] - }); - - for (c = 0; c < related.length; c++) { - feTemp.Process(related[c]); - metagorize(metarchy, related[c]); - } - - self.metarchy = metarchy; - - feTemp.MemberSortFunction = function () { - return this.ActiveCount; - }; - feTemp.sortFacetMembers(); - - self.feRelated(feTemp); - self.relatedConcepts(self.feRelated().GetCurrentObjects()); - relatedPromise.resolve(); - }); - }); - - $.when(relatedPromise).done(function () { - self.loadingRelated(false); - }); - - // triggers once our async loading of the concept and related concepts is complete - $.when(conceptPromise).done(function () { - self.currentView('concept'); - }); - } - self.reportCohortDefinitionId = ko.observable(); self.reportReportName = ko.observable(); self.reportSourceKey = ko.observable(); @@ -452,6 +327,7 @@ define([ self.evidenceUrl = ko.observable(); self.resultsUrl = ko.observable(); self.currentConcept = ko.observable(); + self.currentConceptId = ko.observable(); self.currentConceptMode = ko.observable('details'); self.currentConceptMode.subscribe(function (newMode) { switch (newMode) { diff --git a/js/components/concept.html b/js/components/concept-manager.html similarity index 100% rename from js/components/concept.html rename to js/components/concept-manager.html diff --git a/js/components/concept-manager.js b/js/components/concept-manager.js new file mode 100644 index 000000000..fdecac930 --- /dev/null +++ b/js/components/concept-manager.js @@ -0,0 +1,338 @@ +define(['knockout', 'text!./concept-manager.html'], function (ko, view) { + function conceptManager(params) { + var self = this; + self.model = params.model; + self.currentConceptId = params.currentConceptId; + + self.currentConceptId.subscribe(function (conceptId) { + self.loadConcept(conceptId); + }); + + self.loadConcept = function (conceptId) { + self.model.currentView('loading'); + + var conceptPromise = $.ajax({ + url: self.model.vocabularyUrl() + 'concept/' + conceptId, + method: 'GET', + contentType: 'application/json', + success: function (c, status, xhr) { + var exists = false; + for (i = 0; i < self.model.recentConcept().length; i++) { + if (self.model.recentConcept()[i].CONCEPT_ID == c.CONCEPT_ID) + exists = true; + } + if (!exists) { + self.model.recentConcept.unshift(c); + } + if (self.model.recentConcept().length > 7) { + self.model.recentConcept.pop(); + } + + self.model.currentConcept(c); + self.model.currentView('concept'); + }, + error: function () { + alert('An error occurred while attempting to load the concept from your currently configured provider. Please check the status of your selection from the configuration button in the top right corner.'); + } + }); + + // load related concepts once the concept is loaded + self.model.loadingRelated(true); + var relatedPromise = $.Deferred(); + + $.when(conceptPromise).done(function () { + metarchy = { + parents: ko.observableArray(), + children: ko.observableArray(), + synonyms: ko.observableArray() + }; + + $.getJSON(self.model.vocabularyUrl() + 'concept/' + conceptId + '/related', function (related) { + self.model.relatedConcepts(related); + + var feTemp = new FacetEngine({ + Facets: [ + { + 'caption': 'Vocabulary', + 'binding': function (o) { + return o.VOCABULARY_ID; + } + }, + { + 'caption': 'Standard Concept', + 'binding': function (o) { + return o.STANDARD_CONCEPT_CAPTION; + } + }, + { + 'caption': 'Invalid Reason', + 'binding': function (o) { + return o.INVALID_REASON_CAPTION; + } + }, + { + 'caption': 'Class', + 'binding': function (o) { + return o.CONCEPT_CLASS_ID; + } + }, + { + 'caption': 'Domain', + 'binding': function (o) { + return o.DOMAIN_ID; + } + }, + { + 'caption': 'Relationship', + 'binding': function (o) { + values = []; + for (i = 0; i < o.RELATIONSHIPS.length; i++) { + values.push(o.RELATIONSHIPS[i].RELATIONSHIP_NAME); + } + return values; + } + }, + { + 'caption': 'Distance', + 'binding': function (o) { + values = []; + for (i = 0; i < o.RELATIONSHIPS.length; i++) { + if (values.indexOf(o.RELATIONSHIPS[i].RELATIONSHIP_DISTANCE) == -1) { + values.push(o.RELATIONSHIPS[i].RELATIONSHIP_DISTANCE); + } + } + return values; + } + } + ] + }); + + for (c = 0; c < related.length; c++) { + feTemp.Process(related[c]); + self.metagorize(metarchy, related[c]); + } + + self.metarchy = metarchy; + + feTemp.MemberSortFunction = function () { + return this.ActiveCount; + }; + feTemp.sortFacetMembers(); + + self.model.feRelated(feTemp); + self.model.relatedConcepts(self.model.feRelated().GetCurrentObjects()); + relatedPromise.resolve(); + }); + }); + + $.when(relatedPromise).done(function () { + self.model.loadingRelated(false); + }); + + // triggers once our async loading of the concept and related concepts is complete + $.when(conceptPromise).done(function () { + self.model.currentView('concept'); + }); + } + + self.metagorize = function (metarchy, related) { + var concept = self.model.currentConcept(); + var key = concept.VOCABULARY_ID + '.' + concept.CONCEPT_CLASS_ID; + if (self.metatrix[key] != undefined) { + var meta = self.metatrix[key]; + if (self.hasRelationship(related, meta.childRelationships)) { + metarchy.children.push(related); + } + if (self.hasRelationship(related, meta.parentRelationships)) { + metarchy.parents.push(related); + } + } + } + + self.metatrix = { + 'RxNorm.Ingredient': { + childRelationships: [{ + name: 'Ingredient of (RxNorm)', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Has inferred drug class (OMOP)', + range: [0, 999] + }] + }, + 'RxNorm.Brand Name': { + childRelationships: [{ + name: 'Ingredient of (RxNorm)', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Tradename of (RxNorm)', + range: [0, 999] + }] + }, + 'RxNorm.Branded Drug': { + childRelationships: [{ + name: 'Consists of (RxNorm)', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Has ingredient (RxNorm)', + range: [0, 999] + }, { + name: 'RxNorm to ATC (RxNorm)', + range: [0, 999] + }, { + name: 'RxNorm to ETC (FDB)', + range: [0, 999] + }] + }, + 'RxNorm.Clinical Drug Comp': { + childRelationships: [], + parentRelationships: [{ + name: 'Has precise ingredient (RxNorm)', + range: [0, 999] + }, { + name: 'Has ingredient (RxNorm)', + range: [0, 999] + }] + }, + 'CPT4.CPT4': { + childRelationships: [], + parentRelationships: [{ + name: 'Is a', + range: [0, 999] + }], + synonymRelationships: [] + }, + 'CPT4.CPT4 Hierarchy': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Is a', + range: [0, 999] + }] + }, + 'ETC.ETC': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }, { + name: 'Inferred drug class of (OMOP)', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Is a', + range: [0, 999] + }, { + name: 'Has ancestor of', + range: [0, 999] + }] + }, + 'MedDRA.LLT': { + childRelationships: [], + parentRelationships: [{ + name: 'Has ancestor of', + range: [0, 1] + }, { + name: 'Is a', + range: [0, 1] + }] + }, + 'MedDRA.PT': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Has ancestor of', + range: [0, 999] + }] + }, + 'MedDRA.HLT': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Has ancestor of', + range: [0, 999] + }] + }, + 'MedDRA.SOC': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [] + }, + 'MedDRA.HLGT': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Is a', + range: [0, 999] + }] + }, + 'SNOMED.Clinical Finding': { + childRelationships: [{ + name: 'Subsumes', + range: [0, 999] + }], + parentRelationships: [{ + name: 'Is a', + range: [0, 999] + }, { + name: 'Has ancestor of', + range: [0, 1] + }] + } + }; + + self.hasRelationship = function (concept, relationships) { + for (var r = 0; r < concept.RELATIONSHIPS.length; r++) { + for (var i = 0; i < relationships.length; i++) { + if (concept.RELATIONSHIPS[r].RELATIONSHIP_NAME == relationships[i].name) { + if (concept.RELATIONSHIPS[r].RELATIONSHIP_DISTANCE >= relationships[i].range[0] && concept.RELATIONSHIPS[r].RELATIONSHIP_DISTANCE <= relationships[i].range[1]) { + return true; + } + } + } + } + return false; + } + + self.meetsRequirements = function (concept, requirements) { + var passCount = 0; + + for (var r = 0; r < requirements.length; r++) { + for (var f = 0; f < this.fe.Facets.length; f++) { + if (this.fe.Facets[f].caption == requirements[r].c) { + for (var m = 0; m < this.fe.Facets[f].Members.length; m++) { + if (this.fe.Facets[f].Members[m].Name == requirements[r].n) { + passCount++; + } + } + } + } + } + + if (filters.length == requirements.length) { + return true; + } else { + return false; + } + } + } + + var component = { + viewModel: conceptManager, + template: view + }; + + ko.components.register('concept-manager', component); + return component; +}); diff --git a/js/components/concept.js b/js/components/concept.js deleted file mode 100644 index c87695eb4..000000000 --- a/js/components/concept.js +++ /dev/null @@ -1,14 +0,0 @@ -define(['knockout', 'text!./concept.html'], function (ko, view) { - function atlasConcept(params) { - var self = this; - self.model = params.model; - } - - var component = { - viewModel: atlasConcept, - template: view - }; - - ko.components.register('atlas-concept', component); - return component; -}); diff --git a/js/components/configuration.js b/js/components/configuration.js index 697bffdce..031f6ab82 100644 --- a/js/components/configuration.js +++ b/js/components/configuration.js @@ -1,4 +1,4 @@ -define(['knockout', 'text!./concept.html'], function (ko, view) { +define(['knockout', 'text!./configuration.html'], function (ko, view) { function configuration(params) { var self = this; self.services = params.services(); diff --git a/js/components/search.html b/js/components/search.html index 9ce81ed92..eaadc9fa1 100644 --- a/js/components/search.html +++ b/js/components/search.html @@ -42,7 +42,7 @@
-
+
diff --git a/js/components/search.js b/js/components/search.js index e688de0dd..9960d946e 100644 --- a/js/components/search.js +++ b/js/components/search.js @@ -1,4 +1,4 @@ -define(['knockout', 'text!./search.html'], function (ko, view) { +define(['knockout', 'text!./search.html', 'knockout.dataTables.binding'], function (ko, view) { function atlasSearch(params) { var self = this; self.model = params.model; @@ -13,6 +13,40 @@ define(['knockout', 'text!./search.html'], function (ko, view) { } } }; + + self.contextSensitiveLinkColor = function (row, data) { + var switchContext; + + if (data.STANDARD_CONCEPT == undefined) { + switchContext = data.concept.STANDARD_CONCEPT; + } else { + switchContext = data.STANDARD_CONCEPT; + } + + switch (switchContext) { + case 'N': + $('a', row).css('color', '#800'); + break; + case 'C': + $('a', row).css('color', '#080'); + break; + } + } + + self.renderConceptSelector = function (s,p,d) { + var css = ''; + var icon = 'fa-shopping-cart'; + + if (self.model.selectedConceptsIndex[d.CONCEPT_ID] == 1) { + css = ' selected'; + } + return ''; + } + + self.renderLink = function (s, p, d) { + var valid = d.INVALID_REASON_CAPTION == 'Invalid' ? 'invalid' : ''; + return '' + d.CONCEPT_NAME + ''; + } } var component = { diff --git a/images/sort_asc.png b/js/images/sort_asc.png similarity index 100% rename from images/sort_asc.png rename to js/images/sort_asc.png diff --git a/images/sort_asc_disabled.png b/js/images/sort_asc_disabled.png similarity index 100% rename from images/sort_asc_disabled.png rename to js/images/sort_asc_disabled.png diff --git a/images/sort_both.png b/js/images/sort_both.png similarity index 100% rename from images/sort_both.png rename to js/images/sort_both.png diff --git a/images/sort_desc.png b/js/images/sort_desc.png similarity index 100% rename from images/sort_desc.png rename to js/images/sort_desc.png diff --git a/images/sort_desc_disabled.png b/js/images/sort_desc_disabled.png similarity index 100% rename from images/sort_desc_disabled.png rename to js/images/sort_desc_disabled.png diff --git a/js/knockout.dataTables.binding.js b/js/knockout.dataTables.binding.js index 3262754d6..493a78fea 100644 --- a/js/knockout.dataTables.binding.js +++ b/js/knockout.dataTables.binding.js @@ -1,38 +1,90 @@ - (function ($) { - ko.bindingHandlers.dataTable = { - init: function (element, valueAccessor) { - var binding = ko.utils.unwrapObservable(valueAccessor()); - - // If the binding is an object with an options field, - // initialise the dataTable with those options. - if (binding.options) { - // allow row level binding context - binding.options.createdRow = function (row, data, index) { - ko.applyBindings(data, row) - }; - - $(element).dataTable(binding.options); - } - return { - controlsDescendantBindings: true - }; - }, - update: function (element, valueAccessor) { - var binding = ko.utils.unwrapObservable(valueAccessor()); - - // If the binding isn't an object, turn it into one. - if (!binding.data) { - binding = { - data: valueAccessor() - } - } +define(['jquery', 'knockout', 'datatables'], function ($, ko) { + + function renderSelected(s, p, d) { + return ''; + } + + function _getSelectedData(element) + { + var selectedRows = $(element).DataTable().rows('tr:has(td.select:has(span.selected))', { + 'search': 'applied' + }).data(); + + var selectedData = []; + $.each(selectedRows, function(index, value) { + selectedData.push(value); + }); + + return selectedData; + } + + ko.bindingHandlers.dataTable = { + + init: function (element, valueAccessor) { + + + var binding = ko.utils.unwrapObservable(valueAccessor()); - // Clear table - $(element).dataTable().fnClearTable(); + // If the binding is an object with an options field, + // initialise the dataTable with those options. + if (binding.options) { + // allow row level binding context + binding.options.createdRow = function (row, data, index) { + ko.applyBindings(data, row) + }; + // test for 'select' column (must be first column in column definition + if (binding.options.columns && binding.options.columns[0] == 'select') { + binding.options.columns[0] = { width:'20px', orderable: false, class: 'select', render: renderSelected } + $(element).on("click","td > span.glyphicon-ok-sign", function () { + $(this).toggleClass('selected'); + console.log(this); + }); + } + + $(element).DataTable(binding.options); - // Rebuild table from data source specified in binding - if (binding.data.length > 0) - $(element).dataTable().fnAddData(binding.data); + if (binding.api != null) + { + // expose datatable API to context's api binding. + binding.api({ + getSelectedData: function() { return _getSelectedData(element);} + }); } + } + + return { + controlsDescendantBindings: true }; - })(jQuery); + }, + update: function (element, valueAccessor) { + var binding = ko.utils.unwrapObservable(valueAccessor()); + var table = $(element).DataTable(); + + // assign data to either the binding's data or the actual binding. + var data = ko.utils.unwrapObservable(binding.data || binding); + + // clear events that .on() attached to previously. Prior to this update, the binding may have specified an 'onRowClick' option, but no longer does. + $(element).off("click","tr"); + + if (binding.onRowClick != null) // attach a onRowclick handler if the options binding specifies it. + { + $(element).on("click","tr", function() + { + if (this._DT_RowIndex != null) + { + binding.onRowClick(data[this._DT_RowIndex]); + } + }); + } + + // Clear table + table.clear(); + + // Rebuild table from data source specified in binding + if (data.length > 0) + table.rows.add(data); + + table.draw(); + } + }; +}); diff --git a/js/main.js b/js/main.js index 2049b0ea6..c17a5abbb 100644 --- a/js/main.js +++ b/js/main.js @@ -21,14 +21,15 @@ requirejs.config({ "jquery": "http://code.jquery.com/jquery-1.11.2.min", "bootstrap": "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min", "knockout": "knockout.min", + "datatables" : "jquery.dataTables.min", "director": "director.min", "search" : "components/search", - "concept" : "components/concept", - "configuration" : "components/configuration" + "configuration" : "components/configuration", + "concept-manager" : "components/concept-manager" } }); -requirejs(['knockout', 'app', 'director', 'search', 'concept', "configuration"], function (ko, app) { +requirejs(['knockout', 'app', 'director', 'search', "configuration", "concept-manager"], function (ko, app) { var pageModel = new app(); var routerOptions = { @@ -38,7 +39,9 @@ requirejs(['knockout', 'app', 'director', 'search', 'concept', "configuration"], } var routes = { - '/concept/:conceptId:': pageModel.loadConcept, + '/concept/:conceptId:': function(conceptId) { + pageModel.currentConceptId(conceptId); + }, '/cohortdefinitions': function () { pageModel.currentView('cohortdefinitions'); }, diff --git a/js/styles/atlas.css b/js/styles/atlas.css index 9de0f71ab..21c3f8855 100644 --- a/js/styles/atlas.css +++ b/js/styles/atlas.css @@ -21,19 +21,11 @@ body { .heading { font-size: 14px; - - /* font-weight: bold; */ - margin-top: 5px; - margin-bottom: 0px; - /* clear:both; */ - /* height:40px; */ - /* background-color: #f00; */ - - padding: 3px 0px 0px 0px; + margin-bottom: 10px; } #wrapperConfigure { - padding: 10px; + padding: 5px; } #textImportConceptSet { @@ -120,6 +112,7 @@ body { margin-top: 10px; margin-bottom: 10px; /* margin-left: 10px; */ + padding-left: 10px; } @@ -177,7 +170,7 @@ pre span.key { position: relative; height: 46px; padding: 0px 10px 0px 10px; - line-height: 47px; + line-height: 49px; font-size: 18px; background-color: #fff; color: #1F4159; @@ -215,8 +208,8 @@ div#wrapperMainWindowContainer {} height: 46px; color: #FFFFFF; line-height: 47px; - padding: 0px 10px 0px 10px; - font-size: 18px; + padding: 0px 10px 0px 6px; + font-size: 16px; border-bottom: solid 1px #ccc; } @@ -632,7 +625,7 @@ ul.ColVis_collection li { margin-left: 50px; padding-bottom: 10px; padding-top: 10px; - font-size:14px; + font-size: 14px; background-color: #eee; padding-left: 10px; border-top: solid 1px #222; @@ -725,12 +718,12 @@ ul.ColVis_collection li { } input.btn.btn-default { - font-size: 12px; - float: right; - background-image: none; - background-color: #24465D; - color: #FFF; - text-shadow: none; + font-size: 12px; + float: right; + background-image: none; + background-color: #24465D; + color: #FFF; + text-shadow: none; } .reportHeading { @@ -744,6 +737,7 @@ input.btn.btn-default { .reportSectionHeading { font-size: 13px; /* font-weight: bold; */ + border-bottom: solid 1px #ccc; margin-top: 10px; margin-bottom: 0px; @@ -752,98 +746,381 @@ input.btn.btn-default { .evidenceDescription { color: #222; - font-size:11px; + font-size: 11px; padding: 10px; } .evidenceVisualization { - padding:10px; - text-align:center; - background-color:#fff + padding: 10px; + text-align: center; + background-color: #fff } .pad-10 { - padding: 10px; + padding: 10px; } .report table { - width: 100%; - background-color: #fff; - margin-bottom: 15px; + width: 100%; + background-color: #fff; + margin-bottom: 15px; } .report svg { - margin-left: auto; - margin-right: auto; + margin-left: auto; + margin-right: auto; } -g.trellisLegend { -} +g.trellisLegend {} ul.nav.nav-tabs { - /* margin-top: 5px; */ - /* margin-bottom: 10px; */ - background-color: #fff; - padding: 10px 10px 0px 10px; + /* margin-top: 5px; */ + /* margin-bottom: 10px; */ + + background-color: #fff; + padding: 10px 10px 0px 10px; } div.loader { - margin-top:20px; + margin-top: 20px; } g rect { - cursor: pointer; + cursor: pointer; } -g rect:hover { -} +g rect:hover {} .tab-content { - padding: 5px 5px 15px 5px; - background-color: #fff; + padding: 5px 5px 15px 5px; + background-color: #fff; } table#analysisStatus { - width: 100%; + width: 100%; } .reportControls { background-color: #666; - padding-bottom:34px; - margin-left:1px; + padding-bottom: 34px; + margin-left: 1px; border-bottom: solid #222 1px; } input.btn.btn-default:disabled { - background-color: #ccc; - color: #fff; + background-color: #ccc; + color: #fff; } .report { - background-color: #eee; - margin: 10px 10px 10px 10px; - border: solid 1px #ccc; + background-color: #eee; + margin: 10px 10px 10px 10px; + border: solid 1px #ccc; } .reportHeading .fa-area-chart { - font-size: 2em; - margin-right: 5px; + font-size: 2em; + margin-right: 5px; } i.fa.fa-refresh.fa-spin { - padding-right: 0px; - font-size:1.5em; -} - -rect.box { + padding-right: 0px; } +rect.box {} div#trellisLinePlot { - display: flex; - flex-shrink: 1; + display: flex; + flex-shrink: 1; } .dataTable tr td { - cursor:pointer; + cursor: pointer; +} + +.img-thumbnail { + border-radius: 0 +} + +code { + border-radius: 0 +} + +pre { + border-radius: 0 +} + +.form-control { + border-radius: 0 +} + +.form-control:focus { + /* border-color:#66afe9; */ + + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; + -webkit-box-shadow: none; + box-shadow: none +} + +.input-sm { + border-radius: 0 +} + +.input-lg { + border-radius: 0 +} + +.btn { + border-radius: 0 +} + +.btn-lg { + border-radius: 0 +} + +.btn-sm, +.btn-xs { + border-radius: 0 +} + +.dropdown-menu { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-group-xs>.btn { + border-radius: 0 +} + +.btn-group-sm>.btn { + border-radius: 0 +} + +.btn-group-lg>.btn { + border-radius: 0 +} + +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-bottom-left-radius: 0 +} + +.input-group-lg>.form-control, +.input-group-lg>.input-group-addon, +.input-group-lg>.input-group-btn>.btn { + border-radius: 0 +} + +.input-group-sm>.form-control, +.input-group-sm>.input-group-addon, +.input-group-lg>.input-group-btn>.btn { + border-radius: 0 +} + +.input-group-addon { + border-radius: 0 +} + +.input-group-addon.input-sm { + border-radius: 0 +} + +.input-group-addon.input-lg { + border-radius: 0 +} + +.nav-tabs>li>a { + border-radius: 0 +} + +.nav-pills>li>a { + border-radius: 0 +} + +@media(min-width:768px) { + .navbar { + border-radius: 0 + } +} + +.navbar-toggle { + border-radius: 0 +} + +.navbar-toggle .icon-bar { + border-radius: 0 +} + +.breadcrumb { + border-radius: 0 +} + +.pagination { + border-radius: 0 +} + +.pagination>li:first-child>a, +.pagination>li:first-child>span { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.pagination>li:last-child>a, +.pagination>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.pagination-lg>li:first-child>a, +.pagination-lg>li:first-child>span { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.pagination-lg>li:last-child>a, +.pagination-lg>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.pagination-sm>li:first-child>a, +.pagination-sm>li:first-child>span { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.pagination-sm>li:last-child>a, +.pagination-sm>li:last-child>span { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.pager li>a, +.pager li>span { + border-radius: 0 +} + +.label { + border-radius: 0 +} + +.badge { + border-radius: 0; + background-color: #F19119; +} + +.container .jumbotron { + border-radius: 0 +} + +.thumbnail { + border-radius: 0 +} + +.alert { + border-radius: 0 +} + +.progress { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +.progress-bar { + -webkit-box-shadow: none; + box-shadow: none +} + +.list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.list-group-item:last-child { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.panel { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +.panel-heading { + border-top-right-radius: 0; + border-top-left-radius: 0 +} + +.panel-footer { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.panel-group .panel { + border-radius: 0 +} + +.well { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +.well-lg { + border-radius: 0 +} + +.well-sm { + border-radius: 0 +} + +.close { + text-shadow: none +} + +.modal-content { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +@media screen and (min-width: 768px) { + .modal-content { + -webkit-box-shadow: none; + box-shadow: none + } +} + +.tooltip-inner { + border-radius: 0 +} + +.popover { + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none +} + +.popover-title { + border-radius: 0 +} + +.carousel-control { + text-shadow: none +} + +.carousel-indicators li { + border-radius: 0 +} + +.carousel-caption { + text-shadow: none } diff --git a/js/styles/atlas.dataTables.css b/js/styles/atlas.dataTables.css new file mode 100644 index 000000000..6e04f7c8f --- /dev/null +++ b/js/styles/atlas.dataTables.css @@ -0,0 +1,61 @@ +/* datatable overrides */ + +table.dataTable.hover tbody tr td { + border-bottom: solid 1px #eee; +} +table.dataTable td { + cursor: default; +} +table.dataTable.stripe tbody tr.odd, +table.dataTable.display tbody tr.odd { + background-color: #f0f0f0; +} +table.dataTable.stripe tbody tr.odd.selected, +table.dataTable.display tbody tr.odd.selected { + background-color: #f0f0f0; +} +table.dataTable.stripe tbody tr.even.selected, +table.dataTable.display tbody tr.even.selected { + background-color: #ffffff; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected { + background-color: #f0f0f0; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected { + background-color: #ffffff; +} +table.dataTable.hover tbody tr:hover td, +table.dataTable.hover tbody tr.odd:hover { + border-bottom: solid 1px #f0f0f0; +} +table.dataTable.hover tbody tr:hover td, +table.dataTable.hover tbody tr.even:hover { + border-bottom: solid 1px #ffffff; +} +/* override default hover colors */ + +table.dataTable.hover tbody tr.even:hover, +table.dataTable.display tbody tr.even:hover { + background-color: #fff; +} +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.display tbody tr.odd:hover { + background-color: #f0f0f0; +} +/* colVis formatting */ + +ul.ColVis_collection { + width: 200px; + right: 0px; +} +button.ColVis_Button { + margin-left: 10px; + height: 25px; + -webkit-box-shadow: 1px 1px 1px #ccc; + -moz-box-shadow: 1px 1px 1px #ccc; + -ms-box-shadow: 1px 1px 1px #ccc; + -o-box-shadow: 1px 1px 1px #ccc; + box-shadow: 1px 1px 1px #ccc; +} diff --git a/js/styles/jquery.dataTables.colVis.css b/js/styles/jquery.dataTables.colVis.css new file mode 100644 index 000000000..95d1d3097 --- /dev/null +++ b/js/styles/jquery.dataTables.colVis.css @@ -0,0 +1,183 @@ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * ColVis styles + */ +div.ColVis { + float: right; + margin-bottom: 1em; +} + +button.ColVis_Button, +ul.ColVis_collection li { + position: relative; + float: left; + margin-right: 3px; + padding: 5px 8px; + border: 1px solid #999; + cursor: pointer; + *cursor: hand; + font-size: 0.88em; + color: black !important; + white-space: nowrap; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 1px 1px 3px #ccc; + -moz-box-shadow: 1px 1px 3px #ccc; + -ms-box-shadow: 1px 1px 3px #ccc; + -o-box-shadow: 1px 1px 3px #ccc; + box-shadow: 1px 1px 3px #ccc; + + /* Generated by http://www.colorzilla.com/gradient-editor/ */ + background: #ffffff; /* Old browsers */ + /* background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); */ /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ +} + +.ColVis_Button:hover, +ul.ColVis_collection li:hover { + border: 1px solid #666; + text-decoration: none !important; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; + + background: #f3f3f3; /* Old browsers */ + background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */ + background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */ +} + +button.ColVis_Button { + height: 30px; + padding: 3px 8px; +} + +button.ColVis_Button::-moz-focus-inner { + border: none !important; + padding: 0; +} + +button.ColVis_Button:active { + outline: none; +} + + +div.ColVis_collectionBackground { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: black; + z-index: 1100; +} + +ul.ColVis_collection { + width: 150px; + padding: 8px 8px 4px 8px; + margin: 3; + border: 1px solid #ccc; + border: 1px solid rgba( 0, 0, 0, 0.4 ); + background-color: #f3f3f3; + /* background-color: rgba( 255, 255, 255, 0.3 ); */ + overflow: hidden; + z-index: 2002; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + + /* border-radius: 5px; */ + + -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); +} + +ul.ColVis_collection li { + position: relative; + height: auto; + left: 0; + right: 0; + padding: 0.5em; + + display: block; + float: none; + margin-bottom: 4px; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; +} + +ul.ColVis_collection li { + text-align: left; +} + +ul.ColVis_collection li.ColVis_Button:hover { + border: 1px solid #999; + background-color: #f0f0f0; +} + +ul.ColVis_collection li span { + display: inline-block; + padding-left: 0.5em; + cursor: pointer; +} + + +ul.ColVis_collection li.ColVis_Special { + border-color: #555; + background: rgb(237,237,237); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, rgba(237,237,237,1) 0%, rgba(214,214,214,1) 77%, rgba(232,232,232,1) 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* IE10+ */ + background: -o-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Opera 11.10+ */ + background: linear-gradient(to bottom, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 ); /* IE6-9 */ +} + +ul.ColVis_collection li.ColVis_Special:hover { + background: #e2e2e2; /* Old browsers */ + background: -webkit-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* IE10+ */ + background: -o-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 ); /* IE6-9 */ +} + + +span.ColVis_radio { + display: inline-block; + width: 20px; +} + +div.ColVis_catcher { + position: absolute; + z-index: 1101; +} + +.disabled { + color: #999; +} diff --git a/js/styles/jquery.dataTables.min.css b/js/styles/jquery.dataTables.min.css new file mode 100644 index 000000000..9ccf3ef6a --- /dev/null +++ b/js/styles/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;/* zoom:1 */}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333;}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}